source: freewrt/package/fwifupdown/files/main.sh@ 8414c1b

Last change on this file since 8414c1b was 8414c1b, checked in by Christian Fischer <spaetzle@…>, 19 years ago

tag: fwifupdown_0.2-1

  • lot of fixes and code cleanup
  • nas startup und shutdown fixes
  • dhcp support added
  • documentation update will follow as soon as possible

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

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