summaryrefslogtreecommitdiff
path: root/aports/busybox/default.script
blob: cbc4179c9496412a5d8161b433703d5992f3e55e (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/sh

# script for udhcpc
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>

UDHCPC="/etc/udhcpc"
UDHCPC_CONF="$UDHCPC/udhcpc.conf"

RESOLV_CONF="/etc/resolv.conf"
UDHCPD_CONF="no"
[ -f $UDHCPC_CONF ] && . $UDHCPC_CONF

export broadcast
export dns
export domain
export interface
export ip
export mask
export metric
export staticroutes
export router
export subnet

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

run_scripts() {
	local dir=$1
	if [ -d $dir ]; then
		for i in $dir/*; do
			[ -f $i ] && $i
		done
	fi
}

deconfig() {
	ip -4 addr flush dev $interface
}

is_wifi() {
	test -e /sys/class/net/$interface/phy80211
}

if_index() {
	if [ -e  /sys/class/net/$interface/ifindex ]; then
		cat /sys/class/net/$interface/ifindex
	else
		ip -4 link show dev $interface | head -n1 | cut -d: -f1
	fi
}

calc_metric() {
	local base=
	if is_wifi; then
		base=300
	else
		base=200
	fi
	echo $(( $base + $(if_index) ))
}

route_add() {
	local to=$1 gw=$2 num=$3
	# special case for /32 subnets:
	# /32 instructs kernel to always use routing for all outgoing packets
	# (they can never be sent to local subnet - there is no local subnet for /32).
	# Used in datacenters, avoids the need for private ip-addresses between two hops.
	if [ "$subnet" = "255.255.255.255" ]; then
		ip -4 route add $gw dev $interface
	fi
	ip -4 route add $to via $gw dev $interface \
		metric $(( $num + ${IF_METRIC:-$(calc_metric)} ))
}

routes() {
	[ -z "$router" ] && [ -z "$staticroutes" ] && return
	for i in $NO_GATEWAY; do
		[ "$i" = "$interface" ] && return
	done
	while ip -4 route del default via dev $interface 2>/dev/null; do
		:
	done
	local num=0
	# RFC3442:
	# 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 "$staticroutes" ]; then
		# static routes format: dest1/mask gw1 ... destn/mask gwn
		set -- $staticroutes
		while [ -n "$1" ] && [ -n "$2" ]; do
			local dest="$1" gw="$2"
			if [ "$gw" != "0.0.0.0" ]; then
				route_add $dest $gw $num && num=$(( $num + 1))
			fi
			shift 2
		done
	else
		local gw=
		for gw in $router; do
			route_add 0.0.0.0/0 $gw $num && num=$(( $num + 1 ))
		done
	fi
}

resolvconf() {
	local i
	if [ "$RESOLV_CONF" = "no" ] || [ "$RESOLV_CONF" = "NO" ] \
			|| [ -z "$RESOLV_CONF" ] || [ -z "$dns" ]; then
		return
	fi
	echo -n > "$RESOLV_CONF.$$"
	if [ -n "$search" ]; then
		echo "search $search" >> "$RESOLV_CONF.$$"
	elif [ -n "$domain" ]; then
		echo "search $domain" >> "$RESOLV_CONF.$$"
	fi
	for i in $dns; do
		echo "nameserver $i" >> "$RESOLV_CONF.$$"
	done
	chmod a+r "$RESOLV_CONF.$$"
	mv -f "$RESOLV_CONF.$$" "$RESOLV_CONF"
}

udhcpd_conf() {
	if [ "$UDHCPD_CONF" = "no" ] || [ "$UDHCPD_CONF" = "NO" ] \
			|| [ -z "$UDHCPD_CONF" ]; then
		return
	fi
	cat $UDHCPD_CONF_TEMPLATE \
		| sed "s!%%DNS%%!$dns!" \
		> $UDHCPD_CONF
	chmod a+r "$UDHCPD_CONF"
	service udhcpd --ifstarted restart
}

propagate_dns() {
	local i
	[ -n "$IF_PEER_DNS" ] && [ "$IF_PEER_DNS" != "yes" ] && return
	for i in $NO_DNS; do
		[ "$i" = "$interface" ] && return
	done
	resolvconf
	udhcpd_conf
}

bound() {
	ip -4 addr add $ip/$mask ${broadcast:+broadcast $broadcast} dev $interface
	ip -4 link set dev $interface up
	routes
	propagate_dns
}

renew() {
	if ! ip -4 addr show dev $interface | grep $ip/$mask; then
		ip -4 addr flush dev $interface
		ip -4 addr add $ip/$mask ${broadcast:+broadcast $broadcast} dev $interface
	fi

	local i
	for i in $router; do
		if ! ip -4 route show | grep ^default | grep $i; then
			routes
			break
		fi
	done

	if ! grep "^search $domain"; then
		propagate_dns
		return
	fi
	for i in $dns; do
		if ! grep "^nameserver $i"; then
			propagate_dns
			return
		fi
	done
}

case "$1" in
	deconfig|renew|bound)
		run_scripts $UDHCPC/pre-$1
		$1
		run_scripts $UDHCPC/post-$1
		;;
	leasefail)
		echo "udhcpc failed to get a DHCP lease" >&2
		;;
	nak)
		echo "udhcpc received DHCP NAK" >&2
		;;
	*)
		echo "Error: this script should be called from udhcpc" >&2
		exit 1
		;;
esac
exit 0