source: freewrt/package/fwifupdown/files/main.sh@ 3278fb3

Last change on this file since 3278fb3 was 5dcdc822, checked in by Thorsten Glaser <tg@…>, 19 years ago

nuke set -u, ok spaetzle@
(rides on old dashver bump)

git-svn-id: svn://www.freewrt.org/trunk/freewrt@2768 afb5a338-a214-0410-bd46-81f09a774fd1

  • Property mode set to 100644
File size: 7.3 KB
Line 
1#!/bin/sh
2#
3# This file is part of the FreeWRT project. FreeWRT is copyrighted
4# material, please see the LICENCE file in the top-level directory
5# or at http://www.freewrt.org/licence for details.
6#
7# Christian Fischer <spaetzle@freewrt.org>
8#
9
10built_in() {
11 local what=$1
12 local alias=$(alias $what)
13 unalias $what
14 alias $(echo $alias|sed 's/'\''//g')
15 shift
16 $what $@
17}
18
19config() {
20 [ x"$1" != x"0" ]
21}
22
23__ifupdown() {
24 local environ=$(cat $ENVFILE)
25
26 IFUPDOWN_ENV=$(echo -n $IFUPDOWN_ENV|sed 's/\(MDENT=\)[^ ]*[[:space:]]*//g';\
27 echo " PARENT_IFACE_TYPE=$IFACE_TYPE"; \
28 echo " PARENT_IFACE=$IFACE"; \
29 echo " MDENT=$MDENT") \
30 busybox "$@"
31
32 retval=$?
33 echo $environ > $ENVFILE
34 return $retval
35}
36
37__exit() {
38 [ "$1" != "0" ] && echo "H_ERR=1" >> $ENVFILE
39 exit $1
40}
41
42iface_exists() {
43 grep -q "${1:-$IFACE}:" /proc/net/dev
44}
45
46is_up() {
47 local iface=${1:-$IFACE}
48
49 if iface_exists $iface
50 then
51 ip a|grep ${iface}:[[:space:]]|grep -q UP && return
52
53 ### ifupdown netlink bug workaround ###
54 # suppress "ip: RTNETLINK answers: File exists" message in the case of
55 # iface is down but an ip address is assigned
56 ip a|grep ${iface}$|grep -q inet && ip addr flush dev $iface >/dev/null 2>&1
57 ### end workaround ###
58 fi
59 return 1
60}
61
62main_env_update() {
63 local t_mdent lastmatch=""
64
65 # get submode from calling hook script
66 SUBMODE=$(dirname $0|sed '{ s/\(.*\/\)*//; s/\.d$//}')
67
68 # create env file
69 if ! [ -f "$ENVFILE" ]
70 then
71 [ -d $(dirname $ENVFILE) ] || mkdir -p $(dirname $ENVFILE)
72 echo "MDENT=0" >> $ENVFILE
73 echo "LASTLOG=0" >> $ENVFILE
74
75 if is_up
76 then
77 IFACE_STATE="up"
78 else
79 IFACE_STATE="down"
80 fi
81 echo "IFACE_STATE=$IFACE_STATE" >> $ENVFILE
82
83 if [ "$IFACE" != "lo" ]
84 then
85 # search for existing lib files end evaluate iface type by using the appropriate
86 # function from lib file
87 for lib in ${LIBDIR}/iftypes/* ${LIBDIR_OVERLAY}/iftypes/*
88 do
89 if [ -f $lib ]
90 then
91 if (. $lib; iface_type 2>&-)
92 then
93 if [ "$lastmatch" != "" ]
94 then
95 if [ "$(basename $lib)" = "$(basename $lastmatch)" ]
96 then
97 mprint -s "Warning: $lib overlays $lastmatch"
98 else
99 mprint -s "Error: iface type $lib overlays $lastmatch"
100 fi
101 fi
102 lastmatch=$lib
103 fi
104 fi
105 done
106 fi
107
108 if [ "$lastmatch" != "" ]
109 then
110 IFACE_TYPE=$(basename $lastmatch)
111 else
112 # if iface type isn't evaluated type "iface" is default
113 IFACE_TYPE="iface"
114 fi
115
116 # update env
117 echo "IFACE_TYPE=${IFACE_TYPE}" >> $ENVFILE
118 fi
119
120 . $ENVFILE
121 t_mdent=$MDENT
122
123 # expand $IFUPDOWN_ENV
124 for var in $IFUPDOWN_ENV; do
125 eval $var
126 done
127
128 [ $t_mdent -gt $MDENT ] && MDENT=$t_mdent
129 main_pos_update
130}
131
132main_pos_update() {
133 if [ "${MDENT:-0}" = "0" ]
134 then
135 STARTCOL=""
136 else
137 STARTCOL="[$(expr ${MDENT:-0} \* ${TAB})C"
138 fi
139 sed 's/MDENT=[0-9]*/'MDENT=$MDENT'/' -i $ENVFILE
140}
141
142main_preup() {
143 config $RT_PREUP_PRINTING_OFF || mstart
144
145 if ! config $RT_PREUP_IFUP_CHECK_OFF && is_up
146 then
147 if ! config $RT_PREUP_PRINTING_OFF
148 then
149 mup
150 mstate 1
151 minfo "Interface already up"
152 fi
153 exit 1
154 fi
155
156 if_preup 2>&-
157 retval=$?
158
159 if [ $retval != 0 ]
160 then
161 if [ $retval != 127 ]
162 then
163 fail_preup 2>&- || exit 1
164 fi
165 fi
166
167 config $RT_PREUP_PRINTING_OFF || mup
168}
169
170main_up() {
171 if ! config $RT_UP_IFUP_CHECK_OFF
172 then
173 is_up
174 retval=$?
175
176 if [ $retval != 0 ]
177 then
178
179 if ! config $RT_UP_PRINTING_OFF
180 then
181 mstate $retval
182 [ "$METHOD" = "manual" ] && minfo "Method manual is set"
183 fi
184 exit 1
185 else
186 config $RT_UP_PRINTING_OFF || mstate $retval
187 fi
188 fi
189
190 if_up 2>&-
191 retval=$?
192
193 if [ $retval != 0 ]
194 then
195 if [ $retval != 127 ]
196 then
197 fail_up 2>&- || exit 1
198 fi
199 fi
200
201 if [ -d /tmp/ifupdown/pcode/${IFACE} ]
202 then
203 for dir in /tmp/ifupdown/pcode/${IFACE}/*
204 do
205 if [ -f ${dir}/postup ]
206 then
207 . ${dir}/postup
208 fi
209 done
210 fi
211}
212
213main_down() {
214 config $RT_DOWN_PRINTING_OFF || mstop
215
216 if [ -d /tmp/ifupdown/pcode/${IFACE} ]
217 then
218 for dir in /tmp/ifupdown/pcode/${IFACE}/*
219 do
220 if [ -f ${dir}/predown ]
221 then
222 . ${dir}/predown
223 fi
224 done
225 fi
226
227 if_down 2>&-
228 retval=$?
229
230 if [ $retval != 0 ]
231 then
232 if [ $retval != 127 ]
233 then
234 fail_down 2>&- || exit 1
235 fi
236 fi
237
238 config $RT_DOWN_PRINTING_OFF || mdown
239}
240
241main_postdown() {
242 if ! config $RT_POSTDOWN_IFDOWN_CHECK_OFF
243 then
244 if [ $IFACE_STATE = "down" ]
245 then
246 if ! config $RT_POSTDOWN_PRINTING_OFF
247 then
248 mdown
249 mstate 1
250 minfo "Interface already down"
251 fi
252 else
253 if is_up
254 then
255 if ! config $RT_POSTDOWN_PRINTING_OFF
256 then
257 mstate 1
258 [ "$METHOD" = "manual" ] && minfo "Method manual is set"
259 fi
260 return 1
261 else
262 config $RT_POSTDOWN_PRINTING_OFF || mstate 0
263 fi
264 fi
265 fi
266
267 if_postdown 2>&-
268 retval=$?
269
270 if [ $retval != 0 ]
271 then
272 if [ $retval != 127 ]
273 then
274 fail_postdown 2>&- || exit 1
275 fi
276 fi
277
278 # pcode cleanup
279 rm -rf /tmp/ifupdown/pcode/*/$IFACE 2>&- 1>&-
280}
281
282main_exec_dirhooks() {
283 for hook in ${LIBDIR_OVERLAY}/${1}/${2} ${LIBDIR}/${1}/${2}
284 do
285 if [ -f $hook ]
286 then
287 . $hook
288 eval $3 2>&-
289 retval=$?
290 [ $retval != 0 -a $retval != 127 ] && exit 1
291 return
292 fi
293 done
294}
295
296main_exec_plugins() {
297 for plugin in ${LIBDIR_OVERLAY}/plugins/* ${LIBDIR}/plugins/*; do
298 [ -f $plugin ] || continue
299 . $plugin
300 eval "${plugin##*/}_${1}" 2>&-
301 retval=$?
302 [ $retval != 0 -a $retval != 127 ] && exit 1
303 done
304}
305
306main_exec_inlinehooks() {
307 case $SUBMODE in
308 if-pre-up)
309 [ "${IF_PRE_UP:-""}" != "" ] && eval $IF_PRE_UP
310 ;;
311 if-up)
312 [ "${IF_UP:-""}" != "" ] && eval $IF_UP
313 ;;
314 if-down)
315 [ "${IF_DOWN:-""}" != "" ] && eval $IF_DOWN
316 ;;
317 if-post-down)
318 [ "${IF_POST_DOWN:-""}" != "" ] && eval $IF_POST_DOWN
319 ;;
320 esac
321}
322
323### main entry point ###
324
325CFG_PRINTING_OFF=0
326CFG_SYSLOG_OFF=0
327CFG_FANCY=0
328CFG_DEBUG=0
329
330if ! [ -f /etc/conf.d/ifupdown ]
331then
332 logger -t ifupdown "/etc/conf.d/ifupdown not found"
333 exit 1
334fi
335. /etc/conf.d/ifupdown
336
337config ${CFG_DEBUG:=""} && set -x
338
339RT_PREUP_PRINTING_OFF=0
340RT_UP_PRINTING_OFF=0
341RT_DOWN_PRINTING_OFF=0
342RT_POSTDOWN_PRINTING_OFF=0
343RT_PREUP_IFUP_CHECK_OFF=0
344RT_UP_IFUP_CHECK_OFF=0
345RT_POSTDOWN_IFDOWN_CHECK_OFF=0
346RT_BB_NOEXEC=0
347readonly ENVFILE="/tmp/ifupdown/env"
348readonly LIBDIR="/lib/network"
349readonly LIBDIR_OVERLAY="/etc/network/lib"
350IFACE_TYPE="none"
351H_ERR=0
352
353alias exit="__exit"
354alias ifup="__ifupdown ifup"
355alias ifdown="__ifupdown ifdown"
356[ -z "${KSH_VERSION:-""}" ] || alias which='whence -p'
357
358if ! [ -f ${LIBDIR}/sh/mfunctions.sh ]
359then
360 logger -t ifupdown "${LIBDIR}/sh/mfunctions.sh not found"
361 exit 1
362fi
363. ${LIBDIR}/sh/mfunctions.sh
364
365main_env_update
366
367config $H_ERR && built_in exit 1
368
369if [ "$IFACE_TYPE" != "iface" ]
370then
371 if [ -f "${LIBDIR_OVERLAY}/iftypes/${IFACE_TYPE}" ]
372 then
373 . ${LIBDIR_OVERLAY}/iftypes/${IFACE_TYPE}
374 elif [ -f "${LIBDIR}/iftypes/${IFACE_TYPE}" ]
375 then
376 . ${LIBDIR}/iftypes/$IFACE_TYPE
377 else
378 mprint -s "Error: libfile $IFACE_TYPE not found"
379 fi
380fi
381
382case $SUBMODE in
383 if-pre-up)
384 main_preup
385 main_exec_dirhooks methods $METHOD method_preup
386 main_exec_plugins preup
387
388 # bypass execution of further busybox ifupdown.c code
389 config $RT_BB_NOEXEC && built_in exit 1
390 ;;
391 if-up)
392 main_exec_plugins up
393 main_exec_dirhooks methods $METHOD method_up
394 main_up
395 ;;
396 if-down)
397 main_down
398 main_exec_dirhooks methods $METHOD method_down
399 main_exec_plugins down
400
401 # bypass execution of further busybox ifupdown.c code
402 config $RT_BB_NOEXEC && built_in exit 1
403 ;;
404 if-post-down)
405 main_exec_plugins postdown
406 main_exec_dirhooks methods $METHOD method_postdown
407 main_postdown
408 ;;
409esac
410
411exit 0
412
413# vim:ts=4
Note: See TracBrowser for help on using the repository browser.