1*83ee113eSDavid van Moolenbroek#!/bin/sh 2*83ee113eSDavid van Moolenbroek 3*83ee113eSDavid van Moolenbroek# 'ip' just looks too weird. /sbin/ip looks less weird. 4*83ee113eSDavid van Moolenbroekip=/usr/sbin/ip 5*83ee113eSDavid van Moolenbroek 6*83ee113eSDavid van Moolenbroekmake_resolv_conf() { 7*83ee113eSDavid van Moolenbroek if [ x"$new_domain_name_servers" != x ]; then 8*83ee113eSDavid van Moolenbroek cat /dev/null > /etc/resolv.conf.dhclient 9*83ee113eSDavid van Moolenbroek chmod 644 /etc/resolv.conf.dhclient 10*83ee113eSDavid van Moolenbroek if [ x"$new_domain_search" != x ]; then 11*83ee113eSDavid van Moolenbroek echo search $new_domain_search >> /etc/resolv.conf.dhclient 12*83ee113eSDavid van Moolenbroek elif [ x"$new_domain_name" != x ]; then 13*83ee113eSDavid van Moolenbroek # Note that the DHCP 'Domain Name Option' is really just a domain 14*83ee113eSDavid van Moolenbroek # name, and that this practice of using the domain name option as 15*83ee113eSDavid van Moolenbroek # a search path is both nonstandard and deprecated. 16*83ee113eSDavid van Moolenbroek echo search $new_domain_name >> /etc/resolv.conf.dhclient 17*83ee113eSDavid van Moolenbroek fi 18*83ee113eSDavid van Moolenbroek for nameserver in $new_domain_name_servers; do 19*83ee113eSDavid van Moolenbroek echo nameserver $nameserver >>/etc/resolv.conf.dhclient 20*83ee113eSDavid van Moolenbroek done 21*83ee113eSDavid van Moolenbroek 22*83ee113eSDavid van Moolenbroek mv /etc/resolv.conf.dhclient /etc/resolv.conf 23*83ee113eSDavid van Moolenbroek elif [ "x${new_dhcp6_name_servers}" != x ] ; then 24*83ee113eSDavid van Moolenbroek cat /dev/null > /etc/resolv.conf.dhclient6 25*83ee113eSDavid van Moolenbroek chmod 644 /etc/resolv.conf.dhclient6 26*83ee113eSDavid van Moolenbroek 27*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_domain_search}" != x ] ; then 28*83ee113eSDavid van Moolenbroek echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 29*83ee113eSDavid van Moolenbroek fi 30*83ee113eSDavid van Moolenbroek for nameserver in ${new_dhcp6_name_servers} ; do 31*83ee113eSDavid van Moolenbroek # If the nameserver has a link-local address 32*83ee113eSDavid van Moolenbroek # add a <zone_id> (interface name) to it. 33*83ee113eSDavid van Moolenbroek case $nameserver in 34*83ee113eSDavid van Moolenbroek fe80:*) zone_id="%$interface";; 35*83ee113eSDavid van Moolenbroek FE80:*) zone_id="%$interface";; 36*83ee113eSDavid van Moolenbroek *) zone_id="";; 37*83ee113eSDavid van Moolenbroek esac 38*83ee113eSDavid van Moolenbroek echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 39*83ee113eSDavid van Moolenbroek done 40*83ee113eSDavid van Moolenbroek 41*83ee113eSDavid van Moolenbroek mv /etc/resolv.conf.dhclient6 /etc/resolv.conf 42*83ee113eSDavid van Moolenbroek fi 43*83ee113eSDavid van Moolenbroek} 44*83ee113eSDavid van Moolenbroek 45*83ee113eSDavid van Moolenbroek# Must be used on exit. Invokes the local dhcp client exit hooks, if any. 46*83ee113eSDavid van Moolenbroekexit_with_hooks() { 47*83ee113eSDavid van Moolenbroek exit_status=$1 48*83ee113eSDavid van Moolenbroek if [ -f /etc/dhclient-exit-hooks ]; then 49*83ee113eSDavid van Moolenbroek . /etc/dhclient-exit-hooks 50*83ee113eSDavid van Moolenbroek fi 51*83ee113eSDavid van Moolenbroek# probably should do something with exit status of the local script 52*83ee113eSDavid van Moolenbroek exit $exit_status 53*83ee113eSDavid van Moolenbroek} 54*83ee113eSDavid van Moolenbroek 55*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist. 56*83ee113eSDavid van Moolenbroekif [ -f /etc/dhclient-enter-hooks ]; then 57*83ee113eSDavid van Moolenbroek exit_status=0 58*83ee113eSDavid van Moolenbroek . /etc/dhclient-enter-hooks 59*83ee113eSDavid van Moolenbroek # allow the local script to abort processing of this state 60*83ee113eSDavid van Moolenbroek # local script must set exit_status variable to nonzero. 61*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 62*83ee113eSDavid van Moolenbroek exit $exit_status 63*83ee113eSDavid van Moolenbroek fi 64*83ee113eSDavid van Moolenbroekfi 65*83ee113eSDavid van Moolenbroek 66*83ee113eSDavid van Moolenbroek### 67*83ee113eSDavid van Moolenbroek### DHCPv4 Handlers 68*83ee113eSDavid van Moolenbroek### 69*83ee113eSDavid van Moolenbroek 70*83ee113eSDavid van Moolenbroekif [ x$new_broadcast_address != x ]; then 71*83ee113eSDavid van Moolenbroek new_broadcast_arg="broadcast $new_broadcast_address" 72*83ee113eSDavid van Moolenbroekfi 73*83ee113eSDavid van Moolenbroekif [ x$new_subnet_mask != x ]; then 74*83ee113eSDavid van Moolenbroek new_subnet_arg="netmask $new_subnet_mask" 75*83ee113eSDavid van Moolenbroekfi 76*83ee113eSDavid van Moolenbroekif [ x$alias_subnet_mask != x ]; then 77*83ee113eSDavid van Moolenbroek alias_subnet_arg="netmask $alias_subnet_mask" 78*83ee113eSDavid van Moolenbroekfi 79*83ee113eSDavid van Moolenbroekif [ x$new_interface_mtu != x ]; then 80*83ee113eSDavid van Moolenbroek mtu_arg="mtu $new_interface_mtu" 81*83ee113eSDavid van Moolenbroekfi 82*83ee113eSDavid van Moolenbroekif [ x$IF_METRIC != x ]; then 83*83ee113eSDavid van Moolenbroek metric_arg="metric $IF_METRIC" 84*83ee113eSDavid van Moolenbroekfi 85*83ee113eSDavid van Moolenbroek 86*83ee113eSDavid van Moolenbroekif [ x$reason = xMEDIUM ]; then 87*83ee113eSDavid van Moolenbroek # Linux doesn't do mediums (ok, ok, media). 88*83ee113eSDavid van Moolenbroek exit_with_hooks 0 89*83ee113eSDavid van Moolenbroekfi 90*83ee113eSDavid van Moolenbroek 91*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT ]; then 92*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 93*83ee113eSDavid van Moolenbroek # Bring down alias interface. Its routes will disappear too. 94*83ee113eSDavid van Moolenbroek ifconfig $interface:0- 0.0.0.0 95*83ee113eSDavid van Moolenbroek fi 96*83ee113eSDavid van Moolenbroek ifconfig $interface 0.0.0.0 up 97*83ee113eSDavid van Moolenbroek 98*83ee113eSDavid van Moolenbroek # We need to give the kernel some time to get the interface up. 99*83ee113eSDavid van Moolenbroek sleep 1 100*83ee113eSDavid van Moolenbroek 101*83ee113eSDavid van Moolenbroek exit_with_hooks 0 102*83ee113eSDavid van Moolenbroekfi 103*83ee113eSDavid van Moolenbroek 104*83ee113eSDavid van Moolenbroekif [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then 105*83ee113eSDavid van Moolenbroek exit_with_hooks 0 106*83ee113eSDavid van Moolenbroekfi 107*83ee113eSDavid van Moolenbroek 108*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ 109*83ee113eSDavid van Moolenbroek [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then 110*83ee113eSDavid van Moolenbroek current_hostname=`hostname` 111*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 112*83ee113eSDavid van Moolenbroek [ x$current_hostname = x$old_host_name ]; then 113*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 114*83ee113eSDavid van Moolenbroek [ x$new_host_name != x$old_host_name ]; then 115*83ee113eSDavid van Moolenbroek hostname $new_host_name 116*83ee113eSDavid van Moolenbroek fi 117*83ee113eSDavid van Moolenbroek fi 118*83ee113eSDavid van Moolenbroek 119*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ 120*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x$old_ip_address ]; then 121*83ee113eSDavid van Moolenbroek # Possible new alias. Remove old alias. 122*83ee113eSDavid van Moolenbroek ifconfig $interface:0- 0.0.0.0 123*83ee113eSDavid van Moolenbroek fi 124*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && \ 125*83ee113eSDavid van Moolenbroek [ x$old_ip_address != x$new_ip_address ]; then 126*83ee113eSDavid van Moolenbroek # IP address changed. Bringing down the interface will delete all routes, 127*83ee113eSDavid van Moolenbroek # and clear the ARP cache. 128*83ee113eSDavid van Moolenbroek ifconfig $interface 0.0.0.0 down 129*83ee113eSDavid van Moolenbroek 130*83ee113eSDavid van Moolenbroek fi 131*83ee113eSDavid van Moolenbroek if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ 132*83ee113eSDavid van Moolenbroek [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then 133*83ee113eSDavid van Moolenbroek 134*83ee113eSDavid van Moolenbroek ifconfig $interface $new_ip_address $new_subnet_arg \ 135*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg 136*83ee113eSDavid van Moolenbroek for router in $new_routers; do 137*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 138*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 139*83ee113eSDavid van Moolenbroek fi 140*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 141*83ee113eSDavid van Moolenbroek done 142*83ee113eSDavid van Moolenbroek else 143*83ee113eSDavid van Moolenbroek # we haven't changed the address, have we changed other options 144*83ee113eSDavid van Moolenbroek # that we wish to update? 145*83ee113eSDavid van Moolenbroek if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then 146*83ee113eSDavid van Moolenbroek # if we've changed routers delete the old and add the new. 147*83ee113eSDavid van Moolenbroek $LOGGER "New Routers: $new_routers" 148*83ee113eSDavid van Moolenbroek for router in $old_routers; do 149*83ee113eSDavid van Moolenbroek route del default gw $router 150*83ee113eSDavid van Moolenbroek done 151*83ee113eSDavid van Moolenbroek for router in $new_routers; do 152*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 153*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 154*83ee113eSDavid van Moolenbroek fi 155*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 156*83ee113eSDavid van Moolenbroek done 157*83ee113eSDavid van Moolenbroek fi 158*83ee113eSDavid van Moolenbroek fi 159*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; 160*83ee113eSDavid van Moolenbroek then 161*83ee113eSDavid van Moolenbroek ifconfig $interface:0- 0.0.0.0 162*83ee113eSDavid van Moolenbroek ifconfig $interface:0 $alias_ip_address $alias_subnet_arg 163*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address $interface:0 164*83ee113eSDavid van Moolenbroek fi 165*83ee113eSDavid van Moolenbroek make_resolv_conf 166*83ee113eSDavid van Moolenbroek exit_with_hooks 0 167*83ee113eSDavid van Moolenbroekfi 168*83ee113eSDavid van Moolenbroek 169*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ 170*83ee113eSDavid van Moolenbroek || [ x$reason = xSTOP ]; then 171*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 172*83ee113eSDavid van Moolenbroek # Turn off alias interface. 173*83ee113eSDavid van Moolenbroek ifconfig $interface:0- 0.0.0.0 174*83ee113eSDavid van Moolenbroek fi 175*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ]; then 176*83ee113eSDavid van Moolenbroek # Shut down interface, which will delete routes and clear arp cache. 177*83ee113eSDavid van Moolenbroek ifconfig $interface 0.0.0.0 down 178*83ee113eSDavid van Moolenbroek fi 179*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 180*83ee113eSDavid van Moolenbroek ifconfig $interface:0 $alias_ip_address $alias_subnet_arg 181*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address $interface:0 182*83ee113eSDavid van Moolenbroek fi 183*83ee113eSDavid van Moolenbroek exit_with_hooks 0 184*83ee113eSDavid van Moolenbroekfi 185*83ee113eSDavid van Moolenbroek 186*83ee113eSDavid van Moolenbroekif [ x$reason = xTIMEOUT ]; then 187*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 188*83ee113eSDavid van Moolenbroek ifconfig $interface:0- 0.0.0.0 189*83ee113eSDavid van Moolenbroek fi 190*83ee113eSDavid van Moolenbroek ifconfig $interface $new_ip_address $new_subnet_arg \ 191*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg 192*83ee113eSDavid van Moolenbroek set $new_routers 193*83ee113eSDavid van Moolenbroek if ping -q -c 1 $1; then 194*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && \ 195*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x ]; then 196*83ee113eSDavid van Moolenbroek ifconfig $interface:0 $alias_ip_address $alias_subnet_arg 197*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address dev $interface:0 198*83ee113eSDavid van Moolenbroek fi 199*83ee113eSDavid van Moolenbroek for router in $new_routers; do 200*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 201*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 202*83ee113eSDavid van Moolenbroek fi 203*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 204*83ee113eSDavid van Moolenbroek done 205*83ee113eSDavid van Moolenbroek make_resolv_conf 206*83ee113eSDavid van Moolenbroek exit_with_hooks 0 207*83ee113eSDavid van Moolenbroek fi 208*83ee113eSDavid van Moolenbroek ifconfig $interface 0.0.0.0 down 209*83ee113eSDavid van Moolenbroek exit_with_hooks 1 210*83ee113eSDavid van Moolenbroekfi 211*83ee113eSDavid van Moolenbroek 212*83ee113eSDavid van Moolenbroek### 213*83ee113eSDavid van Moolenbroek### DHCPv6 Handlers 214*83ee113eSDavid van Moolenbroek### 215*83ee113eSDavid van Moolenbroek 216*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT6 ]; then 217*83ee113eSDavid van Moolenbroek # Ensure interface is up. 218*83ee113eSDavid van Moolenbroek ${ip} link set ${interface} up 219*83ee113eSDavid van Moolenbroek 220*83ee113eSDavid van Moolenbroek # Remove any stale addresses from aborted clients. 221*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr flush dev ${interface} scope global permanent 222*83ee113eSDavid van Moolenbroek 223*83ee113eSDavid van Moolenbroek exit_with_hooks 0 224*83ee113eSDavid van Moolenbroekfi 225*83ee113eSDavid van Moolenbroek 226*83ee113eSDavid van Moolenbroekif [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then 227*83ee113eSDavid van Moolenbroek echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} 228*83ee113eSDavid van Moolenbroek 229*83ee113eSDavid van Moolenbroek exit_with_hooks 0 230*83ee113eSDavid van Moolenbroekfi 231*83ee113eSDavid van Moolenbroek 232*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND6 ]; then 233*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then 234*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 235*83ee113eSDavid van Moolenbroek fi 236*83ee113eSDavid van Moolenbroek 237*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ 238*83ee113eSDavid van Moolenbroek dev ${interface} scope global 239*83ee113eSDavid van Moolenbroek 240*83ee113eSDavid van Moolenbroek # Check for nameserver options. 241*83ee113eSDavid van Moolenbroek make_resolv_conf 242*83ee113eSDavid van Moolenbroek 243*83ee113eSDavid van Moolenbroek exit_with_hooks 0 244*83ee113eSDavid van Moolenbroekfi 245*83ee113eSDavid van Moolenbroek 246*83ee113eSDavid van Moolenbroekif [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ]; then 247*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then 248*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 249*83ee113eSDavid van Moolenbroek fi 250*83ee113eSDavid van Moolenbroek 251*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ 252*83ee113eSDavid van Moolenbroek dev ${interface} scope global 253*83ee113eSDavid van Moolenbroek 254*83ee113eSDavid van Moolenbroek # Make sure nothing has moved around on us. 255*83ee113eSDavid van Moolenbroek 256*83ee113eSDavid van Moolenbroek # Nameservers/domains/etc. 257*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || 258*83ee113eSDavid van Moolenbroek [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then 259*83ee113eSDavid van Moolenbroek make_resolv_conf 260*83ee113eSDavid van Moolenbroek fi 261*83ee113eSDavid van Moolenbroek 262*83ee113eSDavid van Moolenbroek exit_with_hooks 0 263*83ee113eSDavid van Moolenbroekfi 264*83ee113eSDavid van Moolenbroek 265*83ee113eSDavid van Moolenbroekif [ x$reason = xDEPREF6 ]; then 266*83ee113eSDavid van Moolenbroek if [ x${new_ip6_prefixlen} = x ] ; then 267*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 268*83ee113eSDavid van Moolenbroek fi 269*83ee113eSDavid van Moolenbroek 270*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ 271*83ee113eSDavid van Moolenbroek dev ${interface} scope global preferred_lft 0 272*83ee113eSDavid van Moolenbroek 273*83ee113eSDavid van Moolenbroek exit_with_hooks 0 274*83ee113eSDavid van Moolenbroekfi 275*83ee113eSDavid van Moolenbroek 276*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ]; then 277*83ee113eSDavid van Moolenbroek if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then 278*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 279*83ee113eSDavid van Moolenbroek fi 280*83ee113eSDavid van Moolenbroek 281*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ 282*83ee113eSDavid van Moolenbroek dev ${interface} 283*83ee113eSDavid van Moolenbroek 284*83ee113eSDavid van Moolenbroek exit_with_hooks 0 285*83ee113eSDavid van Moolenbroekfi 286*83ee113eSDavid van Moolenbroek 287*83ee113eSDavid van Moolenbroekexit_with_hooks 0 288