]> git.pld-linux.org Git - projects/rc-scripts.git/blob - sysconfig/network-scripts/functions.network
Try harder to get value for WLAN_NICKNAME.
[projects/rc-scripts.git] / sysconfig / network-scripts / functions.network
1 #!/bin/sh - keep it for file(1) to get bourne shell script result
2 #
3 # $Id$
4 #
5 # This is not a shell script; it provides functions to network scripts
6 # that source it.
7
8 source_config ()
9 {
10         DEVNAME=$(basename "$CONFIG" | awk ' { gsub(/^ifcfg-/,NIL); print $0; } ')
11
12         if echo "$CONFIG"|egrep "^/" >/dev/null 2>&1 ; then
13                 if [ -f "$CONFIG" ] ; then
14                         . "$CONFIG"
15                 fi
16         elif [ -f "/etc/sysconfig/interfaces/$CONFIG" ] ; then
17                 . "/etc/sysconfig/interfaces/$CONFIG"
18         fi
19         if [ -n "${PREFIX}" ] && ! $(echo $IPADDR | grep "/" 2>&1 >/dev/null) ; then
20                 IPADDR="$IPADDR/$PREFIX"
21         fi
22 }
23
24 do_netreport ()
25 {
26         # Notify programs that have requested notification
27         ( cd /var/run/netreport || exit
28         for i in * ; do
29                 [ -f $i ] && kill -SIGIO $i >/dev/null 2>&1 || \
30                         rm -f $i >/dev/null 2>&1
31         done
32         )
33 }
34
35 need_hostname()
36 {
37         if [ "`hostname`" = "(none)" -o "`hostname`" = "localhost" -o \
38              "`hostname`" = "localhost.localdomain" ]; then
39                 NEEDHOSTNAME=yes
40         else
41                 unset NEEDHOSTNAME
42         fi
43 }
44
45 set_hostname()
46 {
47         typeset hostname domain
48
49         hostname=$(echo $1 | awk ' { gsub(/\..*$/,NIL); print $0; } ')
50         domain=$(echo $1 | awk ' { sub(/^[^\.]*\./,NIL); print $0; } ')
51
52         if [ -n "$hostname" ] ; then
53                 echo "$hostname" > /etc/HOSTNAME
54                 hostname $hostname
55         fi
56
57         if [ -n "$domain" ] ; then
58                 >/etc/resolv.conf.new
59                 if ! grep -q "search $domain" /etc/resolv.conf ; then
60                         echo "search $domain" >> /etc/resolv.conf.new
61                 fi
62                 echo "domain $domain" >> /etc/resolv.conf.new
63                 grep -v "^domain " /etc/resolv.conf >> /etc/resolv.conf.new
64                 mv -f /etc/resolv.conf.new /etc/resolv.conf
65         fi
66 }
67
68 # Setup Network Address Translation (NAT)
69 setup_nat()
70 {
71         typeset src via dst
72
73         if [ -r /etc/sysconfig/static-nat ]; then
74                 if [ "$1" = "on" ]; then
75                         grep "^[0-9]" /etc/sysconfig/static-nat | while read src via dst; do
76                                 /sbin/ip route add nat $dst via $src
77                                 /sbin/ip rule add from $src nat $dst
78                         done
79                 elif [ "$1" = "off" ]; then
80                         /sbin/ip route show table all | egrep "^nat[[:blank:]]" | while read nat dst via src args; do
81                                 /sbin/ip rule del from $src nat $dst
82                                 /sbin/ip route del nat $dst via $src
83                         done
84                 fi
85         fi
86 }
87
88 # Setup static ARP
89 static_arp()
90 {
91         typeset rc arpdev host hwaddr flags neflags
92
93         if is_yes "$STATIC_ARP" && [ -r /etc/ethers ]; then
94                 if [ -x /sbin/arp ]; then
95                         run_cmd "Setting static ARP entries" /sbin/arp -f /etc/ethers
96                 else
97                         show "Setting static ARP entries"; busy
98                         rc=0
99                         arpdev=$(ip link show | awk -F':' '(/UP/) && ! (/NOARP/) && ! (/lo:/) && ! (/NONE:/) { print $2; exit }')
100                         if [ -z "$arpdev" ]; then
101                                 rc=1
102                         else
103                                 # ip supports only ip addresses
104                                 grep "^[0-9]" /etc/ethers | \
105                                 while read host hwaddr flags; do
106                                         case "$flags" in
107                                           *temp*)
108                                                 neflags="nud stale"
109                                                 ;;
110                                           *)
111                                                 neflags="nud permanent"
112                                                 ;;
113                                         esac
114                                         if ! /sbin/ip neigh add $host lladdr $hwaddr $neflags dev $arpdev; then
115                                                 rc=1
116                                         fi
117                                 done
118                         fi
119                         if [ "$rc" -gt 0 ]; then
120                                 fail
121                         fi
122                 fi
123         fi
124 }
125
126 static_rarp()
127 {
128         if is_yes "$STATIC_RARP"; then
129                 if [ ! -e /proc/net/rarp ]; then
130                         _modprobe single -k rarp
131                 fi
132                 if [ -r /etc/ethers -a -x /sbin/rarp ]; then
133                         run_cmd "Setting static RARP entries" /sbin/rarp -f /etc/ethers
134                 fi
135         fi
136 }
137
138 vlan_setup()
139 {
140         if [ -x /sbin/vconfig -a -e /proc/net/vlan/config ] && `echo $DEVICE | grep -q ^eth`; then
141                 /sbin/vconfig set_name_type DEV_PLUS_VID_NO_PAD 2>&1 > /dev/null
142                 ETH_VLANS="yes"
143         else
144                 ETH_VLANS="no"
145         fi
146 }
147
148 # Set up all IP && IP parameter variables
149 setup_ip_param ()
150 {
151         # detect network device type (ie. dummy, eth for dummy0, eth0 ..)
152         if [ -z "$DEVICETYPE" ]; then
153                 DEVICETYPE=$(echo $DEVICE | awk ' { gsub(/[0-9]*\.?[0-9]*$/,NUL); print $0 } ')
154         fi
155
156         # Setup DEVICETYPE for special cases.
157         if (echo ${DEVICE} | LC_ALL=C egrep -q '^[a-z0-9]+\.[0-9]+$'); then
158                 DEVICETYPE=vlan
159         fi
160
161         # real name of device (ie. is eth0 for eth0,eth0:1,eth0:alias)
162         DEVICE=$(echo $DEVICE | awk ' { gsub(/:.*$/,NUL); print $0 } ')
163
164         eval IP4ADDR="\$IPADDR${IP4_PRIM_IF:-}"
165         if echo "${IP4ADDR}" | grep -q ":" ; then
166                 IP6ADDR=${IP4ADDR}
167                 IP4ADDR=""
168         else
169                 eval IP4ADDROPT="\$IP_AOPTS${IP4_PRIM_IF:-}"
170                 eval IP4ROUTEOPT="\$IP_ROPTS${IP4_PRIM_IF:-}"
171         fi
172         if [ -n "${IP6_PRIM_IF}" ] ; then
173                 eval IP6ADDR="\$IPADDR${IP6_PRIM_IF:-}"
174                 eval IP6ADDROPT="\$IPV6_AOPTS${IP6_PRIM_IF:-}"
175         fi
176         if [ -n "${IP4_SRC_IF}" ] ; then
177                 eval IP4SRCADDR="\$IPADDR${IP4_SRC_IF}"
178                 IP4SRCADDR=$(echo ${IP4SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
179         fi
180         if [ -n "${IP6_SRC_IF}" ] ; then
181                 eval IP6SRCADDR="\$IPADDR${IP6_SRC_IF}"
182                 IP6SRCADDR=$(echo ${IP6SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
183         fi
184
185         # new rc-scripts 0.4.x option
186         if [ -z "$HANDLING" ]; then
187                 HANDLING=0
188         fi
189
190         # set handling for bridge
191         case "$DEVICETYPE" in
192           br|atm|lec|irda|vlan)
193                 HANDLING=1
194                 ;;
195         esac
196
197         # Multicast ready devices
198         if is_yes "$MULTICAST"; then
199                 MULTICAST="on"
200         else
201                 case "$DEVICETYPE" in
202                   eth|br)
203                         MULTICAST="on"
204                         ;;
205                   *)
206                         MULTICAST="off"
207                         ;;
208                 esac
209         fi
210
211         # ARP ready devices
212         if [ -n "$ARP" ] ; then
213                 if is_yes "$ARP"; then
214                         ARP="arp on"
215                 else
216                         ARP="arp off"
217                 fi
218         fi
219 }
220
221 check_device_down ()
222 {
223         if (ip link show dev ${DEVICE} 2> /dev/null | grep -q UP); then
224                 return 1
225         else
226                 return 0
227         fi
228 }
229
230 setup_ip_gw_ro ()
231 {
232         # IPv4 gateway
233         if is_yes "$IPV4_NETWORKING"; then
234                 if [ -z "${GATEWAYDEV}" -o "${GATEWAYDEV}" = "${DEVICE}" ]; then
235                         # set up default gateway
236                         if [ -n "${GATEWAY}" ]; then
237                                 ip -4 route add default via ${GATEWAY} dev ${DEVICE} ${IP4SRCADDR} onlink
238                                 DEFGW=${GATEWAY}
239                         elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then
240                                 ip -4 route add default dev ${DEVICE} ${IP4SRCADDR}
241                         fi
242                 fi
243         fi
244
245         # IPv6 gateway && IPv6 globalroute
246         if is_yes "$IPV6_NETWORKING"; then
247                 if [ -z "${GATEWAY6DEV}" -o "${GATEWAY6DEV}" = "${DEVICE}" ]; then
248                         # set up default gateway
249                         if [ -n "${GATEWAY6}" ]; then
250                                 ip -6 route add default via ${GATEWAY6} dev ${DEVICE} ${IP6SRCADDR} onlink
251                                 DEFGW6=${GATEWAY6}
252                         elif [ "${GATEWAY6DEV}" = "${DEVICE}" ]; then
253                                 ip -6 route add default dev ${DEVICE} ${IP6SRCADDR}
254                         fi
255                 fi
256                 if [ -z "${IPV6_GLOBALROUTEDEV}" -o "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
257                         # set up default route
258                         if [ -n "${IPV6_GLOBALROUTEGW}" ]; then
259                                 ip -6 route add 2000::/3 via ${IPV6_GLOBALROUTEGW} dev ${DEVICE} ${IP6SRCADDR} onlink
260                         elif [ "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
261                                 ip -6 route add 2000::/3 dev ${DEVICE} ${IP6SRCADDR}
262                         fi
263                 fi
264         fi
265 }
266
267 #
268 # following function sets up routes not associated to any device
269 # eg. unreachable or blackhole routes
270 # (c) 1999 Jacek Konieczny <jajcus@pld-linux.org>
271 #
272 setup_routes()
273 {
274         typeset args
275
276         if [ -f /etc/sysconfig/static-routes ]; then
277                 if [ "$1" = "on" -o "$1" = "yes" ] ; then
278                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
279                                 /sbin/ip route add $args
280                         done
281                 else
282                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
283                                 /sbin/ip route del $args 2>/dev/null
284                         done
285                 fi
286         fi
287 }
288
289 # Add ONLY IPv4 address (IPv6 address is added automaticly)
290 set_up_loopback()
291 {
292         if is_yes "$IPV4_NETWORKING"; then
293                 ip addr add 127.0.0.1/8 dev lo
294         fi
295         ip link set dev lo up
296 }
297
298 set_down_loopback()
299 {
300         ip addr flush dev lo 2>&1 | grep -v "Nothing to flush"
301         ip link set dev lo down
302 }
303
304 modprobe_net()
305 {
306         if is_yes "$IPV6_NETWORKING" && is_module "ipv6"; then
307                 _modprobe single -k ipv6
308         fi
309
310         if is_yes "$IPX" && is_module "ipx"; then
311                 _modprobe single -k ipx
312         fi
313 }
314
315 #
316 # folowing function calculates network prefix from given network mask
317 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
318 #
319 calcprefix()
320 {
321         typeset len olen bad prefix
322
323         prefix=0
324         olen=8
325         bad=0
326         for i in 1 2 3 4; do
327                 len=0
328                 j=$(echo "$1" | awk -F"." "{ print \$${i} }")
329                 case "$j" in
330                   255)  len=8 ;;
331                   254)  len=7 ;;
332                   252)  len=6 ;;
333                   248)  len=5 ;;
334                   240)  len=4 ;;
335                   224)  len=3 ;;
336                   192)  len=2 ;;
337                   128)  len=1 ;;
338                   0)    len=0 ;;
339                   *)    len=300 ;;
340                 esac
341                 [ "$len" -gt "$olen" ] && bad=1
342                 prefix=$(($prefix + $len))
343                 olen=$len
344         done
345
346         if [ "$bad" = "0" ]; then
347                 echo "$prefix"
348         else
349                 echo "32"
350         fi
351         return
352 }
353
354 #
355 # folowing function calculates network mask from given prefix
356 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
357 #
358 calcnetmask()
359 {
360         typeset prefix a MASK
361
362         MASK=""
363         if [ "`echo "${1}" | grep "^[0-9]"`" = "" ]; then
364                 prefix=32
365         else
366                 typeset -i prefix=$1
367         fi
368         for i in 1 2 3 4; do
369                 case $prefix in
370                   7)    a=254 ;;
371                   6)    a=252 ;;
372                   5)    a=248 ;;
373                   4)    a=240 ;;
374                   3)    a=224 ;;
375                   2)    a=192 ;;
376                   1)    a=128 ;;
377                   *)
378                         [ $prefix -ge 8 ] && a=255
379                         [ $prefix -le 0 ] && a=0
380                         ;;
381                 esac
382
383                 prefix="$(( $prefix - 8))"
384                 if [ -z "$MASK" ]; then
385                         MASK=$a
386                 else
387                         MASK=$MASK.$a
388                 fi
389         done
390
391         echo $MASK
392         return
393 }
394
395 # Retrievies PPPD PID and real interface name from /var/run/ppp-*.pid
396 get_ppp_device_and_pid ()
397 {
398         if [ -f "/var/run/ppp-$DEVNAME.pid" ] ; then
399                 eval `{
400                         read PID ; echo "PID='$PID'"
401                         read REALDEVICE ; echo "REALDEVICE=$REALDEVICE"
402                 } < "/var/run/ppp-$DEVNAME.pid"`
403         fi
404
405         if [ -z "$REALDEVICE" ] ; then
406                 REALDEVICE=$DEVICE
407         fi
408 }
409
410 # following function setups advanced routing rules
411 # Olgierd Pieczul <wojrus@pld-linux.org>
412 setup_ip_rules ()
413 {
414         typeset args prio from src
415
416         if [ -f /etc/sysconfig/static-routes ] ; then
417                 if is_yes "$1"; then
418                         egrep "^(from|to|iif|tos|fwmark|dev|pref|priority|prio)[[:blank:]]" /etc/sysconfig/static-routes | while read args; do
419                                 /sbin/ip rule add $args
420                         done
421                 elif is_no "$1"; then
422                         /sbin/ip rule show | egrep -v -e "from all lookup (main|default|local) \$" -e " map-to " | while read prio from src args; do
423                                 [ "$src" == "all" ] && ip rule delete $args || ip rule delete $from $src $args
424                         done
425                 fi
426         fi
427 }
428
429 is_wireless_device ()
430 {
431         if [ -x /sbin/iwconfig ]; then
432                 LC_ALL=C iwconfig "${1}" 2>&1 | grep -q "no wireless extensions" || return 0
433         fi
434         return 1
435 }
436
437 wireless_param ()
438 {
439         device="$1"
440         if [ "$2" = "br" ]; then
441                 prefix="${device}_"
442         else
443                 prefix=""
444         fi
445
446         if [ -z "$(eval echo \$${prefix}WLAN_NICKNAME)" ]; then
447                  WLAN_NICKNAME="$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo localhost)"
448         else
449                  WLAN_NICKANME="$(eval echo \$${prefix}WLAN_NICKNAME)"
450         fi
451
452         # wlan mode needs to be first
453         [ -n "$(eval echo \$${prefix}WLAN_MODE)" ] && \
454                 iwconfig ${device} mode "$(eval echo \$${prefix}WLAN_MODE)"
455         iwconfig ${device} nickname ${WLAN_NICKNAME}
456         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && \
457                 iwconfig ${device} nwid "$(eval echo \$${prefix}WLAN_NWID)"
458         if [ -n "$(eval echo \$${prefix}WLAN_FREQ)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ] ; then
459                 iwconfig ${device} freq "$(eval echo \$${prefix}WLAN_FREQ)"
460         elif [ -n "$(eval echo \$${prefix}WLAN_CHANNEL)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ]; then
461                 iwconfig ${device} channel "$(eval echo \$${prefix}WLAN_CHANNEL)"
462         fi
463         [ -n "$(eval echo \$${prefix}WLAN_SENS)" ] && \
464                 iwconfig ${device} sens "$(eval echo \$${prefix}WLAN_SENS)"
465         [ -n "$(eval echo \$${prefix}WLAN_AP)" ] && \
466                 iwconfig ${device} ap "$(eval echo \$${prefix}WLAN_AP)"
467         [ -n "$(eval echo \$${prefix}WLAN_BITRATE)" ] && \
468                 iwconfig ${device} rate "$(eval echo \$${prefix}WLAN_BITRATE)"
469         [ -n "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)" ] && \
470                 iwconfig ${device} rts "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)"
471         [ -n "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)" ] && \
472                 iwconfig ${device} frag "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)"
473         if [ -n "$(eval echo \$${prefix}WLAN_KEY)" ]; then
474                 iwconfig ${device} key "$(eval echo \$${prefix}WLAN_KEY)"
475                 [ -n "$(eval echo \$${prefix}WLAN_ENCRYPTION)" ] && \
476                         iwconfig ${device} key "$(eval echo \$${prefix}WLAN_ENCRYPTION)"
477         fi
478         if is_no "$(eval echo \$${prefix}WLAN_ENCRYPTION)"; then
479                 iwconfig ${device} key off
480         fi
481         [ -n "$(eval echo \$${prefix}WLAN_POWER)" ] && \
482                 iwconfig ${device} power "$(eval echo \$${prefix}WLAN_POWER)"
483         [ -n "$(eval echo \$${prefix}WLAN_TXPOWER)" ] && \
484                 iwconfig ${device} txpower "$(eval echo \$${prefix}WLAN_TXPOWER)"
485         [ -n "$(eval echo \$${prefix}WLAN_RETRY)" ] && \
486                 iwconfig ${device} retry "$(eval echo \$${prefix}WLAN_RETRY)"
487         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && iwconfig ${device} \
488                 nwid "$(eval echo \$${prefix}WLAN_NWID)"
489
490         # essid should be last due to network rescanning by wlan devices
491         [ -n "$(eval echo \$${prefix}WLAN_ESSID)" ] && iwconfig ${device} \
492                 essid "$(eval echo \$${prefix}WLAN_ESSID)"
493
494         if is_yes "$(eval echo \$${prefix}WLAN_COMMIT)"; then
495                 iwconfig ${device} commit
496         fi
497 }
498
499 check_mii_tool ()
500 {
501         [ -x /sbin/mii-tool ] || return 2
502         output=$(LC_ALL=C mii-tool $1 2>&1)
503         echo $output | LC_ALL=C grep -q "link ok" && return 1
504         echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2
505 }
506
507 check_ethtool ()
508 {
509         [ -x /sbin/ethtool ] || return 2
510         output=$(LC_ALL=C ethtool $1 2>&1)
511         echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1
512         echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2
513 }
514
515
516 check_link_down ()
517 {
518         if [ -x /sbin/mii-tool -o -x /sbin/ethtool ]; then
519                 if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then
520                         ip link set dev $1 up >/dev/null 2>&1
521                         timeout=0
522                         while [ $timeout -le 10 ]; do
523                                 check_mii_tool $1
524                                 m=$?
525                                 check_ethtool $1
526                                 e=$?
527                                 if [ $m -eq 1 ] || [ $e -eq 1 ] ; then
528                                         return 1
529                                 fi
530                                 if [ $m -eq 2 ] && [ $e -eq 2 ] ; then
531                                         return 1
532                                 fi
533                                 usleep 500000
534                                 timeout=$((timeout+1))
535                         done
536                         return 0
537                 fi
538         fi
539         return 1
540 }
541
542 # This must be last line !
543 # vi:syntax=sh
This page took 0.113548 seconds and 4 git commands to generate.