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

  1. #! /bin/bash
  2. #
  3. # Copyright (c) 2002 SuSE Linux AG Nuernberg, Germany. All rights reserved.
  4. # This program is free software; you can redistribute it and/or modify it under
  5. # the terms of the GNU General Public License as published by the Free Software
  6. # Foundation; either version 2 of the License, or (at your option) any later
  7. # version.
  8. #
  9. # This program is distributed in the hope that it will be useful, but WITHOUT
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  12. # details.
  13. #
  14. # You should have received a copy of the GNU General Public License along with
  15. # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  16. # Place, Suite 330, Boston, MA 02111-1307 USA
  17. #
  18. # Author: Christian Zoz <zoz@suse.de>, 2002-2006
  19. #         Peter Poeml <poeml@suse.de>, 2002-2006
  20. #
  21. # $Id: ifup-dhcp 1525 2006-11-20 11:39:48Z zoz $
  22. #
  23.  
  24. usage () {
  25.     echo $@
  26.     echo "Usage: if{up,down,status}-dhcp [<config>] <hwdesc> [-o <options>]"
  27.     echo "  hwdesc may be the interface name or any valid description"
  28.     echo "  of the corresponding device, for details see ifup(8)."
  29.     echo "Options are: boot      : we are currently booting"
  30.     echo "             hotplug   : we are handling a hotplug event"
  31.     echo "             debug     : be verbose"
  32.     echo "             rc        : indicates that we are called from rcnetwork"
  33.     echo "All other or wrong options are silently ignored."
  34.     exit $R_USAGE
  35. }
  36.  
  37. dhcpc_on_iface() {
  38.     local i
  39.     for i in `my_pidof $DHCLIENT`; do
  40.         case $(cat /proc/$i/cmdline) in
  41.             *$INTERFACE*) return 0
  42.         esac
  43.     done
  44.     return 1
  45. }
  46.  
  47. ifup_on_iface() {
  48.     ps ax | grep -v grep | grep -qs "ifup.* $INTERFACE\>"
  49. }
  50.  
  51. ######################################################################
  52. # change the working direcory and source some common files
  53. #
  54. R_INTERNAL=1      # internal error, e.g. no config or missing scripts
  55. cd /etc/sysconfig/network || exit $R_INTERNAL
  56. test -f ./config && . ./config
  57. test -f scripts/functions && . scripts/functions || exit $R_INTERNAL
  58.  
  59. # . scripts/extradebug
  60.  
  61. ######################################################################
  62. # check arguments and how we are called (in case of links)
  63. #
  64. SCRIPTNAME=${0##*/}
  65. debug $*
  66.  
  67. case "${SCRIPTNAME}" in
  68.     ifup-*) ACTION=start ;;
  69.     ifdown-*) ACTION=stop ;;
  70.     ifstatus-*) ACTION=status ;;
  71.     ifrenew-*) ACTION=renew ;;
  72.     *) usage
  73. esac
  74.  
  75. INTERFACE=$1
  76. case "$INTERFACE" in ""|-h|*help*) usage; esac
  77. shift
  78. if [ -n "$1" -a "$1" != "-o" ] ; then
  79.     CONFIG=$INTERFACE
  80.     INTERFACE=$1
  81. fi
  82. shift
  83. test "$1" = "-o" && shift
  84. OPTIONS="$@"
  85. MODE=manual
  86. while [ $# -gt 0 ]; do
  87.     case $1 in
  88.         boot|onboot) MODE=onboot ;;
  89.         hotplug)     MODE=hotplug ;;
  90.         quiet)       be_quiet_has_gone ;;
  91.         debug)       DEBUG=yes ;;
  92.         rc)          RUN_FROM_RC=yes ;;
  93.         *)           debug unknown option $1 ;;
  94.     esac
  95.     shift
  96. done
  97.  
  98. ######################################################################
  99. # check presence of configuration files
  100. #
  101. test -f ./dhcp && . ./dhcp
  102. test -f ./ifcfg-$CONFIG && . ./ifcfg-$CONFIG
  103.  
  104. ######################################################################
  105. # get the interface and check if it is up
  106. #
  107. if [ -z "$INTERFACE" ] ; then
  108.     usage "No interface given"
  109. fi
  110. if ! is_iface_available $INTERFACE ; then
  111.     # When a hotplug remove event occurs the interface has already gone.
  112.     # Nevertheless we have to clean up.
  113.     if [ \( "$ACTION" != stop -o "$MODE" != hotplug \) -a "$INTERFACE" != all ] ; then
  114.         logerror "interface ${INTERFACE} is not available"
  115.         exit $R_NODEV
  116.     fi
  117. fi
  118.  
  119. ######################################################################
  120. # determine type of dhcp client
  121. #
  122. # This script is supposed to work with both dhcpcd and the ISC DHCP client,
  123. # because there's a lot of common stuff.
  124. # If neccesary you can preselect a dhcp client; just set DHCLIENT_BIN in one of
  125. # the used config files. If not we prefer dhcpcd if available.
  126. : ${DHCLIENT_BIN:=dhcpcd}
  127. if [ -x $DHCLIENT_BIN ]; then 
  128.     :
  129. elif [ -x /sbin/$DHCLIENT_BIN ]; then 
  130.     DHCLIENT_BIN=/sbin/$DHCLIENT_BIN; 
  131. elif [ -x /sbin/dhclient ]; then
  132.     DHCLIENT_BIN=/sbin/dhclient
  133. else
  134.     if [ "$INTERFACE" = all ]; then 
  135.         # 'rcnetwork stop' also calls us with "ifdown-dhcp all" in the end to make
  136.         # sure that all DHCP clients are stopped.  But if there is none installed,
  137.         # there is nothing to do and we can silently quit
  138.         exit $R_SUCCESS
  139.     else
  140.         logerror "DHCP client $DHCLIENT_BIN is not available"
  141.         logerror "please install package 'dhcpcd' or 'dhcp-client'"
  142.         exit $R_ERROR
  143.     fi
  144. fi
  145. DHCLIENT=${DHCLIENT_BIN##*/}
  146.  
  147.  
  148. case "$ACTION" in
  149.     start|renew)
  150.         # avoid that the temporary resolv.conf will persist after the client stops
  151.         # just because there hasn't been any resolv.conf to back up
  152.         test -e /etc/resolv.conf || touch /etc/resolv.conf
  153.  
  154.         # if we were called at boot time, increase the time startproc waits,
  155.         # because the next scripts might rely on a configured network
  156.         # test "$MODE" = "boot" && STARTPROC_TIMEOUT=5
  157.  
  158.         # a previous dhcpcd daemon could have been killed leaving its pidfile, 
  159.         # and we need to remove it before we can start a new one.
  160.         if [ $DHCLIENT = dhcpcd ]; then 
  161.             if [ -s /var/run/dhcpcd-$INTERFACE.pid ]; then
  162.                 checkproc -k -p /var/run/dhcpcd-$INTERFACE.pid $DHCLIENT_BIN
  163.                 ret=$? 
  164.                 if [ $ret = 1 -o $ret = 7 ]; then 
  165.                     message removing stale pid file /var/run/dhcpcd-$INTERFACE.pid
  166.                     rm -f /var/run/dhcpcd-$INTERFACE.pid
  167.                 fi
  168.             fi
  169.         fi
  170.  
  171.         # the following code block, is only relevant if DHCLIENT_PRIMARY_DEVICE is
  172.         # empty. it basically sets DHCLIENT_PRIMARY_DEVICE based on the informationen 
  173.         # that is provided by the cached config data in a way that a user-defined  
  174.         # DHCLIENT_PRIMARY_DEVICE remains untouched.
  175.  
  176.         if [ -z "$DHCLIENT_PRIMARY_DEVICE" ]; then
  177.  
  178.             # read cached config data into PRIMARY_FROM_CACHE
  179.             PRIMARY_FROM_CACHE="`grep_cached_config_data primary yes`"
  180.  
  181.             if [ -z "$PRIMARY_FROM_CACHE" ]; then
  182.                 # no primary interface up-> we're the primary interface
  183.                 DHCLIENT_PRIMARY_DEVICE='yes'
  184.  
  185.                  # save this fact to cached config data        
  186.                 write_cached_config_data primary yes $INTERFACE
  187.                 commit_cached_config_data $INTERFACE
  188.             else
  189.                 # primary interface already up -> DHCLIENT_PRIMARY_DEVICE='no'
  190.                 if [ "${PRIMARY_FROM_CACHE% }" == $INTERFACE ]; then
  191.                     # special case for ifrenew:
  192.                     # we are the primary interface which is up 
  193.                     DHCLIENT_PRIMARY_DEVICE='yes'
  194.                 else
  195.                     DHCLIENT_PRIMARY_DEVICE='no'
  196.                 fi
  197.             fi
  198.  
  199.         fi        
  200.  
  201.         if [ "$ACTION" = 'start' ] \
  202.             && ( checkproc $DHCLIENT_BIN || [ "$DHCLIENT_PRIMARY_DEVICE" = no ]); then
  203.             
  204.             # let's first test if the running dhcpcd actually runs on this
  205.             # interface, because then we don't want to start another one:
  206.             already_running=false
  207.             for i in `my_pidof $DHCLIENT`; do
  208.                 case $(cat /proc/$i/cmdline) in
  209.                     *$INTERFACE*) already_running=true;;
  210.                 esac
  211.             done
  212.             if $already_running; then
  213.                 if test "$RUN_FROM_RC" = yes; then
  214.                     while read a b c d e f g h i; do
  215.                         message "`printf "    %-9s IP address: %s (DHCP was already running)" $i $d`"
  216.                         R_DHCP_BG=$R_SUCCESS
  217.                     done < <(ip -o -4 addr show $INTERFACE)
  218.                     if [ "$R_DHCP_BG" != "$R_SUCCESS" ] ; then
  219.                         message "`printf "    %-9s DHCP already running" $INTERFACE`"
  220.                     fi
  221.                 else
  222.                     message    "DHCP client is already running on $INTERFACE"
  223.                 fi
  224.                 exit $R_DHCP_BG
  225.             fi
  226.  
  227.         elif [ "$ACTION" = 'renew' ]; then
  228.             case $DHCLIENT in 
  229.             dhcpcd) 
  230.                 for i in `my_pidof $DHCLIENT`; do
  231.                     case $(cat /proc/$i/cmdline) in
  232.                         *$INTERFACE*) dhcpcd_on_device="$dhcpcd_on_device $i"
  233.                     esac
  234.                 done
  235.                 for i in $dhcpcd_on_device; do
  236.                     kill -TERM $i &>/dev/null
  237.                 done
  238.                 sleep 1
  239.                 ;;
  240.             dhclient)
  241.                 killproc $DHCLIENT_BIN &>/dev/null 
  242.                 ;;
  243.             esac
  244.         fi
  245.  
  246.         # there is already a dhcpcd running (or scheduled). We probably don't
  247.         # want to set another default gateway and so on. Let's clear some
  248.         # variables and source the ifcfg-$CONFIG again -- unless
  249.         # DHCLIENT_PRIMARY_DEVICE is set to "yes".
  250.  
  251.         if [ "$DHCLIENT_PRIMARY_DEVICE" != yes ]; then 
  252.  
  253.             unset DHCLIENT_SET_HOSTNAME \
  254.                     DHCLIENT_SET_DOMAINNAME \
  255.                     DHCLIENT_KEEP_SEARCHLIST \
  256.                     DHCLIENT_MODIFY_RESOLV_CONF \
  257.                     DHCLIENT_SET_DEFAULT_ROUTE \
  258.                     DHCLIENT_MODIFY_NTP_CONF \
  259.                     DHCLIENT_MODIFY_NIS_CONF 
  260.  
  261.             test -f ./ifcfg-$CONFIG && . ./ifcfg-$CONFIG
  262.         fi
  263.     
  264.         debug "Starting service dhcp client on $INTERFACE"
  265.         ip link set $INTERFACE up ${MTU:+mtu $MTU} \
  266.                                   ${LLADDR:+address $LLADDR} $LINK_OPTIONS
  267.         for a in 1 2 3 4 5; do is_iface_up $INTERFACE && break; sleep 1; done
  268.  
  269.         # (optionally) wait until a device is really configured
  270.         sleep ${DHCLIENT_SLEEP:-0}
  271.  
  272.         if [ "$DHCLIENT" = "dhcpcd" ] ; then 
  273.             # The following DHCLIENT_ARGS are specific to dhcpcd. 
  274.             # (the ISC DHCP client can be finetuned via /etc/dhclient.conf 
  275.             # and so-called hooks (see man 8 dhclient-script)
  276.             test "$DHCLIENT_DEBUG"               = "yes" && args="-d"
  277.             test "$DHCLIENT_UDP_CHECKSUM"        = "yes" && args="$args -C"
  278.             test "$DHCLIENT_SET_HOSTNAME"        = "yes" && args="$args -H"
  279.             test "$DHCLIENT_SET_DOMAINNAME"      = "yes" && args="$args -D"
  280.             test "$DHCLIENT_KEEP_SEARCHLIST"     = "yes" && args="$args -K"
  281.             test "$DHCLIENT_MODIFY_RESOLV_CONF" != "yes" && args="$args -R"
  282.             test "$DHCLIENT_SET_DEFAULT_ROUTE"  != "yes" && args="$args -G"
  283.             test "$DHCLIENT_MODIFY_NTP_CONF"    != "yes" && args="$args -N"
  284.             test "$DHCLIENT_MODIFY_NIS_CONF"    != "yes" && args="$args -Y"
  285.             test -n "$DHCLIENT_TIMEOUT" \
  286.                 && args="$args -t $DHCLIENT_TIMEOUT"
  287.             test -n "$DHCLIENT_REBOOT_TIMEOUT" \
  288.                 && args="$args -z $DHCLIENT_REBOOT_TIMEOUT"
  289.             test -n "$DHCLIENT_CLIENT_ID" \
  290.                 && args="$args -I $DHCLIENT_CLIENT_ID"
  291.             test -n "$DHCLIENT_VENDOR_CLASS_ID" \
  292.                 && args="$args -i $DHCLIENT_VENDOR_CLASS_ID"
  293.             test -n "$DHCLIENT_LEASE_TIME" \
  294.                 && args="$args -l $DHCLIENT_LEASE_TIME"
  295.             test -n "$DHCLIENT_ADDITIONAL_OPTIONS" \
  296.                 && args="$args $DHCLIENT_ADDITIONAL_OPTIONS"
  297.  
  298.             # send hostname for DDNS?
  299.             case "$DHCLIENT_HOSTNAME_OPTION" in AUTO|auto)
  300.                 unset DHCLIENT_HOSTNAME_OPTION
  301.                 test -s /etc/HOSTNAME && read -t 1 FQHOSTNAME < /etc/HOSTNAME
  302.                 FQHOSTNAME=${FQHOSTNAME%%.*} # strip domain
  303.                 FQHOSTNAME=${FQHOSTNAME%% *} # must not contain spaces, just in case
  304.                 DHCLIENT_HOSTNAME_OPTION=$FQHOSTNAME
  305.                 ;;
  306.             esac
  307.             test -n "$DHCLIENT_HOSTNAME_OPTION" \
  308.                 && args="$args -h $DHCLIENT_HOSTNAME_OPTION"
  309.  
  310.             # this used to be hardcoded in the dhcpcd binary, but we have reverted it in order 
  311.             # to allow innocent commandline users to use dhcpcd without calling the 
  312.             # dhcpcd-hook/ifup machinery [#85849]
  313.             args="$args -c ${DHCLIENT_SCRIPT_EXE:-/etc/sysconfig/network/scripts/dhcpcd-hook}"
  314.  
  315.             DHCLIENT_ARGS=$args
  316.  
  317.             # just in case /var is not mounted
  318.             test -d /var/lib/dhcpcd || mkdir -p /var/lib/dhcpcd
  319.             timestamp=/var/lib/dhcpcd/dhcpcd-$INTERFACE.timestamp; touch $timestamp
  320.             info=/var/lib/dhcpcd/dhcpcd-$INTERFACE.info
  321.  
  322.             if test "$RUN_FROM_RC" = yes; then 
  323.                 message_n "`printf "    %-9s (DHCP) " $INTERFACE`"
  324.                 # message_n "(DHCP) " 
  325.             else
  326.                 message_n "Starting DHCP Client Daemon on $INTERFACE... "
  327.             fi
  328.  
  329.             # now start dhcpcd
  330.             $DHCLIENT_BIN $DHCLIENT_ARGS $INTERFACE </dev/null &>/dev/null &
  331.  
  332.             # wait some more time until dhcpcd has done its job.
  333.             # it would be easier to wait for the pidfile, but it is written later
  334.             for ((i=0; i<${DHCLIENT_WAIT_AT_BOOT:-15}; i++)); do 
  335.                 if [ -e $info -a ! $info -ot $timestamp ]; then continue
  336.                 else message_n .\ ; sleep 1
  337.                 fi
  338.             done
  339.             if [ -e $info -a ! $info -ot $timestamp ]; then 
  340.                 while read line; do
  341.                     case "$line" in 
  342.                         IPADDR*) message_n ${line/IPADDR=/IP/Netmask: };; 
  343.                         NETMASK*) message_n " / ${line/NETMASK=/}";; 
  344.                         HOSTNAME*) message_n " (${line/HOSTNAME=/})";; 
  345.                     esac
  346.                 done < $info
  347.                 message " "
  348.                 R_DHCP_BG=$R_SUCCESS
  349.             else
  350.                 message "no IP address yet... backgrounding. "
  351.             fi
  352.             exit $R_DHCP_BG
  353.  
  354.  
  355.         else
  356.             # if we are here, then $DHCLIENT is the ISC dhclient
  357.  
  358.             # don't write copyright info
  359.             DHCLIENT_ARGS="-q" 
  360.             # If ISC dhclient should be used for more than one interfaces, we have
  361.             # to stop it and restart it with all interfaces when adding an
  362.             # interface.  !!! Currently, we do not provide that.
  363.             if checkproc $DHCLIENT_BIN; then
  364.                 logerror "$DHCLIENT is already running for some interface." \
  365.                          "Stop it first.\nIf you want to run dhcp on several " \
  366.                          "interfaces, please use dhcpcd."
  367.             else
  368.                 startproc -f -t ${STARTPROC_TIMEOUT:-1} -q $DHCLIENT_BIN \
  369.                           $DHCLIENT_ARGS $INTERFACE
  370.             fi
  371.         fi
  372.  
  373.         ;;
  374.     stop)
  375.         debug "Shutting down service dhcp client on $INTERFACE"
  376.  
  377.         case $DHCLIENT in 
  378.         dhcpcd) 
  379.             # let's first test if any dhcpcd processes are running on this
  380.             # interface.  Unfortunately, the pid file is not there when it starts
  381.             # up, so we can't rely on that.  Normally, only one process is running
  382.             # per interface. but we have made bad experiences with ...hotplug 
  383.             for i in `my_pidof $DHCLIENT`; do
  384.                 case $(cat /proc/$i/cmdline) in
  385.                     *$INTERFACE*) dhcpcd_on_device="$dhcpcd_on_device $i"
  386.                 esac
  387.             done
  388.  
  389.             test "$DHCLIENT_RELEASE_BEFORE_QUIT" = "yes" \
  390.               && USE_SIGNAL="-HUP" || USE_SIGNAL="-TERM"
  391.  
  392.             for i in $dhcpcd_on_device; do
  393.                 kill $USE_SIGNAL $i &>/dev/null
  394.             done
  395.  
  396.                         # wait until the processes are gone
  397.             for i in $dhcpcd_on_device; do
  398.                 for ((wait=0; wait<30; wait++)); do
  399.                     if test -d /proc/$i; then usleep 300000
  400.                     else continue 2
  401.                     fi
  402.                     if [ $wait = 20 ]; then
  403.                         echo process $i still not dead, sending SIGKILL
  404.                         kill -KILL $i &>/dev/null
  405.                     fi
  406.                 done
  407.             done
  408.  
  409.             if [ -z "$dhcpcd_on_device" ]; then 
  410.                 # dhcpcd may not be running (it quits if it gets an 
  411.                 # infinite lease)
  412.                 info=/var/lib/dhcpcd/dhcpcd-$INTERFACE.info
  413.                 if test -s $info && grep -q LEASETIME=4294967295 $info; then
  414.                     debug "dhcpcd is no longer running on $INTERFACE, since it got"
  415.                     debug "an infinite lease. Manually shutting down the interface."
  416.                     ip addr flush dev $INTERFACE &>/dev/null
  417.                     ip link set dev $INTERFACE down &>/dev/null
  418.                 fi
  419.             fi
  420.  
  421.             ;;
  422.  
  423.         dhclient)
  424.  
  425.             # If ISC dhclient is used for more than one interfaces, we have to stop
  426.             # it and restart it without this interface when removing one interface,
  427.             # or we have to use the OMAPI interface
  428.             # !!! Currently, we do not provide that.
  429.             killproc $DHCLIENT_BIN &>/dev/null 
  430.             ;;
  431.         esac
  432.  
  433.         # We send -9 because interfaces have to stay up for STARTMODE==nfsroot
  434.         test "$INTERFACE" = all && killall -9 $DHCLIENT_BIN &>/dev/null
  435.  
  436.         # delete primary flag from cache file
  437.         delete_from_cached_config_data primary yes $INTERFACE
  438.         commit_cached_config_data $INTERFACE
  439.  
  440.         # This is useful for pcmcia interfaces... before the modules can be
  441.         # unloaded, the device must be unused.
  442.         if [ "$DHCLIENT_SET_DOWN_LINK" = yes ] ; then
  443.             ip link set down dev $INTERFACE
  444.         fi
  445.         ;;
  446.     status)
  447.         if test -z "`ip -o -f inet addr show $INTERFACE`"; then
  448.             # interface has currently no ipv4 address assigned
  449.             if dhcpc_on_iface ; then
  450.                 message "`printf "    %-9s %s is still waiting for data" $INTERFACE $DHCLIENT`"
  451.                 exit $R_DHCP_BG
  452.             elif ifup_on_iface ; then
  453.                 message "`printf "    %-9s is just beeing set up" $INTERFACE`"
  454.                 exit $R_DHCP_BG
  455.             else
  456.                 message "`printf "    %-9s DHCP client NOT running" $INTERFACE`"
  457.                 exit $R_NOTRUNNING
  458.             fi
  459.         else 
  460.             # interface has at least one ipv4 address
  461.             if dhcpc_on_iface ; then
  462.                 message "`printf "    %-9s DHCP client (%s) is running" $INTERFACE $DHCLIENT`"
  463.                 # Show more info if not run from initscript
  464.                 if [ "$RUN_FROM_RC" != yes ] ; then
  465.                     case $DHCLIENT in 
  466.                         dhcpcd)
  467.                             if test -e /var/lib/dhcpcd/dhcpcd-$INTERFACE.info; then
  468.                                 # message "              current lease for $INTERFACE:" 
  469.                                 while read line; do
  470.                                     case "$line" in 
  471.                                         IPADDR*|NETMASK*|GATEWAY*|HOSTNAME*|DOMAIN*)
  472.                                             message "              "$line ;;
  473.                                         DNS*|DHCPCHADDR*|DHCPSIADDR*|REBINDTIME*)
  474.                                             message "              "$line ;;
  475.                                         *) ;;
  476.                                     esac
  477.                                 done < /var/lib/dhcpcd/dhcpcd-$INTERFACE.info
  478.                             else 
  479.                                 message /var/lib/dhcpcd/dhcpcd-$INTERFACE.info file \
  480.                                         not available
  481.                             fi
  482.                             ;;
  483.                         dhclient)
  484.                             if test -e /var/lib/dhcp/dhclient.leases; then 
  485.                                 message last lease in /var/lib/dhcp/dhclient.leases:
  486.                                 awk 'BEGIN {RS="lease[[:blank:]]*{"; FS="}"} {lease=$1} END {print "{" lease "} "}' \
  487.                                     /var/lib/dhcp/dhclient.leases
  488.                             else
  489.                                 message /var/lib/dhcp/dhclient.leases file not available
  490.                             fi
  491.                             ;;
  492.                     esac
  493.                 fi
  494.             elif ifup_on_iface ; then
  495.                 message "`printf "    %-9s is just beeing set up" $INTERFACE`"
  496.                 exit $R_DHCP_BG
  497.             else
  498.                 message "`printf "    %-9s DHCP client NOT running" $INTERFACE`"
  499.                 if [ "$RUN_FROM_RC" = yes ] ; then
  500.                     while read a b c d e f g h i; do
  501.                         message "`printf "    %-9s IP address: %s (DHCP)" ${i:-$b} $d`"
  502.                     done < <(ip -o -4 addr show $INTERFACE)
  503.                 else
  504.                     message "$(ip addr show $INTERFACE)"
  505.                 fi
  506.                 exit $R_NOTRUNNING
  507.             fi
  508.  
  509.  
  510.         fi
  511. esac
  512.