home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / ifup < prev    next >
Text File  |  2006-11-29  |  45KB  |  1,358 lines

  1. #!/bin/bash
  2. #
  3. # Network interface configuration
  4. #
  5. # Copyright (c) 2002-2006 SuSE Linux AG Nuernberg, Germany.
  6. # All rights reserved.
  7. #
  8. # This program is free software; you can redistribute it and/or modify it under
  9. # the terms of the GNU General Public License as published by the Free Software
  10. # Foundation; either version 2 of the License, or (at your option) any later
  11. # version.
  12. #
  13. # This program is distributed in the hope that it will be useful, but WITHOUT
  14. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  16. # details.
  17. #
  18. # You should have received a copy of the GNU General Public License along with
  19. # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  20. # Place, Suite 330, Boston, MA 02111-1307 USA
  21. #
  22. # Author: Michal Svec <msvec@suse.cz>
  23. #         Christian Zoz <zoz@suse.de>
  24. #         Mads Martin Joergensen <mmj@suse.de>
  25. #         Bjoern Jacke
  26. #         Michal Ludvig <mludvig@suse.cz>
  27. #
  28. # $Id: ifup 1514 2006-10-31 15:18:52Z zoz $
  29. #
  30.  
  31. usage () {
  32.     echo $@
  33.     echo "Usage: if{up,down,status} [<config>] <hwdesc> [-o <options>]"
  34.     echo "  hwdesc may be the interface name or any valid description"
  35.     echo "  of the corresponding device, for details see ifup(8)."
  36.     echo
  37.     echo "Options are:"
  38.     echo "    [on]boot : we are currently booting (or shutting down)"
  39.     echo "    auto     : alias for boot"
  40.     echo "    hotplug  : we are handling a hotplug event"
  41.     echo "    manual   : we do it manually (default, just needed with 'rc'"
  42.     echo "    rc       : we are called by a rc script (implies auto)"
  43.     echo "    dhcp     : we are called from dhcp client" 
  44.     echo "    prov=<n> : use provider <n> (for dial up interface)"
  45.     echo "    nodeps   : don't shut down interfaces depending on this" 
  46.     echo "    debug    : be verbose"
  47.     test "$SCRIPTNAME" = "ifstatus" &&
  48.         echo -e "    check    : return R_BUSY (=$R_BUSY) if there are" \
  49.               "\n               active connections on this interface"
  50.     echo "If options are contradictionary, last option wins. Unknown options"
  51.     echo "are simply ignored, so be careful."
  52.     echo
  53.     exit $R_USAGE
  54. }
  55.  
  56. exithook () {
  57.     RET_VAL=${1:-0}
  58.     if [ "$LOCK_RET_STATE" != yes ] ; then
  59.         case $RET_VAL in
  60.             $R_SUCCESS) RET_STATE=success ;;
  61.             $R_DHCP_BG) RET_STATE=progress ;;
  62.         esac
  63.     fi
  64.     RET_STATE=${2:-$RET_STATE}
  65.     exit $RET_VAL
  66. }
  67.  
  68. ######################################################################
  69. # change the working direcory and source some common files
  70. #
  71. R_INTERNAL=1      # internal error, e.g. no config or missing scripts
  72. cd /etc/sysconfig/network || exit $R_INTERNAL
  73. test -f ./config && . ./config
  74. test -f scripts/functions && . scripts/functions || exit $R_INTERNAL
  75.  
  76. # . scripts/extradebug
  77.  
  78. ######################################################################
  79. # Commandline parsing
  80. #
  81. # if{up,down,status} [config] hwdesc [-o options]
  82. SCRIPTNAME=${0##*/}
  83. debug $*
  84. HWDESC=$1
  85. case "$HWDESC" in ""|-h|*help*) usage; esac
  86. shift
  87. if [ -n "$1" -a "$1" != "-o" ] ; then
  88.     CONFIG=$HWDESC
  89.     HWDESC=$1
  90. fi
  91. shift
  92. test "$1" = "-o" && shift
  93. OPTIONS=$@
  94. MODE=manual
  95. HOTPLUG=no
  96. CONTROL_IFPLUGD=yes # Start/Stop ifplugd?
  97. while [ $# -gt 0 ]; do
  98.     case $1 in
  99.         boot|onboot) MODE=auto ;;
  100.         auto)        MODE=auto ;;
  101.         hotplug)     MODE=auto
  102.                      HOTPLUG=yes ;;
  103.         rc)          RUN_FROM_RC=yes
  104.                      MODE=auto ;;
  105.         manual)      MODE=manual ;;
  106.         ifplugd)     CONTROL_IFPLUGD=no ;; # No, set up iface instead
  107.         check)       CHECK=yes ;;
  108.         quiet)       be_quiet_has_gone ;;
  109.         debug)       DEBUG=yes ;;
  110.         prov=*)      PROVIDER=${1##*=} ;;
  111.         dhcp)        DHCP=yes; CONTROL_IFPLUGD=no ;;
  112.         nodeps)      NODEPS=yes ;;
  113.         *)           debug "unknown option $1 ignored" ;;
  114.     esac
  115.     shift
  116. done
  117. # Source functions.common again, because values of DEBUG and BE_QUIET might
  118. # have changed. These variable will be evaluated while sourcing the file.
  119. test -f scripts/functions.common \
  120.     && . scripts/functions.common \
  121.     || exit $R_INTERNAL
  122.  
  123.  
  124. ######################################################################
  125. # Get a configuration name and additional information
  126. #
  127. # Maybe we already got an configuration name at the command line, but call
  128. # getcfg in any case, because it provides more information.
  129. eval `/sbin/getcfg -d . -f ifcfg- -- $HWDESC 2>/dev/null`
  130. INTERFACE=$HWD_INTERFACE_0
  131. case $SCRIPTNAME in
  132.     ifup)
  133.         if [ -z "$CONFIG" -a "$DHCP" = yes ] ; then
  134.             # This time we were called from dhcpcd just to finish setup (hooks,
  135.             # routes) and thus must use for sure the same config as in the first
  136.             # run. Except if specified different on comand line.
  137.             read CONFIG < <(read_cached_config_data config $INTERFACE)
  138.         fi
  139.         if [ -z "$CONFIG" -a -n "$HWD_CONFIG_0" ] ; then
  140.             # Use determined configuration if it was not specified on command line
  141.             CONFIG=$HWD_CONFIG_0
  142.         fi
  143.         ;;
  144.     ifprobe)
  145.         IFUPFILE=$RUN_FILES_BASE/ifup-$INTERFACE
  146.         if [ ! -e "$IFUPFILE" ] ; then
  147.             IFUPFILE=$RUN_FILES_BASE/if-$INTERFACE
  148.         fi
  149.         if [ -e $IFUPFILE ] ; then
  150.             for FILE in if{cfg,route,services}-$HWD_CONFIG_0 \
  151.                         config dhcp wireless routes; do
  152.                 test -e $FILE || continue
  153.                 test $FILE -nt $IFUPFILE || continue
  154.                 message "`printf "    %-9s changed config file: %s %s" \
  155.                          $INTERFACE "$FILE" "--> restart interface!"`"
  156.                 exit $R_NOT_UP2DATE
  157.             done
  158.         fi
  159.         read CONFIG < <(read_cached_config_data config $INTERFACE)
  160.         if [ "$CONFIG" != "$HWD_CONFIG_0" ] ; then
  161.             message "`printf "    %-9s still using old config: %s %s" \
  162.                      $INTERFACE "$CONFIG" "--> restart interface!"`"
  163.             exit $R_NOT_UP2DATE
  164.         fi
  165.         exit $R_SUCCESS
  166.         ;;
  167.     *)
  168.         # For down and status we prefer to use the same configuration as used for
  169.         # ifup. There could be differences if there was a configuration specified
  170.         # on ifup command line, or if configuration had changed in between
  171.         if [ -z "$CONFIG" ] ; then
  172.             read CONFIG < <(read_cached_config_data config $INTERFACE)
  173.         fi
  174.         if [ -z "$CONFIG" -a -n "$HWD_CONFIG_0" ] ; then
  175.             # Use determined configuration if there was none in the cache
  176.             CONFIG=$HWD_CONFIG_0
  177.         fi
  178.         ;;
  179. esac
  180.  
  181. # virtual interfaces like vlan, bonding, tunnel often take over the MAC address
  182. # of their master interface. So it might get the configuration of master
  183. # interface. Let's work around (but keep in mind that a config name from the
  184. # command line should not be changed):
  185. CONFIG_INTERFACE="`getcfg-interface -d . -f ifcfg- -- "$CONFIG"`"
  186. if [ "$CONFIG_INTERFACE" != "$INTERFACE" \
  187.      -a "$CONFIG_INTERFACE" != "$CONFIG" \
  188.      -a -f "ifcfg-$INTERFACE" ] ; then
  189.     for T in vlan bonding; do
  190.         if [ -f /proc/net/$T/$INTERFACE ] ; then
  191.             CONFIG=$INTERFACE
  192.             break
  193.         fi
  194.     done
  195. fi
  196.  
  197. # This is a workaround for bug 61387. This has to be fixed in getcfg later.
  198. if ! is_iface_available $INTERFACE && is_iface_available $CONFIG_INTERFACE ; then
  199.     INTERFACE=$CONFIG_INTERFACE
  200. fi
  201.  
  202. debug "HWDESC = $HWDESC      CONFIG = $CONFIG      INTERFACE = $INTERFACE"
  203.  
  204.  
  205. ######################################################################
  206. # Now source the configuration file and check if we have an interface
  207. #
  208. if [ -n "$CONFIG" -a -r ifcfg-$CONFIG ] ; then
  209.     . ifcfg-$CONFIG
  210.     # Store config name persistently for use in ifplugd-selectif after
  211.     # interface has gone. Without that info it will not activate
  212.     # alternative interface in this case. Used in get_ifplugd_priority()
  213.     echo $CONFIG > $RUN_FILES_BASE/config-$INTERFACE
  214. fi
  215.  
  216. if ! is_iface_available $INTERFACE; then
  217.     if [ "$SCRIPTNAME" != ifdown ] ; then
  218.         logerror Interface $INTERFACE is not available
  219.         exit $R_NODEV
  220.     else
  221.         if [ "$RUN_FROM_RC" = yes -o "$HOTPLUG" = yes ] ; then
  222.             : just go on, there are things to clean up even if iface has gone
  223.         else
  224.             # message "There is no interface '$INTERFACE'"
  225.             MESS_NO_IFACE="no such interface"
  226.         fi
  227.     fi
  228. fi
  229.  
  230.  
  231. ######################################################################
  232. # Find out the type of the interface
  233. #
  234. # This section needs to be improved. Since we cannot properly detect all
  235. # interface types, it is possible to set this variable in the config file.
  236. if [ -z "$INTERFACETYPE" ] ; then
  237.     case "$HWD_INTERFACETYPE_0" in
  238.         wlan|eth|tr) INTERFACETYPE=$HWD_INTERFACETYPE_0 ;;
  239.     esac
  240.     : ${INTERFACETYPE:=${INTERFACE%%[0-9]*}}
  241. fi
  242.  
  243.  
  244. ######################################################################
  245. # Check if NetworkManager is running and inform both NM and the user
  246. case "$INTERFACETYPE" in
  247.         wlan|eth|tr) : ;;
  248.         *) : ${NM_CONTROLLED:=no} ;;
  249. esac
  250. if nm_running && [ "$NM_CONTROLLED" != no ] ; then
  251.     mesg "Network interface is managed from NetworkManager"
  252.     retcode=$R_SUCCESS
  253.     case $SCRIPTNAME in
  254.         ifup)
  255.             mesg "NetworkManager will be advised to set up $INTERFACE" \
  256.                  "\nbut it cannot be assured from here."
  257.             /usr/bin/dbus-send --system --dest='org.freedesktop.NetworkManager' \
  258.                     '/org/freedesktop/NetworkManager' \
  259.                     'org.freedesktop.NetworkManager.setActiveDevice' \
  260.                     objpath:'/org/freedesktop/NetworkManager/Devices/'$INTERFACE
  261.             ;;
  262.         ifdown)
  263.             mesg "NetworkManager cannot be advised to take down an interface." \
  264.                  "\nSet up another interface instead."
  265.             retcode=$R_NOTIMPL
  266.             ;;
  267.         ifstatus)
  268.                 if is_iface_up $INTERFACE ; then
  269.                     message_if_not_run_from_rc "$INTERFACE is up"
  270.                     message_if_not_run_from_rc "$(ip addr show $INTERFACE)"
  271.                     while read a b c d e f g h i; do
  272.                         message "`printf "    %-9s IP address: %s" "$i" "$d"`"
  273.                     done < <(ip -o -4 addr show $INTERFACE)
  274.                     message_if_not_run_from_rc "$(ip route show dev $INTERFACE)"
  275.                 else
  276.                     message "`printf "    %-9s is down" $INTERFACE`"
  277.                     retcode=$R_INACTIVE
  278.                 fi
  279.                 E="`iwconfig eth0 2>/dev/null \
  280.                     | sed -n 's/^.*ESSID:\"\(.*\)\"/\1/p'`"
  281.                 scripts/ifstatus-services "${INTERFACE}${E:+-$E}"
  282.             ;;
  283.         *)
  284.             mesg "unknown command"
  285.             retcode=$R_USAGE
  286.             ;;
  287.     esac
  288.     exit $retcode
  289. fi
  290.  
  291.  
  292. ######################################################################
  293. # work around bug 85849
  294. # If interface is not configured for dhcp, but ifup/down -o dhcp was
  295. # called from dhcpcd, then exit. This case may happen when dhcpcd was
  296. # called directly.
  297. case "$BOOTPROTO" in
  298.     dhcp|DHCP) : ;; # go on
  299.     *)
  300.         if [ "$DHCP" = yes ] ; then
  301.             logerror "Interface $INTERFACE is not configured for dhcp." \
  302.                   "So don't use '-o dhcp'."
  303.             exit $R_USAGE
  304.         fi ;;
  305. esac
  306.  
  307. ######################################################################
  308. # If we were called via hotplug, we maybe have to rename the interface
  309. #
  310. if [       "$SCRIPTNAME"  = ifup   \
  311.      -a \( "$HOTPLUG"     = yes    \
  312.         -o "$RUN_FROM_RC" = yes \) \
  313.      -a -n "$PERSISTENT_NAME"      ] \
  314.    && ! is_iface_up $INTERFACE ; then
  315.     nameif -r "$PERSISTENT_NAME" "$INTERFACE"
  316.     if [ $? = 0 ] ; then
  317.         message "Interface '$INTERFACE' of device '$HWDESC' renamed to" \
  318.               "$PERSISTENT_NAME"
  319.         message "Don't use PERSISTENT_NAME any longer. See" \
  320.             "/usr/share/doc/packages/sysconfig/README.Persistent_Interface_Names"
  321.         INTERFACE=$PERSISTENT_NAME
  322.     else
  323.         debug "Renaming interface failed"
  324.     fi
  325. fi
  326.  
  327.  
  328. ######################################################################
  329. # check if service network was started and skip ifup in auto mode
  330. #
  331. if [ "$SCRIPTNAME" = ifup -a "$MODE" = auto ] ; then
  332.     if [ ! -f "$NETWORK_RUNFILE" ] ; then
  333.         message "Service network not started and mode 'auto' -> skipping"
  334.         exit $R_SUCCESS
  335.     fi
  336. fi
  337.  
  338.  
  339. ######################################################################
  340. # If we were called via hotplug or from rc-script then start/stop ifplugd if
  341. # configured for this interface
  342. #
  343. IFPLUGD=/sbin/ifplugd
  344. #if [ \(    "$HOTPLUG"     = yes    \
  345. #        -o "$RUN_FROM_RC" = yes \) \
  346. #     -a -x "$IFPLUGD" ] ; then
  347. if [ "$CONTROL_IFPLUGD" == yes ] ; then
  348.     case $SCRIPTNAME in
  349.         ifup)
  350.             if [ $((IFPLUGD_PRIORITY)) -gt 0 ] ; then
  351.                 IFPLUGSCRIPT="-r $PWD/scripts/ifplugd-selectif"
  352.             fi
  353.             # -a do not set interface UP automatically
  354.             # -f ignore failure, treated as no link
  355.             # -F ignore failure, treated as link detected
  356.             # -I don't terminate when script returns error
  357.             # -q don't down iface when terminating
  358.             # -w wait on fork for link status
  359.             if [ "$STARTMODE" = ifplugd ] ; then
  360.                 if [ ! -x "$IFPLUGD" ] ; then
  361.                     logerror "Package ifplugd not installed: missing $IFPLUGD"
  362.                     exit $R_ERROR
  363.                 fi
  364.                 # ifplugd does get link status properly for wlan interfaces.
  365.                 # Therefore we don't start it for these. If multiple interfaces were
  366.                 # configured with ifplugd, wlan iface will be set up when no iface
  367.                 # with higher priority (== wired iface) has a link.
  368.                 if [ "$INTERFACETYPE" = "wlan" ]; then
  369.                     write_cached_config_data link yes $INTERFACE
  370.                 else
  371.                     $IFPLUGD -i $INTERFACE $IFPLUGSCRIPT \
  372.                         ${IFPLUGD_OPTIONS:- -f -I}
  373.                 fi
  374.             fi
  375.             # We need this flag later for ifstatus, because we must avoid that
  376.             # connection state is checked to early
  377.             ( sleep 3; touch $RUN_FILES_BASE/ready-$INTERFACE; ) &
  378.             ;;
  379.         ifdown)
  380.             if [ "$INTERFACETYPE" != "wlan" -a -f /var/run/ifplugd.$INTERFACE.pid ]; then
  381.                 $IFPLUGD -i $INTERFACE -k 2>/dev/null
  382.                 # When ifplug terminates it calls the down script which in turn
  383.                 # runs ifdown without '-o hotplug' or '-o rc' and writes status
  384.                 # information. But we must wait and ensure that all this info is
  385.                 # deleted afterwards.
  386.                 # Additionally ifdown must not return before ifplugd has terminated
  387.                 # so that a new ifplugd may be started when calling 'rcnetwork
  388.                 # restart' (See bug 129648).
  389.                 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
  390.                     if [ ! -f /var/run/ifplugd.$INTERFACE.pid ] ; then
  391.                         debug "ifplugd terminated"
  392.                         break
  393.                     fi
  394.                     debug "waiting for ifplugd to terminate ($i)"
  395.                     sleep 1
  396.                 done
  397.             fi
  398.             ;;
  399.     esac
  400. fi
  401.  
  402. ######################################################################
  403. # Shut down depending interfaces
  404. #
  405. # Check if there are interfaces which depend on this interface. If yes these
  406. # have to be shut down first.
  407. # For example these might be bonding or vlan interfaces. Note that we don't
  408. # catch all types of depending interfaces currently. See function
  409. # 'get_depending_ifaces' in file 'functions' for details.
  410. #
  411. test "$SCRIPTNAME" = ifdown && DEP_IFACES=`get_depending_ifaces $INTERFACE`
  412. if [ "$?" = 0 -a "$NODEPS" != yes ] ; then
  413.     message "`printf "    %-9s is still used from interfaces %s" \
  414.                      $INTERFACE "$DEP_IFACES"`"
  415.     for DI in $DEP_IFACES; do
  416.         ifdown $DI -o $OPTIONS    
  417.     done
  418.     message "`printf "    %-9s now going down itself" $INTERFACE`"
  419. fi
  420.  
  421. ######################################################################
  422. # write status information into the interface data cache
  423. #
  424.  
  425. setexitstate () {
  426.     case $SCRIPTNAME in
  427.         ifup)
  428.             case $RET_STATE in
  429.                 removed)
  430.                     delete_from_cached_config_data '*' '' $INTERFACE
  431.                     ;;
  432.                 success)
  433.                     write_cached_config_data status connected $INTERFACE
  434.                     write_cached_config_data up yes $INTERFACE PFX=ifup-
  435.                     ;;
  436.                 progress)
  437.                     write_cached_config_data status connecting $INTERFACE
  438.                     write_cached_config_data up yes $INTERFACE PFX=ifup-
  439.                     ;;
  440.                 failure|ifplugd)
  441.                     write_cached_config_data status disconnected $INTERFACE
  442.                     ;;
  443.                 *)
  444.                     write_cached_config_data status "$RET_STATE" $INTERFACE
  445.                     ;;
  446.             esac
  447.             commit_cached_config_data $INTERFACE
  448.             commit_cached_config_data $INTERFACE PFX=ifup-
  449.             ;;
  450.         ifdown)
  451.             test "$HOTPLUG" = yes && RET_STATE=removed
  452.             test "$RUN_FROM_RC" = yes && RET_STATE=removed
  453.             case $RET_STATE in
  454.                 removed)
  455.                     delete_from_cached_config_data '*' '' $INTERFACE
  456.                     ;;
  457.                 success)
  458.                     write_cached_config_data status disconnected $INTERFACE
  459.                     ;;
  460.                 progress)
  461.                     write_cached_config_data status disconnecting $INTERFACE
  462.                     ;;
  463.                 failure)
  464.                     write_cached_config_data status connected $INTERFACE
  465.                     ;;
  466.                 *)
  467.                     write_cached_config_data status "$RET_STATE" $INTERFACE
  468.                     ;;
  469.             esac
  470.             commit_cached_config_data $INTERFACE
  471.             delete_from_cached_config_data '*' '' $INTERFACE PFX=ifup-
  472.             commit_cached_config_data $INTERFACE PFX=ifup-
  473.             ;;
  474.     esac
  475. }
  476.  
  477. exittrap () {
  478.     if [ "$RET_STATE" != keep_state ] ; then
  479.         setexitstate
  480.     fi
  481. }
  482.  
  483. case $SCRIPTNAME in
  484.     ifup)
  485.         write_cached_config_data config "$CONFIG" $INTERFACE
  486.         write_cached_config_data hwdesc "$HWDESC" $INTERFACE
  487.         write_cached_config_data status connecting $INTERFACE
  488.         if [ "$RUN_FROM_RC" != yes ] ; then
  489.             write_cached_config_data provider "$PROVIDER" $INTERFACE
  490.         fi
  491.         commit_cached_config_data $INTERFACE
  492.         RET_STATE=failure
  493.         trap exittrap EXIT
  494.         ;;
  495.     ifstatus)
  496.         :
  497.         ;;
  498.     ifdown)
  499.         write_cached_config_data status disconnecting $INTERFACE
  500.         if [ "$RUN_FROM_RC" != yes ] ; then
  501.             delete_from_cached_config_data provider "" $INTERFACE
  502.         fi
  503.         commit_cached_config_data $INTERFACE
  504.         RET_STATE=failure
  505.         trap exittrap EXIT
  506.         ;;
  507. esac
  508.  
  509.  
  510. ######################################################################
  511. # Print some info
  512. #
  513. DEVNAME=
  514. eval export HWD_BUSNAME=\$HWD_BUSNAME_$((HWD_BUS_N-1))
  515. eval export HWD_BUSID=\$HWD_BUSID_$((HWD_BUS_N-1))
  516. if [ -n "$HWD_VENDORID$HWD_PRODUCTID" -a "$HWD_BUSNAME" = pci -a -x /sbin/lspci ] ; then
  517.     DEVNAME=`lspci -d $HWD_VENDORID:$HWD_PRODUCTID 2>/dev/null | sed -n 1p`
  518. #    DEVNAME=${DEVNAME#* }
  519.     DEVNAME=${DEVNAME#*: }
  520. fi
  521. if [ "$HWD_BUSNAME" = pcmcia -a -n "$HWD_BUSID" \
  522.                              -a -r /var/lib/pcmcia/stab ] ; then
  523.     DEVNAME="`sed -n "s=Socket $HWD_BUSID: ==p" /var/lib/pcmcia/stab`"
  524. fi
  525. if [ -n "$DEVNAME" ] ; then
  526.     message "`printf "    %-9s device: %s" $INTERFACE "$DEVNAME"`"
  527. else
  528.     message "`printf "    %-9s %s" "$INTERFACE" "$MESS_NO_IFACE"`"
  529. fi
  530.  
  531. ######################################################################
  532. # What shell we do if there is no configuration data?
  533. # - fail
  534. # - get it automatically
  535. # - ask the user
  536. if [    "$SCRIPTNAME" != ifdown  \
  537.      -a \(      -z "$CONFIG"     \
  538.            -o ! -r ifcfg-$CONFIG \
  539.            -o   -n "$NODATA"     \) ] ; then
  540.     RET_STATE=removed
  541.     logerror "`printf "    %-9s No configuration found for $HWDESC" "" `"
  542.     exit $R_NOCONFIG
  543. fi
  544. if [    "$SCRIPTNAME" = ifdown  \
  545.      -a \(      -z "$CONFIG"     \
  546.            -o ! -r ifcfg-$CONFIG \
  547.            -o   -n "$NODATA"     \) ] ; then
  548.     RET_STATE=removed
  549.     LOCK_RET_STATE=yes
  550.     if is_iface_available $INTERFACE; then
  551.         # FIXME:
  552.         # If there is $CONFIG (from status file?) and ifcfg-$CONFIG does
  553.         # not exist, then invalidate the status file information
  554.         # And improve message for this case, because ifstatus uses this $CONFIG as well
  555.         logerror "`printf "    %-9s No configuration found for $HWDESC" "" `"\
  556.                  "\n`printf "    %-9s Nevertheless the interface will be shut down." ""`"
  557.     else
  558.         logerror "Interface not available and no configuration found."
  559.         exit $R_NOCONFIG
  560.     fi
  561. fi
  562.  
  563. if [ "$INTERFACE" != "$CONFIG" -a -n "$CONFIG" ] ; then
  564.     message "`printf "    %-9s configuration: %s" $INTERFACE "$CONFIG"`"
  565. fi
  566.  
  567.  
  568. ######################################################################
  569. # read possibly stored provider
  570. #
  571. # If we don't know a provider name, let's have a look if a provider was stored
  572. # in the runtime data cache for this configuration.
  573. if [ "$SCRIPTNAME" != ifdown -a -z "$PROVIDER" ] ; then
  574.     PROVIDER=`read_cached_config_data provider $INTERFACE`
  575. fi
  576.  
  577.  
  578. ######################################################################
  579. # check startmode (not for ifdown)
  580. #
  581. # STARTMODE is from config file; MODE is current mode
  582. test "$STARTMODE" = "on"      && STARTMODE=auto
  583. test "$STARTMODE" = "boot"    && STARTMODE=auto
  584. test "$STARTMODE" = "onboot"  && STARTMODE=auto
  585. test "$STARTMODE" = "hotplug" && STARTMODE=auto
  586. if [ "$STARTMODE" = "nfsroot" ] ; then
  587.     STARTMODE=auto
  588.     # if this interface serves nfs root, then don't shut it down via rcnetwork
  589.     if [ "$SCRIPTNAME" = ifdown -a "$RUN_FROM_RC" = yes ] ; then
  590.         message "`printf "    %-9s serves root filesystem. Leave it up." \
  591.                          "$INTERFACE"`"
  592.         RET_STATE=keep_state
  593.         exit $R_NOTCONFIGURED
  594.     fi
  595. fi
  596. if [ "$STARTMODE" == ifplugd -a "$CONTROL_IFPLUGD" == yes ] ; then
  597.     if [ "$SCRIPTNAME" == ifup ] ; then
  598.         message "`printf "    %-9s is controlled by ifplugd" $INTERFACE`"
  599.         if [ "$INTERFACETYPE" = "wlan" ]; then
  600.             # Since exec deletes our traps we have to call
  601.             # exittrap explicitely to set connection state
  602.             RET_STATE=ifplugd
  603.             exittrap
  604.             exec scripts/ifplugd-selectif $INTERFACE up > /dev/null
  605.         fi
  606.         exit $R_DHCP_BG
  607.     fi
  608. fi
  609. test -z "$STARTMODE" && STARTMODE=manual
  610. if [ "$SCRIPTNAME" = ifup ] ; then
  611.     case "$MODE:$STARTMODE" in
  612.         force:*)       : go on ;;
  613.         manual:manual) : go on ;;
  614.         manual:auto)   : go on ;;
  615.         manual:ifplugd): go on ;;
  616.         auto:auto)     : go on ;;
  617.         auto:ifplugd)
  618. #            message "`printf "    %-9s is controlled by ifplugd" $INTERFACE`"
  619. #            if [ "$SCRIPTNAME" = ifup -a "$INTERFACETYPE" = "wlan" ]; then
  620. #                # Since exec deletes our traps we have to call
  621. #                # exittrap explicitely to set connection state
  622. #                RET_STATE=ifplugd
  623. #                exittrap
  624. #                exec scripts/ifplugd-selectif $INTERFACE up > /dev/null
  625. #            fi
  626. #            exit $R_DHCP_BG
  627.             : go on
  628.             ;;
  629.         *:off)         : exit
  630.             message "`printf "    %-9s Startmode is 'off'" $INTERFACE`"
  631.             RET_STATE=removed # Don't write status information file in this case
  632.             exit $R_INACTIVE
  633.             ;;
  634.         *:*)           : exit
  635.             message "`printf "    %-9s Startmode is '%s'" $INTERFACE $STARTMODE`"
  636.             exit $R_NOTCONFIGURED
  637.             ;;
  638.     esac
  639. fi
  640.  
  641.  
  642. ######################################################################
  643. # call optional and individual scripts
  644. #
  645.  
  646. # DHCP special:
  647. #
  648. # When DHCP is used ifup runs twice. First it triggers the dhcp client. As soon
  649. # as the client got a valid ip address it calls ifup again with option 'dhcp' to
  650. # finish individual setup. ifdown is first called from dhcp client with option
  651. # 'dhcp' and then as usual.
  652. #
  653. # When called directly (from rcnetwork or manually, $DHCP!=yes) only PRE_UP
  654. # (ifup) and POST_DOWN (ifdown) scripts are called. And of course ifup-dhcp is
  655. # called.
  656. #
  657. # When called from dhcp client (with option "dhcp", $DHCP=yes) then POST_UP
  658. # (ifup) and PRE_DOWN (ifdown) are called. Additionally if{up,down}-route is
  659. # called to make it possible to set individual routes _after_ dhcp client
  660. # brought up the interface.
  661. #
  662. # PRE_DOWN is now called directly, because dhcpcd calls it hook script always
  663. # after removing the ip address (i.e. POST) (Bug 61842)
  664.  
  665. if [ "$SCRIPTNAME" = ifdown ] ; then
  666.  
  667.     # execute global down/stop scripts
  668.     if [ "$GLOBAL_PRE_DOWN_EXEC" = "yes" ]; then
  669.         for SCRIPT in if-down.d/*; do
  670.             [ -d $SCRIPT -o ! -x $SCRIPT ] && continue;
  671.             # ignore backup files and leftovers from rpm
  672.             echo $SCRIPT | grep -q '\(\.rpm\(save\|new\)$\)\|\(.~$\)' && continue;
  673.             debug "executing additional global stop script $SCRIPT"
  674.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  675.         done
  676.     fi
  677.  
  678.     # execute an individual prestop script if available
  679.     # NOTE: 'eval echo' in the next line is necessary to expand settings
  680.     # like PRE_DOWN_SCRIPT="~root/bin/foo"
  681.     for SCRIPT in `eval echo $PRE_DOWN_SCRIPT scripts/$PRE_DOWN_SCRIPT`; do
  682.         if [ -x "$SCRIPT" -a ! -d "$SCRIPT" ] ; then
  683.             debug "executing additional stop script $SCRIPT"
  684.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  685.         fi
  686.     done
  687.  
  688.     # shut down depending services first
  689.     scripts/${SCRIPTNAME}-services $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  690.  
  691. fi
  692.  
  693. # execute an individual prestart script if available
  694. if [ "$SCRIPTNAME" = ifup \
  695.      -a \( "$BOOTPROTO" != dhcp -o "$DHCP" != yes \) ] ; then
  696.     # NOTE: 'eval echo' in the next line is necessary to expand settings
  697.     # like PRE_UP_SCRIPT="~root/bin/foo"
  698.     for SCRIPT in `eval echo $PRE_UP_SCRIPT scripts/$PRE_UP_SCRIPT`; do
  699.         if [ -x "$SCRIPT" -a ! -d "$SCRIPT" ] ; then
  700.             debug "executing additional start script $SCRIPT"
  701.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  702.         fi
  703.     done
  704. fi
  705.  
  706.  
  707. ######################################################################
  708. # call some default helper scripts
  709. #
  710.  
  711. # call them only if we are not in the second run for dhcp
  712. if [ "$DHCP" != yes ] ; then
  713.  
  714.     # perhaps we have to close some connections first when ifdown
  715.     if [ "$SCRIPTNAME" = ifdown ] ; then
  716.         scripts/${SCRIPTNAME}-connection $CONFIG $INTERFACE \
  717.                                          ${OPTIONS:+-o $OPTIONS}
  718.     fi
  719.     
  720.     # before setting up interfaces we have to configure wireless NICs
  721.     if [ "$SCRIPTNAME" = ifup ] ; then
  722.         scripts/${SCRIPTNAME}-wireless $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  723.         test "$?" -ne 0 && exit
  724.     fi
  725.     
  726.     # Frob vlan interface
  727.     if [ "$SCRIPTNAME" = ifup -a "$INTERFACETYPE" = vlan ]; then
  728.         scripts/${SCRIPTNAME}-802.1q $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  729.     fi
  730.  
  731.     # Frob bridge interface
  732.     if [ "$SCRIPTNAME" = ifup -a "$BRIDGE" = yes ]; then
  733.         scripts/${SCRIPTNAME}-bridge $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  734.         test "$?" -ne 0 && exit
  735.     fi
  736.     
  737.     # exec if*-ppp for modem and dsl
  738.     case $INTERFACETYPE in
  739.         modem|dsl|ppp)
  740.             scripts/${SCRIPTNAME}-ppp $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  741.             retcode=$?
  742.             # If ifup, an exit value of 0 does just mean that smpppd will go to
  743.             # establish the connection, but it's still not connected.
  744.             if [ \( "$retcode" = "$R_SUCCESS" -a "$SCRIPTNAME" = ifup \) \
  745.                  -o "$retcode" = "$R_DHCP_BG" ] ; then
  746.                 RET_STATE=progress
  747.             else
  748.                 RET_STATE=success
  749.             fi
  750.             # We write the exit status immediately and leave it alone when we
  751.             # are finished, because smpppd may already change it while we are
  752.             # still running some POST_* scripts.
  753.             setexitstate
  754.             RET_STATE=keep_state
  755.             LOCK_RET_STATE=yes
  756.             # Don't execute maim part of ifup, but all helper scripts and hooks
  757.             SKIP_MAIN_PART=skip
  758.             ;;
  759.     esac
  760.  
  761.     # exec interface-type ifup if present
  762.     # If someone names an interface 'wireless', ifup-wirelss might be called
  763.     # here. To avoid this we check if INTERFACETYPE != wireless. ifup-wireless
  764.     # will be called later anyway. (bug 83786)
  765.     INTERFACESCRIPT="scripts/${SCRIPTNAME}-${INTERFACETYPE}"
  766.     # Some scripts will be called anyway. So we must avoid that they will be
  767.     # called a second time here.
  768.     case "$INTERFACETYPE" in
  769.         802.1q)        : ;;
  770.         autoip)        : ;;
  771.         bridge)        : ;;
  772.         dhcp)          : ;;
  773.         ppp)           : ;;
  774.         route)         : ;;
  775.         services)      : ;;
  776.         skel)          : ;;
  777.         wireless)      : ;;
  778.         *)
  779.             if [ -x "$INTERFACESCRIPT" ] ; then
  780.                 $INTERFACESCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  781.                 retcode=$?
  782.                 SKIP_MAIN_PART=skip
  783.             fi
  784.             ;;
  785.     esac
  786. fi
  787.  
  788.  
  789. ######################################################################
  790. # Change device settings via ethtool.
  791. #
  792. if [ "$SCRIPTNAME" = ifup -a -n "$ETHTOOL_OPTIONS" ]; then
  793.     # There were cases where interfaces were not ready for ethtool
  794.     # immediately after registration. 
  795.     test -n "$ETHTOOL_WAIT" && sleep $ETHTOOL_WAIT 2>/dev/null
  796.     case $ETHTOOL_OPTIONS in
  797.         -*) # got an option, replace second word with current interface name
  798.             read ETHTOOL_SWITCH xifacex ETHTOOL_SETTINGS < <(echo $ETHTOOL_OPTIONS)
  799.             ETHTOOL_OPTIONS="$ETHTOOL_SWITCH $INTERFACE $ETHTOOL_SETTINGS"
  800.             ;;
  801.         *)  # old style, setting a parameter...
  802.             ETHTOOL_OPTIONS="-s $INTERFACE $ETHTOOL_OPTIONS"
  803.             ;;
  804.     esac
  805.     MESSAGE="`/usr/sbin/ethtool $ETHTOOL_OPTIONS 2>&1`"
  806.     test $? != 0 \
  807.         && err_mesg "Error while executing: /usr/sbin/ethtool $ETHTOOL_OPTIONS" \
  808.         || info_mesg "/usr/sbin/ethtool $ETHTOOL_OPTIONS"
  809.     test -n "$MESSAGE" && err_mesg "$MESSAGE"
  810. fi
  811.  
  812.  
  813. ######################################################################
  814. # Tunnel setup
  815. #
  816. if [ "$TUNNEL" = "sit" -o "$TUNNEL" = "gre" -o "$TUNNEL" = "ipip" ]; then
  817.  
  818.     # Backwards compliance hack:
  819.     # TUNNEL_DEVICE is new since SL9.1/SLES9. Up to then TUNNEL_LOCAL_INTERFACE
  820.     # was used in configuration files
  821.     if [ -z "$TUNNEL_DEVICE" ] ; then
  822.         TUNNEL_DEVICE=$TUNNEL_LOCAL_INTERFACE
  823.     fi
  824.     # Get current interface name of tunnel device    
  825.     TUNNEL_LOCAL_INTERFACE=`/sbin/getcfg-interface -- $TUNNEL_DEVICE`
  826.  
  827.     # Get IPv4 address of local tunnel endpoint 
  828.     # in the case it wasn't set in the config file.
  829.     if [ -z "$TUNNEL_LOCAL_IPADDR" -a -n "$TUNNEL_LOCAL_INTERFACE" ]; then
  830.         TUNNEL_LOCAL_IPADDR=`is_iface_up $TUNNEL_LOCAL_INTERFACE && \
  831.                              get_ipv4address $TUNNEL_LOCAL_INTERFACE`
  832.         if [ "$?" != 0 ] ; then
  833.             logerror "failed to get IPv4 address of $TUNNEL_LOCAL_INTERFACE" \
  834.                      "($TUNNEL_DEVICE)"
  835.             exit $R_ERROR
  836.         fi
  837.     fi
  838.  
  839.     TUNNEL_LOCAL_IPADDR_V6=`printf "%s/16" $(convert_ipv4address_to_6to4 $TUNNEL_LOCAL_IPADDR)`
  840.  
  841.     case "$SCRIPTNAME" in
  842.         ifup)
  843.             # Create a new tunnel
  844.             MESSAGE=`ip tunnel add $INTERFACE mode "$TUNNEL" \
  845.                 ${TUNNEL_LOCAL_IPADDR:+local "$TUNNEL_LOCAL_IPADDR"} \
  846.                 ${TUNNEL_REMOTE_IPADDR:+remote "$TUNNEL_REMOTE_IPADDR"} \
  847.                 ${TUNNEL_TTL:+ttl "$TUNNEL_TTL"} $TUNNEL_OPTIONS 2>&1`
  848.             if [ $? = 0 ] ; then
  849.                 :
  850.             else
  851.                 logerror "failed to add tunnel $INTERFACE"
  852.                 logerror "$MESSAGE"
  853.                 exit $R_ERROR
  854.             fi
  855.     
  856.             MESSAGE=`ip link show $INTERFACE 2>&1`
  857.             if [ $? = 0 ] ; then
  858.                 # This message shuold be printed at the very end
  859.                 message_if_not_run_from_rc "tunnel $CONFIG is configured"
  860.             else
  861.                 logerror "failed to add tunnel $INTERFACE"
  862.                 logerror "$MESSAGE"
  863.                 logerror "(does it already exist with a different name?)"
  864.                 exit $R_ERROR
  865.             fi
  866.             ;;
  867.         ifdown)
  868.             MESSAGE=`ip tunnel del $INTERFACE 2>&1`
  869.             if [ $? = 0 ] ; then
  870.                 message_if_not_run_from_rc "tunnel $INTERFACE is removed"
  871.             else
  872.                 logerror "failed to delete tunnel $INTERFACE"
  873.                 logerror "$MESSAGE"
  874.                 exit $R_ERROR
  875.             fi
  876.             ;;
  877.     esac
  878.  
  879.     # We only handle bringing up the 6to4 tunnel in a special way.
  880.     # Shutting down and querying for it's status is the same
  881.     # as for 'static' tunnels.
  882.     if [ "$BOOTPROTO" = "6to4" -a "$SCRIPTNAME" != "ifup" ]; then
  883.         BOOTPROTO="static"
  884.     fi
  885. fi
  886.  
  887.  
  888. ######################################################################
  889. # Prepare Bonding
  890. #
  891. if [ "$BONDING_MASTER" = yes ] ; then
  892.     if [ "$SCRIPTNAME" = ifup -a ! "$DHCP" = yes ] ; then
  893.         if [ ! -x /sbin/ifenslave ] ; then
  894.             logerror "Bonding: /sbin/ifenslave not found"
  895.             exit $R_INTERNAL
  896.         fi
  897.         if ! load_bond $INTERFACE $BONDING_MODULE_OPTS ; then
  898.             logerror "Bonding: could not get interface $INTERFACE"
  899.             exit $R_NODEV
  900.         fi
  901.     fi
  902.     # Get all slave interfaces from hardware descriptions
  903.     BSINTERFACES=""
  904.     for BSVAR in ${!BONDING_SLAVE*} ; do
  905.         INDEX=${BSVAR#BONDING_SLAVE}
  906.         BONDING_SLAVE=${!BSVAR}
  907.         BSIFACE="`/sbin/getcfg-interface -- $BONDING_SLAVE`"
  908.         if [ $? != 0 ] ; then
  909.             logerror "Could not get an interface for slave device '$BONDING_SLAVE'"
  910.         fi
  911.         # prepare only available slave devices
  912.         if [ -d /sys/class/net/$BSIFACE ] ; then
  913.             BSINTERFACES="$BSINTERFACES $BSIFACE"
  914.         else
  915.             logerror "Bonding Slave $BSIFACE is not available. Skipped."
  916.         fi
  917.     done
  918.     # enslave the slave ifaces only once
  919.     if [ "$SCRIPTNAME" = ifup -a ! "$DHCP" = yes ] ; then
  920.         message "`printf "    %-9s enslaving interfaces: %s" \
  921.                          $INTERFACE "$BSINTERFACES"`"
  922.         # get up the bonding device before enslaving
  923. #        if ! is_iface_up $INTERFACE; then
  924.             ip link set $INTERFACE up 2>&1
  925. #        fi
  926.         # enslave available slave devices; if there is none -> hard break and log
  927.         MESSAGE=`/sbin/ifenslave $BONDING_OPTIONS $INTERFACE $BSINTERFACES 2>&1`
  928.         if [ "$?" -gt 0 ]; then
  929.             logerror "Bonding interface '$INTERFACE' could not be set up" \
  930.                      "correctly\n$MESSAGE"
  931.             exit $R_ERROR
  932.         fi
  933.         # Some option have to be changed after ifenslave (e.g. primary)
  934.         # Therefore we call load_bond() a second time
  935.         load_bond $INTERFACE $BONDING_MODULE_OPTS
  936.     fi
  937. fi
  938.  
  939. ######################################################################
  940. # bringing up/down or checking the interface (main part)
  941. #
  942.  
  943. # Check status of ifplugd first. If ifplugd is running the interface
  944. # need not to be up always.
  945. if [ "$SCRIPTNAME" == ifstatus -a "$STARTMODE" == ifplugd ] ; then
  946.     if [ ! -x "$IFPLUGD" ] ; then
  947.         logerror "Package ifplugd not installed: missing $IFPLUGD"
  948.         exit $R_ERROR
  949.     fi
  950.     debug "Checking ifplugd status"
  951.     ifplugd_retcode=$R_SUCCESS
  952.     NOT=""
  953.     if [ "$INTERFACETYPE" == "wlan" ]; then
  954.         # We don't run ifplugd on wlan interfaces, because link detection
  955.         # is not reliable there. Therefore we assume that there is always
  956.         # a link and take it up if all major interfaces are not linked.
  957.         # Nevertheless ifup need to be called initially on wlan interfaces.
  958.         # We check this by looking for the link flag in its status file.
  959.         if ! has_link $INTERFACE; then
  960.             ifplugd_retcode=$R_NO_IFPLUGD
  961.             NOT="not "
  962.         fi
  963.         message "`printf "    %-9s is ${NOT}prepared for use with ifplugd" \
  964.                          "$INTERFACE"`"
  965.     else
  966.         MESSAGE="`$IFPLUGD -c -i $INTERFACE 2>&1`"
  967.         if [ "$?" -ne 0 ] ; then
  968.             ifplugd_retcode=$R_NO_IFPLUGD
  969.             NOT="not "
  970.         fi
  971.         debug "$MESSAGE"
  972.         message "`printf "    %-9s ifplugd is ${NOT}running" "$INTERFACE"`"
  973.     fi
  974.     if [ "$ifplugd_retcode" == "$R_SUCCESS" ] &&
  975.        ifplugd-selectif $INTERFACE should_be_up $INTERFACETYPE; then
  976.         # if interface should be up and running then we unset ifplugd_retcode.
  977.         # Then the normal status section will decide if the interface is set up
  978.         # correctly.
  979.         if [ $ifplugd_retcode -eq 0 ] ; then
  980.             unset ifplugd_retcode
  981.             # If we check an interface to early after registration we might get
  982.             # wrong connection state. Therefore we will write check if flag 'ready'
  983.             # is already set. This flag was set in initial call of ifup (called
  984.             # from udev right after initialisation). 
  985.             if [ ! -f $RUN_FILES_BASE/ready-$INTERFACE ] ; then
  986.                 ifplugd_retcode=99
  987.             fi
  988.         fi
  989.     fi
  990. fi
  991.  
  992. dhcpretcode=$R_SUCCESS
  993. # switch type. If SKIP_MAIN_PART == skip, don't execute any section
  994. case "$BOOTPROTO$SKIP_MAIN_PART" in
  995.     dhcp+autoip|DHCP+AUTOIP)
  996.         if [ "$DHCP" = yes ] ; then      # called from dhcp client
  997.             ${SCRIPTNAME}-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  998.             retcode=$?
  999.         else                             # called from rcnetwork or manually
  1000.             ${SCRIPTNAME}-autoip $CONFIG $INTERFACE -o prepare $OPTIONS
  1001.             ${SCRIPTNAME}-dhcp $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1002.             dhcpretcode=$?
  1003.             ${SCRIPTNAME}-autoip $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1004.             retcode=$?
  1005.         fi
  1006.     ;;
  1007.     autoip|AUTOIP)
  1008.         ${SCRIPTNAME}-autoip $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1009.         retcode=$?
  1010.     ;;
  1011.     dhcp|DHCP)
  1012.         # With dhcp if{up,down} is called twice. See comment "DHCP special" above
  1013.         if [ "$DHCP" = yes ] ; then      # called from dhcp client
  1014.             SKIP_MAIN_PART=skip
  1015.             ${SCRIPTNAME}-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1016.             retcode=$?
  1017.         else                             # called from rcnetwork or manually
  1018.             ${SCRIPTNAME}-dhcp $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1019.             dhcpretcode=$?
  1020.         fi
  1021.     ;;
  1022. esac
  1023. case "$BOOTPROTO$SKIP_MAIN_PART" in
  1024.     # Skip it
  1025.     *skip)
  1026.         :
  1027.         ;;
  1028.     # Configure IPv6 6to4 tunnels.
  1029.     6to4)
  1030.  
  1031.         MESSAGE=`ip link set up dev $INTERFACE $LINK_OPTIONS 2>&1`
  1032.         if [ $? != 0 ] ; then
  1033.             logerror "failed to set up interface $INTERFACE"
  1034.             logerror "$MESSAGE"
  1035.             exit $R_ERROR
  1036.         fi
  1037.  
  1038.         if [ -n "$MTU" ] ; then
  1039.             MESSAGE=`ip link set $INTERFACE mtu $MTU 2>&1`
  1040.             if [ $? !=0 ] ; then
  1041.                 logerror "failed to set MTU for interface $INTERFACE"
  1042.                 logerror "$MESSAGE"
  1043.                 exit $R_ERROR
  1044.             fi
  1045.         fi
  1046.  
  1047.         MESSAGE=`ip -6 addr add $TUNNEL_LOCAL_IPADDR_V6 dev $INTERFACE 2>&1`
  1048.         if [ $? != 0 ] ; then
  1049.             logerror "failed to add address $TUNNEL_LOCAL_IPADDR_V6 to" \
  1050.                      "interface $INTERFACE"
  1051.             logerror "$MESSAGE"
  1052.             exit $R_ERROR
  1053.         fi
  1054.  
  1055.         ifup-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1056.         retcode=$?
  1057.     ;;
  1058.     *)
  1059.         case $SCRIPTNAME in
  1060.             ifup)
  1061.                 retcode=$R_SUCCESS
  1062.                 if [ -n "$MTU" ] ; then
  1063.                     ip link set $INTERFACE mtu $MTU
  1064.                     retcode_mtu=$?
  1065.                 fi
  1066.                 if ! ip link set up dev $INTERFACE \
  1067.                         ${LLADDR:+address $LLADDR} $LINK_OPTIONS; then
  1068.                     logerror "Cannot enable interface $INTERFACE."
  1069.                     retcode=$R_NOTRUNNING
  1070.                 else
  1071.                     if [ -n "$MTU" ] ; then
  1072.                         ip link set $INTERFACE mtu $MTU || retcode_mtu=$?
  1073.                         if [ $retcode_mtu != 0 ] ; then
  1074.                             logerror "Cannot set mtu of $MTU to interface $INTERFACE."
  1075.                         fi
  1076.                     fi
  1077.                     ADDRCOUNT=0
  1078.                     for IPVAR in ${!IPADDR*}; do
  1079.                         INDEX=${IPVAR#IPADDR}
  1080.                         if [ -n "$INDEX" ] ; then
  1081.                             eval REMOTE_IPADDR=\$REMOTE_IPADDR$INDEX
  1082.                             eval BROADCAST=\$BROADCAST$INDEX
  1083.                             eval LABEL=\$LABEL$INDEX
  1084.                             eval SCOPE=\$SCOPE$INDEX
  1085.                             eval NETMASK=\$NETMASK$INDEX
  1086.                             eval PREFIXLEN=\$PREFIXLEN$INDEX
  1087.                             eval IP_OPTIONS=\$IP_OPTIONS$INDEX
  1088.                         fi
  1089.                         IPADDR=${!IPVAR}
  1090.                         test -z "$IPADDR" && continue
  1091.                         if [ -z "$PREFIXLEN" ] ; then
  1092.                             PREFIXLEN=`mask2pfxlen $NETMASK`
  1093.                         fi
  1094.                         case $IPADDR in
  1095.                             */*)
  1096.                                 PREFIXLEN=${IPADDR#*/}
  1097.                                 IPADDR=${IPADDR%/*}
  1098.                                 ;;
  1099.                             *) ;;         # IP=$IP${PREFIXLEN:+/$PREFIXLEN} ;;
  1100.                         esac
  1101.                         if [ -z "$NETMASK" ] ; then
  1102.                             NETMASK=`pfxlen2mask $PREFIXLEN`
  1103.                         fi
  1104.                         if [ -z "$BROADCAST" ]; then
  1105.                             BROADCAST=$DEFAULT_BROADCAST
  1106.                         fi
  1107.                         # Don't set broadcast for IPv6
  1108.                         case $IPADDR in
  1109.                             *:*)
  1110.                                 ISv6=yes
  1111.                                 BROADCAST='';;
  1112.                             *)
  1113.                                 ISv6=no;;
  1114.                         esac
  1115.  
  1116.                         # Make sure we have ipv6 support or skip this address
  1117.                         if [ "$ISv6" = "yes" ]; then
  1118.                             if ! sysctl net.ipv6 &>/dev/null; then
  1119.                                 if ! modprobe net-pf-10 2>/dev/null; then
  1120.                                     logerror "Missing IPv6 support." \
  1121.                                              "Ommitting address $IPADDR."
  1122.                                     continue
  1123.                                 fi
  1124.                             fi
  1125.                         fi
  1126.  
  1127.                         if [ "$RUN_FROM_RC" = yes ]; then
  1128.                             # show IP address etc.
  1129.                             case $INTERFACE in
  1130.                             # lo)    ;;
  1131.                             *)
  1132.                                 # if multiple addresses show one per line
  1133.                                 if [ "$ADDRCOUNT" -gt 0 -a -z "$LABEL" ]; then 
  1134.                                     message_n "              "  # 14 blanks
  1135.                                 else
  1136.                                     message_n "`printf "    %-9s " $INTERFACE${LABEL:+:$LABEL}`"
  1137.                                 fi
  1138.                                 if [ "$REMOTE_IPADDR" ]; then
  1139.                                     message_n "`printf "IP/Peer:    %s / %s  " $IPADDR $REMOTE_IPADDR`"
  1140.                                 # elif [ "$ISv6" = "yes" ]; then
  1141.                                 else
  1142.                                     message_n "`printf "IP address: %s/%s  " $IPADDR $PREFIXLEN`"
  1143.                                 # else
  1144.                                 #    message_n "`printf "IP/Netmask: %s / %s  " $IPADDR $NETMASK`"
  1145.                                 fi
  1146.                                 if [ "$BONDING_MASTER" = yes ] ; then
  1147.                                     message_n " as bonding master"
  1148.                                 fi
  1149.                                 message " "
  1150.                                 ;;
  1151.                             esac
  1152.                         fi
  1153.  
  1154.                         debug "Handling Index <$INDEX>:\n" \
  1155.                               "    IPADDR             = $IPADDR\n" \
  1156.                               "    PREFIXLEN          = $PREFIXLEN\n" \
  1157.                               "    CHECK_DUPLICATE_IP = $CHECK_DUPLICATE_IP"
  1158.                         if [ "$CHECK_DUPLICATE_IP"  = "yes" ] ; then
  1159.                             arping -q -c 2 -w 3 -D -I $INTERFACE $IPADDR \
  1160.                                 && CHECK_DUPLICATE_IP=no
  1161.                         fi
  1162.                         if [ "$CHECK_DUPLICATE_IP" = "yes" ] ; then
  1163.                             logerror "Error on setting up interface" \
  1164.                                      "$INTERFACE:$LABEL:\n" \
  1165.                                      "  address $IPADDR already in use.\n  Probably" \
  1166.                                      "there is another computer using that address."
  1167.                             retcode=$R_NOTRUNNING
  1168.                         else
  1169.                             MESSAGE=`\
  1170.                                 ip addr add dev $INTERFACE \
  1171.                                     "local" $IPADDR${PREFIXLEN:+/$PREFIXLEN} \
  1172.                                     ${REMOTE_IPADDR:+peer $REMOTE_IPADDR} \
  1173.                                     ${BROADCAST:+broadcast "$BROADCAST"} \
  1174.                                     ${LABEL:+label $INTERFACE:$LABEL} \
  1175.                                     ${SCOPE:+scope $SCOPE} \
  1176.                                     $IP_OPTIONS \
  1177.                                     2>&1 `
  1178.                             case $? in
  1179.                                 0) retcode=$R_SUCCESS ;;
  1180.                                 2)
  1181.                                     case "$MESSAGE" in
  1182.                                         # Address is already set.
  1183.                                         RTNET*File*exists*| \
  1184.                                         RTNET*No*buffer*space*available*)
  1185.                                             retcode=$R_SUCCESS ;;
  1186.                                         *) retcode=$R_NOTRUNNING ;;
  1187.                                     esac ;;
  1188.                                 *) retcode=$R_NOTRUNNING ;;
  1189.                             esac
  1190.                         fi
  1191.                         ADDRCOUNT=$(($ADDRCOUNT + 1))
  1192.                     done
  1193.                 fi
  1194.                 ifup-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1195.                 ;;
  1196.             ifdown)
  1197.                 ifdown-dhcp $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1198.                 ifdown-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1199.                 ip addr flush dev $INTERFACE &>/dev/null
  1200.                 ip link set dev $INTERFACE down &>/dev/null
  1201.                 # If this is an bonding master, remove it
  1202.                 if [ "$BONDING_MASTER" = yes ] ; then
  1203.                     remove_bond $INTERFACE
  1204.                 fi
  1205.                 retcode=0 # $?
  1206.                 ;;
  1207.             ifstatus)
  1208.                 if is_iface_up $INTERFACE ; then
  1209.                     message_if_not_run_from_rc "$INTERFACE is up"
  1210.                     message_if_not_run_from_rc "$(ip addr show $INTERFACE)"
  1211.                     while read a b c d e f g h i; do
  1212.                         message "`printf "    %-9s IP address: %s" "$i" "$d"`"
  1213.                     done < <(ip -o -4 addr show $INTERFACE)
  1214.                     ifstatus-route $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1215.                     retcode=$R_SUCCESS
  1216.                     if [ "$BONDING_MASTER" = yes ] ; then
  1217.                         message_if_not_run_from_rc \
  1218.                             "`cat /proc/net/bonding/$INTERFACE`"
  1219.                     fi
  1220.                 else
  1221.                     # message_if_not_run_from_rc "$INTERFACE is down"
  1222.                     message "`printf "    %-9s is down" $INTERFACE`"
  1223.                     retcode=$R_NOTRUNNING
  1224.                     test "$STARTMODE" = "manual" && retcode=$R_INACTIVE
  1225.                 fi
  1226.                 ;;
  1227.         esac
  1228.         ;;
  1229. esac
  1230.  
  1231.  
  1232. ######################################################################
  1233. # call some default helper scripts
  1234. #
  1235.  
  1236. # call them only if we are not in the second run for dhcp
  1237. if [ "$DHCP" != yes ] ; then
  1238.  
  1239.     # we check connections and settings for wireless NICs when ifstatus
  1240.     if [ "$SCRIPTNAME" = ifstatus ] ; then
  1241.         scripts/${SCRIPTNAME}-wireless    $CONFIG $INTERFACE \
  1242.                                           ${OPTIONS:+-o $OPTIONS}
  1243.         scripts/${SCRIPTNAME}-connection  $CONFIG $INTERFACE \
  1244.                                           ${OPTIONS:+-o $OPTIONS}
  1245.         ret=$?
  1246.         test "$CHECK" = yes -a $ret != 0 && retcode=$ret
  1247.         DEP_IFACES=`get_depending_ifaces $INTERFACE`
  1248.         if [ "$?" = 0 -a "$NODEPS" != yes ] ; then
  1249.             message "`printf "    %-9s is still used from interfaces %s" \
  1250.                              $INTERFACE "$DEP_IFACES"`"
  1251.             #for DI in $DEP_IFACES; do
  1252.             #  ifstatus $DI -o $OPTIONS
  1253.             #done
  1254.         fi
  1255.         # check if setting up firewall is in progress
  1256.         if [ -f /var/lock/SuSEfirewall2.pid ] ; then
  1257.             message "Setting up firewall still in progress"
  1258.             retcode=$R_DHCP_BG
  1259.         fi
  1260.     fi
  1261.     
  1262.     # after shutting down interfaces ifup-wireless has to kill the wpa daemon
  1263.     if [ "$SCRIPTNAME" = ifdown ] ; then
  1264.         scripts/${SCRIPTNAME}-wireless $CONFIG $INTERFACE \
  1265.         ${OPTIONS:+-o $OPTIONS}
  1266.     fi
  1267.  
  1268.     # Frob vlan interface, part II
  1269.     if [ "$SCRIPTNAME" = ifdown -a "$INTERFACETYPE" = vlan ]; then
  1270.         scripts/${SCRIPTNAME}-802.1q $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1271.     fi
  1272.  
  1273.     # Frob bridge interface, part II
  1274.     if [ "$BRIDGE" = yes -a "$SCRIPTNAME" != ifup ]; then
  1275.         scripts/${SCRIPTNAME}-bridge $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1276.     fi
  1277.  
  1278. fi
  1279.     
  1280. if [ "$BOOTPROTO" != dhcp -o "$DHCP" = yes ] ; then
  1281.     if [    "$RUN_FROM_RC" != yes      \
  1282.          -a "$SCRIPTNAME"  != ifstatus \
  1283.          -a "$FIREWALL"     = yes      ]; then
  1284.         read NIX RL < <(runlevel)
  1285.         test -z "$RL" && RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`
  1286.         if ls /etc/init.d/rc${RL}.d/S*SuSEfirewall2_setup &>/dev/null; then
  1287.             /sbin/SuSEfirewall2 start
  1288.         fi
  1289.     fi
  1290. fi
  1291.  
  1292. ######################################################################
  1293. # call optional and individual scripts
  1294. #
  1295.  
  1296. if [ "$SCRIPTNAME" = ifup \
  1297.      -a \( "$BOOTPROTO" != dhcp -o "$DHCP" = yes \) ] ; then
  1298.  
  1299.     # start depending services
  1300.     scripts/${SCRIPTNAME}-services $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1301.  
  1302.     # execute global start scripts
  1303.     if [ "$GLOBAL_POST_UP_EXEC" = "yes" ]; then
  1304.         for SCRIPT in if-up.d/*; do
  1305.             [ -d $SCRIPT -o ! -x $SCRIPT ] && continue;
  1306.             # ignore backup files and leftovers from rpm
  1307.             echo $SCRIPT | grep -q '\(\.rpm\(save\|new\)$\)\|\(.~$\)' && continue;
  1308.             debug "executing additional global start script $SCRIPT"
  1309.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1310.         done
  1311.     fi
  1312.  
  1313.     # execute an individual poststart script if available
  1314.     # NOTE: 'eval echo' in the next line is necessary to expand settings
  1315.     # like POST_UP_SCRIPT="~root/bin/foo"
  1316.     for SCRIPT in `eval echo $POST_UP_SCRIPT scripts/$POST_UP_SCRIPT`; do
  1317.         if [ -x "$SCRIPT" -a ! -d "$SCRIPT" ] ; then
  1318.             debug "executing additional start script $SCRIPT"
  1319.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1320.         fi
  1321.     done
  1322.  
  1323. fi
  1324.  
  1325. # execute an individual poststop script if available
  1326. if [ "$SCRIPTNAME" = ifdown \
  1327.      -a \( "$BOOTPROTO" != dhcp -o "$DHCP" != yes \) ] ; then
  1328.     # NOTE: 'eval echo' in the next line is necessary to expand settings
  1329.     # like POST_DOWN_SCRIPT="~root/bin/foo"
  1330.     for SCRIPT in `eval echo $POST_DOWN_SCRIPT scripts/$POST_DOWN_SCRIPT`; do
  1331.         if [ -x "$SCRIPT" -a ! -d "$SCRIPT" ] ; then
  1332.             debug "executing additional stop script $SCRIPT"
  1333.             $SCRIPT $CONFIG $INTERFACE ${OPTIONS:+-o $OPTIONS}
  1334.         fi
  1335.     done
  1336. fi
  1337.  
  1338. # We have to respect the status of ifplugd for interfaces with
  1339. # STARTMODE=ifplugd. If ifplugd_retcode is set, then this value takes 
  1340. # priority over other reurn codes.
  1341. if [ -n "$ifplugd_retcode" -a "$ifplugd_retcode" != 99 ] ; then
  1342.     exithook $ifplugd_retcode
  1343. elif [ "$ifplugd_retcode" == 99 -a "$dhcpretcode" == $R_NOTRUNNING ] ; then
  1344.     message "`printf "    %-9s is probably not initialized completely" \
  1345.                      "$INTERFACE"`"
  1346.     exithook $R_DHCP_BG
  1347. elif [ "$dhcpretcode" != $R_SUCCESS ] ; then
  1348.     exithook $dhcpretcode
  1349. else
  1350.     if [ "$retcode" = 0 -a -n "$retcode_mtu" -a "$retcode_mtu" != 0 ] ; then
  1351.         exithook $R_PROPERTY_NOT_SET
  1352.     else
  1353.         exithook $retcode
  1354.     fi
  1355. fi
  1356.  
  1357.