Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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