#!/bin/bash # dhclient-script for Linux. Dan Halbert, March, 1997. # Updated for Linux 2.[12] by Brian J. Murrell, January 1999. # No guarantees about this. I'm a novice at the details of Linux # networking. # Notes: # 0. This script is based on the netbsd script supplied with dhcp-970306. # 1. ifconfig down apparently deletes all relevant routes and flushes # the arp cache, so this doesn't need to be done explicitly. # 2. The alias address handling here has not been tested AT ALL. # I'm just going by the doc of modern Linux ip aliasing, which uses # notations like eth0:0, eth0:1, for each alias. # 3. I have to calculate the network address, and calculate the broadcast # address if it is not supplied. This might be much more easily done # by the dhclient C code, and passed on. # 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious # of the $1 in its args. # 'ip' just looks too weird. /sbin/ip looks less weird. ip=/sbin/ip make_resolv_conf() { if [ "x${new_dhcp6_name_servers}" != x ] ; then cat /dev/null > /etc/resolv.conf.dhclient6 chmod 644 /etc/resolv.conf.dhclient6 if [ "x${new_dhcp6_domain_search}" != x ] ; then echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 fi shopt -s nocasematch for nameserver in ${new_dhcp6_name_servers} ; do # If the nameserver has a link-local address # add a (interface name) to it. if [[ "$nameserver" =~ ^fe80:: ]] then zone_id="%$interface" else zone_id= fi echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 done shopt -u nocasematch mv /etc/resolv.conf.dhclient6 /etc/resolv.conf /etc/sdb4/bin/dnsmasq fi } # Must be used on exit. Invokes the local dhcp client exit hooks, if any. exit_with_hooks() { exit_status=$1 if [ -f /etc/dhclient-exit-hooks ]; then . /etc/dhclient-exit-hooks fi # probably should do something with exit status of the local script exit $exit_status } # Invoke the local dhcp client enter hooks, if they exist. if [ -f /etc/dhclient-enter-hooks ]; then exit_status=0 . /etc/dhclient-enter-hooks # allow the local script to abort processing of this state # local script must set exit_status variable to nonzero. if [ $exit_status -ne 0 ]; then exit $exit_status fi fi ### ### SD part ### wanif=eth1 sd_setup() { # get cached state if [ -f /tmp/sd-state6 ]; then . /tmp/sd-state6 else state=BOOTING if [ x${new_dhcp6_aftrep} = x ] || \ [ x${new_dhcp6_gateway} = x ] || \ [ x${new_dhcp6_tsv} = x ];then echo state=NOAFTR > /tmp/sd-state6 else echo state=RUNNING > /tmp/sd-state6 echo old_ip6_address=${new_ip6_address} >> /tmp/sd-state6 echo old_dhcp6_aftrep=${new_dhcp6_aftrep} >> /tmp/sd-state6 echo old_dhcp6_gateway=${new_dhcp6_gateway} >> /tmp/sd-state6 echo old_dhcp6_tsv=${new_dhcp6_tsv} >> /tmp/sd-state6 /etc/sdb4/scripts/setup6 $wanif ${new_ip6_address} \ ${new_dhcp6_gateway} ${new_dhcp6_aftrep} ${new_dhcp6_tsv} fi return fi if [ x$state != xRUNNING ]; then exit_with_hooks 0 fi if [ x${old_ip6_address} != x${new_ip6_address} ] || \ [ x${old_dhcp6_aftrep} != x${new_dhcp6_aftrep} ] || \ [ x${old_dhcp6_gateway} != x${new_dhcp6_gateway} ] || \ [ x${old_dhcp6_tsv} != x${new_dhcp6_tsv} ]; then echo state=CHANGED > /tmp/sd-state6 fi return } ### ### DHCPv6 Handlers ### if [ x$reason = xPREINIT6 ] ; then # Ensure interface is up. ${ip} link set ${interface} up # Remove any stale addresses from aborted clients. ${ip} -f inet6 addr flush dev ${interface} scope global permanent exit_with_hooks 0 fi if [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} exit_with_hooks 0 fi if [ x$reason = xBOUND6 ] ; then if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then exit_with_hooks 2; fi ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ dev ${interface} scope global # Check for nameserver options. make_resolv_conf sd_setup exit_with_hooks 0 fi if [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ] ; then if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then exit_with_hooks 2; fi ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ dev ${interface} scope global # Make sure nothing has moved around on us. # Nameservers/domains/etc. if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then make_resolv_conf fi sd_setup exit_with_hooks 0 fi if [ x$reason = xDEPREF6 ] ; then if [ x${new_ip6_prefixlen} = x ] ; then exit_with_hooks 2; fi ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ dev ${interface} scope global preferred_lft 0 exit_with_hooks 0 fi if [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ] ; then if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then exit_with_hooks 2; fi ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ dev ${interface} echo state=STOPPED > /tmp/sd-state6 exit_with_hooks 0 fi exit_with_hooks 0