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