1*2ad0f3f2SLuigi Rizzo#!/bin/sh 2*2ad0f3f2SLuigi Rizzo# 3*2ad0f3f2SLuigi Rizzo# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $ 4*2ad0f3f2SLuigi Rizzo# $FreeBSD$ 5*2ad0f3f2SLuigi Rizzo# 6*2ad0f3f2SLuigi Rizzo# Copyright (c) 2003 Kenneth R Westerback <[email protected]> 7*2ad0f3f2SLuigi Rizzo# 8*2ad0f3f2SLuigi Rizzo# Permission to use, copy, modify, and distribute this software for any 9*2ad0f3f2SLuigi Rizzo# purpose with or without fee is hereby granted, provided that the above 10*2ad0f3f2SLuigi Rizzo# copyright notice and this permission notice appear in all copies. 11*2ad0f3f2SLuigi Rizzo# 12*2ad0f3f2SLuigi Rizzo# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13*2ad0f3f2SLuigi Rizzo# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14*2ad0f3f2SLuigi Rizzo# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15*2ad0f3f2SLuigi Rizzo# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16*2ad0f3f2SLuigi Rizzo# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17*2ad0f3f2SLuigi Rizzo# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18*2ad0f3f2SLuigi Rizzo# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19*2ad0f3f2SLuigi Rizzo# 20*2ad0f3f2SLuigi Rizzo# 21*2ad0f3f2SLuigi Rizzo 22*2ad0f3f2SLuigi RizzoARP=/usr/sbin/arp 23*2ad0f3f2SLuigi RizzoHOSTNAME=/bin/hostname 24*2ad0f3f2SLuigi RizzoIFCONFIG='/sbin/ifconfig -n' 25*2ad0f3f2SLuigi Rizzo 26*2ad0f3f2SLuigi RizzoLOCALHOST=127.0.0.1 27*2ad0f3f2SLuigi Rizzo 28*2ad0f3f2SLuigi Rizzoif [ -x /usr/bin/logger ]; then 29*2ad0f3f2SLuigi Rizzo LOGGER="/usr/bin/logger -s -p user.notice -t dhclient" 30*2ad0f3f2SLuigi Rizzoelse 31*2ad0f3f2SLuigi Rizzo LOGGER=echo 32*2ad0f3f2SLuigi Rizzofi 33*2ad0f3f2SLuigi Rizzo 34*2ad0f3f2SLuigi Rizzo# 35*2ad0f3f2SLuigi Rizzo# Helper functions that implement common actions. 36*2ad0f3f2SLuigi Rizzo# 37*2ad0f3f2SLuigi Rizzo 38*2ad0f3f2SLuigi Rizzocheck_hostname() { 39*2ad0f3f2SLuigi Rizzo current_hostname=`$HOSTNAME` 40*2ad0f3f2SLuigi Rizzo if [ -z "$current_hostname" ]; then 41*2ad0f3f2SLuigi Rizzo $LOGGER "New Hostname ($interface): $new_host_name" 42*2ad0f3f2SLuigi Rizzo $HOSTNAME $new_host_name 43*2ad0f3f2SLuigi Rizzo elif [ "$current_hostname" = "$old_host_name" -a \ 44*2ad0f3f2SLuigi Rizzo "$new_host_name" != "$old_host_name" ]; then 45*2ad0f3f2SLuigi Rizzo $LOGGER "New Hostname ($interface): $new_host_name" 46*2ad0f3f2SLuigi Rizzo $HOSTNAME $new_host_name 47*2ad0f3f2SLuigi Rizzo fi 48*2ad0f3f2SLuigi Rizzo} 49*2ad0f3f2SLuigi Rizzo 50*2ad0f3f2SLuigi Rizzoarp_flush() { 51*2ad0f3f2SLuigi Rizzo arp -an -i $interface | \ 52*2ad0f3f2SLuigi Rizzo sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \ 53*2ad0f3f2SLuigi Rizzo sh >/dev/null 2>&1 54*2ad0f3f2SLuigi Rizzo} 55*2ad0f3f2SLuigi Rizzo 56*2ad0f3f2SLuigi Rizzodelete_old_address() { 57*2ad0f3f2SLuigi Rizzo eval "$IFCONFIG $interface inet -alias $old_ip_address $medium" 58*2ad0f3f2SLuigi Rizzo} 59*2ad0f3f2SLuigi Rizzo 60*2ad0f3f2SLuigi Rizzoadd_new_address() { 61*2ad0f3f2SLuigi Rizzo eval "$IFCONFIG $interface \ 62*2ad0f3f2SLuigi Rizzo inet $new_ip_address \ 63*2ad0f3f2SLuigi Rizzo netmask $new_subnet_mask \ 64*2ad0f3f2SLuigi Rizzo broadcast $new_broadcast_address \ 65*2ad0f3f2SLuigi Rizzo $medium" 66*2ad0f3f2SLuigi Rizzo 67*2ad0f3f2SLuigi Rizzo $LOGGER "New IP Address ($interface): $new_ip_address" 68*2ad0f3f2SLuigi Rizzo $LOGGER "New Subnet Mask ($interface): $new_subnet_mask" 69*2ad0f3f2SLuigi Rizzo $LOGGER "New Broadcast Address ($interface): $new_broadcast_address" 70*2ad0f3f2SLuigi Rizzo $LOGGER "New Routers ($interface): $new_routers" 71*2ad0f3f2SLuigi Rizzo} 72*2ad0f3f2SLuigi Rizzo 73*2ad0f3f2SLuigi Rizzodelete_old_alias() { 74*2ad0f3f2SLuigi Rizzo if [ -n "$alias_ip_address" ]; then 75*2ad0f3f2SLuigi Rizzo $IFCONFIG $interface inet -alias $alias_ip_address > /dev/null 2>&1 76*2ad0f3f2SLuigi Rizzo #route delete $alias_ip_address $LOCALHOST > /dev/null 2>&1 77*2ad0f3f2SLuigi Rizzo fi 78*2ad0f3f2SLuigi Rizzo} 79*2ad0f3f2SLuigi Rizzo 80*2ad0f3f2SLuigi Rizzoadd_new_alias() { 81*2ad0f3f2SLuigi Rizzo if [ -n "$alias_ip_address" ]; then 82*2ad0f3f2SLuigi Rizzo $IFCONFIG $interface inet alias $alias_ip_address netmask \ 83*2ad0f3f2SLuigi Rizzo $alias_subnet_mask 84*2ad0f3f2SLuigi Rizzo #route add $alias_ip_address $LOCALHOST 85*2ad0f3f2SLuigi Rizzo fi 86*2ad0f3f2SLuigi Rizzo} 87*2ad0f3f2SLuigi Rizzo 88*2ad0f3f2SLuigi Rizzofill_classless_routes() { 89*2ad0f3f2SLuigi Rizzo set $1 90*2ad0f3f2SLuigi Rizzo while [ $# -ge 5 ]; do 91*2ad0f3f2SLuigi Rizzo if [ $1 -eq 0 ]; then 92*2ad0f3f2SLuigi Rizzo route="default" 93*2ad0f3f2SLuigi Rizzo elif [ $1 -le 8 ]; then 94*2ad0f3f2SLuigi Rizzo route="$2.0.0.0/$1" 95*2ad0f3f2SLuigi Rizzo shift 96*2ad0f3f2SLuigi Rizzo elif [ $1 -le 16 ]; then 97*2ad0f3f2SLuigi Rizzo route="$2.$3.0.0/$1" 98*2ad0f3f2SLuigi Rizzo shift; shift 99*2ad0f3f2SLuigi Rizzo elif [ $1 -le 24 ]; then 100*2ad0f3f2SLuigi Rizzo route="$2.$3.$4.0/$1" 101*2ad0f3f2SLuigi Rizzo shift; shift; shift 102*2ad0f3f2SLuigi Rizzo else 103*2ad0f3f2SLuigi Rizzo route="$2.$3.$4.$5/$1" 104*2ad0f3f2SLuigi Rizzo shift; shift; shift; shift 105*2ad0f3f2SLuigi Rizzo fi 106*2ad0f3f2SLuigi Rizzo shift 107*2ad0f3f2SLuigi Rizzo router="$1.$2.$3.$4" 108*2ad0f3f2SLuigi Rizzo classless_routes="$classless_routes $route $router" 109*2ad0f3f2SLuigi Rizzo shift; shift; shift; shift 110*2ad0f3f2SLuigi Rizzo done 111*2ad0f3f2SLuigi Rizzo} 112*2ad0f3f2SLuigi Rizzo 113*2ad0f3f2SLuigi Rizzodelete_old_routes() { 114*2ad0f3f2SLuigi Rizzo #route delete "$old_ip_address" $LOCALHOST >/dev/null 2>&1 115*2ad0f3f2SLuigi Rizzo if [ -n "$old_classless_routes" ]; then 116*2ad0f3f2SLuigi Rizzo fill_classless_routes "$old_classless_routes" 117*2ad0f3f2SLuigi Rizzo set $classless_routes 118*2ad0f3f2SLuigi Rizzo while [ $# -gt 1 ]; do 119*2ad0f3f2SLuigi Rizzo route delete "$1" "$2" 120*2ad0f3f2SLuigi Rizzo shift; shift 121*2ad0f3f2SLuigi Rizzo done 122*2ad0f3f2SLuigi Rizzo return 0; 123*2ad0f3f2SLuigi Rizzo fi 124*2ad0f3f2SLuigi Rizzo 125*2ad0f3f2SLuigi Rizzo # If we supported multiple default routes, we'd be removing each 126*2ad0f3f2SLuigi Rizzo # one here. We don't so just delete the default route if it's 127*2ad0f3f2SLuigi Rizzo # through our interface. 128*2ad0f3f2SLuigi Rizzo if is_default_interface; then 129*2ad0f3f2SLuigi Rizzo route delete default >/dev/null 2>&1 130*2ad0f3f2SLuigi Rizzo fi 131*2ad0f3f2SLuigi Rizzo 132*2ad0f3f2SLuigi Rizzo if [ -n "$old_static_routes" ]; then 133*2ad0f3f2SLuigi Rizzo set $old_static_routes 134*2ad0f3f2SLuigi Rizzo while [ $# -gt 1 ]; do 135*2ad0f3f2SLuigi Rizzo route delete "$1" "$2" 136*2ad0f3f2SLuigi Rizzo shift; shift 137*2ad0f3f2SLuigi Rizzo done 138*2ad0f3f2SLuigi Rizzo fi 139*2ad0f3f2SLuigi Rizzo 140*2ad0f3f2SLuigi Rizzo arp_flush 141*2ad0f3f2SLuigi Rizzo} 142*2ad0f3f2SLuigi Rizzo 143*2ad0f3f2SLuigi Rizzoadd_new_routes() { 144*2ad0f3f2SLuigi Rizzo #route add $new_ip_address $LOCALHOST >/dev/null 2>&1 145*2ad0f3f2SLuigi Rizzo 146*2ad0f3f2SLuigi Rizzo # RFC 3442: If the DHCP server returns both a Classless Static 147*2ad0f3f2SLuigi Rizzo # Routes option and a Router option, the DHCP client MUST ignore 148*2ad0f3f2SLuigi Rizzo # the Router option. 149*2ad0f3f2SLuigi Rizzo # 150*2ad0f3f2SLuigi Rizzo # DHCP clients that support this option (Classless Static Routes) 151*2ad0f3f2SLuigi Rizzo # MUST NOT install the routes specified in the Static Routes 152*2ad0f3f2SLuigi Rizzo # option (option code 33) if both a Static Routes option and the 153*2ad0f3f2SLuigi Rizzo # Classless Static Routes option are provided. 154*2ad0f3f2SLuigi Rizzo 155*2ad0f3f2SLuigi Rizzo if [ -n "$new_classless_routes" ]; then 156*2ad0f3f2SLuigi Rizzo fill_classless_routes "$new_classless_routes" 157*2ad0f3f2SLuigi Rizzo $LOGGER "New Classless Static Routes ($interface): $classless_routes" 158*2ad0f3f2SLuigi Rizzo set $classless_routes 159*2ad0f3f2SLuigi Rizzo while [ $# -gt 1 ]; do 160*2ad0f3f2SLuigi Rizzo if [ "0.0.0.0" = "$2" ]; then 161*2ad0f3f2SLuigi Rizzo route add "$1" -iface "$interface" 162*2ad0f3f2SLuigi Rizzo else 163*2ad0f3f2SLuigi Rizzo route add "$1" "$2" 164*2ad0f3f2SLuigi Rizzo fi 165*2ad0f3f2SLuigi Rizzo shift; shift 166*2ad0f3f2SLuigi Rizzo done 167*2ad0f3f2SLuigi Rizzo return 168*2ad0f3f2SLuigi Rizzo fi 169*2ad0f3f2SLuigi Rizzo 170*2ad0f3f2SLuigi Rizzo for router in $new_routers; do 171*2ad0f3f2SLuigi Rizzo if is_default_interface; then 172*2ad0f3f2SLuigi Rizzo 173*2ad0f3f2SLuigi Rizzo if [ "$new_ip_address" = "$router" ]; then 174*2ad0f3f2SLuigi Rizzo route add default -iface $router >/dev/null 2>&1 175*2ad0f3f2SLuigi Rizzo else 176*2ad0f3f2SLuigi Rizzo route add default $router >/dev/null 2>&1 177*2ad0f3f2SLuigi Rizzo fi 178*2ad0f3f2SLuigi Rizzo fi 179*2ad0f3f2SLuigi Rizzo # 2nd and subsequent default routers error out, so explicitly 180*2ad0f3f2SLuigi Rizzo # stop processing the list after the first one. 181*2ad0f3f2SLuigi Rizzo break 182*2ad0f3f2SLuigi Rizzo done 183*2ad0f3f2SLuigi Rizzo 184*2ad0f3f2SLuigi Rizzo if [ -n "$new_static_routes" ]; then 185*2ad0f3f2SLuigi Rizzo $LOGGER "New Static Routes ($interface): $new_static_routes" 186*2ad0f3f2SLuigi Rizzo set $new_static_routes 187*2ad0f3f2SLuigi Rizzo while [ $# -gt 1 ]; do 188*2ad0f3f2SLuigi Rizzo route add $1 $2 189*2ad0f3f2SLuigi Rizzo shift; shift 190*2ad0f3f2SLuigi Rizzo done 191*2ad0f3f2SLuigi Rizzo fi 192*2ad0f3f2SLuigi Rizzo} 193*2ad0f3f2SLuigi Rizzo 194*2ad0f3f2SLuigi Rizzoadd_new_resolv_conf() { 195*2ad0f3f2SLuigi Rizzo # XXX Old code did not create/update resolv.conf unless both 196*2ad0f3f2SLuigi Rizzo # $new_domain_name and $new_domain_name_servers were provided. PR 197*2ad0f3f2SLuigi Rizzo # #3135 reported some ISP's only provide $new_domain_name_servers and 198*2ad0f3f2SLuigi Rizzo # thus broke the script. This code creates the resolv.conf if either 199*2ad0f3f2SLuigi Rizzo # are provided. 200*2ad0f3f2SLuigi Rizzo 201*2ad0f3f2SLuigi Rizzo local tmpres=/var/run/resolv.conf.${interface} 202*2ad0f3f2SLuigi Rizzo rm -f $tmpres 203*2ad0f3f2SLuigi Rizzo 204*2ad0f3f2SLuigi Rizzo if [ -n "$new_domain_name" ]; then 205*2ad0f3f2SLuigi Rizzo echo "search $new_domain_name" >>$tmpres 206*2ad0f3f2SLuigi Rizzo fi 207*2ad0f3f2SLuigi Rizzo 208*2ad0f3f2SLuigi Rizzo if [ -n "$new_domain_name_servers" ]; then 209*2ad0f3f2SLuigi Rizzo for nameserver in $new_domain_name_servers; do 210*2ad0f3f2SLuigi Rizzo echo "nameserver $nameserver" >>$tmpres 211*2ad0f3f2SLuigi Rizzo done 212*2ad0f3f2SLuigi Rizzo fi 213*2ad0f3f2SLuigi Rizzo 214*2ad0f3f2SLuigi Rizzo if [ -f $tmpres ]; then 215*2ad0f3f2SLuigi Rizzo if [ -f /etc/resolv.conf.tail ]; then 216*2ad0f3f2SLuigi Rizzo cat /etc/resolv.conf.tail >>$tmpres 217*2ad0f3f2SLuigi Rizzo fi 218*2ad0f3f2SLuigi Rizzo 219*2ad0f3f2SLuigi Rizzo # When resolv.conf is not changed actually, we don't 220*2ad0f3f2SLuigi Rizzo # need to update it. 221*2ad0f3f2SLuigi Rizzo # If /usr is not mounted yet, we cannot use cmp, then 222*2ad0f3f2SLuigi Rizzo # the following test fails. In such case, we simply 223*2ad0f3f2SLuigi Rizzo # ignore an error and do update resolv.conf. 224*2ad0f3f2SLuigi Rizzo if cmp -s $tmpres /etc/resolv.conf; then 225*2ad0f3f2SLuigi Rizzo rm -f $tmpres 226*2ad0f3f2SLuigi Rizzo return 0 227*2ad0f3f2SLuigi Rizzo fi 2>/dev/null 228*2ad0f3f2SLuigi Rizzo 229*2ad0f3f2SLuigi Rizzo # In case (e.g. during OpenBSD installs) /etc/resolv.conf 230*2ad0f3f2SLuigi Rizzo # is a symbolic link, take care to preserve the link and write 231*2ad0f3f2SLuigi Rizzo # the new data in the correct location. 232*2ad0f3f2SLuigi Rizzo 233*2ad0f3f2SLuigi Rizzo if [ -f /etc/resolv.conf ]; then 234*2ad0f3f2SLuigi Rizzo cat /etc/resolv.conf > /etc/resolv.conf.save 235*2ad0f3f2SLuigi Rizzo fi 236*2ad0f3f2SLuigi Rizzo cat $tmpres > /etc/resolv.conf 237*2ad0f3f2SLuigi Rizzo rm -f $tmpres 238*2ad0f3f2SLuigi Rizzo 239*2ad0f3f2SLuigi Rizzo # Try to ensure correct ownership and permissions. 240*2ad0f3f2SLuigi Rizzo chown -RL root:wheel /etc/resolv.conf 241*2ad0f3f2SLuigi Rizzo chmod -RL 644 /etc/resolv.conf 242*2ad0f3f2SLuigi Rizzo 243*2ad0f3f2SLuigi Rizzo return 0 244*2ad0f3f2SLuigi Rizzo fi 245*2ad0f3f2SLuigi Rizzo 246*2ad0f3f2SLuigi Rizzo return 1 247*2ad0f3f2SLuigi Rizzo} 248*2ad0f3f2SLuigi Rizzo 249*2ad0f3f2SLuigi Rizzo# Must be used on exit. Invokes the local dhcp client exit hooks, if any. 250*2ad0f3f2SLuigi Rizzoexit_with_hooks() { 251*2ad0f3f2SLuigi Rizzo exit_status=$1 252*2ad0f3f2SLuigi Rizzo if [ -f /etc/dhclient-exit-hooks ]; then 253*2ad0f3f2SLuigi Rizzo . /etc/dhclient-exit-hooks 254*2ad0f3f2SLuigi Rizzo fi 255*2ad0f3f2SLuigi Rizzo # probably should do something with exit status of the local script 256*2ad0f3f2SLuigi Rizzo exit $exit_status 257*2ad0f3f2SLuigi Rizzo} 258*2ad0f3f2SLuigi Rizzo 259*2ad0f3f2SLuigi Rizzo# Get the interface with the current ipv4 default route on it using only 260*2ad0f3f2SLuigi Rizzo# commands that are available prior to /usr being mounted. 261*2ad0f3f2SLuigi Rizzois_default_interface() 262*2ad0f3f2SLuigi Rizzo{ 263*2ad0f3f2SLuigi Rizzo routeget="`route -n get -inet default`" 264*2ad0f3f2SLuigi Rizzo oldifs="$IFS" 265*2ad0f3f2SLuigi Rizzo IFS=" 266*2ad0f3f2SLuigi Rizzo" 267*2ad0f3f2SLuigi Rizzo defif= 268*2ad0f3f2SLuigi Rizzo for line in $routeget ; do 269*2ad0f3f2SLuigi Rizzo case $line in 270*2ad0f3f2SLuigi Rizzo *interface:*) 271*2ad0f3f2SLuigi Rizzo defif=${line##*: } 272*2ad0f3f2SLuigi Rizzo ;; 273*2ad0f3f2SLuigi Rizzo esac 274*2ad0f3f2SLuigi Rizzo done 275*2ad0f3f2SLuigi Rizzo IFS=${oldifs} 276*2ad0f3f2SLuigi Rizzo 277*2ad0f3f2SLuigi Rizzo if [ -z "$defif" -o "$defif" = "$interface" ]; then 278*2ad0f3f2SLuigi Rizzo return 0 279*2ad0f3f2SLuigi Rizzo else 280*2ad0f3f2SLuigi Rizzo return 1 281*2ad0f3f2SLuigi Rizzo fi 282*2ad0f3f2SLuigi Rizzo} 283*2ad0f3f2SLuigi Rizzo 284*2ad0f3f2SLuigi Rizzo# 285*2ad0f3f2SLuigi Rizzo# Start of active code. 286*2ad0f3f2SLuigi Rizzo# 287*2ad0f3f2SLuigi Rizzo 288*2ad0f3f2SLuigi Rizzo# Invoke the local dhcp client enter hooks, if they exist. 289*2ad0f3f2SLuigi Rizzoif [ -f /etc/dhclient-enter-hooks ]; then 290*2ad0f3f2SLuigi Rizzo exit_status=0 291*2ad0f3f2SLuigi Rizzo . /etc/dhclient-enter-hooks 292*2ad0f3f2SLuigi Rizzo # allow the local script to abort processing of this state 293*2ad0f3f2SLuigi Rizzo # local script must set exit_status variable to nonzero. 294*2ad0f3f2SLuigi Rizzo if [ $exit_status -ne 0 ]; then 295*2ad0f3f2SLuigi Rizzo exit $exit_status 296*2ad0f3f2SLuigi Rizzo fi 297*2ad0f3f2SLuigi Rizzofi 298*2ad0f3f2SLuigi Rizzo 299*2ad0f3f2SLuigi Rizzocase $reason in 300*2ad0f3f2SLuigi RizzoMEDIUM) 301*2ad0f3f2SLuigi Rizzo eval "$IFCONFIG $interface $medium" 302*2ad0f3f2SLuigi Rizzo eval "$IFCONFIG $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1 303*2ad0f3f2SLuigi Rizzo sleep 1 304*2ad0f3f2SLuigi Rizzo ;; 305*2ad0f3f2SLuigi Rizzo 306*2ad0f3f2SLuigi RizzoPREINIT) 307*2ad0f3f2SLuigi Rizzo delete_old_alias 308*2ad0f3f2SLuigi Rizzo $IFCONFIG $interface inet alias 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up 309*2ad0f3f2SLuigi Rizzo ;; 310*2ad0f3f2SLuigi Rizzo 311*2ad0f3f2SLuigi RizzoARPCHECK|ARPSEND) 312*2ad0f3f2SLuigi Rizzo ;; 313*2ad0f3f2SLuigi Rizzo 314*2ad0f3f2SLuigi RizzoBOUND|RENEW|REBIND|REBOOT) 315*2ad0f3f2SLuigi Rizzo check_hostname 316*2ad0f3f2SLuigi Rizzo if [ -n "$old_ip_address" ]; then 317*2ad0f3f2SLuigi Rizzo if [ "$old_ip_address" != "$alias_ip_address" ]; then 318*2ad0f3f2SLuigi Rizzo delete_old_alias 319*2ad0f3f2SLuigi Rizzo fi 320*2ad0f3f2SLuigi Rizzo if [ "$old_ip_address" != "$new_ip_address" ]; then 321*2ad0f3f2SLuigi Rizzo delete_old_address 322*2ad0f3f2SLuigi Rizzo delete_old_routes 323*2ad0f3f2SLuigi Rizzo fi 324*2ad0f3f2SLuigi Rizzo fi 325*2ad0f3f2SLuigi Rizzo if [ "$reason" = BOUND ] || \ 326*2ad0f3f2SLuigi Rizzo [ "$reason" = REBOOT ] || \ 327*2ad0f3f2SLuigi Rizzo [ -z "$old_ip_address" ] || \ 328*2ad0f3f2SLuigi Rizzo [ "$old_ip_address" != "$new_ip_address" ]; then 329*2ad0f3f2SLuigi Rizzo add_new_address 330*2ad0f3f2SLuigi Rizzo add_new_routes 331*2ad0f3f2SLuigi Rizzo fi 332*2ad0f3f2SLuigi Rizzo if [ "$new_ip_address" != "$alias_ip_address" ]; then 333*2ad0f3f2SLuigi Rizzo add_new_alias 334*2ad0f3f2SLuigi Rizzo fi 335*2ad0f3f2SLuigi Rizzo if is_default_interface; then 336*2ad0f3f2SLuigi Rizzo add_new_resolv_conf 337*2ad0f3f2SLuigi Rizzo fi 338*2ad0f3f2SLuigi Rizzo ;; 339*2ad0f3f2SLuigi Rizzo 340*2ad0f3f2SLuigi RizzoEXPIRE|FAIL) 341*2ad0f3f2SLuigi Rizzo delete_old_alias 342*2ad0f3f2SLuigi Rizzo if [ -n "$old_ip_address" ]; then 343*2ad0f3f2SLuigi Rizzo delete_old_address 344*2ad0f3f2SLuigi Rizzo delete_old_routes 345*2ad0f3f2SLuigi Rizzo fi 346*2ad0f3f2SLuigi Rizzo if [ -x $ARP ]; then 347*2ad0f3f2SLuigi Rizzo $ARP -d -a -i $interface 348*2ad0f3f2SLuigi Rizzo fi 349*2ad0f3f2SLuigi Rizzo # XXX Why add alias we just deleted above? 350*2ad0f3f2SLuigi Rizzo add_new_alias 351*2ad0f3f2SLuigi Rizzo if is_default_interface; then 352*2ad0f3f2SLuigi Rizzo if [ -f /etc/resolv.conf.save ]; then 353*2ad0f3f2SLuigi Rizzo cat /etc/resolv.conf.save > /etc/resolv.conf 354*2ad0f3f2SLuigi Rizzo fi 355*2ad0f3f2SLuigi Rizzo fi 356*2ad0f3f2SLuigi Rizzo ;; 357*2ad0f3f2SLuigi Rizzo 358*2ad0f3f2SLuigi RizzoTIMEOUT) 359*2ad0f3f2SLuigi Rizzo delete_old_alias 360*2ad0f3f2SLuigi Rizzo add_new_address 361*2ad0f3f2SLuigi Rizzo sleep 1 362*2ad0f3f2SLuigi Rizzo if [ -n "$new_routers" ]; then 363*2ad0f3f2SLuigi Rizzo $LOGGER "New Routers ($interface): $new_routers" 364*2ad0f3f2SLuigi Rizzo set "$new_routers" 365*2ad0f3f2SLuigi Rizzo if ping -q -c 1 -t 1 "$1"; then 366*2ad0f3f2SLuigi Rizzo if [ "$new_ip_address" != "$alias_ip_address" ]; then 367*2ad0f3f2SLuigi Rizzo add_new_alias 368*2ad0f3f2SLuigi Rizzo fi 369*2ad0f3f2SLuigi Rizzo add_new_routes 370*2ad0f3f2SLuigi Rizzo if ! is_default_interface; then 371*2ad0f3f2SLuigi Rizzo exit_with_hooks 0 372*2ad0f3f2SLuigi Rizzo fi 373*2ad0f3f2SLuigi Rizzo if add_new_resolv_conf; then 374*2ad0f3f2SLuigi Rizzo exit_with_hooks 0 375*2ad0f3f2SLuigi Rizzo fi 376*2ad0f3f2SLuigi Rizzo fi 377*2ad0f3f2SLuigi Rizzo fi 378*2ad0f3f2SLuigi Rizzo eval "$IFCONFIG $interface inet -alias $new_ip_address $medium" 379*2ad0f3f2SLuigi Rizzo delete_old_routes 380*2ad0f3f2SLuigi Rizzo exit_with_hooks 1 381*2ad0f3f2SLuigi Rizzo ;; 382*2ad0f3f2SLuigi Rizzoesac 383*2ad0f3f2SLuigi Rizzo 384*2ad0f3f2SLuigi Rizzoexit_with_hooks 0 385