home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / etc / sysconfig / network / scripts / ifplugd-selectif < prev    next >
Text File  |  2006-11-29  |  5KB  |  173 lines

  1. #!/bin/bash
  2. # $Id: ifplugd-selectif 1428 2006-02-24 13:49:55Z zoz $
  3. #
  4. # Priority based interface selector for ifplugd
  5. #
  6. # If there are multiple interfaces which should be used alternatively depending
  7. # on which one actually has a link beat, this script will select the right one,
  8. # set this up and all alternatives down. Interfaces are considered to be used
  9. # alternatively if they have IFPLUGD_PRIORITY > 0 in their ifcfg-*
  10. # configuration file. 
  11. #
  12. #
  13. # Copyright (c) 2004 SuSE Linux AG Nuernberg, Germany.
  14. # All rights reserved.
  15. #
  16. # This program is free software; you can redistribute it and/or modify it under
  17. # the terms of the GNU General Public License as published by the Free Software
  18. # Foundation; either version 2 of the License, or (at your option) any later
  19. # version.
  20. # This program is distributed in the hope that it will be useful, but WITHOUT
  21. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  22. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  23. # details.
  24. # You should have received a copy of the GNU General Public License along with
  25. # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  26. # Place, Suite 330, Boston, MA 02111-1307 USA
  27. #
  28. # Authors: Christian Zoz <zoz@suse.de>
  29.  
  30. cd /etc/sysconfig/network
  31. test -f ./config && . ./config
  32. . scripts/functions
  33.  
  34. # . scripts/extradebug
  35.  
  36. get_carrier() {
  37.     test "`cat /sys/class/net/${1}/carrier 2>/dev/null`" != 1 && sleep 1
  38.     cat /sys/class/net/${1}/carrier 2>/dev/null
  39. }
  40.  
  41. debug $0 $*
  42.  
  43. if [ -z "$1" ] || [ -z "$2" ] ; then
  44.     echo "Wrong arguments" > /dev/stderr
  45.     exit 1
  46. fi
  47.  
  48. INTERFACE=$1
  49. ACTION=$2
  50. INTERFACETYPE=$3 # may be empty
  51.  
  52. # Check all available interfaces if they have a ifplugd priority and collect
  53. # two ordered lists of interfaces with minor or major priority.
  54. unset MINOR MAJOR MINOR_A MAJOR_A
  55. PRIORITY=`get_ifplugd_priority $INTERFACE`
  56. if [ "$PRIORITY" -gt 0 ] ; then
  57.     for IF in `ls /sys/class/net`; do
  58.         test "$IF" = "$INTERFACE" && continue
  59.         IFPRIO=`get_ifplugd_priority $IF`
  60.         test "$IFPRIO" -eq 0 && continue
  61.         if [ "$IFPRIO" -lt "$PRIORITY" ] ; then
  62.             MINOR_A[$IFPRIO]="${MINOR_A[$IFPRIO]} $IF"
  63.         else
  64.             MAJOR_A[$IFPRIO]="${MAJOR_A[$IFPRIO]} $IF"
  65.         fi
  66.     done
  67.     MINOR=${MINOR_A[*]}
  68.     MAJOR=${MAJOR_A[*]}
  69. fi
  70.  
  71. # for a in INTERFACE ACTION MAJOR MINOR FOUND; do
  72. #      printf "%10s = %s\n" "$a" "${!a}"
  73. # done
  74.  
  75. case $ACTION in
  76.     up)
  77.         write_cached_config_data link yes $INTERFACE
  78.         commit_cached_config_data $INTERFACE
  79.         # if current interface has an ifplugd priority, then shut down
  80.         # all minor interfaces and set up this interface if no major
  81.         # interfaces are already connected
  82.         for IF in $MINOR; do
  83.             if is_connected $IF; then 
  84.                 echo ifdown $IF -o ifplugd
  85.                 ifdown $IF -o ifplugd
  86.             fi
  87.         done
  88.         for IF in $MAJOR; do
  89.             if is_connected $IF; then
  90.                 INTERFACE=""
  91.             fi
  92.         done
  93.         if [ -n "$INTERFACE" ] ; then
  94.             echo ifup $INTERFACE -o ifplugd
  95.             ifup $INTERFACE -o ifplugd
  96.             exit
  97.         fi
  98.         ;;
  99.     down)
  100.         write_cached_config_data link no $INTERFACE
  101.         commit_cached_config_data $INTERFACE
  102.         # if current interface has an ifplugd priority, then shut down
  103.         # current interface and if no major interface is actually
  104.         # connected then set up next minor interface, which actually
  105.         # has a link.
  106.         for IF in $MAJOR; do
  107.             if is_connected $IF; then
  108.                 MINOR=""
  109.             fi
  110.         done
  111.         echo ifdown $INTERFACE -o ifplugd
  112.         ifdown $INTERFACE -o ifplugd
  113.         for IF in `reverse $MINOR`; do
  114.             if has_link $IF; then
  115.                 echo ifup $IF -o ifplugd
  116.                 ifup $IF -o ifplugd
  117.                 # Set up only one interface. If ifup returns
  118.                 # without dhcp client looking for a lease in
  119.                 # background, we consider this as success,
  120.                 # because we know that it has a link.
  121.                 case $? in
  122.                     $R_SUCCESS|$R_DHCP_BG)
  123.                         break
  124.                         ;;
  125.                 esac
  126.             fi
  127.         done
  128.         ;;
  129.     should_be_up)
  130.         # Checks if an interface which is controlled by ifplugd should
  131.         # currently be up and running (==> this script returns 0)
  132.         case "`get_carrier $INTERFACE`" in
  133.             1)
  134.                 if [ "$INTERFACETYPE" == wlan ] ; then
  135.                     mesg "`printf "    %-9s is probably associated" "$INTERFACE"`" 
  136.                 else
  137.                     mesg "`printf "    %-9s cable is connected" "$INTERFACE"`" 
  138.                 fi
  139.                 ;;
  140.             0)
  141.                 if [ "$INTERFACETYPE" == wlan ] ; then
  142.                     mesg "`printf "    %-9s is assumed to be associated" \
  143.                                   "$INTERFACE"`" 
  144.                 else
  145.                     mesg "`printf "    %-9s no cable connected" "$INTERFACE"`" 
  146.                     exit 1
  147.                 fi
  148.                 ;;
  149.             *)
  150.                 if [ "$INTERFACETYPE" == wlan ] ; then
  151.                     mesg "`printf "    %-9s cannot determine association state" \
  152.                                   "$INTERFACE"`" 
  153.                 else
  154.                     mesg "`printf "    %-9s cannot determine cable connection state" \
  155.                                   "$INTERFACE"`" 
  156.                     exit 1
  157.                 fi
  158.                 ;;
  159.         esac
  160.         info_mesg "`printf "    %-9s has priority %s" "$INTERFACE" "$PRIORITY"`"
  161.         if [ $PRIORITY -gt 0 ] ; then
  162.             for IF in $MAJOR; do
  163.                 test "`get_carrier $IF`" == 1|| continue
  164.                 mesg "`printf "    %-9s has lesser priority than '%s'" \
  165.                               "$INTERFACE" "$IF"`"
  166.                 exit 1
  167.             done
  168.         fi
  169.         ;;
  170. esac
  171.         
  172. exit 0
  173.