dhclient-script revision 147072
1147072Sbrooks#!/bin/sh 2147072Sbrooks# 3147072Sbrooks# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $ 4147072Sbrooks# 5147072Sbrooks# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org> 6147072Sbrooks# 7147072Sbrooks# Permission to use, copy, modify, and distribute this software for any 8147072Sbrooks# purpose with or without fee is hereby granted, provided that the above 9147072Sbrooks# copyright notice and this permission notice appear in all copies. 10147072Sbrooks# 11147072Sbrooks# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12147072Sbrooks# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13147072Sbrooks# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14147072Sbrooks# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15147072Sbrooks# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16147072Sbrooks# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17147072Sbrooks# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18147072Sbrooks# 19147072Sbrooks# 20147072Sbrooks 21147072Sbrooks# 22147072Sbrooks# Helper functions that implement common actions. 23147072Sbrooks# 24147072Sbrooks 25147072Sbrooksdelete_old_address() { 26147072Sbrooks if [ -n "$old_ip_address" ]; then 27147072Sbrooks ifconfig $interface inet -alias $old_ip_address $medium 28147072Sbrooks route delete "$old_ip_address" 127.0.0.1 >/dev/null 2>&1 29147072Sbrooks fi 30147072Sbrooks} 31147072Sbrooks 32147072Sbrooksadd_new_address() { 33147072Sbrooks ifconfig $interface \ 34147072Sbrooks inet $new_ip_address \ 35147072Sbrooks netmask $new_subnet_mask \ 36147072Sbrooks broadcast $new_broadcast_address \ 37147072Sbrooks $medium 38147072Sbrooks 39147072Sbrooks # XXX Original TIMEOUT code did not do this unless $new_routers was set? 40147072Sbrooks route add $new_ip_address 127.0.0.1 >/dev/null 2>&1 41147072Sbrooks} 42147072Sbrooks 43147072Sbrooksdelete_old_alias() { 44147072Sbrooks if [ -n "$alias_ip_address" ]; then 45147072Sbrooks ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 46147072Sbrooks route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 47147072Sbrooks fi 48147072Sbrooks} 49147072Sbrooks 50147072Sbrooksadd_new_alias() { 51147072Sbrooks if [ -n "$alias_ip_address" ]; then 52147072Sbrooks ifconfig $interface inet alias $alias_ip_address netmask \ 53147072Sbrooks $alias_subnet_mask 54147072Sbrooks route add $alias_ip_address 127.0.0.1 55147072Sbrooks fi 56147072Sbrooks} 57147072Sbrooks 58147072Sbrooksdelete_old_routes() { 59147072Sbrooks # Delete existing default route. We only allow one, so no need to 60147072Sbrooks # process $old_routers list. 61147072Sbrooks route delete default >/dev/null 2>&1 62147072Sbrooks 63147072Sbrooks if [ -n "$old_static_routes" ]; then 64147072Sbrooks set $old_static_routes 65147072Sbrooks while [ $# -gt 1 ]; do 66147072Sbrooks route delete "$1" "$2" 67147072Sbrooks shift; shift 68147072Sbrooks done 69147072Sbrooks fi 70147072Sbrooks 71147072Sbrooks arp -dan 72147072Sbrooks} 73147072Sbrooks 74147072Sbrooksadd_new_routes() { 75147072Sbrooks route delete default >/dev/null 2>&1 76147072Sbrooks for router in $new_routers; do 77147072Sbrooks if [ "$new_ip_address" = "$router" ]; then 78147072Sbrooks route add default -iface $router >/dev/null 2>&1 79147072Sbrooks else 80147072Sbrooks route add default $router >/dev/null 2>&1 81147072Sbrooks fi 82147072Sbrooks # 2nd and subsequent default routers error out, so explicitly 83147072Sbrooks # stop processing the list after the first one. 84147072Sbrooks break 85147072Sbrooks done 86147072Sbrooks 87147072Sbrooks if [ -n "$new_static_routes" ]; then 88147072Sbrooks set $new_static_routes 89147072Sbrooks while [ $# -gt 1 ]; do 90147072Sbrooks route add $1 $2 91147072Sbrooks shift; shift 92147072Sbrooks done 93147072Sbrooks fi 94147072Sbrooks} 95147072Sbrooks 96147072Sbrooksadd_new_resolv_conf() { 97147072Sbrooks # XXX Old code did not create/update resolv.conf unless both 98147072Sbrooks # $new_domain_name and $new_domain_name_servers were provided. PR 99147072Sbrooks # #3135 reported some ISP's only provide $new_domain_name_servers and 100147072Sbrooks # thus broke the script. This code creates the resolv.conf if either 101147072Sbrooks # are provided. 102147072Sbrooks 103147072Sbrooks rm -f /etc/resolv.conf.std 104147072Sbrooks 105147072Sbrooks if [ -n "$new_domain_name" ]; then 106147072Sbrooks echo "search $new_domain_name" >>/etc/resolv.conf.std 107147072Sbrooks fi 108147072Sbrooks 109147072Sbrooks if [ -n "$new_domain_name_servers" ]; then 110147072Sbrooks for nameserver in $new_domain_name_servers; do 111147072Sbrooks echo "nameserver $nameserver" >>/etc/resolv.conf.std 112147072Sbrooks done 113147072Sbrooks fi 114147072Sbrooks 115147072Sbrooks if [ -f /etc/resolv.conf.std ]; then 116147072Sbrooks if [ -f /etc/resolv.conf.tail ]; then 117147072Sbrooks cat /etc/resolv.conf.tail >>/etc/resolv.conf.std 118147072Sbrooks fi 119147072Sbrooks 120147072Sbrooks # In case (e.g. during OpenBSD installs) /etc/resolv.conf 121147072Sbrooks # is a symbolic link, take care to preserve the link and write 122147072Sbrooks # the new data in the correct location. 123147072Sbrooks 124147072Sbrooks if [ -f /etc/resolv.conf ]; then 125147072Sbrooks cat /etc/resolv.conf > /etc/resolv.conf.save 126147072Sbrooks fi 127147072Sbrooks cat /etc/resolv.conf.std > /etc/resolv.conf 128147072Sbrooks rm -f /etc/resolv.conf.std 129147072Sbrooks 130147072Sbrooks # Try to ensure correct ownership and permissions. 131147072Sbrooks chown -RL root:wheel /etc/resolv.conf 132147072Sbrooks chmod -RL 644 /etc/resolv.conf 133147072Sbrooks 134147072Sbrooks return 0 135147072Sbrooks fi 136147072Sbrooks 137147072Sbrooks return 1 138147072Sbrooks} 139147072Sbrooks 140147072Sbrooks# 141147072Sbrooks# Start of active code. 142147072Sbrooks# 143147072Sbrooks 144147072Sbrooksif [ -n "$new_network_number" ]; then 145147072Sbrooks echo "New Network Number: $new_network_number" 146147072Sbrooksfi 147147072Sbrooks 148147072Sbrooksif [ -n "$new_broadcast_address" ]; then 149147072Sbrooks echo "New Broadcast Address: $new_broadcast_address" 150147072Sbrooksfi 151147072Sbrooks 152147072Sbrookscase $reason in 153147072SbrooksMEDIUM) 154147072Sbrooks ifconfig $interface $medium 155147072Sbrooks ifconfig $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1 156147072Sbrooks sleep 1 157147072Sbrooks ;; 158147072Sbrooks 159147072SbrooksPREINIT) 160147072Sbrooks delete_old_alias 161147072Sbrooks ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up 162147072Sbrooks ;; 163147072Sbrooks 164147072SbrooksARPCHECK|ARPSEND) 165147072Sbrooks ;; 166147072Sbrooks 167147072SbrooksBOUND|RENEW|REBIND|REBOOT) 168147072Sbrooks if [ -n "$old_ip_address" ]; then 169147072Sbrooks if [ "$old_ip_address" != "$alias_ip_address" ]; then 170147072Sbrooks delete_old_alias 171147072Sbrooks fi 172147072Sbrooks if [ "$old_ip_address" != "$new_ip_address" ]; then 173147072Sbrooks delete_old_address 174147072Sbrooks delete_old_routes 175147072Sbrooks fi 176147072Sbrooks fi 177147072Sbrooks if [ "$reason" = BOUND ] || \ 178147072Sbrooks [ "$reason" = REBOOT ] || \ 179147072Sbrooks [ -z "$old_ip_address" ] || \ 180147072Sbrooks [ "$old_ip_address" != "$new_ip_address" ]; then 181147072Sbrooks add_new_address 182147072Sbrooks add_new_routes 183147072Sbrooks fi 184147072Sbrooks if [ "$new_ip_address" != "$alias_ip_address" ]; then 185147072Sbrooks add_new_alias 186147072Sbrooks fi 187147072Sbrooks add_new_resolv_conf 188147072Sbrooks ;; 189147072Sbrooks 190147072SbrooksEXPIRE|FAIL) 191147072Sbrooks delete_old_alias 192147072Sbrooks if [ -n "$old_ip_address" ]; then 193147072Sbrooks delete_old_address 194147072Sbrooks delete_old_routes 195147072Sbrooks fi 196147072Sbrooks # XXX Why add alias we just deleted above? 197147072Sbrooks add_new_alias 198147072Sbrooks if [ -f /etc/resolv.conf.save ]; then 199147072Sbrooks cat /etc/resolv.conf.save > /etc/resolv.conf 200147072Sbrooks fi 201147072Sbrooks ;; 202147072Sbrooks 203147072SbrooksTIMEOUT) 204147072Sbrooks delete_old_alias 205147072Sbrooks add_new_address 206147072Sbrooks sleep 1 207147072Sbrooks if [ -n "$new_routers" ]; then 208147072Sbrooks set "$new_routers" 209147072Sbrooks if ping -q -c 1 -w 1 "$1"; then 210147072Sbrooks if [ "$new_ip_address" != "$alias_ip_address" ]; then 211147072Sbrooks add_new_alias 212147072Sbrooks fi 213147072Sbrooks add_new_routes 214147072Sbrooks if add_new_resolv_conf; then 215147072Sbrooks exit 0 216147072Sbrooks fi 217147072Sbrooks fi 218147072Sbrooks fi 219147072Sbrooks ifconfig $interface inet -alias $new_ip_address $medium 220147072Sbrooks # XXX Why not a delete_old_address as before all other invocations of 221147072Sbrooks # delete_old_routes? 222147072Sbrooks delete_old_routes 223147072Sbrooks exit 1 224147072Sbrooks ;; 225147072Sbrooksesac 226147072Sbrooks 227147072Sbrooksexit 0 228