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