# This script is run by dhclient as part of the dhclient-exit-hooks
# It is used to extract all IPv4 and IPv6 address details into
# /tmp/ipDetails.<interface> and /tmp/ip6Details.<interface> files respectively
# It also updates the /etc/resolv.dmasq with DNS servers extracted from the
# received DHCP offer

make_resolv_conf() {
    local new_resolv_conf

    # DHCPv4
    if [ -n "$new_domain_search" ] || [ -n "$new_domain_name" ] ||
       [ -n "$new_domain_name_servers" ]; then
        resolv_conf=$(readlink -f "/etc/resolv.dmasq" 2>/dev/null) ||
            resolv_conf="/etc/resolv.dmasq"

        new_resolv_conf="${resolv_conf}.dhclient-new.$$"
        wait_for_rw "$new_resolv_conf"
        rm -f $new_resolv_conf

        if [ -n "$new_domain_name" ]; then
            echo domain ${new_domain_name%% *} >>$new_resolv_conf
        fi

        if [ -n "$new_domain_search" ]; then
            if [ -n "$new_domain_name" ]; then
                domain_in_search_list=""
                for domain in $new_domain_search; do
                    if [ "$domain" = "${new_domain_name}" ] ||
                       [ "$domain" = "${new_domain_name}." ]; then
                        domain_in_search_list="Yes"
                    fi
                done
                if [ -z "$domain_in_search_list" ]; then
                    new_domain_search="$new_domain_name $new_domain_search"
                fi
            fi
            echo "search ${new_domain_search}" >> $new_resolv_conf
        elif [ -n "$new_domain_name" ]; then
            echo "search ${new_domain_name}" >> $new_resolv_conf
        fi

        if [ -n "$new_domain_name_servers" ]; then
            for nameserver in $new_domain_name_servers; do
                echo nameserver $nameserver >>$new_resolv_conf
            done
        else # keep 'old' nameservers
            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p $resolv_conf >>$new_resolv_conf
        fi

	if [ -f $resolv_conf ]; then
	    chown --reference=$resolv_conf $new_resolv_conf
	    chmod --reference=$resolv_conf $new_resolv_conf
	fi
        #commented following line as $resolv_conf will be updated by the main app
        #mv -f $new_resolv_conf $resolv_conf
    # DHCPv6
    elif [ -n "$new_dhcp6_domain_search" ] || [ -n "$new_dhcp6_name_servers" ]; then
        resolv_conf=$(readlink -f "/etc/resolv.dmasq" 2>/dev/null) ||
            resolv_conf="/etc/resolv.dmasq"

        new_resolv_conf="${resolv_conf}.dhclient-new.$$"
        wait_for_rw "$new_resolv_conf"
        rm -f $new_resolv_conf

        if [ -n "$new_dhcp6_domain_search" ]; then
            echo "search ${new_dhcp6_domain_search}" >> $new_resolv_conf
        fi

        if [ -n "$new_dhcp6_name_servers" ]; then
            for nameserver in $new_dhcp6_name_servers; do
                # append %interface to link-local-address nameservers
                if [ "${nameserver##fe80::}" != "$nameserver" ] ||
                   [ "${nameserver##FE80::}" != "$nameserver" ]; then
                    nameserver="${nameserver}%${interface}"
                fi
                echo nameserver $nameserver >>$new_resolv_conf
            done
        else # keep 'old' nameservers
            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p $resolv_conf >>$new_resolv_conf
        fi

	if [ -f $resolv_conf ]; then
            chown --reference=$resolv_conf $new_resolv_conf
            chmod --reference=$resolv_conf $new_resolv_conf
	fi
        #commented following line as $resolv_conf will be updated by the main app
        #mv -f $new_resolv_conf $resolv_conf
    fi
    #echo "search localhost" > /etc/resolv.conf
    echo "nameserver ::1" > /etc/resolv.conf
    echo "nameserver 127.0.0.1" >> /etc/resolv.conf
}

case "$reason" in
        BOUND|RENEW|REBIND|REBOOT)
                filename="/tmp/ipDetails.${interface}"
                echo "ip_address=${new_ip_address}" > ${filename}
                echo "subnet_mask=${new_subnet_mask}" >> ${filename}
                echo "routers=${new_routers}" >> ${filename}
                echo "domain_name_servers=${new_domain_name_servers}" >> ${filename}
                echo "domain_search=${new_domain_search}" >> ${filename}
                echo "domain_name=${new_domain_name}" >> ${filename}
                echo "ntp_servers=${new_ntp_servers}" >> ${filename}
                # update /etc/resolv.dmasq
                make_resolv_conf
                systemctl restart dnsmasq
                ;;

        BOUND6|RENEW6|REBIND6|REBOOT6)
                filename="/tmp/ip6Details.${interface}"
                echo "ip6_address=${new_ip6_address}" >> ${filename}
                echo "ip6_prefix=${new_ip6_prefix}" >> ${filename}
                echo "ip6_prefixlen=${new_ip6_prefixlen}" >> ${filename}
                echo "dhcp6_name_servers=${new_dhcp6_name_servers}" >> ${filename}
                echo "dhcp6_domain_search=${new_dhcp6_domain_search}" >> ${filename}
                echo "domain_name=${new_domain_name}" >> ${filename}
                echo "ntp_servers=${new_ntp_servers}" >> ${filename}
                # update /etc/resolv.dmasq
                if [ "${reason}" = BOUND6 ] ||
                   [ "${new_dhcp6_name_servers}" != "${old_dhcp6_name_servers}" ] ||
                   [ "${new_dhcp6_domain_search}" != "${old_dhcp6_domain_search}" ]; then
                    make_resolv_conf
                    systemctl restart dnsmasq
                fi
                ;;

        EXPIRE|FAIL|RELEASE|STOP)
                rm -f /tmp/ipDetails.${interface}
                ;;


        EXPIRE6|RELEASE6|STOP6)
                rm -f /tmp/ip6Details.${interface}
                ;;
esac

sync
sync
sync

