source: projects/initscripts/tags/initscripts-8.91.0/sysconfig/network-scripts/network-functions @ 2576

Revision 2576, 10.3 KB checked in by daisuke, 13 years ago (diff)

tagging as initscripts-8.91.0

Line 
1# -*-Shell-script-*-
2#
3# This file is not a stand-alone shell script; it provides functions
4# to network scripts that source it.
5
6# Set up a default search path.
7PATH="/sbin:/usr/sbin:/bin:/usr/bin"
8export PATH
9
10[ -z "$__sed_discard_ignored_files" ] && . /etc/init.d/functions
11
12get_hwaddr ()
13{
14    if [ -f /sys/class/net/${1}/address ]; then
15        awk '{ print toupper($0) }' < /sys/class/net/${1}/address
16    elif [ -d "/sys/class/net/${1}" ]; then
17        LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \
18            awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
19                                        "\\1", 1)); }'
20    fi
21}
22
23get_config_by_hwaddr ()
24{
25    LANG=C grep -il "^[[:space:]]*HWADDR=${1}\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-* \
26        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
27}
28
29get_config_by_subchannel ()
30{
31    LANG=C grep -il "^[[:space:]]*SUBCHANNELS=${1}\([[:space:]#]\|$\|,\)" /etc/sysconfig/network-scripts/ifcfg-* \
32        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
33}
34
35get_device_by_hwaddr ()
36{
37    LANG=C ip -o link | grep -v link/ieee802.11 | awk -F ': ' -vIGNORECASE=1 "/$1/ { print \$2 }"
38}
39
40need_config ()
41{
42    local nconfig
43
44    CONFIG="ifcfg-${1}"
45    [ -f "${CONFIG}" ] && return
46    CONFIG="${1}"
47    [ -f "${CONFIG}" ] && return
48    local addr=`get_hwaddr ${1}`
49    if [ -n "$addr" ]; then
50      nconfig=`get_config_by_hwaddr ${addr}`
51      if [ -n "$nconfig" ] ; then
52        CONFIG=${nconfig##*/}
53        [ -f "${CONFIG}" ] && return
54      fi
55    fi
56    nconfig=$(LANG=C grep -l "^[[:space:]]*DEVICE=${1}\([[:space:]#]\|$\)" \
57        /etc/sysconfig/network-scripts/ifcfg-* \
58        | LC_ALL=C sed -e "$__sed_discard_ignored_files")
59    if [ -n "$nconfig" -a -f "$nconfig" ]; then
60      CONFIG=${nconfig##*/}
61      return
62    fi
63}
64
65source_config ()
66{
67    DEVNAME=`basename $CONFIG | sed 's/^ifcfg-//g'`
68    if echo ${CONFIG##*/} | grep -q '[^g]-' ; then
69        PARENTCONFIG=`echo $CONFIG | sed 's/-[^-]*$//g'`
70        PARENTDEVNAME=${PARENTCONFIG##*/ifcfg-}
71        [ -f $PARENTCONFIG ] || {
72            echo $"Missing config file $PARENTCONFIG." >&2
73            exit 1
74        }
75        . /etc/sysconfig/network-scripts/${PARENTCONFIG##*/}
76        [ -r "/etc/sysconfig/network-scripts/keys-$PARENTDEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$PARENTDEVNAME
77    fi
78    . /etc/sysconfig/network-scripts/${CONFIG##*/}
79    [ -r "/etc/sysconfig/network-scripts/keys-$DEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$DEVNAME
80    case "$TYPE" in
81        Ethernet)
82                DEVICETYPE="eth"
83                ;;
84        CIPE)
85                DEVICETYPE="cipcb"
86                ;;
87        IPSEC)
88                DEVICETYPE="ipsec"
89                ;;
90        Modem)
91                DEVICETYPE="ppp"
92                ;;
93        xDSL)
94                DEVICETYPE="ppp"
95                ;;
96        ISDN)
97                DEVICETYPE="ippp"
98                ;;
99        Wireless)
100                DEVICETYPE="eth"
101                ;;
102        "Token Ring")
103                DEVICETYPE="eth"
104                ;;
105        CTC)
106                DEVICETYPE="ctc"
107                ;;
108        IUCV)
109                DEVICETYPE="iucv"
110                ;;
111        GRE | IPIP)
112                DEVICETYPE="tunnel"
113                ;;
114        SIT | sit)
115                DEVICETYPE="sit"
116                ;;
117    esac
118    [ -z "$DEVICETYPE" ] && DEVICETYPE=`echo ${DEVICE} | sed "s/[0-9]*$//"`
119    [ -z "$REALDEVICE" -a -n "$PARENTDEVICE" ] && REALDEVICE=$PARENTDEVICE
120    [ -z "$REALDEVICE" ] && REALDEVICE=${DEVICE%%:*}
121    if [ "${DEVICE}" != "${REALDEVICE}" ]; then
122        ISALIAS=yes
123    else
124        ISALIAS=no
125    fi
126    if [ -n "$HWADDR" ]; then
127        HWADDR=`echo $HWADDR | awk '{ print toupper($0) }'`
128    fi
129    if [ -n "$MACADDR" ]; then
130        MACADDR=`echo $MACADDR | awk '{ print toupper($0) }'`
131    fi
132}
133
134
135
136expand_config ()
137{
138    if [ -z "${NETMASK}" ]; then
139        eval `/bin/ipcalc --netmask ${IPADDR}`
140    fi
141
142    if [ -z "${PREFIX}" ]; then
143        eval `/bin/ipcalc --prefix ${IPADDR} ${NETMASK}`
144    fi
145
146    if [ -z "${BROADCAST}" ]; then
147        eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}`
148    fi
149
150    if [ -z "${NETWORK}" ]; then
151        eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}`
152    fi
153}
154
155toggle_value ()
156{
157    if [ "$2" = "yes"  -o "$2" = "YES" ] ; then
158        echo "$1 on"
159    elif [ "$2" = "no"  -o "$2" = "NO" ] ; then
160        echo "$1 off"
161    else
162        echo ''
163    fi
164}
165 
166do_netreport ()
167{
168  # Notify programs that have requested notification
169  ( cd /var/run/netreport || exit
170    for i in * ; do
171      if [ -f $i ]; then
172        OWNER=`ls -l $i | awk '{ print $3 }'`
173       
174        if [ "`id -u`" = "0" ]; then
175          su -s /bin/bash $OWNER -c "kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1" > /dev/null 2>&1
176        else
177          kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1
178        fi
179      fi
180    done
181  )
182}
183
184# rename_device() - Rename a network device to something else
185# $1 - desired name
186# $2 - hardware address to name
187# $3 - list of devices that are already in use
188#      (for general calls, use the current device you're trying to
189#       change to $1)
190
191rename_device()
192{
193    /sbin/nameif "$1" "$2" || {
194      local hw2=`get_hwaddr ${1}`
195      local nconfig=`get_config_by_hwaddr ${hw2}`
196      local dev=
197      if [ -n "$nconfig"  ]; then
198         dev=$(. /etc/sysconfig/network-scripts/${nconfig##*/} ; echo $DEVICE)
199         for device in $3 ; do
200            [ "$dev" = "$device" ] && unset dev
201         done
202      fi
203      [ -z "$dev" ] && dev=dev$RANDOM
204      rename_device $dev $hw2 "$3 $1"
205      /sbin/nameif "$1" "$2"
206    }
207}
208
209# Sets $alias to the device module if $? != 0
210is_available ()
211{
212    LC_ALL= LANG= ip -o link | grep -q $1
213    [ "$?" = "1" ] || return 0
214
215    alias=$(modprobe -c | awk \
216'BEGIN { alias = ""; }
217$1 == "alias" && $2 == "'"$1"'" { alias = $3; }
218$1 == "install" { install[$2] = $3; }
219END {
220    cmd = install[alias];
221    print alias;
222    if (alias == "" || alias == "off" || cmd == "/bin/true" || cmd == ":")
223        exit 1;
224    exit 0;
225}')
226    [ $? -eq 0 ] || return 2
227
228    modprobe $1 > /dev/null 2>&1 || {
229      return 1
230    }
231    if [ -n "$HWADDR" ]; then
232       local curdev=`get_device_by_hwaddr "$HWADDR"`
233       if [ -z "$curdev" ]; then
234          return 1
235       fi
236       #rename_device "$1" "$HWADDR" "$curdev"
237    fi
238
239    if [ ${alias} == "bonding" ]; then
240        install_bonding_driver $1
241    fi
242
243    LC_ALL= LANG= ip -o link | grep -q $1
244    return $?
245}
246
247need_hostname ()
248{
249    CHECK_HOSTNAME=`hostname`
250    if [ "$CHECK_HOSTNAME" = "(none)" -o "$CHECK_HOSTNAME" = "localhost" -o \
251        "$CHECK_HOSTNAME" = "localhost.localdomain" ]; then
252        return 0
253    else
254        return 1
255    fi
256}
257
258set_hostname ()
259{
260    hostname $1
261    if ! grep search /etc/resolv.conf >/dev/null 2>&1; then
262        domain=`echo $1 | sed 's/^[^\.]*\.//'`
263        if [ -n "$domain" ]; then
264                rsctmp=`mktemp /tmp/XXXXXX`;
265                cat /etc/resolv.conf > $rsctmp
266                echo "search $domain" >> $rsctmp
267                change_resolv_conf $rsctmp
268                /bin/rm -f $rsctmp
269        fi     
270    fi
271}
272
273check_device_down ()
274{
275    if echo $1 | grep -q ':' ; then
276     if LC_ALL=C ifconfig -a 2>/dev/null | grep -q $1 ; then
277          return 1
278     else
279          return 0
280     fi
281    else
282     if LC_ALL=C ip -o link 2>/dev/null | grep -q "$1[:@].*,UP" ; then
283        return 1
284     else
285        return 0
286     fi
287    fi
288}
289
290check_mii_tool ()
291{
292   [ -x /sbin/mii-tool ] || return 2
293   output=`LC_ALL=C mii-tool $1 2>&1`
294   echo $output | LC_ALL=C grep -q "link ok" && return 1
295   echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2
296}
297
298check_ethtool ()
299{
300   [ -x /sbin/ethtool ] || return 2
301   output=`LC_ALL=C ethtool $1 2>&1`
302   echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1
303   echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2
304}
305
306
307check_link_down ()
308{
309    if [ -x /sbin/mii-tool -o -x /sbin/ethtool ]; then
310        if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then
311           ip link set dev $1 up >/dev/null 2>&1
312        fi
313        timeout=0
314        delay=10
315        [ -n "$LINKDELAY" ] && delay=$(($LINKDELAY * 2))
316        while [ $timeout -le $delay ]; do
317            check_mii_tool $1
318            m=$?
319            check_ethtool $1
320            e=$?
321            if [ $m -eq 1 ] || [ $e -eq 1 ] ; then
322                return 1
323            fi
324            if [ $m -eq 2 ] && [ $e -eq 2 ] ; then
325                return 1
326            fi
327            usleep 500000
328            timeout=$((timeout+1))
329        done
330        return 0
331    fi
332    return 1
333}
334
335check_default_route ()
336{
337    LC_ALL=C ip route list match 0/0 | grep -q default
338}
339
340find_gateway_dev ()
341{
342    . /etc/sysconfig/network
343    if [ -n "${GATEWAY}" -a "${GATEWAY}" != "none" ] ; then
344        dev=$(LC_ALL=C /sbin/ip route get to "${GATEWAY}" 2>/dev/null | \
345            sed -n 's/.* dev \([[:alnum:]]*\) .*/\1/p')
346        if [ -n "$dev" ]; then
347            GATEWAYDEV="$dev"
348        fi
349    fi
350}
351
352# After the device $1 goes away, restore the standard default route; typically
353# used for ppp with DEFROUTE temporarily replacing the "standard" default
354# route.
355# FIXME: This function doesn't support some newer features (GATEWAY in ifcfg,
356# $WINDOW, $METRIC)
357add_default_route ()
358{
359    . /etc/sysconfig/network
360    check_default_route && return 0
361    find_gateway_dev
362    if [ "$GATEWAYDEV" != "" -a -n "${GATEWAY}" -a \
363                "${GATEWAY}" != "none" ]; then
364        if ! check_device_down $1; then
365            if [ "$GATEWAY" = "0.0.0.0" ]; then
366                /sbin/ip route add default dev ${GATEWAYDEV}
367            else
368                /sbin/ip route add default via ${GATEWAY}
369            fi
370        fi
371    elif [ -f /etc/default-routes ]; then
372        while read spec; do
373            /sbin/ip route add $spec
374        done < /etc/default-routes
375        rm -f /etc/default-routes
376    fi
377}
378
379is_wireless_device ()
380{
381    [ -x /sbin/iwconfig ] || return 1
382    LC_ALL=C iwconfig $1 2>&1 | grep -q "no wireless extensions" || return 0
383    return 1
384}
385
386install_bonding_driver ()
387{
388   ethtool -i $1 2>/dev/null | grep -q "driver: bonding" && return 0
389   [ ! -f /sys/class/net/bonding_masters ] && ( modprobe bonding || return 1 )
390   echo "+$1" > /sys/class/net/bonding_masters
391   return 0
392}
393
394is_bonding_device ()
395{
396   [ -f "/sys/class/net/$1/bonding/slaves" ]
397}
398
399# Invoke this when /etc/resolv.conf has changed:
400change_resolv_conf ()
401{
402    s=`/bin/grep '^[\ \ ]*option' /etc/resolv.conf 2>/dev/null`;
403    if [ "x$s" != "x" ]; then
404       s="$s"$'\n';
405    fi;
406    if [ $# -gt 1 ]; then
407       let n_args=$#;
408       while [ $n_args -gt 0 ];
409         do
410            if [[ "$s" = *$1* ]]; then
411               shift;
412               let n_args=n_args-1;
413               continue;
414            fi;
415            s="$s$1";
416            shift;
417            if [ $# -gt 0 ]; then
418                s="$s"$'\n';
419            fi;
420            let n_args=n_args-1;
421         done;       
422    elif [ $# -eq 1 ]; then
423       if [ "x$s" != "x" ]; then
424          s="$s"`/bin/grep -vF "$s" $1`;
425       else
426          s=`cat $1`;
427       fi;
428    fi;
429    (echo "$s" > /etc/resolv.conf;) >/dev/null 2>&1;
430    r=$?
431    if [ $r -eq 0 ]; then
432        [ -x /sbin/restorecon ] && /sbin/restorecon /etc/resolv.conf >/dev/null 2>&1 # reset the correct context
433        logger -p local7.notice -t "NET" -i "$0 : updated /etc/resolv.conf";
434        [ -e /var/lock/subsys/nscd ] && /usr/sbin/nscd -i hosts; # invalidate cache
435    fi;
436    return $r;
437}
Note: See TracBrowser for help on using the repository browser.