xref: /minix3/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.in (revision 9f20bfa6c4c442e2e798d91b11c2a5f8d6833a41)
1*9f20bfa6SDavid van Moolenbroek#!/bin/sh
2*9f20bfa6SDavid van Moolenbroek# $NetBSD: dhcpcd-run-hooks.in,v 1.11 2015/08/21 10:39:00 roy Exp $
3*9f20bfa6SDavid van Moolenbroek
4*9f20bfa6SDavid van Moolenbroek# dhcpcd client configuration script
5*9f20bfa6SDavid van Moolenbroek
6*9f20bfa6SDavid van Moolenbroek# Handy variables and functions for our hooks to use
7*9f20bfa6SDavid van Moolenbroekcase "$reason" in
8*9f20bfa6SDavid van Moolenbroek	ROUTERADVERT)
9*9f20bfa6SDavid van Moolenbroek		ifsuffix=".ra";;
10*9f20bfa6SDavid van Moolenbroek	INFORM6|BOUND6|RENEW6|REBIND6|REBOOT6|EXPIRE6|RELEASE6|STOP6)
11*9f20bfa6SDavid van Moolenbroek		ifsuffix=".dhcp6";;
12*9f20bfa6SDavid van Moolenbroek	IPV4LL)
13*9f20bfa6SDavid van Moolenbroek		ifsuffix=".ipv4ll";;
14*9f20bfa6SDavid van Moolenbroek	*)
15*9f20bfa6SDavid van Moolenbroek		ifsuffix=".dhcp";;
16*9f20bfa6SDavid van Moolenbroekesac
17*9f20bfa6SDavid van Moolenbroekifname="$interface$ifsuffix"
18*9f20bfa6SDavid van Moolenbroek
19*9f20bfa6SDavid van Moolenbroekfrom=from
20*9f20bfa6SDavid van Moolenbroeksignature_base="# Generated by dhcpcd"
21*9f20bfa6SDavid van Moolenbroeksignature="$signature_base $from $ifname"
22*9f20bfa6SDavid van Moolenbroeksignature_base_end="# End of dhcpcd"
23*9f20bfa6SDavid van Moolenbroeksignature_end="$signature_base_end $from $ifname"
24*9f20bfa6SDavid van Moolenbroekstate_dir=@RUNDIR@/dhcpcd
25*9f20bfa6SDavid van Moolenbroek_detected_init=false
26*9f20bfa6SDavid van Moolenbroek
27*9f20bfa6SDavid van Moolenbroek: ${if_up:=false}
28*9f20bfa6SDavid van Moolenbroek: ${if_down:=false}
29*9f20bfa6SDavid van Moolenbroek: ${syslog_debug:=false}
30*9f20bfa6SDavid van Moolenbroek
31*9f20bfa6SDavid van Moolenbroek# Ensure that all arguments are unique
32*9f20bfa6SDavid van Moolenbroekuniqify()
33*9f20bfa6SDavid van Moolenbroek{
34*9f20bfa6SDavid van Moolenbroek	local result= i=
35*9f20bfa6SDavid van Moolenbroek	for i do
36*9f20bfa6SDavid van Moolenbroek		case " $result " in
37*9f20bfa6SDavid van Moolenbroek			*" $i "*);;
38*9f20bfa6SDavid van Moolenbroek			*) result="$result $i";;
39*9f20bfa6SDavid van Moolenbroek		esac
40*9f20bfa6SDavid van Moolenbroek	done
41*9f20bfa6SDavid van Moolenbroek	echo "${result# *}"
42*9f20bfa6SDavid van Moolenbroek}
43*9f20bfa6SDavid van Moolenbroek
44*9f20bfa6SDavid van Moolenbroek# List interface config files in a directory.
45*9f20bfa6SDavid van Moolenbroek# If dhcpcd is running as a single instance then it will have a list of
46*9f20bfa6SDavid van Moolenbroek# interfaces in the preferred order.
47*9f20bfa6SDavid van Moolenbroek# Otherwise we just use what we have.
48*9f20bfa6SDavid van Moolenbroeklist_interfaces()
49*9f20bfa6SDavid van Moolenbroek{
50*9f20bfa6SDavid van Moolenbroek	local i= x= ifaces=
51*9f20bfa6SDavid van Moolenbroek	for i in $interface_order; do
52*9f20bfa6SDavid van Moolenbroek		for x in "$1"/$i.*; do
53*9f20bfa6SDavid van Moolenbroek			[ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}"
54*9f20bfa6SDavid van Moolenbroek		done
55*9f20bfa6SDavid van Moolenbroek	done
56*9f20bfa6SDavid van Moolenbroek	for x in "$1"/*; do
57*9f20bfa6SDavid van Moolenbroek		[ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}"
58*9f20bfa6SDavid van Moolenbroek	done
59*9f20bfa6SDavid van Moolenbroek	uniqify $ifaces
60*9f20bfa6SDavid van Moolenbroek}
61*9f20bfa6SDavid van Moolenbroek
62*9f20bfa6SDavid van Moolenbroek# Trim function
63*9f20bfa6SDavid van Moolenbroektrim()
64*9f20bfa6SDavid van Moolenbroek{
65*9f20bfa6SDavid van Moolenbroek	local var="$*"
66*9f20bfa6SDavid van Moolenbroek
67*9f20bfa6SDavid van Moolenbroek	var=${var#"${var%%[![:space:]]*}"}
68*9f20bfa6SDavid van Moolenbroek	var=${var%"${var##*[![:space:]]}"}
69*9f20bfa6SDavid van Moolenbroek	if [ -z "$var" ]; then
70*9f20bfa6SDavid van Moolenbroek		# So it seems our shell doesn't support wctype(3) patterns
71*9f20bfa6SDavid van Moolenbroek		# Fall back to sed
72*9f20bfa6SDavid van Moolenbroek		var=$(echo "$*" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//')
73*9f20bfa6SDavid van Moolenbroek	fi
74*9f20bfa6SDavid van Moolenbroek	printf %s "$var"
75*9f20bfa6SDavid van Moolenbroek}
76*9f20bfa6SDavid van Moolenbroek
77*9f20bfa6SDavid van Moolenbroek# We normally use sed to extract values using a key from a list of files
78*9f20bfa6SDavid van Moolenbroek# but sed may not always be available at the time.
79*9f20bfa6SDavid van Moolenbroekkey_get_value()
80*9f20bfa6SDavid van Moolenbroek{
81*9f20bfa6SDavid van Moolenbroek	local key="$1" value= x= line=
82*9f20bfa6SDavid van Moolenbroek
83*9f20bfa6SDavid van Moolenbroek	shift
84*9f20bfa6SDavid van Moolenbroek	if type sed >/dev/null 2>&1; then
85*9f20bfa6SDavid van Moolenbroek		sed -n "s/^$key//p" $@
86*9f20bfa6SDavid van Moolenbroek	else
87*9f20bfa6SDavid van Moolenbroek		for x do
88*9f20bfa6SDavid van Moolenbroek			while read line; do
89*9f20bfa6SDavid van Moolenbroek				case "$line" in
90*9f20bfa6SDavid van Moolenbroek				"$key"*) echo "${line##$key}";;
91*9f20bfa6SDavid van Moolenbroek				esac
92*9f20bfa6SDavid van Moolenbroek			done < "$x"
93*9f20bfa6SDavid van Moolenbroek		done
94*9f20bfa6SDavid van Moolenbroek	fi
95*9f20bfa6SDavid van Moolenbroek}
96*9f20bfa6SDavid van Moolenbroek
97*9f20bfa6SDavid van Moolenbroek# We normally use sed to remove markers from a configuration file
98*9f20bfa6SDavid van Moolenbroek# but sed may not always be available at the time.
99*9f20bfa6SDavid van Moolenbroekremove_markers()
100*9f20bfa6SDavid van Moolenbroek{
101*9f20bfa6SDavid van Moolenbroek	local m1="$1" m2="$2" x= line= in_marker=0
102*9f20bfa6SDavid van Moolenbroek
103*9f20bfa6SDavid van Moolenbroek	shift; shift
104*9f20bfa6SDavid van Moolenbroek	if type sed >/dev/null 2>&1; then
105*9f20bfa6SDavid van Moolenbroek		sed "/^$m1/,/^$m2/d" $@
106*9f20bfa6SDavid van Moolenbroek	else
107*9f20bfa6SDavid van Moolenbroek		for x do
108*9f20bfa6SDavid van Moolenbroek			while read line; do
109*9f20bfa6SDavid van Moolenbroek				case "$line" in
110*9f20bfa6SDavid van Moolenbroek				"$m1"*) in_marker=1;;
111*9f20bfa6SDavid van Moolenbroek				"$m2"*) in_marker=0;;
112*9f20bfa6SDavid van Moolenbroek				*) [ $in_marker = 0 ] && echo "$line";;
113*9f20bfa6SDavid van Moolenbroek				esac
114*9f20bfa6SDavid van Moolenbroek			done < "$x"
115*9f20bfa6SDavid van Moolenbroek		done
116*9f20bfa6SDavid van Moolenbroek	fi
117*9f20bfa6SDavid van Moolenbroek}
118*9f20bfa6SDavid van Moolenbroek
119*9f20bfa6SDavid van Moolenbroek# Compare two files.
120*9f20bfa6SDavid van Moolenbroekcomp_file()
121*9f20bfa6SDavid van Moolenbroek{
122*9f20bfa6SDavid van Moolenbroek
123*9f20bfa6SDavid van Moolenbroek	[ -e "$1" -a -e "$2" ] || return 1
124*9f20bfa6SDavid van Moolenbroek
125*9f20bfa6SDavid van Moolenbroek	if type cmp >/dev/null 2>&1; then
126*9f20bfa6SDavid van Moolenbroek		cmp -s "$1" "$2"
127*9f20bfa6SDavid van Moolenbroek	elif type diff >/dev/null 2>&1; then
128*9f20bfa6SDavid van Moolenbroek		diff -q "$1" "$2" >/dev/null
129*9f20bfa6SDavid van Moolenbroek	else
130*9f20bfa6SDavid van Moolenbroek		# Hopefully we're only working on small text files ...
131*9f20bfa6SDavid van Moolenbroek		[ "$(cat "$1")" = "$(cat "$2")" ]
132*9f20bfa6SDavid van Moolenbroek	fi
133*9f20bfa6SDavid van Moolenbroek}
134*9f20bfa6SDavid van Moolenbroek
135*9f20bfa6SDavid van Moolenbroek# Compare two files.
136*9f20bfa6SDavid van Moolenbroek# If different, replace first with second otherwise remove second.
137*9f20bfa6SDavid van Moolenbroekchange_file()
138*9f20bfa6SDavid van Moolenbroek{
139*9f20bfa6SDavid van Moolenbroek
140*9f20bfa6SDavid van Moolenbroek	if [ -e "$1" ]; then
141*9f20bfa6SDavid van Moolenbroek		if comp_file "$1" "$2"; then
142*9f20bfa6SDavid van Moolenbroek			rm -f "$2"
143*9f20bfa6SDavid van Moolenbroek			return 1
144*9f20bfa6SDavid van Moolenbroek		fi
145*9f20bfa6SDavid van Moolenbroek	fi
146*9f20bfa6SDavid van Moolenbroek	cat "$2" > "$1"
147*9f20bfa6SDavid van Moolenbroek	rm -f "$2"
148*9f20bfa6SDavid van Moolenbroek	return 0
149*9f20bfa6SDavid van Moolenbroek}
150*9f20bfa6SDavid van Moolenbroek
151*9f20bfa6SDavid van Moolenbroek# Compare two files.
152*9f20bfa6SDavid van Moolenbroek# If different, copy or link depending on target type
153*9f20bfa6SDavid van Moolenbroekcopy_file()
154*9f20bfa6SDavid van Moolenbroek{
155*9f20bfa6SDavid van Moolenbroek
156*9f20bfa6SDavid van Moolenbroek	if [ -h "$2" ]; then
157*9f20bfa6SDavid van Moolenbroek		[ "$(readlink "$2")" = "$1" ] && return 1
158*9f20bfa6SDavid van Moolenbroek		ln -sf "$1" "$2"
159*9f20bfa6SDavid van Moolenbroek	else
160*9f20bfa6SDavid van Moolenbroek		comp_file "$1" "$2" && return 1
161*9f20bfa6SDavid van Moolenbroek		cat "$1" >"$2"
162*9f20bfa6SDavid van Moolenbroek	fi
163*9f20bfa6SDavid van Moolenbroek}
164*9f20bfa6SDavid van Moolenbroek
165*9f20bfa6SDavid van Moolenbroek# Save a config file
166*9f20bfa6SDavid van Moolenbroeksave_conf()
167*9f20bfa6SDavid van Moolenbroek{
168*9f20bfa6SDavid van Moolenbroek
169*9f20bfa6SDavid van Moolenbroek	if [ -f "$1" ]; then
170*9f20bfa6SDavid van Moolenbroek		rm -f "$1-pre.$interface"
171*9f20bfa6SDavid van Moolenbroek		cat "$1" > "$1-pre.$interface"
172*9f20bfa6SDavid van Moolenbroek	fi
173*9f20bfa6SDavid van Moolenbroek}
174*9f20bfa6SDavid van Moolenbroek
175*9f20bfa6SDavid van Moolenbroek# Restore a config file
176*9f20bfa6SDavid van Moolenbroekrestore_conf()
177*9f20bfa6SDavid van Moolenbroek{
178*9f20bfa6SDavid van Moolenbroek
179*9f20bfa6SDavid van Moolenbroek	[ -f "$1-pre.$interface" ] || return 1
180*9f20bfa6SDavid van Moolenbroek	cat "$1-pre.$interface" > "$1"
181*9f20bfa6SDavid van Moolenbroek	rm -f "$1-pre.$interface"
182*9f20bfa6SDavid van Moolenbroek}
183*9f20bfa6SDavid van Moolenbroek
184*9f20bfa6SDavid van Moolenbroek# Write a syslog entry
185*9f20bfa6SDavid van Moolenbroeksyslog()
186*9f20bfa6SDavid van Moolenbroek{
187*9f20bfa6SDavid van Moolenbroek	local lvl="$1"
188*9f20bfa6SDavid van Moolenbroek
189*9f20bfa6SDavid van Moolenbroek	if [ "$lvl" = debug ]; then
190*9f20bfa6SDavid van Moolenbroek		${syslog_debug} || return 0
191*9f20bfa6SDavid van Moolenbroek	fi
192*9f20bfa6SDavid van Moolenbroek	[ -n "$lvl" ] && shift
193*9f20bfa6SDavid van Moolenbroek	[ -n "$*" ] || return 0
194*9f20bfa6SDavid van Moolenbroek	case "$lvl" in
195*9f20bfa6SDavid van Moolenbroek	err|error)	echo "$interface: $*" >&2;;
196*9f20bfa6SDavid van Moolenbroek	*)		echo "$interface: $*";;
197*9f20bfa6SDavid van Moolenbroek	esac
198*9f20bfa6SDavid van Moolenbroek	if type logger >/dev/null 2>&1; then
199*9f20bfa6SDavid van Moolenbroek		logger -i -p daemon."$lvl" -t dhcpcd-run-hooks "$interface: $*"
200*9f20bfa6SDavid van Moolenbroek	fi
201*9f20bfa6SDavid van Moolenbroek}
202*9f20bfa6SDavid van Moolenbroek
203*9f20bfa6SDavid van Moolenbroek# Check for a valid domain name as per RFC1123 with the exception of
204*9f20bfa6SDavid van Moolenbroek# allowing - and _ as they seem to be widely used.
205*9f20bfa6SDavid van Moolenbroekvalid_domainname()
206*9f20bfa6SDavid van Moolenbroek{
207*9f20bfa6SDavid van Moolenbroek	local name="$1" label
208*9f20bfa6SDavid van Moolenbroek
209*9f20bfa6SDavid van Moolenbroek	[ -z "$name" -o ${#name} -gt 255 ] && return 1
210*9f20bfa6SDavid van Moolenbroek
211*9f20bfa6SDavid van Moolenbroek	while [ -n "$name" ]; do
212*9f20bfa6SDavid van Moolenbroek		label="${name%%.*}"
213*9f20bfa6SDavid van Moolenbroek		[ -z "$label" -o ${#label} -gt 63 ] && return 1
214*9f20bfa6SDavid van Moolenbroek		case "$label" in
215*9f20bfa6SDavid van Moolenbroek		-*|_*|*-|*_)		return 1;;
216*9f20bfa6SDavid van Moolenbroek		# some sh require - as the first or last character in the class
217*9f20bfa6SDavid van Moolenbroek		# when matching it
218*9f20bfa6SDavid van Moolenbroek		*[![:alnum:]_-]*)	return 1;;
219*9f20bfa6SDavid van Moolenbroek		esac
220*9f20bfa6SDavid van Moolenbroek		[ "$name" = "${name#*.}" ] && break
221*9f20bfa6SDavid van Moolenbroek		name="${name#*.}"
222*9f20bfa6SDavid van Moolenbroek	done
223*9f20bfa6SDavid van Moolenbroek	return 0
224*9f20bfa6SDavid van Moolenbroek}
225*9f20bfa6SDavid van Moolenbroek
226*9f20bfa6SDavid van Moolenbroekvalid_domainname_list()
227*9f20bfa6SDavid van Moolenbroek{
228*9f20bfa6SDavid van Moolenbroek	local name
229*9f20bfa6SDavid van Moolenbroek
230*9f20bfa6SDavid van Moolenbroek	for name do
231*9f20bfa6SDavid van Moolenbroek		valid_domainname "$name" || return $?
232*9f20bfa6SDavid van Moolenbroek	done
233*9f20bfa6SDavid van Moolenbroek	return 0
234*9f20bfa6SDavid van Moolenbroek}
235*9f20bfa6SDavid van Moolenbroek
236*9f20bfa6SDavid van Moolenbroek# Check for a valid path
237*9f20bfa6SDavid van Moolenbroekvalid_path()
238*9f20bfa6SDavid van Moolenbroek{
239*9f20bfa6SDavid van Moolenbroek
240*9f20bfa6SDavid van Moolenbroek	case "$@" in
241*9f20bfa6SDavid van Moolenbroek	*[![:alnum:]#%+-_:\.,@~\\/\[\]=\ ]*) return 1;;
242*9f20bfa6SDavid van Moolenbroek	esac
243*9f20bfa6SDavid van Moolenbroek	return 0
244*9f20bfa6SDavid van Moolenbroek}
245*9f20bfa6SDavid van Moolenbroek
246*9f20bfa6SDavid van Moolenbroek# With the advent of alternative init systems, it's possible to have
247*9f20bfa6SDavid van Moolenbroek# more than one installed. So we need to try and guess what one we're
248*9f20bfa6SDavid van Moolenbroek# using unless overriden by configure.
249*9f20bfa6SDavid van Moolenbroekdetect_init()
250*9f20bfa6SDavid van Moolenbroek{
251*9f20bfa6SDavid van Moolenbroek	_service_exists="@SERVICEEXISTS@"
252*9f20bfa6SDavid van Moolenbroek	_service_cmd="@SERVICECMD@"
253*9f20bfa6SDavid van Moolenbroek	_service_status="@SERVICESTATUS@"
254*9f20bfa6SDavid van Moolenbroek
255*9f20bfa6SDavid van Moolenbroek	[ -n "$_service_cmd" ] && return 0
256*9f20bfa6SDavid van Moolenbroek
257*9f20bfa6SDavid van Moolenbroek	if ${_detected_init}; then
258*9f20bfa6SDavid van Moolenbroek		[ -n "$_service_cmd" ]
259*9f20bfa6SDavid van Moolenbroek		return $?
260*9f20bfa6SDavid van Moolenbroek	fi
261*9f20bfa6SDavid van Moolenbroek
262*9f20bfa6SDavid van Moolenbroek	# Detect the running init system.
263*9f20bfa6SDavid van Moolenbroek	# As systemd and OpenRC can be installed on top of legacy init
264*9f20bfa6SDavid van Moolenbroek	# systems we try to detect them first.
265*9f20bfa6SDavid van Moolenbroek	_service_status=
266*9f20bfa6SDavid van Moolenbroek	if [ -x /bin/systemctl -a -S /run/systemd/private ]; then
267*9f20bfa6SDavid van Moolenbroek		_service_exists="/bin/systemctl --quiet is-enabled \$1.service"
268*9f20bfa6SDavid van Moolenbroek		_service_status="/bin/systemctl --quiet is-active \$1.service"
269*9f20bfa6SDavid van Moolenbroek		_service_cmd="/bin/systemctl \$2 \$1.service"
270*9f20bfa6SDavid van Moolenbroek	elif [ -x /usr/bin/systemctl -a -S /run/systemd/private ]; then
271*9f20bfa6SDavid van Moolenbroek		_service_exists="/usr/bin/systemctl --quiet is-enabled \$1.service"
272*9f20bfa6SDavid van Moolenbroek		_service_status="/usr/bin/systemctl --quiet is-active \$1.service"
273*9f20bfa6SDavid van Moolenbroek		_service_cmd="/usr/bin/systemctl \$2 \$1.service"
274*9f20bfa6SDavid van Moolenbroek	elif [ -x /sbin/rc-service -a \
275*9f20bfa6SDavid van Moolenbroek	    -s /libexec/rc/init.d/softlevel -o -s /run/openrc/softlevel ]
276*9f20bfa6SDavid van Moolenbroek	then
277*9f20bfa6SDavid van Moolenbroek		_service_exists="/sbin/rc-service -e \$1"
278*9f20bfa6SDavid van Moolenbroek		_service_cmd="/sbin/rc-service \$1 -- -D \$2"
279*9f20bfa6SDavid van Moolenbroek	elif [ -x /usr/sbin/invoke-rc.d ]; then
280*9f20bfa6SDavid van Moolenbroek		_service_exists="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]"
281*9f20bfa6SDavid van Moolenbroek		_service_cmd="/usr/sbin/invoke-rc.d \$1 \$2"
282*9f20bfa6SDavid van Moolenbroek	elif [ -x /sbin/service ]; then
283*9f20bfa6SDavid van Moolenbroek		_service_exists="/sbin/service \$1 >/dev/null 2>&1"
284*9f20bfa6SDavid van Moolenbroek		_service_cmd="/sbin/service \$1 \$2"
285*9f20bfa6SDavid van Moolenbroek	elif [ -x /bin/sv ]; then
286*9f20bfa6SDavid van Moolenbroek		_service_exists="/bin/sv status \1 >/dev/null 2>&1"
287*9f20bfa6SDavid van Moolenbroek		_service_cmd="/bin/sv \$1 \$2"
288*9f20bfa6SDavid van Moolenbroek	elif [ -x /usr/bin/sv ]; then
289*9f20bfa6SDavid van Moolenbroek		_service_exists="/usr/bin/sv status \1 >/dev/null 2>&1"
290*9f20bfa6SDavid van Moolenbroek		_service_cmd="/usr/bin/sv \$1 \$2"
291*9f20bfa6SDavid van Moolenbroek	elif [ -e /etc/slackware-version -a -d /etc/rc.d ]; then
292*9f20bfa6SDavid van Moolenbroek		_service_exists="[ -x /etc/rc.d/rc.\$1 ]"
293*9f20bfa6SDavid van Moolenbroek		_service_cmd="/etc/rc.d/rc.\$1 \$2"
294*9f20bfa6SDavid van Moolenbroek		_service_status="/etc/rc.d/rc.\$1 status 1>/dev/null 2>&1"
295*9f20bfa6SDavid van Moolenbroek	else
296*9f20bfa6SDavid van Moolenbroek		for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do
297*9f20bfa6SDavid van Moolenbroek			if [ -d $x ]; then
298*9f20bfa6SDavid van Moolenbroek				_service_exists="[ -x $x/\$1 ]"
299*9f20bfa6SDavid van Moolenbroek				_service_cmd="$x/\$1 \$2"
300*9f20bfa6SDavid van Moolenbroek				break
301*9f20bfa6SDavid van Moolenbroek			fi
302*9f20bfa6SDavid van Moolenbroek		done
303*9f20bfa6SDavid van Moolenbroek		if [ -e /etc/arch-release ]; then
304*9f20bfa6SDavid van Moolenbroek			_service_status="[ -e /var/run/daemons/\$1 ]"
305*9f20bfa6SDavid van Moolenbroek		elif [ "$x" = "/etc/rc.d" -a -e /etc/rc.d/rc.subr ]; then
306*9f20bfa6SDavid van Moolenbroek			_service_status="$x/\$1 check 1>/dev/null 2>&1"
307*9f20bfa6SDavid van Moolenbroek		fi
308*9f20bfa6SDavid van Moolenbroek	fi
309*9f20bfa6SDavid van Moolenbroek
310*9f20bfa6SDavid van Moolenbroek	_detected_init=true
311*9f20bfa6SDavid van Moolenbroek	if [ -z "$_service_cmd" ]; then
312*9f20bfa6SDavid van Moolenbroek		syslog err "could not detect a useable init system"
313*9f20bfa6SDavid van Moolenbroek		return 1
314*9f20bfa6SDavid van Moolenbroek	fi
315*9f20bfa6SDavid van Moolenbroek	return 0
316*9f20bfa6SDavid van Moolenbroek}
317*9f20bfa6SDavid van Moolenbroek
318*9f20bfa6SDavid van Moolenbroek# Check a system service exists
319*9f20bfa6SDavid van Moolenbroekservice_exists()
320*9f20bfa6SDavid van Moolenbroek{
321*9f20bfa6SDavid van Moolenbroek
322*9f20bfa6SDavid van Moolenbroek	if [ -z "$_service_exists" ]; then
323*9f20bfa6SDavid van Moolenbroek		detect_init || return 1
324*9f20bfa6SDavid van Moolenbroek	fi
325*9f20bfa6SDavid van Moolenbroek	eval $_service_exists
326*9f20bfa6SDavid van Moolenbroek}
327*9f20bfa6SDavid van Moolenbroek
328*9f20bfa6SDavid van Moolenbroek# Send a command to a system service
329*9f20bfa6SDavid van Moolenbroekservice_cmd()
330*9f20bfa6SDavid van Moolenbroek{
331*9f20bfa6SDavid van Moolenbroek
332*9f20bfa6SDavid van Moolenbroek	if [ -z "$_service_cmd" ]; then
333*9f20bfa6SDavid van Moolenbroek		detect_init || return 1
334*9f20bfa6SDavid van Moolenbroek	fi
335*9f20bfa6SDavid van Moolenbroek	eval $_service_cmd
336*9f20bfa6SDavid van Moolenbroek}
337*9f20bfa6SDavid van Moolenbroek
338*9f20bfa6SDavid van Moolenbroek# Send a command to a system service if it is running
339*9f20bfa6SDavid van Moolenbroekservice_status()
340*9f20bfa6SDavid van Moolenbroek{
341*9f20bfa6SDavid van Moolenbroek
342*9f20bfa6SDavid van Moolenbroek	if [ -z "$_service_cmd" ]; then
343*9f20bfa6SDavid van Moolenbroek		detect_init || return 1
344*9f20bfa6SDavid van Moolenbroek	fi
345*9f20bfa6SDavid van Moolenbroek	if [ -n "$_service_status" ]; then
346*9f20bfa6SDavid van Moolenbroek		eval $_service_status
347*9f20bfa6SDavid van Moolenbroek	else
348*9f20bfa6SDavid van Moolenbroek		service_command $1 status >/dev/null 2>&1
349*9f20bfa6SDavid van Moolenbroek	fi
350*9f20bfa6SDavid van Moolenbroek}
351*9f20bfa6SDavid van Moolenbroek
352*9f20bfa6SDavid van Moolenbroek# Handy macros for our hooks
353*9f20bfa6SDavid van Moolenbroekservice_command()
354*9f20bfa6SDavid van Moolenbroek{
355*9f20bfa6SDavid van Moolenbroek
356*9f20bfa6SDavid van Moolenbroek	service_exists $1 && service_cmd $1 $2
357*9f20bfa6SDavid van Moolenbroek}
358*9f20bfa6SDavid van Moolenbroekservice_condcommand()
359*9f20bfa6SDavid van Moolenbroek{
360*9f20bfa6SDavid van Moolenbroek
361*9f20bfa6SDavid van Moolenbroek	service_exists $1 && service_status $1 && service_cmd $1 $2
362*9f20bfa6SDavid van Moolenbroek}
363*9f20bfa6SDavid van Moolenbroek
364*9f20bfa6SDavid van Moolenbroek# We source each script into this one so that scripts run earlier can
365*9f20bfa6SDavid van Moolenbroek# remove variables from the environment so later scripts don't see them.
366*9f20bfa6SDavid van Moolenbroek# Thus, the user can create their dhcpcd.enter/exit-hook script to configure
367*9f20bfa6SDavid van Moolenbroek# /etc/resolv.conf how they want and stop the system scripts ever updating it.
368*9f20bfa6SDavid van Moolenbroekfor hook in \
369*9f20bfa6SDavid van Moolenbroek	@SYSCONFDIR@/dhcpcd.enter-hook \
370*9f20bfa6SDavid van Moolenbroek	@HOOKDIR@/* \
371*9f20bfa6SDavid van Moolenbroek	@SYSCONFDIR@/dhcpcd.exit-hook
372*9f20bfa6SDavid van Moolenbroekdo
373*9f20bfa6SDavid van Moolenbroek	for skip in $skip_hooks; do
374*9f20bfa6SDavid van Moolenbroek		case "$hook" in
375*9f20bfa6SDavid van Moolenbroek			*/*~)				continue 2;;
376*9f20bfa6SDavid van Moolenbroek			*/"$skip")			continue 2;;
377*9f20bfa6SDavid van Moolenbroek			*/[0-9][0-9]"-$skip")		continue 2;;
378*9f20bfa6SDavid van Moolenbroek			*/[0-9][0-9]"-$skip.sh")	continue 2;;
379*9f20bfa6SDavid van Moolenbroek		esac
380*9f20bfa6SDavid van Moolenbroek	done
381*9f20bfa6SDavid van Moolenbroek	if [ -f "$hook" ]; then
382*9f20bfa6SDavid van Moolenbroek		. "$hook"
383*9f20bfa6SDavid van Moolenbroek	fi
384*9f20bfa6SDavid van Moolenbroekdone
385