1#!/bin/sh 2# 3# $OpenBSD: src/sbin/dhclient/dhclient-script,v 1.18 2011/03/27 12:15:46 krw Exp $ 4# 5# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org> 6# 7# Permission to use, copy, modify, and distribute this software for any 8# purpose with or without fee is hereby granted, provided that the above 9# copyright notice and this permission notice appear in all copies. 10# 11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18# 19# 20 21# 22# Helper functions that implement common actions. 23# 24 25delete_old_address() { 26 if [ -n "$old_ip_address" ]; then 27 ifconfig $interface inet $old_ip_address delete $medium 28 #route delete "$old_ip_address" 127.0.0.1 >/dev/null 2>&1 29 fi 30} 31 32add_new_address() { 33 ifconfig $interface \ 34 inet $new_ip_address \ 35 netmask $new_subnet_mask \ 36 broadcast $new_broadcast_address \ 37 $medium 38 39 # XXX Original TIMEOUT code did not do this unless $new_routers was set? 40 #route add $new_ip_address 127.0.0.1 >/dev/null 2>&1 41} 42 43delete_old_alias() { 44 if [ -n "$alias_ip_address" ]; then 45 ifconfig $interface inet $alias_ip_address delete > /dev/null 2>&1 46# #route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 47 fi 48} 49 50add_new_alias() { 51 if [ -n "$alias_ip_address" ]; then 52 ifconfig $interface inet $alias_ip_address alias netmask \ 53 $alias_subnet_mask 54 #route add $alias_ip_address 127.0.0.1 55 fi 56} 57 58delete_old_routes() { 59 if [ -n "$old_static_routes" ]; then 60 set $old_static_routes 61 while [ $# -gt 1 ]; do 62 route delete "$1" "$2" 63 shift; shift 64 done 65 fi 66 67 arp -dan 68} 69 70add_new_routes() { 71 for router in $new_routers; do 72 route -q delete default 73 if [ "$new_ip_address" = "$router" ]; then 74 route -q add default -iface $router 75 else 76 route -q add default $router 77 fi 78 # 2nd and subsequent default routers error out, so explicitly 79 # stop processing the list after the first one. 80 break 81 done 82 83 if [ -n "$new_static_routes" ]; then 84 set $new_static_routes 85 while [ $# -gt 1 ]; do 86 route add $1 $2 87 shift; shift 88 done 89 fi 90} 91 92add_new_resolv_conf() { 93 # Create resolv.conf when either $new_domain_name_servers or 94 # $new_domain_name are provided. As reported in PR#3135, some ISPs 95 # provide only $new_domain_name_servers. 96 97 rm -f /etc/resolv.conf.std 98 99 if [ -n "$new_domain_name" ]; then 100 echo "search $new_domain_name" >>/etc/resolv.conf.std 101 fi 102 103 if [ -n "$new_domain_name_servers" ]; then 104 for nameserver in $new_domain_name_servers; do 105 echo "nameserver $nameserver" >>/etc/resolv.conf.std 106 done 107 fi 108 109 if [ -f /etc/resolv.conf.std ]; then 110 if [ -f /etc/resolv.conf.tail ]; then 111 cat /etc/resolv.conf.tail >>/etc/resolv.conf.std 112 fi 113 114 # In case (e.g. during OpenBSD installs) /etc/resolv.conf 115 # is a symbolic link, take care to preserve the link and write 116 # the new data in the correct location. 117 118 if [ -f /etc/resolv.conf ]; then 119 cat /etc/resolv.conf > /etc/resolv.conf.save 120 fi 121 cat /etc/resolv.conf.std > /etc/resolv.conf 122 rm -f /etc/resolv.conf.std 123 124 # Try to ensure correct ownership and permissions. 125 chown -RL root:wheel /etc/resolv.conf 126 chmod -RL 644 /etc/resolv.conf 127 128 return 0 129 fi 130 131 return 1 132} 133 134# 135# Start of active code. 136# 137 138case $reason in 139MEDIUM) 140 ifconfig $interface $medium 141 sleep 1 142 ;; 143 144PREINIT) 145 delete_old_alias 146 ifconfig $interface up 147 ;; 148 149ARPCHECK) 150 # Always succeed. i.e. accept lease. 151 ;; 152 153ARPSEND) 154 # Always fail. i.e. don't wait for ARP packet here. 155 exit 1 156 ;; 157 158BOUND|RENEW|REBIND|REBOOT) 159 if [ -n "$old_ip_address" ]; then 160 if [ "$old_ip_address" != "$alias_ip_address" ]; then 161 delete_old_alias 162 fi 163 if [ "$old_ip_address" != "$new_ip_address" ]; then 164 delete_old_address 165 delete_old_routes 166 fi 167 fi 168 if [ "$reason" = BOUND ] || 169 [ "$reason" = REBOOT ] || 170 [ -z "$old_ip_address" ] || 171 [ "$old_ip_address" != "$new_ip_address" ]; then 172 add_new_address 173 add_new_routes 174 fi 175 if [ "$new_ip_address" != "$alias_ip_address" ]; then 176 add_new_alias 177 fi 178 add_new_resolv_conf 179 ;; 180 181EXPIRE|FAIL) 182 delete_old_alias 183 if [ -n "$old_ip_address" ]; then 184 delete_old_address 185 delete_old_routes 186 fi 187 # XXX Why add alias we just deleted above? 188 add_new_alias 189 if [ -f /etc/resolv.conf.save ]; then 190 cat /etc/resolv.conf.save > /etc/resolv.conf 191 fi 192 ;; 193 194TIMEOUT) 195 delete_old_alias 196 add_new_address 197 sleep 1 198 if [ -n "$new_routers" ]; then 199 set "$new_routers" 200 if ping -q -c 1 -w 1 "$1"; then 201 if [ "$new_ip_address" != "$alias_ip_address" ]; then 202 add_new_alias 203 fi 204 add_new_routes 205 if add_new_resolv_conf; then 206 exit 0 207 fi 208 fi 209 fi 210 ifconfig $interface inet $new_ip_address delete $medium 211 # XXX Why not a delete_old_address as before all other invocations of 212 # delete_old_routes? 213 delete_old_routes 214 exit 1 215 ;; 216esac 217 218exit 0 219