1*83ee113eSDavid van Moolenbroek#!/bin/sh 2*83ee113eSDavid van Moolenbroek 3*83ee113eSDavid van Moolenbroekmake_resolv_conf() { 4*83ee113eSDavid van Moolenbroek if [ x"$new_domain_name_servers" != x ]; then 5*83ee113eSDavid van Moolenbroek cat /dev/null > /etc/resolv.conf.dhclient 6*83ee113eSDavid van Moolenbroek if [ x"$new_domain_search" != x ]; then 7*83ee113eSDavid van Moolenbroek echo search $new_domain_search >> /etc/resolv.conf.dhclient 8*83ee113eSDavid van Moolenbroek elif [ x"$new_domain_name" != x ]; then 9*83ee113eSDavid van Moolenbroek # Note that the DHCP 'Domain Name Option' is really just a domain 10*83ee113eSDavid van Moolenbroek # name, and that this practice of using the domain name option as 11*83ee113eSDavid van Moolenbroek # a search path is both nonstandard and deprecated. 12*83ee113eSDavid van Moolenbroek echo search $new_domain_name >> /etc/resolv.conf.dhclient 13*83ee113eSDavid van Moolenbroek fi 14*83ee113eSDavid van Moolenbroek for nameserver in $new_domain_name_servers; do 15*83ee113eSDavid van Moolenbroek echo nameserver $nameserver >>/etc/resolv.conf.dhclient 16*83ee113eSDavid van Moolenbroek done 17*83ee113eSDavid van Moolenbroek 18*83ee113eSDavid van Moolenbroek mv /etc/resolv.conf.dhclient /etc/resolv.conf 19*83ee113eSDavid van Moolenbroek fi 20*83ee113eSDavid van Moolenbroek} 21*83ee113eSDavid van Moolenbroek 22*83ee113eSDavid van Moolenbroek# Must be used on exit. Invokes the local dhcp client exit hooks, if any. 23*83ee113eSDavid van Moolenbroekexit_with_hooks() { 24*83ee113eSDavid van Moolenbroek exit_status=$1 25*83ee113eSDavid van Moolenbroek if [ -f /etc/dhclient-exit-hooks ]; then 26*83ee113eSDavid van Moolenbroek . /etc/dhclient-exit-hooks 27*83ee113eSDavid van Moolenbroek fi 28*83ee113eSDavid van Moolenbroek# probably should do something with exit status of the local script 29*83ee113eSDavid van Moolenbroek exit $exit_status 30*83ee113eSDavid van Moolenbroek} 31*83ee113eSDavid van Moolenbroek 32*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist. 33*83ee113eSDavid van Moolenbroekif [ -f /etc/dhclient-enter-hooks ]; then 34*83ee113eSDavid van Moolenbroek exit_status=0 35*83ee113eSDavid van Moolenbroek . /etc/dhclient-enter-hooks 36*83ee113eSDavid van Moolenbroek # allow the local script to abort processing of this state 37*83ee113eSDavid van Moolenbroek # local script must set exit_status variable to nonzero. 38*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 39*83ee113eSDavid van Moolenbroek exit $exit_status 40*83ee113eSDavid van Moolenbroek fi 41*83ee113eSDavid van Moolenbroekfi 42*83ee113eSDavid van Moolenbroek 43*83ee113eSDavid van Moolenbroekif [ x$new_broadcast_address != x ]; then 44*83ee113eSDavid van Moolenbroek new_broadcast_arg="broadcast $new_broadcast_address" 45*83ee113eSDavid van Moolenbroekfi 46*83ee113eSDavid van Moolenbroekif [ x$old_broadcast_address != x ]; then 47*83ee113eSDavid van Moolenbroek old_broadcast_arg="broadcast $old_broadcast_address" 48*83ee113eSDavid van Moolenbroekfi 49*83ee113eSDavid van Moolenbroekif [ x$new_subnet_mask != x ]; then 50*83ee113eSDavid van Moolenbroek new_netmask_arg="netmask $new_subnet_mask" 51*83ee113eSDavid van Moolenbroekfi 52*83ee113eSDavid van Moolenbroekif [ x$old_subnet_mask != x ]; then 53*83ee113eSDavid van Moolenbroek old_netmask_arg="netmask $old_subnet_mask" 54*83ee113eSDavid van Moolenbroekfi 55*83ee113eSDavid van Moolenbroekif [ x$alias_subnet_mask != x ]; then 56*83ee113eSDavid van Moolenbroek alias_subnet_arg="netmask $alias_subnet_mask" 57*83ee113eSDavid van Moolenbroekfi 58*83ee113eSDavid van Moolenbroek if [ x$new_interface_mtu != x ]; then 59*83ee113eSDavid van Moolenbroek mtu_arg="mtu $new_interface_mtu" 60*83ee113eSDavid van Moolenbroek fi 61*83ee113eSDavid van Moolenbroekif [ x$IF_METRIC != x ]; then 62*83ee113eSDavid van Moolenbroek metric_arg="metric $IF_METRIC" 63*83ee113eSDavid van Moolenbroekfi 64*83ee113eSDavid van Moolenbroek 65*83ee113eSDavid van Moolenbroekifconfig=/sbin/ifconfig 66*83ee113eSDavid van Moolenbroek 67*83ee113eSDavid van Moolenbroekrelease=`uname -r` 68*83ee113eSDavid van Moolenbroekrelease=`expr $release : '\(.*\)\..*'` 69*83ee113eSDavid van Moolenbroekrelmajor=`echo $release |sed -e 's/^\([^\.]*\)\..*$/\1/'` 70*83ee113eSDavid van Moolenbroekrelminor=`echo $release |sed -e 's/^.*\.\([^\.]*\)$/\1/'` 71*83ee113eSDavid van Moolenbroek 72*83ee113eSDavid van Moolenbroekif [ x$reason = xMEDIUM ]; then 73*83ee113eSDavid van Moolenbroek eval "$ifconfig $interface $medium" 74*83ee113eSDavid van Moolenbroek $ifconfig $interface 75*83ee113eSDavid van Moolenbroek sleep 1 76*83ee113eSDavid van Moolenbroek exit_with_hooks 0 77*83ee113eSDavid van Moolenbroekfi 78*83ee113eSDavid van Moolenbroek 79*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT ]; then 80*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 81*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 0 down > /dev/null 2>&1 82*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 83*83ee113eSDavid van Moolenbroek fi 84*83ee113eSDavid van Moolenbroek if [ $relmajor -gt 5 ] || ( [ $relmajor -eq 5 ] && [ $relminor -ge 5 ] ) 85*83ee113eSDavid van Moolenbroek then 86*83ee113eSDavid van Moolenbroek # Turn the interface on 87*83ee113eSDavid van Moolenbroek $ifconfig $interface plumb 88*83ee113eSDavid van Moolenbroek $ifconfig $interface up 89*83ee113eSDavid van Moolenbroek else 90*83ee113eSDavid van Moolenbroek $ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ 91*83ee113eSDavid van Moolenbroek broadcast 255.255.255.255 up 92*83ee113eSDavid van Moolenbroek fi 93*83ee113eSDavid van Moolenbroek exit_with_hooks 0 94*83ee113eSDavid van Moolenbroekfi 95*83ee113eSDavid van Moolenbroek 96*83ee113eSDavid van Moolenbroekif [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then 97*83ee113eSDavid van Moolenbroek exit_with_hooks 0; 98*83ee113eSDavid van Moolenbroekfi 99*83ee113eSDavid van Moolenbroek 100*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ 101*83ee113eSDavid van Moolenbroek [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then 102*83ee113eSDavid van Moolenbroek current_hostname=`hostname` 103*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 104*83ee113eSDavid van Moolenbroek [ x$current_hostname = x$old_host_name ]; then 105*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 106*83ee113eSDavid van Moolenbroek [ x$new_host_name != x$old_host_name ]; then 107*83ee113eSDavid van Moolenbroek hostname $new_host_name 108*83ee113eSDavid van Moolenbroek fi 109*83ee113eSDavid van Moolenbroek fi 110*83ee113eSDavid van Moolenbroek 111*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ 112*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x$old_ip_address ]; then 113*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 inet 0 down > /dev/null 2>&1 114*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 115*83ee113eSDavid van Moolenbroek fi 116*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then 117*83ee113eSDavid van Moolenbroek $ifconfig ${interface} inet 0 down 118*83ee113eSDavid van Moolenbroek route delete $old_ip_address 127.1 >/dev/null 2>&1 119*83ee113eSDavid van Moolenbroek for router in $old_routers; do 120*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 121*83ee113eSDavid van Moolenbroek done 122*83ee113eSDavid van Moolenbroek fi 123*83ee113eSDavid van Moolenbroek if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ 124*83ee113eSDavid van Moolenbroek [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then 125*83ee113eSDavid van Moolenbroek eval "$ifconfig $interface inet $new_ip_address $new_netmask_arg \ 126*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg $metric_arg $medium" 127*83ee113eSDavid van Moolenbroek route add $new_ip_address 127.1 1 >/dev/null 2>&1 128*83ee113eSDavid van Moolenbroek for router in $new_routers; do 129*83ee113eSDavid van Moolenbroek route add default $router 1 >/dev/null 2>&1 130*83ee113eSDavid van Moolenbroek done 131*83ee113eSDavid van Moolenbroek else 132*83ee113eSDavid van Moolenbroek # we haven't changed the address, have we changed other options 133*83ee113eSDavid van Moolenbroek # that we wish to update? 134*83ee113eSDavid van Moolenbroek if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then 135*83ee113eSDavid van Moolenbroek # if we've changed routers delete the old and add the new. 136*83ee113eSDavid van Moolenbroek $LOGGER "New Routers: $new_routers" 137*83ee113eSDavid van Moolenbroek for router in $old_routers; do 138*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 139*83ee113eSDavid van Moolenbroek done 140*83ee113eSDavid van Moolenbroek for router in $new_routers; do 141*83ee113eSDavid van Moolenbroek route add default $router 1 >/dev/null 2>&1 142*83ee113eSDavid van Moolenbroek done 143*83ee113eSDavid van Moolenbroek fi 144*83ee113eSDavid van Moolenbroek fi 145*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; 146*83ee113eSDavid van Moolenbroek then 147*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 inet $alias_ip_address $alias_subnet_arg 148*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 1 149*83ee113eSDavid van Moolenbroek fi 150*83ee113eSDavid van Moolenbroek make_resolv_conf 151*83ee113eSDavid van Moolenbroek exit_with_hooks 0 152*83ee113eSDavid van Moolenbroekfi 153*83ee113eSDavid van Moolenbroek 154*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ 155*83ee113eSDavid van Moolenbroek || [ x$reason = xSTOP ]; then 156*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 157*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 0 down > /dev/null 2>&1 158*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 159*83ee113eSDavid van Moolenbroek fi 160*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ]; then 161*83ee113eSDavid van Moolenbroek $ifconfig $interface inet 0 down 162*83ee113eSDavid van Moolenbroek route delete $old_ip_address 127.1 >/dev/null 2>&1 163*83ee113eSDavid van Moolenbroek for router in $old_routers; do 164*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 165*83ee113eSDavid van Moolenbroek done 166*83ee113eSDavid van Moolenbroek fi 167*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 168*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 inet $alias_ip_address $alias_subnet_arg 169*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 1 170*83ee113eSDavid van Moolenbroek fi 171*83ee113eSDavid van Moolenbroek exit_with_hooks 0 172*83ee113eSDavid van Moolenbroekfi 173*83ee113eSDavid van Moolenbroek 174*83ee113eSDavid van Moolenbroekif [ x$reason = xTIMEOUT ]; then 175*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 176*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 0 down > /dev/null 2>&1 177*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 178*83ee113eSDavid van Moolenbroek fi 179*83ee113eSDavid van Moolenbroek eval "$ifconfig $interface inet $new_ip_address $new_netmask_arg \ 180*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg $metric_arg $medium" 181*83ee113eSDavid van Moolenbroek sleep 1 182*83ee113eSDavid van Moolenbroek set $new_routers 183*83ee113eSDavid van Moolenbroek if ping -s -n -I 1 $1 64 1; then 184*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && \ 185*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x ]; then 186*83ee113eSDavid van Moolenbroek $ifconfig ${interface}:1 inet $alias_ip_address $alias_subnet_arg 187*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 1 188*83ee113eSDavid van Moolenbroek fi 189*83ee113eSDavid van Moolenbroek route add $new_ip_address 127.1 1 >/dev/null 2>&1 190*83ee113eSDavid van Moolenbroek for router in $new_routers; do 191*83ee113eSDavid van Moolenbroek route add default $router 1 >/dev/null 2>&1 192*83ee113eSDavid van Moolenbroek done 193*83ee113eSDavid van Moolenbroek make_resolv_conf 194*83ee113eSDavid van Moolenbroek exit_with_hooks 0 195*83ee113eSDavid van Moolenbroek fi 196*83ee113eSDavid van Moolenbroek $ifconfig $interface inet 0 down 197*83ee113eSDavid van Moolenbroek for router in $old_routers; do 198*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 199*83ee113eSDavid van Moolenbroek done 200*83ee113eSDavid van Moolenbroek exit_with_hooks 1 201*83ee113eSDavid van Moolenbroekfi 202*83ee113eSDavid van Moolenbroek 203*83ee113eSDavid van Moolenbroekexit_with_hooks 0 204