diff options
author | Kenneth R Westerback <krw@cvs.openbsd.org> | 2003-06-10 23:38:18 +0000 |
---|---|---|
committer | Kenneth R Westerback <krw@cvs.openbsd.org> | 2003-06-10 23:38:18 +0000 |
commit | f65ddfd7f79269e91297d03c69c08c3b6144f668 (patch) | |
tree | f767a61d4fc91ced44558f57cc61b732eb814798 /usr.sbin | |
parent | a3c95338e9818a500e9c35403dca0ee1b8b7dc12 (diff) |
Rework script using advanced coding techniques like a case statement,
factoring out common code to functions, consistant indenting, etc.
Should be no semantic changes, just much easier to read, except for
ensuring that certain cable companies no longer confuse the issue by
supplying name server addresses without a domain name. Either will now
result in the creation of an appropriate resolv.conf
Inspired by PRs #2969 from Alexander Taler and #3135 from Jan
Johansson. Fixes #3135 completely according to Jan. #2969 may have
another item to fix.
Tested by various, including tech@'ers Jan Johansson, Uwe A. P.
Wuerdinger and Jim Rees.
Let the flood of enhancements begin now that it can actually be read
and understood ...
ok deraadt@.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/dhcp/dhclient/scripts/dhclient-script | 348 |
1 files changed, 179 insertions, 169 deletions
diff --git a/usr.sbin/dhcp/dhclient/scripts/dhclient-script b/usr.sbin/dhcp/dhclient/scripts/dhclient-script index 6dc23ba72e5..5c5d1395f05 100644 --- a/usr.sbin/dhcp/dhclient/scripts/dhclient-script +++ b/usr.sbin/dhcp/dhclient/scripts/dhclient-script @@ -1,184 +1,194 @@ #!/bin/sh # -# $OpenBSD: dhclient-script,v 1.11 2000/10/18 23:42:56 todd Exp $ +# $OpenBSD: dhclient-script,v 1.12 2003/06/10 23:38:17 krw Exp $ # -if [ "x$new_network_number" != "x" ]; then - echo "New Network Number: $new_network_number" -fi +# +# Helper functions that implement common actions. +# -if [ "x$new_broadcast_address" != "x" ]; then - echo "New Broadcast Address: $new_broadcast_address" -fi +delete_old_address() { + if [ -n "$old_ip_address" ]; then + ifconfig $interface inet -alias $old_ip_address $medium + route delete "$old_ip_address" 127.0.0.1 >/dev/null 2>&1 + fi +} -if [ "x$reason" = "xMEDIUM" ]; then - ifconfig $interface $medium - ifconfig $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1 - sleep 1 - exit 0 -fi +add_new_address() { + ifconfig $interface \ + inet $new_ip_address \ + netmask $new_subnet_mask \ + broadcast $new_broadcast_address \ + $medium + + # XXX Original TIMEOUT code did not do this unless $new_routers was set? + route add $new_ip_address 127.0.0.1 >/dev/null 2>&1 +} + +delete_old_alias() { + if [ -n "$alias_ip_address" ]; then + ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 + route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 + fi +} + +add_new_alias() { + if [ -n "$alias_ip_address" ]; then + ifconfig $interface inet alias $alias_ip_address netmask $alias_subnet_mask + route add $alias_ip_address 127.0.0.1 + fi +} + +delete_old_routes() { + # Delete existing default route. We only allow one, so no need to + # process $old_routers list. + route delete default >/dev/null 2>&1 + + if [ -n "$old_static_routes" ]; then + set $old_static_routes + while [ $# -gt 1 ]; do + route delete "$1" "$2" + shift; shift + done + fi + + # XXX BOUND RENEW REBIND REBOOT did not /dev/null output before. + arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | sh >/dev/null 2>&1 +} + +add_new_routes() { + for router in $new_routers; do + route add default $router >/dev/null 2>&1 + # 2nd and subsequent default routers error out, so explicitly + # stop processing the list after the first one. + break + done + + if [ -n "$new_static_routes" ]; then + set $new_static_routes + while [ $# -gt 1 ]; do + route add $1 $2 + shift; shift + done + fi +} + +add_new_resolv_conf() { + # XXX Old code did not create/update resolv.conf unless both + # $new_domain_name and $new_domain_name_servers were provided. PR + # #3135 reported some ISP's only provide $new_domain_name_servers and + # thus broke the script. This code creates the resolv.conf if either + # are provided. + + rm -f /etc/resolv.conf.std -if [ "x$reason" = "xPREINIT" ]; then - if [ "x$alias_ip_address" != "x" ]; then - ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 - route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 - fi - ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ - broadcast 255.255.255.255 up - exit 0 + if [ -n "$new_domain_name" ]; then + echo "search $new_domain_name" >>/etc/resolv.conf.std + fi + + if [ -n "$new_domain_name_servers" ]; then + for nameserver in $new_domain_name_servers; do + echo "nameserver $nameserver" >>/etc/resolv.conf.std + done + fi + + if [ -f /etc/resolv.conf.std ]; then + if [ -f /etc/resolv.conf.tail ]; then + cat /etc/resolv.conf.tail >>/etc/resolv.conf.std + fi + + rm -f /etc/resolv.conf + mv /etc/resolv.conf.std /etc/resolv.conf + + return 0 + fi + + return 1 +} + +# +# Start of active code. +# + +if [ -n "$new_network_number" ]; then + echo "New Network Number: $new_network_number" fi -if [ "x$reason" = "xARPCHECK" ] || [ "x$reason" = "xARPSEND" ]; then - exit 0; +if [ -n "$new_broadcast_address" ]; then + echo "New Broadcast Address: $new_broadcast_address" fi + +case $reason in +MEDIUM) + ifconfig $interface $medium + ifconfig $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1 + sleep 1 + ;; + +PREINIT) + delete_old_alias + ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up + ;; + +ARPCHECK|ARPSEND) + ;; -if [ "x$reason" = "xBOUND" ] || [ "x$reason" = "xRENEW" ] || \ - [ "x$reason" = "xREBIND" ] || [ "x$reason" = "xREBOOT" ]; then - if [ "x$old_ip_address" != "x" ] && [ "x$alias_ip_address" != "x" ] && \ - [ "x$alias_ip_address" != "x$old_ip_address" ]; then - ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 - route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 - fi - if [ "x$old_ip_address" != "x" ] && [ "x$old_ip_address" != "x$new_ip_address" ]; then - ifconfig $interface inet -alias $old_ip_address $medium - route delete "$old_ip_address" 127.1 >/dev/null 2>&1 - for router in $old_routers; do - route delete default $router >/dev/null 2>&1 - done - if [ "$old_static_routes" != "" ]; then - set $old_static_routes - while [ $# -gt 1 ]; do - route delete "$1" "$2" - shift; shift - done - fi - arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' |sh - fi - if [ "x$old_ip_address" = "x" ] || \ - [ "x$old_ip_address" != "x$new_ip_address" ] || \ - [ "x$reason" = "xBOUND" ] || [ "x$reason" = "xREBOOT" ]; then - ifconfig $interface inet $new_ip_address netmask $new_subnet_mask \ - broadcast $new_broadcast_address $medium - route add $new_ip_address 127.1 >/dev/null 2>&1 - for router in $new_routers; do - route add default $router >/dev/null 2>&1 - done - if [ "$new_static_routes" != "" ]; then - set "$new_static_routes" - while [ $# -gt 1 ]; do - route add $1 $2 - shift; shift - done - fi - fi - if [ "x$new_ip_address" != "x$alias_ip_address" ] && [ "x$alias_ip_address" != "x" ]; - then - ifconfig $interface inet alias $alias_ip_address netmask $alias_subnet_mask - route add $alias_ip_address 127.0.0.1 - fi - if [ "x$new_domain_name" != "x" ]; - then - if [ -n "$new_domain_name_servers" ]; - then - echo "search $new_domain_name" >/etc/resolv.conf - for nameserver in $new_domain_name_servers; do - echo nameserver $nameserver >>/etc/resolv.conf - done - if [ -f /etc/resolv.conf.tail ]; then - cat /etc/resolv.conf.tail >>/etc/resolv.conf - fi - exit 0 - fi - fi -fi +BOUND|RENEW|REBIND|REBOOT) + if [ -n "$old_ip_address" ]; then + if [ "$old_ip_address" != "$alias_ip_address" ]; then + delete_old_alias + fi + if [ "$old_ip_address" != "$new_ip_address" ]; then + delete_old_address + delete_old_routes + fi + fi + if [ "$reason" = BOUND ] || \ + [ "$reason" = REBOOT ] || \ + [ -z "$old_ip_address" ] || \ + [ "$old_ip_address" != "$new_ip_address" ]; then + add_new_address + add_new_routes + fi + if [ "$new_ip_address" != "$alias_ip_address" ]; then + add_new_alias + fi + add_new_resolv_conf + ;; -if [ "x$reason" = "xEXPIRE" ] || [ "x$reason" = "xFAIL" ]; then - if [ "x$alias_ip_address" != "x" ]; then - ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 - route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 - fi - if [ "x$old_ip_address" != "x" ]; then - ifconfig $interface inet -alias $old_ip_address $medium - route delete $old_ip_address 127.1 >/dev/null 2>&1 - for router in $old_routers; do - route delete default $router >/dev/null 2>&1 - done - if [ "$old_static_routes" != "" ]; then - set "$old_static_routes" - while [ $# -gt 1 ]; do - route delete $1 $2 - shift; shift - done - fi - arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' \ - |sh >/dev/null 2>&1 - fi - if [ "x$alias_ip_address" != "x" ]; then - ifconfig $interface inet alias $alias_ip_address netmask $alias_subnet_mask - route add $alias_ip_address 127.0.0.1 - fi - exit 0 -fi +EXPIRE|FAIL) + delete_old_alias + if [ -n "$old_ip_address" ]; then + delete_old_address + delete_old_routes + fi + # XXX Why add alias we just deleted above? + add_new_alias + # XXX Delete resolv.conf as no longer relevant? + ;; -if [ "x$reason" = "xTIMEOUT" ]; then - if [ "x$alias_ip_address" != "x" ]; then - ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 - route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 - fi - ifconfig $interface inet $new_ip_address netmask $new_subnet_mask \ - broadcast $new_broadcast_address $medium - sleep 1 - if [ "$new_routers" != "" ]; then - set "$new_routers" - if ping -q -c 1 -w 1 "$1"; then - if [ "x$new_ip_address" != "x$alias_ip_address" ] && \ - [ "x$alias_ip_address" != "x" ]; then - ifconfig $interface inet alias $alias_ip_address netmask $alias_subnet_mask - route add $alias_ip_address 127.0.0.1 - fi - route add $new_ip_address 127.1 >/dev/null 2>&1 - for router in $new_routers; do - route add default $router >/dev/null 2>&1 - done - if [ "$new_static_routes" != "" ]; then - set "$new_static_routes" - while [ $# -gt 1 ]; do - route add $1 $2 - shift; shift - done - fi - if [ "$new_domain_name" != "" ]; then - if [ -n "$new_domain_name_servers" ]; then - echo "search $new_domain_name" >/etc/resolv.conf.std - for nameserver in $new_domain_name_servers; do - echo "nameserver $nameserver" >>/etc/resolv.conf.std - done - if [ -f /etc/resolv.conf.tail ]; then - cat /etc/resolv.conf.tail >>/etc/resolv.conf.std - fi - if [ -f /etc/resolv.conf ]; then - rm -f /etc/resolv.conf - fi - mv /etc/resolv.conf.std /etc/resolv.conf - exit 0 - fi - fi - fi - fi - ifconfig $interface inet -alias $new_ip_address $medium - for router in $old_routers; do - route delete default $router >/dev/null 2>&1 - done - if [ "$old_static_routes" != "" ]; then - set "$old_static_routes" - while [ $# -gt 1 ]; do - route delete $1 $2 - shift; shift - done - fi - arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' \ - |sh >/dev/null 2>&1 - exit 1 -fi +TIMEOUT) + delete_old_alias + add_new_address + sleep 1 + if [ -n "$new_routers" ]; then + set "$new_routers" + if ping -q -c 1 -w 1 "$1"; then + if [ "$new_ip_address" != "$alias_ip_address" ]; then + add_new_alias + fi + add_new_routes + if add_new_resolv_conf; then + exit 0 + fi + fi + fi + ifconfig $interface inet -alias $new_ip_address $medium + # XXX Why not a delete_old_address as before all other invocations of + # delete_old_routes? + delete_old_routes + exit 1 + ;; +esac exit 0 |