aboutsummaryrefslogtreecommitdiff
blob: 85ea09d997127ff90f5096b6f480f025c50872d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!@SHELL@
# busybox udhcp setup script
# shellcheck shell=sh disable=SC1008

PATH=/bin:/usr/bin:/sbin:/usr/sbin

peer_var()
{
	[ -n "$1" ] && [ "$1" != "yes" ]
}

update_dns()
{
	peer_var "${PEER_DNS}" && return
	[ -z "${domain}" ] && [ -z "${dns}" ] && return

	conf="# Generated by udhcpc for ${interface}\n"
	[ -n "${domain}" ] && conf="${conf}domain ${domain}\n"
	for i in ${dns} ; do
		conf="${conf}nameserver ${i}\n"
	done
	if command -v resolvconf >/dev/null; then
		printf "${conf}" | resolvconf -a ${interface}
	else
		printf "${conf}" > /etc/resolv.conf
		chmod 644 /etc/resolv.conf
	fi
}

update_ntp()
{
	peer_var "${PEER_NTP}" && return
	[ -z "${ntpsrv}" ] && return

	conf="# Generated by udhcpc for interface ${interface}\n"
	conf="${conf}restrict default noquery notrust nomodify\n"
	conf="${conf}restrict 127.0.0.1\n"
	for i in ${ntpsrv} ; do
		conf="${conf}restrict ${i} nomodify notrap noquery\n"
		conf="${conf}server ${i}\n"
	done
	conf="${conf}driftfile /var/lib/ntp/ntp.drift\n"
	conf="${conf}logfile /var/log/ntp.log\n"
	printf "${conf}" > /etc/ntp.conf
	chmod 644 /etc/ntp.conf
}

update_hostname()
{
	peer_var "${PEER_HOSTNAME}" && return
	[ -z "${hostname}" ] && return

	myhost="$(hostname)"
	[ -z "${myhost}" ] || [ "${myhost}" = "(none)" ] && hostname "${hostname}"
}

update_interface()
{
	[ -n "${broadcast}" ] && broadcast="broadcast ${broadcast}"
	[ -n "${subnet}" ] && netmask="netmask ${subnet}"
	[ -n "${mtu}" ] && mtu="mtu ${mtu}"
	ifconfig "${interface}" ${ip} ${broadcast} ${netmask} ${mtu}
}

update_classless_routes()
{
	if [ -n "${staticroutes}" ] ; then
		max_routes=128
		metric=
		[ -n "${IF_METRIC}" ] && metric="metric ${IF_METRIC}"
		while [ -n "$1" ] && [ -n "$2" ] && [ $max_routes -gt 0 ]; do
			gw_arg=
			if [ "$2" != '0.0.0.0' ]; then
				gw_arg="gw $2"
			fi

			[ ${1##*/} -eq 32 ] && type=host || type=net
			route add -$type "$1" ${gw_arg} ${metric} dev "${interface}"
			max=$((max-1))
			shift 2
		done
	fi
}
update_routes()
{
	peer_var "${PEER_ROUTERS}" && return

	# RFC 3442
	[ -n "${staticroutes}" ] && update_classless_routes $staticroutes

	# If the DHCP server returns both a Classless Static Routes option and
	# a Router option, the DHCP client MUST ignore the Router option.
	if [ -n "${router}" ] && [ -z "${staticroutes}" ] ; then
		metric=
		[ -n "${IF_METRIC}" ] && metric="metric ${IF_METRIC}"
		for i in ${router} ; do
			route add default gw "${i}" ${metric} dev "${interface}"
		done
	fi
}

deconfig()
{
	ifconfig "${interface}" 0.0.0.0

	if ! peer_var "${PEER_ROUTERS}" ; then
		while route del default dev "${interface}" >/dev/null 2>&1; do
			:
		done
	fi

	if ! peer_var "${PEER_DNS}" ; then
		command -v resolvconf >/dev/null && resolvconf -d "${interface}"
	fi
}

if [ -r "/run/udhcpc-${interface}.conf" ]; then
	# shellcheck disable=SC1090
	. "/run/udhcpc-${interface}.conf"
fi

case "$1" in
	bound|renew)
		update_hostname
		update_interface
		update_routes
		update_dns
		update_ntp
		;;
	deconfig|leasefail)
		deconfig
		;;
	nak)
		echo "nak: ${message}"
		;;
	*)
		echo "unknown option $1" >&2
		echo "Usage: $0 {bound|deconfig|leasefail|nak|renew}" >&2
		exit 1
		;;
esac

exit 0