dhcpcd-run-hooks.in revision 938bc384f44031877543765a9ae18c764f5da9c8
1#!/bin/sh
2# dhcpcd client configuration script 
3
4# Handy variables and functions for our hooks to use
5from="from"
6signature_base="# Generated by dhcpcd"
7signature="${signature_base} ${from} ${interface}"
8signature_base_end="# End of dhcpcd"
9signature_end="${signature_base_end} ${from} ${interface}"
10state_dir="/var/run/dhcpcd"
11
12# Ensure that all arguments are unique
13uniqify()
14{
15	local result=
16
17	while [ -n "$1" ]; do
18		case " ${result} " in
19		*" $1 "*);;
20		*) result="${result}${result:+ }$1";;
21		esac
22		shift
23	done
24	echo "${result}"
25}
26
27# List interface config files in a dir
28# We may wish to control the order at some point rather than just lexical
29list_interfaces()
30{
31	local x= interfaces=
32	for x in "$1"/*; do
33		[ -e "${x}" ] || continue
34		interfaces="${interfaces}${interfaces:+ }${x##*/}"
35	done
36	echo "${interfaces}"
37}
38
39# We normally use sed to extract values using a key from a list of files
40# but sed may not always be available at the time.
41key_get_value()
42{
43	local key="$1" value= x= line=
44
45	shift
46	if type sed >/dev/null 2>&1; then
47		sed -n "s/^${key}//p" $@
48	else
49		for x; do
50			while read line; do
51				case "${line}" in
52				"${key}"*) echo "${line##${key}}";;
53				esac
54			done < "${x}"
55		done
56	fi
57}
58
59# We normally use sed to remove markers from a configuration file
60# but sed may not always be available at the time.
61remove_markers()
62{
63	local m1="$1" m2="$2" x= line= in_marker=0
64
65	shift; shift
66	if type sed >/dev/null 2>&1; then
67		sed "/^${m1}/,/^${m2}/d" $@
68	else
69		for x; do
70			while read line; do
71				case "${line}" in
72				"${m1}"*) in_marker=1;;
73				"${m2}"*) in_marker=0;;
74				*) [ ${in_marker} = 0 ] && echo "${line}";;
75				esac
76			done < "${x}"
77		done
78	fi
79}
80
81# Compare two files
82# If different, replace first with second otherwise remove second
83change_file()
84{
85	if type cmp >/dev/null 2>&1; then
86		cmp -s "$1" "$2"
87	elif type diff >/dev/null 2>&1; then
88		diff -q "$1" "$2" >/dev/null
89	else
90		# Hopefully we're only working on small text files ...
91		[ "$(cat "$1")" = "$(cat "$2")" ]
92	fi
93	if [ $? -eq 0 ]; then
94		rm -f "$2"
95		return 1
96	fi
97	mv -f "$2" "$1"
98	return 0
99}
100
101# Save a config file
102save_conf()
103{
104	if [ -f "$1" ]; then
105		rm -f "$1"-pre."${interface}"
106		mv -f "$1" "$1"-pre."${interface}"
107	fi
108}
109
110# Restore a config file
111restore_conf()
112{
113	[ -f "$1"-pre."${interface}" ] || return 1
114	rm -f "$1"
115	mv -f "$1"-pre."${interface}" "$1"
116}
117
118
119# We source each script into this one so that scripts run earlier can
120# remove variables from the environment so later scripts don't see them.
121# Thus, the user can create their dhcpcd.enter/exit-hook script to configure
122# /etc/resolv.conf how they want and stop the system scripts ever updating it.
123for hook in \
124	@SYSCONFDIR@/dhcpcd.enter-hook \
125	@HOOKDIR@/* \
126	@SYSCONFDIR@/dhcpcd.exit-hook
127do
128	for skip in ${skip_hooks}; do
129		case "${hook}" in
130			*/"${skip}")			continue 2;;
131			*/[0-9][0-9]"-${skip}")		continue 2;;
132			*/[0-9][0-9]"-${skip}.sh")	continue 2;;
133		esac
134	done
135	if [ -f "${hook}" ]; then
136		. "${hook}"
137	fi
138done
139