rewrite failsafe mechaism
[openwrt/svn-archive/archive.git] / openwrt / package / base-files / default / etc / functions.sh
1 #!/bin/sh
2 # Copyright (C) 2006 OpenWrt.org
3 # Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
4
5 # newline
6 N="
7 "
8
9 _C=0
10
11 alias debug=${DEBUG:-:}
12
13 # valid interface?
14 if_valid () (
15 ifconfig "$1" >&- 2>&- ||
16 [ "${1%%[0-9]}" = "br" ] ||
17 {
18 [ "${1%%[0-9]*}" = "vlan" ] && (
19 i=${1#vlan}
20 hwname=$(nvram get vlan${i}hwname)
21 hwaddr=$(nvram get ${hwname}macaddr)
22 [ -z "$hwaddr" ] && return 1
23
24 vif=$(ifconfig -a | awk '/^eth.*'$hwaddr'/ {print $1; exit}' IGNORECASE=1)
25 debug "# vlan$i => $vif"
26
27 $DEBUG ifconfig $vif up
28 $DEBUG vconfig add $vif $i 2>&-
29 )
30 } ||
31 { debug "# missing interface '$1' ignored"; false; }
32 )
33
34 do_ifup() {
35 if_proto=$(nvram get ${2}_proto)
36 if=$(nvram get ${2}_ifname)
37 [ "${if%%[0-9]}" = "ppp" ] && if=$(nvram get ${2}_device)
38
39 pidfile=/var/run/${if}.pid
40 [ -f $pidfile ] && $DEBUG kill $(cat $pidfile)
41
42 case "$1" in
43 static)
44 ip=$(nvram get ${2}_ipaddr)
45 netmask=$(nvram get ${2}_netmask)
46 gateway=$(nvram get ${2}_gateway)
47 mtu=$(nvram get ${2}_mtu)
48 static_route=$(nvram get ${2}_static_route)
49
50 $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} ${mtu:+mtu $(($mtu))} broadcast + up
51 ${gateway:+$DEBUG route add default gw $gateway}
52
53 [ -n "$static_route" ] && {
54 for route in $static_route; do {
55 eval "set $(echo $route | sed 's/:/ /g')"
56 if [ "$2" = "255.255.255.255" ]; then
57 opt="-host"
58 fi
59 $DEBUG route add ${opt:-"-net"} $1 netmask $2 gw $3 metric $4
60 } done
61 }
62
63 [ -f /tmp/resolv.conf.auto ] || {
64 debug "# --- creating /tmp/resolv.conf.auto ---"
65 for dns in $(nvram get ${2}_dns); do
66 echo "nameserver $dns" >> /tmp/resolv.conf.auto
67 done
68 }
69
70 env -i ACTION="ifup" INTERFACE="${2}" PROTO=static /sbin/hotplug "iface" &
71 ;;
72 dhcp*)
73 DHCP_IP=$(nvram get ${2}_ipaddr)
74 DHCP_NETMASK=$(nvram get ${2}_netmask)
75 mtu=$(nvram get ${2}_mtu)
76 $DEBUG ifconfig $if $DHCP_IP ${DHCP_NETMASK:+netmask $DHCP_NETMASK} ${mtu:+mtu $(($mtu))} broadcast + up
77
78 DHCP_ARGS="-i $if ${DHCP_IP:+-r $DHCP_IP} -b -p $pidfile"
79 DHCP_HOSTNAME=$(nvram get ${2}_hostname)
80 DHCP_HOSTNAME=${DHCP_HOSTNAME%%.*}
81 [ -z $DHCP_HOSTNAME ] || DHCP_ARGS="$DHCP_ARGS -H $DHCP_HOSTNAME"
82 [ "$if_proto" = "pptp" ] && DHCP_ARGS="$DHCP_ARGS -n -q" || DHCP_ARGS="$DHCP_ARGS -R &"
83 [ -r $pidfile ] && oldpid=$(cat $pidfile 2>&-)
84 ${DEBUG:-eval} "udhcpc $DHCP_ARGS"
85 [ -n "$oldpid" ] && pidof udhcpc | grep "$oldpid" >&- 2>&- && {
86 sleep 1
87 kill -9 $oldpid
88 }
89 # hotplug events are handled by /usr/share/udhcpc/default.script
90 ;;
91 none|"")
92 ;;
93 *)
94 [ -x "/sbin/ifup.$1" ] && { $DEBUG /sbin/ifup.$1 ${2}; exit; }
95 echo "### ifup ${2}: ignored ${2}_proto=\"$1\" (not supported)"
96 ;;
97 esac
98 }
99
100 append() {
101 local var="$1"
102 local value="$2"
103 local sep="${3:- }"
104 eval "export ${var}=\"\${${var}:+\${${var}}${value:+$sep}}\$value\""
105 }
106
107 reset_cb() {
108 config_cb() {
109 return 0
110 }
111 option_cb() {
112 return 0
113 }
114 }
115 reset_cb
116
117 config () {
118 local cfgtype="$1"
119 local name="$2"
120 _C=$(($_C + 1))
121 name="${name:-cfg${_C}}"
122 config_cb "$cfgtype" "$name"
123 export CONFIG_SECTION="$name"
124 export CONFIG_${CONFIG_SECTION}_TYPE="$cfgtype"
125 }
126
127 option () {
128 local varname="$1"; shift
129 export CONFIG_${CONFIG_SECTION}_${varname}="$*"
130 option_cb "$varname" "$*"
131 }
132
133 config_clear() {
134 [ -z "$CONFIG_SECTION" ] && return
135 for oldsetting in `set | grep ^CONFIG_${CONFIG_SECTION}_ | \
136 sed -e 's/\(.*\)=.*$/\1/'` ; do
137 unset $oldsetting
138 done
139 unset CONFIG_SECTION
140 }
141
142 config_load() {
143 CONFIG_SECTION=
144 local DIR="./"
145 _C=0
146 [ \! -e "$1" -a -e "/etc/config/$1" ] && {
147 DIR="/etc/config/"
148 }
149 [ -e "$DIR$1" ] && {
150 CONFIG_FILENAME="$DIR$1"
151 . ${CONFIG_FILENAME}
152 } || return 1
153 ${CD:+cd -} >/dev/null
154 ${CONFIG_SECTION:+config_cb}
155 }
156
157 config_get() {
158 case "$3" in
159 "") eval "echo \${CONFIG_${1}_${2}}";;
160 *) eval "$1=\"\${CONFIG_${2}_${3}}\"";;
161 esac
162 }
163
164 config_set() {
165 export CONFIG_${1}_${2}="${3}"
166 }
167
168 include() {
169 for file in $(ls /lib/$1/*.sh 2>/dev/null); do
170 . $file
171 done
172 }
173
174 set_led() {
175 local led="$1"
176 local state="$2"
177 [ -f "/proc/diag/led/$1" ] && echo "$state" > "/proc/diag/led/$1"
178 }
179
180 set_state() {
181 case "$1" in
182 preinit)
183 set_led dmz 1
184 set_led diag 1
185 set_led power 0
186 ;;
187 failsafe)
188 set_led diag f
189 set_led power f
190 set_led dmz f
191 ;;
192 done)
193 set_led dmz 0
194 set_led diag 0
195 set_led power 1
196 ;;
197 esac
198 }