Magellan Linux

Contents of /trunk/initscripts/systemd/units/scripts/network.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1378 - (show annotations) (download) (as text)
Sat Jun 4 22:39:03 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 11771 byte(s)
-added scripts dir
1 #!/bin/bash
2 # $Id$
3 # Magellan network configuration script for systemd
4
5 # read values from files
6 read_value()
7 {
8 local var="$1"
9 local file="$2"
10 local value
11
12 # local all possible vars
13 # global
14 local ONBOOT
15 local NETWORKING
16
17 # static
18 local IP
19 local NETMASK
20 local BROADCAST
21 local NETWORKING
22 local FORCE_MAC_TO
23
24 # dhcp
25 local DHCP_PROG
26 local DHCP_START
27 local DHCP_STOP
28
29 # default gw
30 local GATEWAY
31 local GATEWAY_IF
32
33 # wireless extensions
34 local WIRELESS_AP
35 local WIRELESS_AUTH_MODE
36 local WIRELESS_BITRATE
37 local WIRELESS_CHANNEL
38 local WIRELESS_DEFAULT_KEY
39 local WIRELESS_ESSID
40 local WIRELESS_FREQUENCY
41 local WIRELESS_KEY
42 local WIRELESS_KEY_ASCII
43 local WIRELESS_KEY_0
44 local WIRELESS_KEY_1
45 local WIRELESS_KEY_2
46 local WIRELESS_KEY_3
47 local WIRELESS_KEY_LENGTH
48 local WIRELESS_MODE
49 local WIRELESS_NICK
50 local WIRELESS_NWID
51 local WIRELESS_POWER
52 local WIRELESS_WPA_DRIVER
53
54 local BRIDGE_INTERFACES
55 local BRIDGE_STP
56 local BRIDGE_AGEING_TIME
57 local BRIDGE_PRIORITY
58 local BRIDGE_FORWARD_DELAY
59 local BRIDGE_HELLO_TIME
60 local BRIDGE_MAX_MESSAGE_AGE
61 local BRIDGE_PATH_COST
62 local BRIDGE_PORT_PRIORITY
63
64 source ${file}
65 eval value=\$$(echo ${var})
66 echo "${value}"
67 }
68
69 checkconfig()
70 {
71 if [[ -z ${NETWORKING} ]]
72 then
73 echo "NETWORKING missing in net.${iface}, aborted"
74 exit 1
75 fi
76
77 case "${NETWORKING}" in
78 static)
79 if [[ -z ${IP} ]]
80 then
81 echo "IP missing in net.${iface}, aborted"
82 exit 1
83 fi
84
85 if [[ -z ${NETMASK} ]]
86 then
87 echo -n "NETMASK missing in net.${iface}, "
88 echo "using 255.255.255.0"
89 NETMASK=255.255.255.0
90 fi
91
92 if [[ -z ${BROADCAST} ]]
93 then
94 echo -n "BROADCAST missing in net.${iface}, "
95 echo "using default address"
96 fi
97 ;;
98
99 dhcp)
100 if [[ -z ${DHCP_PROG} ]]
101 then
102 echo -n "DHCP_PROG missing in net.${iface},"
103 echo "using default programm /sbin/dhcpcd"
104 DHCP_PROG="/sbin/dhcpcd"
105 fi
106 [[ -z ${DHCP_START} ]] && DHCP_START="-t 10"
107 [[ -z ${DHCP_STOP} ]] && DHCP_STOP="-k"
108 ;;
109
110 esac
111 }
112
113 # onboot_interface_list /path/to/files*
114 onboot_interface_list()
115 {
116 local file
117 local devices
118 local iface
119
120 # get list of all devices
121 for file in $@
122 do
123 iface="$(basename ${file} | sed s/net.//)"
124
125 # exclude backup files and exclude net.routes and net.sample too
126 case "${iface}" in
127 *~) continue ;;
128 routes) continue ;;
129 sample) continue ;;
130 esac
131
132 if [[ $(read_value ONBOOT ${file}) = yes ]]
133 then
134 devices="${devices} ${iface}"
135 fi
136 done
137
138 echo "${devices}"
139 }
140
141 config_wireless_wep()
142 {
143 local iface="$1"
144
145 if [[ -z ${iface} ]]
146 then
147 echo "WEP: no \$iface given. Aborting setup."
148 return 1
149 fi
150
151 iwconfig "${iface}" enc on
152 [[ -n ${WIRELESS_KEY_LENGTH} ]] && iwconfig "${iface}" enc "${WIRELESS_KEY_LENGTH}"
153 [[ -n ${WIRELESS_KEY} ]] && iwconfig "${iface}" key "${WIRELESS_KEY}"
154 [[ -n ${WIRELESS_KEY_ASCII} ]] && iwconfig "${iface}" key s:"${WIRELESS_KEY_ASCII}"
155 }
156
157 config_wireless_wpa()
158 {
159 local iface="$1"
160
161 if [[ -z ${iface} ]]
162 then
163 echo "WPA: no \$iface given. Aborting setup."
164 return 1
165 fi
166
167 if [ ! -x /sbin/wpa_supplicant ]
168 then
169 echo "WPA: wpa_supplicant not installed. Aborting setup."
170 return 1
171 fi
172
173 # get default settings
174 [[ -f /etc/conf.d/wpa_supplicant ]] && source /etc/conf.d/wpa_supplicant
175
176 # check the configuration
177 [[ -z ${WIRELESS_WPA_CONFIG} ]] && WIRELESS_WPA_CONFIG=/etc/wpa_supplicant.auto
178 [[ -z ${WIRELESS_WPA_SKEL} ]] && WIRELESS_WPA_SKEL=/etc/conf.d/wpa_supplicant.skel
179
180 # use wext as default driver, do not abort here anymore
181 [[ -z ${WIRELESS_WPA_DRIVER} ]] && WIRELESS_WPA_DRIVER=wext
182
183 # write a config with the settings from net.${iface}
184 # only wpa-psk ! all other needs manual setup
185 if [[ ${WIRELESS_WPA_AUTOCONF} = true ]]
186 then
187 # write default cfg from skeleton
188 cat ${WIRELESS_WPA_SKEL} > ${WIRELESS_WPA_CONFIG}
189
190 local wpa_proto
191 case ${WIRELESS_AUTH_MODE} in
192 wpa) wpa_proto="WPA" ;;
193 wpa2) wpa_proto="WPA2" ;;
194 esac
195
196 # setup the network entry
197 sed -i -e "s:@WIRELESS_ESSID@:${WIRELESS_ESSID}:g" \
198 -e "s:@WIRELESS_KEY@:${WIRELESS_KEY_ASCII}:g" \
199 -e "s:@WIRELESS_AUTH_MODE@:${wpa_proto}:g" \
200 ${WIRELESS_WPA_CONFIG}
201 fi
202
203 # remove old state dir
204 [ -d /var/run/wpa_supplicant ] && rm -rf /var/run/wpa_supplicant
205
206 # now run the wpa_supplicant dameon
207 wpa_supplicant -B \
208 -D"${WIRELESS_WPA_DRIVER}" \
209 -c"${WIRELESS_WPA_CONFIG}" \
210 -i"${iface}" \
211 ${WIRELESS_WPA_OPTS}
212
213 # echo wait 5 seconds
214 echo " Waiting 5 seconds to retrieve authentification reply ... "
215 sleep 5
216 }
217
218 setup_wireless_extensions()
219 {
220 local iface="$1"
221
222 if [[ -z ${iface} ]]
223 then
224 echo "WIRELESS_EXTENSIONS: no \$iface given. Aborting setup."
225 return 1
226 fi
227
228 [[ -n ${WIRELESS_BITRATE} ]] && iwconfig "${iface}" rate "${WIRELESS_BITRATE}"
229 [[ -n ${WIRELESS_CHANNEL} ]] && iwconfig "${iface}" channel "${WIRELESS_CHANNEL}"
230 [[ -n ${WIRELESS_ESSID} ]] && iwconfig "${iface}" essid "${WIRELESS_ESSID}"
231 [[ -n ${WIRELESS_FREQUENCY} ]] && iwconfig "${iface}" freq "${WIRELESS_FREQUENCY}"
232 [[ -n ${WIRELESS_MODE} ]] && iwconfig "${iface}" mode "${WIRELESS_MODE}"
233 [[ -n ${WIRELESS_NICK} ]] && iwconfig "${iface}" nick "${WIRELESS_NICK}"
234
235 case "${WIRELESS_AUTH_MODE}" in
236 wpa|wpa2) config_wireless_wpa "${iface}" ;;
237 wep|on) config_wireless_wep "${iface}" ;;
238 off) iwconfig "${iface}" enc off ;;
239 esac
240 }
241
242 config_bridge_options()
243 {
244 local iface="$1"
245 local i
246 local port
247 local cost
248 local prio
249
250 # enable spanning-tree protocol
251 case ${BRIDGE_STP} in
252 on|off) brctl stp "${iface}" "${BRIDGE_STP}" ;;
253 *) echo "BRIDGE: unkown value \$BRIDGE_STP='$BRIDGE_STP'."; return 1 ;;
254 esac
255
256 # configure ageing time
257 if [[ ! -z ${BRIDGE_AGEING_TIME} ]]
258 then
259 brctl setageing "${iface}" "${BRIDGE_AGEING_TIME}"
260 fi
261
262 # configure bridge priority
263 if [[ ! -z ${BRIDGE_PRIORITY} ]]
264 then
265 brctl setbridgeprio "${iface}" "${BRIDGE_PRIORITY}"
266 fi
267
268 # configure forward delay
269 if [[ ! -z ${BRIDGE_FORWARD_DELAY} ]]
270 then
271 brctl setfd "${iface}" "${BRIDGE_FORWARD_DELAY}"
272 fi
273
274 # configure hello time
275 if [[ ! -z ${BRIDGE_HELLO_TIME} ]]
276 then
277 brctl sethello "${iface}" "${BRIDGE_HELLO_TIME}"
278 fi
279
280 # configure maximal message age
281 if [[ ! -z ${BRIDGE_MAX_MESSAGE_AGE} ]]
282 then
283 brctl setmaxage "${iface}" "${BRIDGE_MAX_MESSAGE_AGE}"
284 fi
285
286 # configure path cost for every port
287 if [[ ! -z ${BRIDGE_PATH_COST} ]]
288 then
289 for i in ${BRIDGE_PATH_COST}
290 do
291 port="${i%=*}"
292 cost="${i#*=}"
293 [[ ! -z ${port} ]] && brctl pathcost "${iface}" "${port}" "${cost}"
294 done
295 fi
296
297 # configure port priority for every port
298 if [[ ! -z ${BRIDGE_PORT_PRIORITY} ]]
299 then
300 for i in ${BRIDGE_PORT_PRIORITY}
301 do
302 port="${i%=*}"
303 prio="${i#*=}"
304 [[ ! -z ${port} ]] && brctl setportprio "${iface}" "${port}" "${prio}"
305 done
306 fi
307 }
308
309 config_bridge_devices()
310 {
311 local iface="$1"
312 local method="$2"
313 local bport
314
315 if [[ -z ${iface} ]]
316 then
317 echo "BRIDGE: no \$iface given. Aborting setup."
318 return 1
319 fi
320
321 if [[ -z ${method} ]]
322 then
323 echo "BRIDGE: no \$method given. Aborting setup."
324 return 1
325 fi
326
327 # first check for brctl
328 if [[ -z $(which brctl) ]]
329 then
330 echo "brctl not found! Please install 'net-misc/bridge-utils'."
331 return 1
332 fi
333
334 # check the config
335 if [[ -z ${BRIDGE_INTERFACES} ]]
336 then
337 echo "BRIDGE: no \$BRIDGE_INTERFACES given. Aborting setup."
338 return 1
339 fi
340
341 case ${method} in
342 add)
343 # setup the bridge device
344 brctl addbr "${iface}"
345 for bport in ${BRIDGE_INTERFACES}
346 do
347 # enter promiscous mode
348 ifconfig "${bport}" 0.0.0.0 promisc
349 # now setup the bridge
350 brctl addif "${iface}" "${bport}"
351 done
352 # configure all other options
353 config_bridge_options "${iface}"
354 ;;
355
356 remove)
357 for bport in ${BRIDGE_INTERFACE}
358 do
359 # bring the interface down
360 ifconfig "${bport}" down
361 # remove the interface from the bridge
362 brctl delif "${iface}" "${bport}"
363 done
364 # bring the bridge down
365 brctl delbr "${iface}"
366 ;;
367 esac
368
369 # unset the bridge variable to be safe
370 unset BRIDGE_INTERFACES
371 # continue to setup generic networking
372 }
373
374 config_routes()
375 {
376 local method="$1"
377 local message
378
379 # only add and del are allowed
380 case ${method} in
381 add) message="Adding" ;;
382 del) message="Removing" ;;
383 *)
384 echo "config_routes: unsupported \$method '${method}'."
385 exit 1
386 ;;
387 esac
388
389 # adds/delete user routes
390 if [[ -f /etc/conf.d/net.routes ]]
391 then
392 ( cat /etc/conf.d/net.routes; echo ) | # make sure there is a LF at the end
393 while read route
394 do
395 case "${route}" in
396 \#*|"") continue ;;
397 esac
398 # do not esacpe ${route} or it breaks!
399 route "${method}" ${route}
400 done
401 fi
402 }
403
404 networking_start()
405 {
406 local iface dns routes ALL_INTERFACES
407
408 if [[ -z $1 ]]
409 then
410 ALL_INTERFACES=$(onboot_interface_list /etc/conf.d/net.*)
411 else
412 if [[ -e /etc/conf.d/net.$1 ]]
413 then
414 ALL_INTERFACES="$1"
415 else
416 echo "Interface $1 does not exist. Aborting"
417 exit 1
418 fi
419 fi
420
421 # get list of all devices
422 for iface in ${ALL_INTERFACES}
423 do
424 # checkconfig
425 source /etc/conf.d/net.${iface} || exit 1
426 checkconfig
427
428 # setup mac
429 if [[ -n ${FORCE_MAC_TO} ]]
430 then
431 ifconfig "${iface}" hw ether "${FORCE_MAC_TO}"
432 fi
433
434 # setup bridges
435 if [[ ${iface} = br[0-9]* ]]
436 then
437 config_bridge_devices "${iface}" add
438 fi
439
440 # now configure wireless_extensions
441 [ -x /usr/sbin/iwconfig ] && setup_wireless_extensions "${iface}"
442
443 # activate the interface
444 ifconfig "${iface}" up
445
446 # setup static or dhcp
447 case ${NETWORKING} in
448 dhcp|DHCP)
449 ${DHCP_PROG} ${DHCP_START} "${iface}" ;;
450 static|STATIC)
451 ifconfig "${iface}" "${IP}" netmask "${NETMASK}" broadcast "${BROADCAST}" ;;
452 esac
453
454 # setup def gw
455 if [[ -n ${GATEWAY} ]]
456 then
457 route add default gateway "${GATEWAY}" metric 1 dev "${iface}"
458 unset GATEWAY
459 fi
460
461 # setup /etc/resolv.conf
462 # add given nameserver
463 if [[ -n ${NAMESERVER} ]]
464 then
465 # whipe out the old one
466 echo "# Generated by the magellan-initscripts for ${iface}" > /etc/resolv.conf
467 # include head
468 if [ -f /etc/resolv.conf.head ]
469 then
470 cat /etc/resolv.conf.head >> /etc/resolv.conf
471 else
472 echo "# /etc/resolv.conf.head can replace this line" >> /etc/resolv.conf
473 fi
474
475 for dns in ${NAMESERVER}
476 do
477 echo "nameserver ${dns}" >> /etc/resolv.conf
478 done
479
480 # include tail
481 if [ -f /etc/resolv.conf.tail ]
482 then
483 cat /etc/resolv.conf.tail >> /etc/resolv.conf
484 else
485 echo "# /etc/resolv.conf.tail can replace this line" >> /etc/resolv.conf
486 fi
487
488 unset NAMESERVER
489 fi
490 done
491
492 # setup user routes
493 config_routes add
494 }
495
496 networking_stop()
497 {
498 if [[ -z $1 ]]
499 then
500 ALL_INTERFACES=$(onboot_interface_list /etc/conf.d/net.*)
501 else
502 if [[ -e /etc/conf.d/net.$1 ]]
503 then
504 ALL_INTERFACES="$1"
505 else
506 echo "Interface $1 does not exist. Aborting"
507 exit 1
508 fi
509 fi
510
511 # get list of all devices
512 for iface in ${ALL_INTERFACES}
513 do
514 source /etc/conf.d/net.${iface} || exit 1
515 checkconfig
516
517 if [[ -n ${GATEWAY} ]]
518 then
519 route del -net default
520 fi
521
522 ifconfig "${iface}" down
523
524 # remove bridges
525 if [[ ${iface} = br[0-9]* ]]
526 then
527 config_bridge_devices "${iface}" remove
528 fi
529
530 # shutdown dhcp-daemon
531 if [[ ${NETWORKING} = dhcp ]] && [[ -n $(pidof $(basename ${DHCP_PROG})) ]]
532 then
533 if [[ -z ${DHCP_STOP} ]]
534 then
535 killall -15 ${DHCP_PROG}
536 sleep 1
537 # try harder
538 if [[ -n $(pidof $(basename ${DHCP_PROG})) ]]
539 then
540 killall -9 ${DHCP_PROG}
541 fi
542 else
543 ${DHCP_PROG} ${DHCP_STOP} "${iface}"
544 fi
545 fi
546
547 # shutdown wpa_supplicant daemon
548 if [[ -n $(pidof wpa_supplicant) ]]
549 then
550 killall wpa_supplicant
551 fi
552 done
553
554 # remove state dir
555 if [ -d /var/run/wpa_supplicant ]
556 then
557 rm -rf /var/run/wpa_supplicant
558 fi
559
560 # delete user routes
561 config_routes del
562 }
563
564 case $1 in
565 start)
566 networking_start $2 ;;
567
568 stop)
569 networking_stop $2 ;;
570
571 restart)
572 $0 stop
573 sleep 1
574 $0 start
575 ;;
576
577 *)
578 echo "Usage: $0 {start|stop|restart} [interface]"
579 exit 1
580 ;;
581 esac