Home | History | Annotate | Line # | Download | only in scripts
bsdos revision 1.1.1.1
      1 #!/bin/sh
      2 
      3 make_resolv_conf() {
      4   if [ x"$new_domain_name_servers" != x ]; then
      5     cat /dev/null > /etc/resolv.conf.dhclient
      6     if [ "x$new_domain_search" != x ]; then
      7       echo search $new_domain_search >> /etc/resolv.conf.dhclient
      8     elif [ "x$new_domain_name" != x ]; then
      9       # Note that the DHCP 'Domain Name Option' is really just a domain
     10       # name, and that this practice of using the domain name option as
     11       # a search path is both nonstandard and deprecated.
     12       echo search $new_domain_name >> /etc/resolv.conf.dhclient
     13     fi
     14     for nameserver in $new_domain_name_servers; do
     15       echo nameserver $nameserver >> /etc/resolv.conf.dhclient
     16     done
     17 
     18     mv /etc/resolv.conf.dhclient /etc/resolv.conf
     19   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
     20     cat /dev/null > /etc/resolv.conf.dhclient6
     21     chmod 644 /etc/resolv.conf.dhclient6
     22 
     23     if [ "x${new_dhcp6_domain_search}" != x ] ; then
     24       echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6
     25     fi
     26     for nameserver in ${new_dhcp6_name_servers} ; do
     27       # If the nameserver has a link-local address
     28       # add a <zone_id> (interface name) to it.
     29       case $nameserver in
     30 	  fe80:*) zone_id="%$interface";;
     31 	  FE80:*) zone_id="%$interface";;
     32 	  *)      zone_id="";;
     33       esac
     34       echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6
     35     done
     36 
     37     mv /etc/resolv.conf.dhclient6 /etc/resolv.conf
     38   fi
     39 }
     40 
     41 # Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
     42 exit_with_hooks() {
     43   exit_status=$1
     44   if [ -f /etc/dhclient-exit-hooks ]; then
     45     . /etc/dhclient-exit-hooks
     46   fi
     47 # probably should do something with exit status of the local script
     48   exit $exit_status
     49 }
     50 
     51 # Invoke the local dhcp client enter hooks, if they exist.
     52 if [ -f /etc/dhclient-enter-hooks ]; then
     53   exit_status=0
     54   . /etc/dhclient-enter-hooks
     55   # allow the local script to abort processing of this state
     56   # local script must set exit_status variable to nonzero.
     57   if [ $exit_status -ne 0 ]; then
     58     exit $exit_status
     59   fi
     60 fi
     61 
     62 if [ x$new_network_number != x ]; then
     63    echo New Network Number: $new_network_number
     64 fi
     65 
     66 if [ x$new_broadcast_address != x ]; then
     67  echo New Broadcast Address: $new_broadcast_address
     68   new_broadcast_arg="broadcast $new_broadcast_address"
     69 fi
     70 if [ x$old_broadcast_address != x ]; then
     71   old_broadcast_arg="broadcast $old_broadcast_address"
     72 fi
     73 if [ x$new_subnet_mask != x ]; then
     74   new_netmask_arg="netmask $new_subnet_mask"
     75 fi
     76 if [ x$old_subnet_mask != x ]; then
     77   old_netmask_arg="netmask $old_subnet_mask"
     78 fi
     79 if [ x$alias_subnet_mask != x ]; then
     80   alias_subnet_arg="netmask $alias_subnet_mask"
     81 fi
     82 if [ x$new_interface_mtu != x ]; then
     83   mtu_arg="mtu $new_interface_mtu"
     84 fi
     85 if [ x$IF_METRIC != x ]; then
     86   metric_arg="metric $IF_METRIC"
     87 fi
     88 
     89 if [ x$reason = xMEDIUM ]; then
     90   eval "ifconfig $interface $medium"
     91   eval "ifconfig $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1
     92   sleep 1
     93   exit_with_hooks 0
     94 fi
     95 
     96 ###
     97 ### DHCPv4 Handlers
     98 ###
     99 
    100 if [ x$reason = xPREINIT ]; then
    101   if [ x$alias_ip_address != x ]; then
    102     ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1
    103     route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
    104   fi
    105   ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \
    106 		broadcast 255.255.255.255 up
    107   exit_with_hooks 0
    108 fi
    109 
    110 if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then
    111   exit_with_hooks 0;
    112 fi
    113   
    114 if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \
    115    [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then
    116   current_hostname=`hostname`
    117   if [ x$current_hostname = x ] || \
    118      [ x$current_hostname = x$old_host_name ]; then
    119     if [ x$current_hostname = x ] || \
    120        [ x$new_host_name != x$old_host_name ]; then
    121       hostname $new_host_name
    122     fi
    123   fi
    124     
    125   if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \
    126 		[ x$alias_ip_address != x$old_ip_address ]; then
    127     ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1
    128     route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
    129   fi
    130   if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]
    131    then
    132     eval "ifconfig $interface inet -alias $old_ip_address $medium"
    133     route delete $old_ip_address 127.1 >/dev/null 2>&1
    134     for router in $old_routers; do
    135       route delete default $router >/dev/null 2>&1
    136     done
    137     if [ "$old_static_routes" != "" ]; then
    138       set $old_static_routes
    139       while [ $# -gt 1 ]; do
    140 	route delete $1 $2
    141 	shift; shift
    142       done
    143     fi
    144     arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -n -d \1/p' |sh
    145   fi
    146   if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \
    147      [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then
    148     eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \
    149 			$new_broadcast_arg $mtu_arg $metric_arg $medium"
    150     route add $new_ip_address 127.1 >/dev/null 2>&1
    151     for router in $new_routers; do
    152       route add default $router >/dev/null 2>&1
    153     done
    154     if [ "$new_static_routes" != "" ]; then
    155       set $new_static_routes
    156       while [ $# -gt 1 ]; do
    157 	route add $1 $2
    158 	shift; shift
    159       done
    160     fi
    161   else                                                                        
    162     # we haven't changed the address, have we changed other options           
    163     # that we wish to update?
    164     if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then
    165       # if we've changed routers delete the old and add the new.
    166       $LOGGER "New Routers: $new_routers"
    167       for router in $old_routers; do
    168         route delete default $router >/dev/null 2>&1
    169       done
    170       for router in $new_routers; do
    171         route add default $router >/dev/null 2>&1
    172       done
    173     fi
    174   fi
    175   if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ];
    176    then
    177     ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg
    178     route add $alias_ip_address 127.0.0.1
    179   fi
    180   make_resolv_conf
    181   exit_with_hooks 0
    182 fi
    183 
    184 if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \
    185    || [ x$reason = xSTOP ]; then
    186   if [ x$alias_ip_address != x ]; then
    187     ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1
    188     route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
    189   fi
    190   if [ x$old_ip_address != x ]; then
    191     eval "ifconfig $interface inet -alias $old_ip_address $medium"
    192     route delete $old_ip_address 127.1 >/dev/null 2>&1
    193     for router in $old_routers; do
    194       route delete default $router >/dev/null 2>&1
    195     done
    196     if [ "$old_static_routes" != "" ]; then
    197       set $old_static_routes
    198       while [ $# -gt 1 ]; do
    199 	route delete $1 $2
    200 	shift; shift
    201       done
    202     fi
    203     arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -n -d \1/p' \
    204 						|sh >/dev/null 2>&1
    205   fi
    206   if [ x$alias_ip_address != x ]; then
    207     ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg
    208     route add $alias_ip_address 127.0.0.1
    209   fi
    210   exit_with_hooks 0
    211 fi
    212 
    213 if [ x$reason = xTIMEOUT ]; then
    214   if [ x$alias_ip_address != x ]; then
    215     ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1
    216     route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
    217   fi
    218   eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \
    219 			$new_broadcast_arg $mtu_arg $metric_arg $medium"
    220   sleep 1
    221   if [ "$new_routers" != "" ]; then
    222     set $new_routers
    223     if ping -q -c 1 -w 1 $1; then
    224       if [ x$new_ip_address != x$alias_ip_address ] && \
    225 			[ x$alias_ip_address != x ]; then
    226 	ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg
    227 	route add $alias_ip_address 127.0.0.1
    228       fi
    229       route add $new_ip_address 127.1 >/dev/null 2>&1
    230       for router in $new_routers; do
    231 	route add default $router >/dev/null 2>&1
    232       done
    233       set $new_static_routes
    234       while [ $# -gt 1 ]; do
    235 	route add $0 $1
    236 	shift; shift
    237       done
    238       make_resolv_conf
    239       exit_with_hooks 0
    240     fi
    241   fi
    242   eval "ifconfig $interface inet -alias $new_ip_address $medium"
    243   for router in $old_routers; do
    244     route delete default $router >/dev/null 2>&1
    245   done
    246   if [ "$old_static_routes" != "" ]; then
    247     set $old_static_routes
    248     while [ $# -gt 1 ]; do
    249       route delete $1 $2
    250       shift; shift
    251     done
    252   fi
    253   arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -n -d \1/p' \
    254 							|sh >/dev/null 2>&1
    255   exit_with_hooks 1
    256 fi
    257 
    258 ###
    259 ### DHCPv6 Handlers
    260 ###
    261 
    262 if [ ${reason} = PREINIT6 ] ; then
    263   # Ensure interface is up.
    264   ifconfig ${interface} up
    265 
    266   # XXX: Remove any stale addresses from aborted clients.
    267 
    268   exit_with_hooks 0
    269 fi
    270 
    271 if [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then
    272     echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix}
    273 
    274     exit_with_hooks 0
    275 fi
    276 
    277 if [ ${reason} = BOUND6 ] ; then
    278   if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then
    279     exit_with_hooks 2;
    280   fi
    281 
    282   ifconfig ${interface} inet6 add ${new_ip6_address}/${new_ip6_prefixlen}
    283 
    284   # Check for nameserver options.
    285   make_resolv_conf
    286 
    287   exit_with_hooks 0
    288 fi
    289 
    290 if [ ${reason} = RENEW6 ] || [ ${reason} = REBIND6 ] ; then
    291   # Make sure nothing has moved around on us.
    292 
    293   # Nameservers/domains/etc.
    294   if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] ||
    295      [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then
    296     make_resolv_conf
    297   fi
    298 
    299   exit_with_hooks 0
    300 fi
    301 
    302 if [ ${reason} = DEPREF6 ] ; then
    303   if [ x${new_ip6_prefixlen} = x ] ; then
    304     exit_with_hooks 2;
    305   fi
    306 
    307   # XXX:
    308   # There doesn't appear to be a way to update an addr to indicate
    309   # preference.
    310 
    311   exit_with_hooks 0
    312 fi
    313 
    314 if [ ${reason} = EXPIRE6 -o ${reason} = RELEASE6 -o ${reason} = STOP6 ] ; then
    315   if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then
    316     exit_with_hooks 2;
    317   fi
    318 
    319   ifconfig ${interface} inet6 delete ${old_ip6_address}/${old_ip6_prefixlen}
    320 
    321   exit_with_hooks 0
    322 fi
    323 
    324 exit_with_hooks 0
    325