xref: /minix3/external/bsd/dhcp/bin/clientscript/dhclient-script (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek#!/bin/sh
2*83ee113eSDavid van Moolenbroek#
3*83ee113eSDavid van Moolenbroek# $NetBSD: dhclient-script,v 1.2 2015/02/26 09:59:55 roy Exp $
4*83ee113eSDavid van Moolenbroek
5*83ee113eSDavid van MoolenbroekENTERHOOKS=/etc/dhclient-enter-hooks
6*83ee113eSDavid van MoolenbroekEXITHOOKS=/etc/dhclient-exit-hooks
7*83ee113eSDavid van MoolenbroekRESOLV=/etc/resolv.conf
8*83ee113eSDavid van MoolenbroekSIGNATURE="# Created by dhclient from"
9*83ee113eSDavid van MoolenbroekINTSIG="$SIGNATURE $interface"
10*83ee113eSDavid van Moolenbroek
11*83ee113eSDavid van Moolenbroekecho_resolv_conf() {
12*83ee113eSDavid van Moolenbroek	echo "$INTSIG"
13*83ee113eSDavid van Moolenbroek	echo search $new_domain_name
14*83ee113eSDavid van Moolenbroek	for nameserver in $new_domain_name_servers; do
15*83ee113eSDavid van Moolenbroek		echo nameserver $nameserver
16*83ee113eSDavid van Moolenbroek	done
17*83ee113eSDavid van Moolenbroek}
18*83ee113eSDavid van Moolenbroek
19*83ee113eSDavid van Moolenbroekmake_resolv_conf() {
20*83ee113eSDavid van Moolenbroek	if [ ! -z "$new_domain_name_servers" ]; then
21*83ee113eSDavid van Moolenbroek		if [ -x /sbin/resolvconf ]; then
22*83ee113eSDavid van Moolenbroek			echo_resolv_conf | /sbin/resolvconf -a $interface
23*83ee113eSDavid van Moolenbroek		else
24*83ee113eSDavid van Moolenbroek			if [ -f $RESOLV ]; then
25*83ee113eSDavid van Moolenbroek				while read line; do
26*83ee113eSDavid van Moolenbroek					case $line in
27*83ee113eSDavid van Moolenbroek					"$SIGNATURE"*)
28*83ee113eSDavid van Moolenbroek						;;
29*83ee113eSDavid van Moolenbroek					*)
30*83ee113eSDavid van Moolenbroek						mv $RESOLV $RESOLV.save;;
31*83ee113eSDavid van Moolenbroek					esac
32*83ee113eSDavid van Moolenbroek					break
33*83ee113eSDavid van Moolenbroek				done < $RESOLV
34*83ee113eSDavid van Moolenbroek			fi
35*83ee113eSDavid van Moolenbroek			echo_resolv_conf > $RESOLV
36*83ee113eSDavid van Moolenbroek		fi
37*83ee113eSDavid van Moolenbroek	fi
38*83ee113eSDavid van Moolenbroek}
39*83ee113eSDavid van Moolenbroek
40*83ee113eSDavid van Moolenbroekrestore_resolv_conf() {
41*83ee113eSDavid van Moolenbroek	if [ -x /sbin/resolvconf ]; then
42*83ee113eSDavid van Moolenbroek		/sbin/resolvconf -d $interface
43*83ee113eSDavid van Moolenbroek	elif [ -f $RESOLV.save -a -f $RESOLV ]; then
44*83ee113eSDavid van Moolenbroek		while read line; do
45*83ee113eSDavid van Moolenbroek			case $line in
46*83ee113eSDavid van Moolenbroek			"$INTSIG"*)
47*83ee113eSDavid van Moolenbroek				mv $RESOLV.save $RESOLV;;
48*83ee113eSDavid van Moolenbroek			esac
49*83ee113eSDavid van Moolenbroek			break
50*83ee113eSDavid van Moolenbroek		done < $RESOLV
51*83ee113eSDavid van Moolenbroek	fi
52*83ee113eSDavid van Moolenbroek}
53*83ee113eSDavid van Moolenbroek
54*83ee113eSDavid van Moolenbroek# Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
55*83ee113eSDavid van Moolenbroekexit_with_hooks() {
56*83ee113eSDavid van Moolenbroek	exit_status=$1
57*83ee113eSDavid van Moolenbroek	if [ -f "$EXITHOOKS" ]; then
58*83ee113eSDavid van Moolenbroek		. "$EXITHOOKS"
59*83ee113eSDavid van Moolenbroek	fi
60*83ee113eSDavid van Moolenbroek	# probably should do something with exit status of the local script
61*83ee113eSDavid van Moolenbroek	exit $exit_status
62*83ee113eSDavid van Moolenbroek}
63*83ee113eSDavid van Moolenbroek
64*83ee113eSDavid van Moolenbroek
65*83ee113eSDavid van Moolenbroekadd_new_routes() {
66*83ee113eSDavid van Moolenbroek	for router in $new_routers; do
67*83ee113eSDavid van Moolenbroek		route add default $router
68*83ee113eSDavid van Moolenbroek	done >/dev/null 2>&1
69*83ee113eSDavid van Moolenbroek
70*83ee113eSDavid van Moolenbroek	set -- $new_static_routes
71*83ee113eSDavid van Moolenbroek	while [ $# -gt 1 ]; do
72*83ee113eSDavid van Moolenbroek		route add $1 $2
73*83ee113eSDavid van Moolenbroek		shift; shift
74*83ee113eSDavid van Moolenbroek	done
75*83ee113eSDavid van Moolenbroek}
76*83ee113eSDavid van Moolenbroek
77*83ee113eSDavid van Moolenbroekdelete_old_routes() {
78*83ee113eSDavid van Moolenbroek	for router in $old_routers; do
79*83ee113eSDavid van Moolenbroek		route delete default $router
80*83ee113eSDavid van Moolenbroek	done >/dev/null 2>&1
81*83ee113eSDavid van Moolenbroek
82*83ee113eSDavid van Moolenbroek	set -- $old_static_routes
83*83ee113eSDavid van Moolenbroek	while [ $# -gt 1 ]; do
84*83ee113eSDavid van Moolenbroek		route delete $1 $2
85*83ee113eSDavid van Moolenbroek		shift; shift
86*83ee113eSDavid van Moolenbroek	done
87*83ee113eSDavid van Moolenbroek
88*83ee113eSDavid van Moolenbroek	route -n flush -inet -llinfo -host
89*83ee113eSDavid van Moolenbroek}
90*83ee113eSDavid van Moolenbroek
91*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist.
92*83ee113eSDavid van Moolenbroekif [ -f $ENTERHOOKS ]; then
93*83ee113eSDavid van Moolenbroek	exit_status=0
94*83ee113eSDavid van Moolenbroek	. $ENTERHOOKS
95*83ee113eSDavid van Moolenbroek	# allow the local script to abort processing of this state
96*83ee113eSDavid van Moolenbroek	# local script must set exit_status variable to nonzero.
97*83ee113eSDavid van Moolenbroek	if [ $exit_status -ne 0 ]; then
98*83ee113eSDavid van Moolenbroek		exit $exit_status
99*83ee113eSDavid van Moolenbroek	fi
100*83ee113eSDavid van Moolenbroekfi
101*83ee113eSDavid van Moolenbroek
102*83ee113eSDavid van Moolenbroek#if [ ! -z "$new_host_name" ]; then
103*83ee113eSDavid van Moolenbroek#	echo New Host Name: $new_host_name
104*83ee113eSDavid van Moolenbroek#fi
105*83ee113eSDavid van Moolenbroek#
106*83ee113eSDavid van Moolenbroek#if [ ! -z "$new_nis_domain" ]; then
107*83ee113eSDavid van Moolenbroek#	echo New NIS Domain: $new_nis_domain
108*83ee113eSDavid van Moolenbroek#fi
109*83ee113eSDavid van Moolenbroek#
110*83ee113eSDavid van Moolenbroek#if [ ! -z "$new_network_number" ]; then
111*83ee113eSDavid van Moolenbroek#	echo New Network Number: $new_network_number
112*83ee113eSDavid van Moolenbroek#fi
113*83ee113eSDavid van Moolenbroek
114*83ee113eSDavid van Moolenbroekif [ ! -z "$new_broadcast_address" ]; then
115*83ee113eSDavid van Moolenbroek#	echo New Broadcast Address: $new_broadcast_address
116*83ee113eSDavid van Moolenbroek	new_broadcast_arg="broadcast $new_broadcast_address"
117*83ee113eSDavid van Moolenbroekfi
118*83ee113eSDavid van Moolenbroek
119*83ee113eSDavid van Moolenbroekif [ ! -z "$old_broadcast_address" ]; then
120*83ee113eSDavid van Moolenbroek	old_broadcast_arg="broadcast $old_broadcast_address"
121*83ee113eSDavid van Moolenbroekfi
122*83ee113eSDavid van Moolenbroek
123*83ee113eSDavid van Moolenbroekif [ ! -z "$new_subnet_mask" ]; then
124*83ee113eSDavid van Moolenbroek	new_netmask_arg="netmask $new_subnet_mask"
125*83ee113eSDavid van Moolenbroekfi
126*83ee113eSDavid van Moolenbroek
127*83ee113eSDavid van Moolenbroekif [ ! -z "$old_subnet_mask" ]; then
128*83ee113eSDavid van Moolenbroek	old_netmask_arg="netmask $old_subnet_mask"
129*83ee113eSDavid van Moolenbroekfi
130*83ee113eSDavid van Moolenbroek
131*83ee113eSDavid van Moolenbroekif [ ! -z "$alias_subnet_mask" ]; then
132*83ee113eSDavid van Moolenbroek	alias_subnet_arg="netmask $alias_subnet_mask"
133*83ee113eSDavid van Moolenbroekfi
134*83ee113eSDavid van Moolenbroek
135*83ee113eSDavid van Moolenbroekcase "$reason" in
136*83ee113eSDavid van MoolenbroekMEDIUM)
137*83ee113eSDavid van Moolenbroek	test -z "$medium" && exit_with_hooks 0
138*83ee113eSDavid van Moolenbroek	eval "ifconfig $interface $medium"
139*83ee113eSDavid van Moolenbroek	eval "ifconfig $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1
140*83ee113eSDavid van Moolenbroek
141*83ee113eSDavid van Moolenbroek	sleep 1
142*83ee113eSDavid van Moolenbroek
143*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
144*83ee113eSDavid van Moolenbroek	;;
145*83ee113eSDavid van Moolenbroek
146*83ee113eSDavid van MoolenbroekPREINIT)
147*83ee113eSDavid van Moolenbroek	if [ ! -z "$alias_ip_address" ]; then
148*83ee113eSDavid van Moolenbroek		ifconfig $interface inet \
149*83ee113eSDavid van Moolenbroek		    -alias $alias_ip_address >/dev/null 2>&1
150*83ee113eSDavid van Moolenbroek	fi
151*83ee113eSDavid van Moolenbroek
152*83ee113eSDavid van Moolenbroek	ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \
153*83ee113eSDavid van Moolenbroek	    broadcast 255.255.255.255 up
154*83ee113eSDavid van Moolenbroek
155*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
156*83ee113eSDavid van Moolenbroek	;;
157*83ee113eSDavid van Moolenbroek
158*83ee113eSDavid van MoolenbroekARPCHECK|ARPSEND)
159*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
160*83ee113eSDavid van Moolenbroek	;;
161*83ee113eSDavid van Moolenbroek
162*83ee113eSDavid van MoolenbroekBOUND|RENEW|REBIND|REBOOT)
163*83ee113eSDavid van Moolenbroek	if [ ! -z "$new_nis_domain" ]; then
164*83ee113eSDavid van Moolenbroek		if type domainname > /dev/null 2>&1; then
165*83ee113eSDavid van Moolenbroek			domainname $new_nis_domain
166*83ee113eSDavid van Moolenbroek		fi
167*83ee113eSDavid van Moolenbroek	fi
168*83ee113eSDavid van Moolenbroek
169*83ee113eSDavid van Moolenbroek	if type hostname > /dev/null 2>&1; then
170*83ee113eSDavid van Moolenbroek		if [ \( -z "$current_hostname" \) -o \
171*83ee113eSDavid van Moolenbroek		    \( "x$new_host_name" = "x$old_hostname" \) ]; then
172*83ee113eSDavid van Moolenbroek			current_hostname=`hostname`
173*83ee113eSDavid van Moolenbroek		fi
174*83ee113eSDavid van Moolenbroek		if [ \( -z "$current_hostname" \) -o \
175*83ee113eSDavid van Moolenbroek		    \( "x$new_host_name" != "x$old_hostname" \) ]; then
176*83ee113eSDavid van Moolenbroek			hostname $new_host_name
177*83ee113eSDavid van Moolenbroek		fi
178*83ee113eSDavid van Moolenbroek	fi
179*83ee113eSDavid van Moolenbroek
180*83ee113eSDavid van Moolenbroek	if [ \( ! -z "$old_ip_address" \) -a \( ! -z "$alias_ip_address" \) -a \
181*83ee113eSDavid van Moolenbroek	    \( "x$alias_ip_address" != "x$old_ip_address" \) ]; then
182*83ee113eSDavid van Moolenbroek		ifconfig $interface inet \
183*83ee113eSDavid van Moolenbroek		    -alias $alias_ip_address > /dev/null 2>&1
184*83ee113eSDavid van Moolenbroek	fi
185*83ee113eSDavid van Moolenbroek
186*83ee113eSDavid van Moolenbroek	if [ \( ! -z "$old_ip_address" \) -a \
187*83ee113eSDavid van Moolenbroek	    \( "x$old_ip_address" != "x$new_ip_address" \) ]; then
188*83ee113eSDavid van Moolenbroek		eval "ifconfig $interface inet -alias $old_ip_address $medium"
189*83ee113eSDavid van Moolenbroek		delete_old_routes
190*83ee113eSDavid van Moolenbroek	fi
191*83ee113eSDavid van Moolenbroek
192*83ee113eSDavid van Moolenbroek	if [ \( -z "$old_ip_address" \) -o \
193*83ee113eSDavid van Moolenbroek	    \( "x$old_ip_address" != "x$new_ip_address" \) -o \
194*83ee113eSDavid van Moolenbroek	    \( "x$reason" = "xBOUND" \) -o \( "x$reason" = "xREBOOT" \) ]; then
195*83ee113eSDavid van Moolenbroek		eval "ifconfig $interface inet $new_ip_address \
196*83ee113eSDavid van Moolenbroek		    $new_netmask_arg $new_broadcast_arg $medium"
197*83ee113eSDavid van Moolenbroek		add_new_routes
198*83ee113eSDavid van Moolenbroek	fi
199*83ee113eSDavid van Moolenbroek
200*83ee113eSDavid van Moolenbroek	if [ \( ! -z "$alias_ip_address" \) -a \
201*83ee113eSDavid van Moolenbroek	    \( "x$new_ip_address" != "x$alias_ip_address" \) ]; then
202*83ee113eSDavid van Moolenbroek		ifconfig $interface inet alias $alias_ip_address \
203*83ee113eSDavid van Moolenbroek		    $alias_subnet_arg
204*83ee113eSDavid van Moolenbroek	fi
205*83ee113eSDavid van Moolenbroek	make_resolv_conf
206*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
207*83ee113eSDavid van Moolenbroek	;;
208*83ee113eSDavid van Moolenbroek
209*83ee113eSDavid van MoolenbroekEXPIRE|FAIL|RELEASE|STOP)
210*83ee113eSDavid van Moolenbroek	if [ ! -z "$old_nis_domain" ]; then
211*83ee113eSDavid van Moolenbroek		if type domainname > /dev/null 2>&1; then
212*83ee113eSDavid van Moolenbroek			# delete the old nis domain name
213*83ee113eSDavid van Moolenbroek			domainname ""
214*83ee113eSDavid van Moolenbroek		fi
215*83ee113eSDavid van Moolenbroek	fi
216*83ee113eSDavid van Moolenbroek
217*83ee113eSDavid van Moolenbroek	if [ ! -z "$alias_ip_address" ]; then
218*83ee113eSDavid van Moolenbroek		ifconfig $interface inet -alias $alias_ip_address
219*83ee113eSDavid van Moolenbroek	fi > /dev/null 2>&1
220*83ee113eSDavid van Moolenbroek
221*83ee113eSDavid van Moolenbroek	if [ ! -z "$old_ip_address" ]; then
222*83ee113eSDavid van Moolenbroek		eval "ifconfig $interface inet -alias $old_ip_address $medium"
223*83ee113eSDavid van Moolenbroek		delete_old_routes
224*83ee113eSDavid van Moolenbroek
225*83ee113eSDavid van Moolenbroek	fi
226*83ee113eSDavid van Moolenbroek
227*83ee113eSDavid van Moolenbroek	if [ ! -z "$alias_ip_address" ]; then
228*83ee113eSDavid van Moolenbroek		ifconfig $interface inet alias $alias_ip_address \
229*83ee113eSDavid van Moolenbroek		    $alias_subnet_arg
230*83ee113eSDavid van Moolenbroek	fi
231*83ee113eSDavid van Moolenbroek
232*83ee113eSDavid van Moolenbroek	restore_resolv_conf
233*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
234*83ee113eSDavid van Moolenbroek	;;
235*83ee113eSDavid van Moolenbroek
236*83ee113eSDavid van MoolenbroekTIMEOUT)
237*83ee113eSDavid van Moolenbroek	if [ ! -z "$alias_ip_address" ]; then
238*83ee113eSDavid van Moolenbroek		ifconfig $interface inet -alias $alias_ip_address
239*83ee113eSDavid van Moolenbroek	fi > /dev/null 2>&1
240*83ee113eSDavid van Moolenbroek
241*83ee113eSDavid van Moolenbroek	if [ ! -z "$new_host_name" ]; then
242*83ee113eSDavid van Moolenbroek		if type hostname > /dev/null 2>&1; then
243*83ee113eSDavid van Moolenbroek			hostname $new_host_name
244*83ee113eSDavid van Moolenbroek		fi
245*83ee113eSDavid van Moolenbroek	fi
246*83ee113eSDavid van Moolenbroek
247*83ee113eSDavid van Moolenbroek	if [ ! -z "$new_nis_domain" ]; then
248*83ee113eSDavid van Moolenbroek		if type domainname > /dev/null 2>&1; then
249*83ee113eSDavid van Moolenbroek			domainname $new_nis_domain
250*83ee113eSDavid van Moolenbroek		fi
251*83ee113eSDavid van Moolenbroek	fi
252*83ee113eSDavid van Moolenbroek
253*83ee113eSDavid van Moolenbroek	eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \
254*83ee113eSDavid van Moolenbroek	    $new_broadcast_arg $medium"
255*83ee113eSDavid van Moolenbroek	sleep 1
256*83ee113eSDavid van Moolenbroek
257*83ee113eSDavid van Moolenbroek	if [ ! -z "$new_routers" ]; then
258*83ee113eSDavid van Moolenbroek		set -- $new_routers
259*83ee113eSDavid van Moolenbroek		if ping -n -q -c 1 -w 1 $1; then
260*83ee113eSDavid van Moolenbroek			if [ \( ! -z "$alias_ip_address" \) -a \
261*83ee113eSDavid van Moolenbroek			    \( "x$new_ip_address" != "x$alias_ip_address" \) ]
262*83ee113eSDavid van Moolenbroek			then
263*83ee113eSDavid van Moolenbroek				ifconfig $interface inet alias \
264*83ee113eSDavid van Moolenbroek				    $alias_ip_address $alias_subnet_arg
265*83ee113eSDavid van Moolenbroek			fi
266*83ee113eSDavid van Moolenbroek
267*83ee113eSDavid van Moolenbroek			add_new_routes
268*83ee113eSDavid van Moolenbroek			make_resolv_conf
269*83ee113eSDavid van Moolenbroek			exit_with_hooks 0
270*83ee113eSDavid van Moolenbroek		fi
271*83ee113eSDavid van Moolenbroek	fi
272*83ee113eSDavid van Moolenbroek
273*83ee113eSDavid van Moolenbroek	eval "ifconfig $interface inet -alias $new_ip_address $medium"
274*83ee113eSDavid van Moolenbroek
275*83ee113eSDavid van Moolenbroek	delete_old_routes
276*83ee113eSDavid van Moolenbroek
277*83ee113eSDavid van Moolenbroek	exit_with_hooks 1
278*83ee113eSDavid van Moolenbroek	;;
279*83ee113eSDavid van Moolenbroek*)
280*83ee113eSDavid van Moolenbroek	exit_with_hooks 0
281*83ee113eSDavid van Moolenbroek	;;
282*83ee113eSDavid van Moolenbroekesac
283