home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / etc / init.d / network < prev    next >
Text File  |  2006-11-29  |  25KB  |  952 lines

  1. #!/bin/bash
  2. #
  3. # Network interface configuration
  4. #
  5. # Copyright (c) 2001-2002 SuSE Linux AG, Nuernberg, Germany.
  6. # This program is free software; you can redistribute it and/or modify it under
  7. # the terms of the GNU General Public License as published by the Free Software
  8. # Foundation; either version 2 of the License, or (at your option) any later
  9. # version.
  10. #
  11. # This program is distributed in the hope that it will be useful, but WITHOUT
  12. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  13. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  14. # details.
  15. #
  16. # You should have received a copy of the GNU General Public License along with
  17. # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  18. # Place, Suite 330, Boston, MA 02111-1307 USA
  19. #
  20. # Author: Michal Svec <msvec@suse.cz>
  21. #         Christian Zoz <zoz@suse.de>
  22. #         Mads Martin J°rgensen <mmj@suse.de>
  23. #
  24. # $Id: network 1517 2006-11-02 17:51:33Z zoz $
  25. #
  26. # /etc/init.d/network
  27. #
  28. ### BEGIN INIT INFO
  29. # Provides:       network
  30. # Required-Start: $local_fs dbus haldaemon
  31. # Should-Start: isdn
  32. # Required-Stop:
  33. # Should-Stop:
  34. # Default-Start:  2 3 5
  35. # Default-Stop:
  36. # Description:    Configure the network interfaces and set up routing
  37. ### END INIT INFO
  38.  
  39. . /etc/rc.status
  40. rc_reset
  41.  
  42. cd /etc/sysconfig/network
  43. test -f ./config && . ./config
  44. if ! . scripts/functions 2>/dev/null; then
  45.     echo -n "Network: file /etc/sysconfig/network/scripts/functions is missing."
  46.     rc_failed
  47.     rc_status -v
  48.     rc_exit
  49. fi
  50.  
  51. # . scripts/extradebug
  52.  
  53. # Only use ifup option 'onboot' if booting or changing runlevel
  54. # Therefore we check if we were called from init
  55. if [ -n "$INIT_VERSION" ] ; then
  56.     MODE=onboot
  57. fi
  58.  
  59. ######################################################################
  60. # Commandline parsing
  61. #
  62. SCRIPTNAME=${0##*/}
  63. debug $*
  64. ACTION=$1
  65. shift
  66. if [ "$1" != "-o" ] ; then INTERFACE=$1; shift; fi
  67. if [ -n "$1" -a "$1" != "-o" ] ; then CONFIG=$INTERFACE; INTERFACE=$1; shift; fi
  68. test "$1" = "-o" && shift
  69. OPTIONS=$@
  70. while [ $# -gt 0 ]; do
  71.     case $1 in
  72.         boot|onboot) MODE=onboot ;;
  73.         hotplug)     MODE=hotplug ;;
  74.         manual)      MODE=manual ;;
  75.         check)       CHECK=check ;;
  76.         quiet)       be_quiet_has_gone ;;
  77.         debug)       DEBUG=yes ;;
  78.         type*)       TYPE=${1#type=} ;;
  79.         fake)        FAKE=echo ;;
  80.         skip*)       SKIP=${1#skip=} ;;
  81.         nm)          NETWORKMANAGER=yes ;;
  82.         netcontrol)  NETWORKMANAGER=no ;;
  83.         *)           mesg "Unknown option $1"
  84.                      mesg "options: {[on]boot,hotplug,check,debug,type=<typelist>,fake}"
  85.                  exit 1 ;;
  86.     esac
  87.     shift
  88. done
  89. # Source functions.common again, because values of DEBUG and BE_QUIET might
  90. # have changed. These variable will be evaluated while sourcing the file.
  91. test -f scripts/functions.common \
  92.    && . scripts/functions.common \
  93.    || exit $R_INTERNAL
  94.  
  95.  
  96. ######################################################################
  97. # Start NetworkManager if wanted
  98. #
  99. # Some variables and functions are defined in
  100. # /etc/sysconfig/network/scripts/functions
  101. # because they are also used in ifup
  102. #
  103. if [ ! -x "$NETWORKMANAGER_BIN" -a "$NETWORKMANAGER" == yes ] ; then
  104.     err_mesg "NetworkManager is not installed, thus using NetControl." \
  105.              "Please set" \
  106.              "\n/etc/sysconfig/network/config:NetworkManager=no" \
  107.              "or install NetworkManager."
  108.     NETWORKMANAGER=no
  109. fi
  110. if [ "$NETWORKMANAGER" != yes ] ; then
  111.     NM_DISPATCHER=no
  112. fi
  113. if [ ! -x "$NM_DISPATCHER_BIN" -a "$NM_DISPATCHER" == yes ] ; then
  114.     err_mesg "NetworkManagerDispatcher is not installed, skipping it." \
  115.              "Please set" \
  116.              "\n/etc/sysconfig/network/config:NetworkManagerDispatcher=no" \
  117.              "or install NetworkManagerDispatcher."
  118.     NM_DISPATCHER=no
  119. fi
  120.  
  121. reload_firewall() {
  122.     test "$1" = not_on_boot -a "$MODE" = onboot && return -1
  123.     test "$FIREWALL" != yes && return -2
  124.     local NIX RL
  125.     read NIX RL < <(runlevel) 
  126.     test -z "$RL" && RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`
  127.     ls /etc/init.d/rc${RL}.d/S*SuSEfirewall2_setup &>/dev/null || return -3
  128.     /sbin/SuSEfirewall2 start
  129. }
  130.  
  131. start_nm_online() {
  132.     test -x "$NM_ONLINE_BIN" || return 0
  133.     if [ "$NM_ONLINE_TIMEOUT" == 0 ] ; then
  134. #        mesg "If service network should wait until connection is established"
  135. #        mesg "then set /etc/sysconfig/network/config:NM_ONLINE_TIMEOUT"
  136.         return 0
  137.     fi
  138.     local rc_startmode="${stat}${attn}waiting${norm}"
  139.     $NM_ONLINE_BIN $NM_ONLINE_TIMEOUT
  140.     case $? in
  141.         0) rc_status -v ;;
  142.         1) echo -e "$rc_startmode" 1>&2 ;;
  143.         *) rc_status -v ;;
  144.     esac
  145. }
  146.  
  147. start_nm_dispatcher() {
  148.     test "$NM_DISPATCHER" == yes || return
  149.     checkproc $NM_DISPATCHER_BIN
  150.     if [ $? = 0 ]; then
  151.         mesg_n "NetworkManagerDispatcher already running"
  152.     else
  153.         mesg_n "Starting the NetworkManagerDispatcher"
  154.         startproc $NM_DISPATCHER_BIN
  155.     fi
  156.     rc_status -v
  157. }
  158.  
  159. stop_nm_dispatcher() {
  160.     test -x "$NM_DISPATCHER_BIN" || return 0
  161.     checkproc $NM_DISPATCHER_BIN 2>/dev/null
  162.     if [ $? = 0 ]; then
  163.         mesg_n "Shutting down the NetworkManagerDispatcher"
  164.         killproc -TERM $NM_DISPATCHER_BIN
  165.         rc_status -v
  166.     fi
  167. }
  168.  
  169. check_nm_dispatcher() {
  170.     test -x "$NM_DISPATCHER_BIN" || return 0
  171.     rc_status
  172.     NM_STATUS=$?
  173.     mesg_n "Checking for the NetworkManagerDispatcher: "
  174.     checkproc $NM_DISPATCHER_BIN
  175.     rc_status -v
  176.     NMD_STATUS=$?
  177.     if [ "$NM_DISPATCHER" != yes ] ; then
  178.         rc_reset
  179.         rc_failed $NM_STATUS
  180.     fi
  181.     return $NMD_STATUS
  182. }
  183.  
  184. start_dhcdbd() {
  185.     test -x "$DHCDBD_BIN" || return 0
  186.     checkproc $DHCDBD_BIN
  187.     if [ $? = 0 ]; then
  188.         mesg_n "DHCP DBUS Daemon already running"
  189.     else
  190.         mesg_n "Starting the DHCP DBUS Daemon"
  191.         startproc $DHCDBD_BIN --system
  192.     fi
  193.     rc_status -v
  194.  
  195. }
  196.  
  197. stop_dhcdbd() {
  198.     test -x "$DHCDBD_BIN" || return 0
  199.     checkproc $DHCDBD_BIN 2>/dev/null
  200.     if [ $? = 0 ]; then
  201.         mesg_n "Shutting down the DHCP DBUS Daemon"
  202.         killproc -TERM $DHCDBD_BIN
  203.         rc_status -v
  204.     else
  205.         return 0
  206.     fi
  207. }
  208.  
  209. check_dhcdbd() {
  210.     test -x "$DHCDBD_BIN" || return 0
  211.     rc_status
  212.     NM_STATUS=$?
  213.     mesg_n "Checking for the DHCP DBUS Daemon: "
  214.     checkproc $DHCDBD_BIN
  215.     rc_status -v
  216.     DHCDBD_STATUS=$?
  217.     return $DHCDBD_STATUS
  218. }
  219.  
  220. cd "$OLDPWD"
  221. case "$ACTION" in
  222.     start)
  223.         if [ "$NETWORKMANAGER" == yes ] ; then
  224.             if nm_running; then
  225.                 mesg_n "NetworkManager already running"
  226.                 rc_status -v
  227.                 start_nm_dispatcher
  228.             elif netcontrol_running; then
  229.                 mesg "'NetControl' is active but" \
  230.                      "configuration says 'NetworkManager'."
  231.                 mesg_n "Call $SCRIPTNAME restart instead".
  232.                 rc_failed 7
  233.                 rc_status -v
  234.             else
  235.                 start_dhcdbd
  236.                 start_nm_dispatcher
  237.                 mesg_n "Starting the NetworkManager"
  238.                 $FAKE startproc $NETWORKMANAGER_BIN
  239.                 rc_status -v
  240.                 start_nm_online
  241.             fi
  242.             rc_exit
  243.         else
  244.             if nm_running; then
  245.                 mesg "'NetworkManager' is active but configuration" \
  246.                      "says 'NetControl'."
  247.                 mesg_n "Call $SCRIPTNAME restart instead".
  248.                 rc_failed 7
  249.                 rc_status -v
  250.                 rc_exit
  251.             fi
  252.         fi
  253.         # else fall through to NetControl
  254.         ;;
  255.     stop)
  256.         if nm_running; then
  257.             mesg_n "Shutting down the NetworkManager"
  258.             $FAKE killproc -TERM $NETWORKMANAGER_BIN
  259.             rc_status -v
  260.             stop_dhcdbd
  261.         fi
  262.         stop_nm_dispatcher
  263.         if ! netcontrol_running ; then
  264.             rc_exit
  265.         fi
  266.         # else fall through to NetControl
  267.         ;;
  268.     try-restart)
  269.         $0 status >/dev/null && \
  270.             $0 restart $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  271.         rc_status
  272.         rc_exit
  273.         ;;
  274.     restart|force-reload)
  275.         $0 stop $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  276.         $0 start $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  277.         rc_status
  278.         rc_exit
  279.         ;;
  280.     stop-all-dhcp-clients)
  281.         if nm_running; then
  282.             mesg "$ACTION not avaliable when running NetworkManager"
  283.             exit 1
  284.         fi
  285.         DHCP_INTERFACES=$(dhcp-interfaces)
  286.         for IFACE in $DHCP_INTERFACES; do
  287.             $0 stop $IFACE ${OPTIONS:+-o $OPTIONS}
  288.         done
  289.         rc_status
  290.         rc_exit
  291.         ;;
  292.     restart-all-dhcp-clients)
  293.         if nm_running; then
  294.             mesg "$ACTION not avaliable when running NetworkManager"
  295.             exit 1
  296.         fi
  297.         DHCP_INTERFACES=$(dhcp-interfaces)
  298.         for IFACE in $DHCP_INTERFACES; do
  299.             $0 stop  $IFACE ${OPTIONS:+-o $OPTIONS}
  300.         done
  301.         for IFACE in $DHCP_INTERFACES; do
  302.             $0 start $IFACE ${OPTIONS:+-o $OPTIONS}
  303.         done
  304.         rc_status
  305.         reload_firewall not_on_boot
  306.         rc_exit
  307.         ;;
  308.     reload)
  309.         # NetworkManager does not support reload (2005.01.15).
  310.         # If configuration and running system do not match exec restart.
  311.         # Fall through if NetControl is confiured and NM not active.
  312.         if [ "$NETWORKMANAGER" == yes ] ; then
  313.             if netcontrol_running; then
  314.                 mesg "Changing Network Control System. Calling $0 restart"
  315.                 exec $0 restart $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  316.             else
  317.                 # NetworkManager doesn't support signaling --> restarting
  318.                 exec $0 restart $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  319.             fi
  320.         else
  321.             if nm_running; then
  322.                 mesg "Changing Network Control System. Calling $0 restart"
  323.                 shift
  324.                 exec $0 restart $*
  325.             fi
  326.         fi
  327.         ;;
  328.     status)
  329.         if [ "$NETWORKMANAGER" == yes ] ; then
  330.             mesg_n "Checking for the NetworkManager: "
  331.             nm_running
  332.             rc_status -v
  333.             check_nm_dispatcher
  334.             check_dhcdbd
  335.             NM_STATUS=$?
  336.             if netcontrol_running; then
  337.                 mesg "NetControl System is active as well." \
  338.                      "Check your config or restart network."
  339.             else
  340.                 rc_exit
  341.             fi
  342.         else
  343.             if nm_running; then
  344.                 mesg "NetworkManager is active even though not configured." \
  345.                      "\nCheck your config or restart network."
  346.             fi
  347.         fi
  348.         ;;
  349.     *)
  350.         echo "Usage: $0 <action> [<config>] [<interface>] [-o <options>]"
  351.         echo "  actions: start|stop|status|reload|force-reload|try-restart"
  352.         echo "           restart|stop-all-dhcp-clients|restart-all-dhcp-clients"
  353.         echo "  options: [on]boot,hotplug,manual,check,debug,fake,nm,netcontrol"
  354.         echo "           type=<typelist>,skip=<skiplist>"
  355.         echo "  typelist: space seperated list of interface types"
  356.         echo "  skiplist: space seperated list of interfaces to skip for 'start'"
  357.         if [ "$NETWORKMANAGER" == yes ] ; then
  358.         echo
  359.             echo "Note:"
  360.             echo "  <config>, <interface> and options [on]boot,hotplug,manual" \
  361.                  "have no effect"
  362.             echo "  if service network is controlled by NetworkManager."
  363.         fi
  364.         exit 1
  365.         ;;
  366. esac
  367. cd /etc/sysconfig/network
  368.  
  369.  
  370. ######################################################################
  371.  
  372.  
  373. if [ "$MODE" = onboot -a "$ACTION" = start ] ; then
  374.     rm -f  ${RUN_FILES_BASE}/if-*
  375.     rm -f  ${RUN_FILES_BASE}/ifup-*
  376.     rm -Rf ${RUN_FILES_BASE}/tmp
  377.     rm -f  ${RUN_FILES_BASE}/route-stack-* 2>/dev/null
  378. fi
  379. mkdir -p ${RUN_FILES_BASE}/tmp
  380.  
  381. # This has to happen early; don't move that into start section below!!!
  382. # (Writing NETWORK_RUNFILE means that service network is started. And only if
  383. # service network was started interfaces will be set up via hotplug. And it must
  384. # be started before checking which interfaces are already available and might
  385. # still have to be set up because the were registered to early. Bug 39005)
  386. if [ "$ACTION" = start ] ; then
  387.     date +%s > $NETWORK_RUNFILE
  388. #    # We need that later to find out if an interface was just registered
  389. #    touch -d "`date -d "-20sec"`" $NETWORK_RUNFILE
  390. fi
  391.  
  392. if [ -n "$TYPE" ] ; then
  393.     type_filter() {
  394.         for i in $*; do
  395.             for t in $TYPE; do
  396.                 case $i in
  397.                     # $t*) echo -n "$i "; continue 2;;
  398.                     $t*) echo $i; continue 2;;
  399.                 esac
  400.             done
  401.         done
  402.         echo
  403.     }
  404. else
  405.     LO=lo
  406.     type_filter() {
  407.         echo $*
  408.     }
  409. fi
  410.  
  411.  
  412.  
  413. ######################################################################
  414. # Get interfaces to handle
  415. #
  416. # Seperate this interfaces into several sets, not all mutually exclisive;
  417. # none of them may contain lo, because it will always handled separately
  418. #
  419. # AVAILABLE_IFACES are all interfaces from /sys/class/net
  420. #                  these have to be shut down when stopping
  421. #
  422. # PHYSICAL_IFACES  are interfaces to present physical devices, they will be
  423. #                  derived from AVAILABLE_IFACES
  424. #
  425. # DIALUP_IFACES    are modemX, dslX, etc., they are derived from ifcfg-* files
  426. #
  427. # TUNNEL_IFACES    are interfaces that do not fit into PHYSICAL and DIALUP and
  428. #                  are as well derived from ifcfg-* files
  429. #
  430. #    PHYSICAL, DIALUP and TUNNEL are mutually exclusive. Their union contains
  431. #    AVAILABLE and MANDATORY and all of them have to be set up when starting
  432. #
  433. # MANDATORY_IFACES these must be up and well configured for success
  434.  
  435. # At first get DIALUP and TUNNEL
  436. # these are all configurations without '-' in the configuration name (because
  437. # then 'config name' == 'interface name'), except those, which start with a
  438. # string known for real physical interfaces (eth, tr, ...) and except those,
  439. # which don't end in a number (those are special configs for manual usage or
  440. # backup files)
  441. while IFS=- read a b c; do
  442.     test -n "$c" && continue
  443.     b=`type_filter $b`
  444.     test -z "$b" && continue
  445.     case $b in
  446.         eth*[0-9]|tr*[0-9]|wlan[0-9]|ath[0-9]|ip6tnl*[0-9]|mip6mnha*[0-9])
  447.             continue
  448.             ;;
  449.         *ppp*[0-9]|dsl*[0-9]|modem*[0-9])
  450.             DIALUP_IFACES="$DIALUP_IFACES $b"
  451.             ;;
  452.         *[0-9])
  453.             TUNNEL_IFACES="$TUNNEL_IFACES $b"
  454.             ;;
  455.     esac
  456. done < <(ls -d /etc/sysconfig/network/ifcfg-*)
  457.  
  458. # Now get all available interfaces drop lo and separate them into physical and
  459. # not physical. Then get AVAILABLE_IFACES sorted to shutdown the not physical
  460. # first.
  461. for a in $(type_filter `ls -A /sys/class/net/`); do
  462.     test "$a" = lo && continue;
  463.     test "$a" = sit0 && continue;
  464.     test "$a" = bonding_masters && continue;
  465.     test "${a#wifi}" != "$a" && continue
  466.     case $a in
  467.         eth*|ath*|wlan*|ra*)
  468.             # Skip these which are too new, they will come via hotplug
  469. #Stempeln in rename_netiface
  470. #- am Anfang: virgin
  471. #- wΣhrend dem Schleifen: looping
  472. #- am Ende: renamed
  473. #ifup bricht gleich ab, wenn kein service network
  474. #Wenns keinen Stempel gibt dann Stempeln unknown --> skip
  475. #Wenn Stempel virgin --> skip
  476. #            looping --> skip
  477. #            renamed --> set up
  478. #In Statusschleife, wenn mandatory devices gecheckt werden:
  479. #  wenn status failed
  480. #    STEMPEL == unknown && halbe Wartezeit vorbei -> ifup
  481. #            == virgin/looping/renamed -> nix
  482.             STAMPFILE=$STAMPFILE_STUB`cat /sys/class/net/$a/ifindex`
  483.             if [ "$MODE" == onboot -a "$ACTION" == start ] ; then
  484.                 if [ -r "$STAMPFILE" ] ; then
  485.                     case "`cat $STAMPFILE`" in
  486.                         virgin|looping) continue ;;
  487.                     esac
  488.                 else
  489.                     echo unknown > $STAMPFILE
  490.                     continue
  491.                 fi
  492.             fi
  493.             ;;
  494.     esac
  495.     for b in $DIALUP_IFACES $TUNNEL_IFACES; do
  496.         if [ "$a" = "$b" ] ; then
  497.             NOT_PHYSICAL_IFACES="$NOT_PHYSICAL_IFACES $a"
  498.             continue 2
  499.         fi
  500.     done
  501.     case $a in
  502.         sit*)
  503.             NOT_PHYSICAL_IFACES="$NOT_PHYSICAL_IFACES $a"
  504.             continue 2
  505.             ;;
  506.     esac
  507.     PHYSICAL_IFACES="$PHYSICAL_IFACES $a"
  508. done
  509. AVAILABLE_IFACES="$NOT_PHYSICAL_IFACES $PHYSICAL_IFACES"
  510.  
  511. # # mandatory interfaces are specified in /etc/sysconfig/network/config
  512. # Hack for 9.1/SLES9: YaST does still not write MANDATORY_DEVICES
  513. # therfore we take all PHYSICAL_IFACES, which are configured, as mandatory
  514. if [ -z "$MANDATORY_DEVICES" ] ; then
  515.     # take all configurations except these
  516.     # -  which seem to be backup files
  517.     # -  which are mostly real hotplug or
  518.     # -  which have STARTMODE != onboot/auto
  519.     # -  which are dialup or tunnel interfaces
  520.     # -  which serve as slave interfaces for bonding, vlan or tunnels
  521.     while IFS=- read a b; do
  522.         test -z "$b" && continue
  523.         case $b in
  524.             *~|*rpmnew|*rpmsave)
  525.                 continue;
  526.                 ;;
  527.             *bus-pcmcia*|*bus-usb*|lo|type-*)
  528.                 continue;
  529.                 ;;
  530.         esac
  531.         case "`get_startmode $b`" in
  532.             on|boot|onboot|auto|ifplugd) : ;;
  533.             *) continue ;;
  534.         esac
  535.         for d in $DIALUP_IFACES; do
  536.             if [ "$b" = "$d" ] ; then
  537.                 continue 2
  538.             fi
  539.         done
  540.         for d in $TUNNEL_IFACES; do
  541.             if [ "$b" = "$d" ] ; then
  542.                 b="`get_slaves $b`"
  543.                 test $? = 0 || continue 2
  544.                 TUNNEL_SLAVES="$TUNNEL_SLAVES $b"
  545.                 continue 2
  546.             fi
  547.         done
  548.         MANDATORY_DEVICES="$MANDATORY_DEVICES $b"
  549.     done < <(ls -d /etc/sysconfig/network/ifcfg-*)
  550.     if [    -n "$MANDATORY_DEVICES" \
  551.          -a "$MODE" != onboot \
  552.          -a "$ACTION" = start ] ; then
  553.         echo "Hint: you may set mandatory devices in" \
  554.              "/etc/sysconfig/network/config"
  555.     fi
  556. fi
  557. MANDATORY_DEVICES="$MANDATORY_DEVICES __NSC__ $TUNNEL_SLAVES"
  558. # Check for mandatory devices only when booting
  559. test "$MODE" = onboot || MANDATORY_DEVICES=""
  560.  
  561. debug "CONFIG      = $CONFIG"
  562. debug "INTERFACE   = $INTERFACE"
  563. debug "AVAILABLE_IFACES = $AVAILABLE_IFACES"
  564. debug "PHYSICAL_IFACES  = $PHYSICAL_IFACES"
  565. debug "DIALUP_IFACES    = $DIALUP_IFACES"
  566. debug "TUNNEL_IFACES    = $TUNNEL_IFACES"
  567. debug "MANDATORY_DEVICES = $MANDATORY_DEVICES"
  568. debug "SKIP             = $SKIP"
  569.  
  570. status() {
  571.     local M IFACE
  572.     # declare -i R=0 F=0
  573.     declare -i F=0
  574.     if [ "$1" = "-m" ]; then
  575.         M=yes
  576.         shift
  577.     fi
  578.     for IFACE in $@; do
  579.         $FAKE ifstatus $CONFIG $IFACE -o rc $CHECK $MODE
  580.         RET=$?
  581.         debug && printf "    %-9s returned %s\n" $IFACE $RET
  582.         case $RET in
  583.             $R_SUCCESS|$R_BUSY)
  584.                 # : $((R++))
  585.                 rc_failed 0
  586.                 rc_status -v1
  587.                 ;;
  588.             $R_DHCP_BG)
  589.                 if [ -f "$NETWORK_RUNFILE" -a "$M" = yes ] ; then
  590.                     : $((F++))
  591.                 fi
  592.                  rc_startmode="${esc}[1A${stat}${attn}waiting${norm}"
  593.                  echo -e "$rc_startmode" 1>&2
  594.                 ;;
  595.             $R_INACTIVE|$R_NOTCONFIGURED)
  596.                 rc_failed 3
  597.                 rc_status -v1
  598.                 ;;
  599.             $R_NOCONFIG)
  600.                 if [ -f "$NETWORK_RUNFILE" -a "$M" = yes ] ; then
  601.                     : $((F++))
  602.                     rc_failed 1
  603.                 else
  604.                     rc_failed 3
  605.                 fi
  606.                 rc_status -v1
  607.                 ;;
  608.             *)
  609.                 if [ -f "$NETWORK_RUNFILE" ] ; then
  610.                     test "$M" = yes && : $((F++))
  611.                     rc_failed 1
  612.                 else
  613.                     rc_failed 3
  614.                 fi
  615.                 rc_status -v1
  616.                 ;;
  617.         esac
  618.         rc_reset
  619.     done
  620.     test "$F" -gt 0 && return 1
  621.     # test "$R" = 0 && return 3
  622.     return 0
  623. }
  624.  
  625. rc_reset
  626. declare -i FAILED=0
  627. if [ "$NETWORKMANAGER" == yes -a ${NM_STATUS:-0} -ne 0 ] ; then
  628.     FAILED=1
  629. fi
  630.  
  631. case "$ACTION" in
  632.     start)
  633.         echo Setting up network interfaces:
  634.         /sbin/ifstatus $LO &>/dev/null && unset $LO;
  635.         for IFACE in ${INTERFACE:- $LO
  636.                                    $PHYSICAL_IFACES   }; do
  637.             for SI in $SKIP; do
  638.                 test "$IFACE" = "$SI" && continue 2
  639.             done
  640.             $FAKE ifup $CONFIG $IFACE -o rc $MODE
  641.             RET=$?
  642.             debug && printf "    %-9s returned %s\n" $IFACE $RET
  643.             case "$RET" in
  644.                  $R_SUCCESS)
  645.                      SUCCESS_IFACES="$SUCCESS_IFACES $IFACE"
  646.                      rc_status -v1
  647.                      ;;
  648.                 $R_DHCP_BG)
  649.                      startmode=waiting
  650.                      rc_startmode="${esc}[1A${stat}${attn}$startmode${norm}"
  651.                      echo -en "$rc_startmode" 1>&2
  652.                      echo
  653.                     ;;
  654.                 $R_NOCONFIG)
  655.                     rc_failed 6
  656.                     rc_status -v1
  657.                     ;;
  658.                  $R_NOTCONFIGURED|$R_INACTIVE)
  659.                      SUCCESS_IFACES="$SUCCESS_IFACES $IFACE"
  660.                     rc_failed 5
  661.                     rc_status -v1
  662.                      ;;
  663.                  *)
  664.                      rc_failed 7
  665.                      rc_status -v1
  666.                      ;;
  667.             esac
  668.             rc_reset
  669.         done
  670.  
  671.         # Wait $WAIT_FOR_INTERFACES seconds after interface setup started for
  672.         # hotplug interfaces to become available
  673.         NEWLINE=no
  674.         while true; do
  675.  
  676.             debug ... still waiting for hotplug devices:
  677.             debug SUCCESS_IFACES=$SUCCESS_IFACES
  678.             debug MANDATORY_DEVICES=$MANDATORY_DEVICES
  679.             TMP=$MANDATORY_DEVICES
  680.             MANDATORY_DEVICES=
  681.             STATUS_CHECK=yes
  682.             for D in $TMP; do
  683.                 if [ "$D" = "__NSC__" ] ; then
  684.                     STATUS_CHECK=no
  685.                     MANDATORY_DEVICES="$MANDATORY_DEVICES $D"
  686.                     continue
  687.                 fi
  688.                 IFACE=`/sbin/getcfg-interface -- $D 2>/dev/null`
  689.                 if [ $? != 0 -o ! -d /sys/class/net/$IFACE ] ; then
  690.                     MANDATORY_DEVICES="$MANDATORY_DEVICES $D"
  691.                     continue    
  692.                 fi
  693.                 for S in $SUCCESS_IFACES; do
  694.                     test "$IFACE" = "$S" && continue 2
  695.                 done
  696.                 if [ "$STATUS_CHECK" = no ] ; then
  697.                     echo
  698.                     NEWLINE=no
  699.                     continue
  700.                 fi
  701.                 IFACE="`type_filter $IFACE`"
  702.                 test -z "$IFACE" && continue
  703.                 status -m $IFACE &>/dev/null
  704.                 RET=$?
  705.                 if [ $RET = 0 ] ; then
  706.                     SUCCESS_IFACES="$SUCCESS_IFACES $IFACE"
  707.                     if [ "$NEWLINE" = yes ] ; then
  708.                         echo
  709.                         NEWLINE=no
  710.                     fi
  711.                     status -m $IFACE
  712.                     continue
  713.                 fi    
  714.                 if [ "$((WAIT_FOR_INTERFACES/3 - TTWAIT))" -le 0 ] ; then
  715.                     STAMPFILE=$STAMPFILE_STUB`cat /sys/class/net/$IFACE/ifindex`
  716.                     if [ "$MODE" == onboot -a "$ACTION" == start \
  717.                          -a -r "$STAMPFILE" ] ; then
  718.                         case "`cat $STAMPFILE`" in
  719.                             unknown)
  720.                                 $FAKE ifup $IFACE -o hotplug &>/dev/null
  721.                                 echo renamed > $STAMPFILE
  722.                                 ;;
  723.                         esac
  724.                     fi
  725.                 fi
  726.                 MANDATORY_DEVICES="$MANDATORY_DEVICES $D"
  727.             done
  728.  
  729.             # If only the seperator remains we are done and thus remove it
  730.             test "`echo $MANDATORY_DEVICES`" = __NSC__ && MANDATORY_DEVICES=
  731.  
  732.             TTWAIT=$((`date +%s` - `cat $NETWORK_RUNFILE`))
  733.             test $TTWAIT -gt $((WAIT_FOR_INTERFACES)) \
  734.                  -o -z "$MANDATORY_DEVICES" && break
  735.  
  736.             debug "Time to wait: $((WAIT_FOR_INTERFACES - TTWAIT))"
  737.             if [ "$NEWLINE" != yes ] ; then
  738.                 echo "Waiting for mandatory devices: $MANDATORY_DEVICES"
  739.             fi
  740.             echo -n "$((WAIT_FOR_INTERFACES - TTWAIT)) "
  741.             NEWLINE=yes
  742.             sleep 1
  743.         done
  744.  
  745.         if [ "$NEWLINE" = yes ] ; then
  746.             echo
  747.         fi
  748.  
  749.         for D in $MANDATORY_DEVICES; do
  750.             # Don't check the seperator
  751.             test "$D" = __NSC__ && continue
  752.             IFACE=`/sbin/getcfg-interface -- $D 2>/dev/null`
  753.             if [ $? = 0 -a -d /sys/class/net/$IFACE ] ; then
  754.                 status -m $IFACE && continue
  755.                 printf "    %-9s interface could not be set up until now\n" $IFACE
  756.             else
  757.                 printf "    %-35s No interface found\n" $D
  758.             fi
  759.             rc_failed
  760.             rc_status -v1
  761.             : $((FAILED++))
  762.         done
  763.  
  764.         debug ... final
  765.         debug SUCCESS_IFACES=$SUCCESS_IFACES
  766.         debug MANDATORY_DEVICES=$MANDATORY_DEVICES
  767.         debug FAILED=$FAILED
  768.  
  769.  
  770.         if [ -z "$INTERFACE" ] ; then
  771.             for IFACE in $DIALUP_IFACES $TUNNEL_IFACES ; do
  772.                 $FAKE ifup $CONFIG $IFACE -o rc $MODE
  773.                 RET=$?
  774.                 debug && printf "    %-9s returned %s\n" $IFACE $RET
  775.                 case "$RET" in
  776.                      $R_SUCCESS)
  777.                          SUCCESS_IFACES="$SUCCESS_IFACES $IFACE"
  778.                          rc_status -v1
  779.                          ;;
  780.                     $R_DHCP_BG)
  781.                          startmode=waiting
  782.                          rc_startmode="${esc}[1A${stat}${attn}$startmode${norm}"
  783.                          echo -en "$rc_startmode" 1>&2
  784.                          echo
  785.                         ;;
  786.                     $R_NOCONFIG)
  787.                         rc_failed 6
  788.                         rc_status -v1
  789.                         : $((FAILED++))
  790.                         ;;
  791.                      $R_NOTCONFIGURED|$R_INACTIVE)
  792.                          SUCCESS_IFACES="$SUCCESS_IFACES $IFACE"
  793.                         rc_failed 5
  794.                         rc_status -v1
  795.                          ;;
  796.                      *)
  797.                          rc_failed 7
  798.                          rc_status -v1
  799.                         : $((FAILED++))
  800.                          ;;
  801.                 esac
  802.                 rc_reset
  803.             done
  804.         fi
  805.  
  806.  
  807.         rc_reset
  808.         if [ -z "$INTERFACE" ] ; then
  809.             $FAKE ifup-route noiface -o rc $MODE
  810.             rc_status
  811.             test $FAILED -gt 0 && rc_failed 7
  812.             echo -n "Setting up service network  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  ."
  813.             rc_status -v
  814.         fi
  815.  
  816.         reload_firewall not_on_boot
  817.  
  818.         ;;
  819.  
  820.     stop)
  821.  
  822.         echo Shutting down network interfaces:
  823.  
  824.         if [ -z "$INTERFACE" ] ; then
  825.             $FAKE ifdown-route noiface -o rc $MODE
  826.         fi
  827.  
  828.         for IFACE in ${INTERFACE:-$AVAILABLE_IFACES} ; do
  829.             # printf "    %-9s " $IFACE
  830.             $FAKE ifdown $CONFIG $IFACE -o rc $MODE
  831.             RET=$?
  832.             debug && printf "    %-9s returned %s\n" $IFACE $RET
  833.             rc_failed $RET
  834.             case "$RET" in
  835.                 $R_NODEV|$R_NOTCONFIGURED|$R_INACTIVE)
  836.                     rc_failed 5
  837.                     rc_status -v1 ;;
  838.                 *)
  839.                     rc_status -v1 ;;
  840.             esac
  841.             rc_reset
  842.         done
  843.  
  844.         if [ -z "$INTERFACE" -a -z "$TYPE" ] ; then
  845.             # At last stop any remaining dhcp client
  846.             $FAKE ifdown-dhcp all -o rc
  847.             rc_status
  848.             rm -f $RUN_FILES_BASE/if-*
  849.             rm -f $NETWORK_RUNFILE
  850.             echo -n "Shutting down service network  .  .  .  .  .  .  .  .  .  .  .  .  .  .  ."
  851.             rc_status -v
  852.         fi
  853.  
  854.         ;;
  855.  
  856.     reload)
  857.         if ! $0 status >/dev/null; then
  858.             echo -n service network not active
  859.             rc_failed 7
  860.             rc_status -v
  861.             rc_exit
  862.         fi
  863.         if [ -z "$INTERFACE" -a routes -nt $NETWORK_RUNFILE ] ; then
  864.             $FAKE ifdown-route noiface -o rc $MODE
  865.         fi
  866.         UP2DATE_IFACES=lo
  867.         for IFACE in ${INTERFACE:-$AVAILABLE_IFACES} ; do
  868.             # ifprobe checks if iface configuration changed
  869.             if ifprobe $IFACE ; then
  870.                 UP2DATE_IFACES="$UP2DATE_IFACES $IFACE"
  871.                 continue
  872.             fi
  873.             $FAKE ifdown $CONFIG $IFACE -o rc $MODE
  874.             RET=$?
  875.             debug && printf "    %-9s returned %s\n" $IFACE $RET
  876.             rc_failed $RET
  877.             case "$RET" in
  878.                 $R_NODEV|$R_NOTCONFIGURED|$R_INACTIVE)
  879.                     rc_failed 5
  880.                     rc_status -v1 ;;
  881.                 *)
  882.                     rc_status -v1 ;;
  883.             esac
  884.             rc_reset
  885.         done
  886.         # And we we start all interfaces to catch also new virtual interfaces
  887.         cd "$OLDPWD" # we went to /etc/sysconfig/network, so we have to go back.
  888.         $0 start $CONFIG $INTERFACE -o $OPTIONS skip="$UP2DATE_IFACES"
  889.         rc_status
  890.         ;;
  891.  
  892.     status)
  893.  
  894.         if [ -z "$INTERFACE" ] ; then
  895.               for D in $LO $MANDATORY_DEVICES; do
  896.                 test "$D" = __NSC__ && continue
  897.                   IFACE=`/sbin/getcfg-interface -- $D 2>/dev/null`
  898.                   if [ $? != 0 ] ; then
  899.                     printf "    %-35s No interface found\n" $D
  900.                       : $((FAILED++))
  901.                       continue
  902.                   fi
  903.                   MANDATORY_IFACES="$MANDATORY_IFACES `type_filter $IFACE`"
  904.               done
  905.             debug getting MANDATORY_IFACES: FAILED=$FAILED
  906.       
  907.               for IFACE in $AVAILABLE_IFACES $DIALUP_IFACES $TUNNEL_IFACES; do
  908.                   for MI in $MANDATORY_IFACES $TOCHECK_IFACES; do
  909.                       test "$IFACE" = "$MI" && continue 2
  910.                   done
  911.                   TOCHECK_IFACES="$TOCHECK_IFACES $IFACE"
  912.               done
  913.       
  914.              debug MANDATORY_DEVICES=$MANDATORY_DEVICES
  915.              debug MANDATORY_IFACES=$MANDATORY_IFACES
  916.              debug TOCHECK_IFACES=$TOCHECK_IFACES
  917.  
  918.             if [ -n "$TOCHECK_IFACES" ] ; then
  919.                 echo Checking optional network interfaces:
  920.                   status $TOCHECK_IFACES
  921.             fi
  922.             if [ -n "$MANDATORY_IFACES" ] ; then
  923.                 echo Checking mandatory network interfaces:
  924.                   status -m $MANDATORY_IFACES
  925.                   test $? != 0 && : $((FAILED++))
  926.                 debug checking MANDATORY_IFACES: FAILED=$FAILED
  927.             else
  928.                 echo No interfaces declared as mandatory
  929.             fi
  930.  
  931.              $FAKE ifstatus-route noiface -o rc $MODE
  932.              rc_status 
  933.             test $FAILED -gt 0 && rc_failed 1
  934.         else
  935.             status $INTERFACE
  936.             rc_status
  937.         fi
  938.  
  939.         if [ ! -f $NETWORK_RUNFILE ] ; then
  940.             rc_failed 3 # unused
  941.         fi
  942.  
  943.         echo -n "Checking service network .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  ."
  944.         rc_status -v
  945.  
  946.         ;;
  947.  
  948. esac
  949.  
  950. rc_exit
  951.  
  952.