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