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 / ifdown-connection < prev    next >
Text File  |  2006-11-29  |  7KB  |  232 lines

  1. #! /bin/bash
  2. # Copyright (c) 2002 SuSE Linux AG Nuernberg, Germany. All rights reserved.
  3. # This program is free software; you can redistribute it and/or modify it under
  4. # the terms of the GNU General Public License as published by the Free Software
  5. # Foundation; either version 2 of the License, or (at your option) any later
  6. # version.
  7. #
  8. # This program is distributed in the hope that it will be useful, but WITHOUT
  9. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  10. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  11. # details.
  12. #
  13. # You should have received a copy of the GNU General Public License along with
  14. # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15. # Place, Suite 330, Boston, MA 02111-1307 USA
  16. #
  17. # Author: Christian Zoz <zoz@suse.de>, 2002
  18. # $Id: ifdown-connection 1344 2006-01-13 15:12:41Z zoz $
  19. #
  20.  
  21. # TODO:
  22. # when closing first use -TERM (except if we just try with -0)
  23. # for ichecking improve output and remove output from getdests() and nfscheck()
  24.  
  25. usage () {
  26.     echo $@
  27.     echo "Usage: if{down,status}-connection [<config>] <hwdesc> [-o <options>]"
  28.     echo "  hwdesc may be the interface name or any valid description"
  29.     echo "  of the corresponding device, for details see ifup(8)."
  30.     echo "Options are: [on]boot : we are currently booting (or shutting down)"
  31.     echo "             hotplug  : we are handling a hotplug event"
  32.     echo "             force    : use -KILL instead of -TERM"
  33.     echo "             try      : don't kill any process"
  34.     echo "All other or wrong options are silently ignored."
  35.     exit $R_USAGE
  36. }
  37.  
  38. ######################################################################
  39. # change the working direcory and source some common files
  40. #
  41. R_INTERNAL=1      # internal error, e.g. no config or missing scripts
  42. cd /etc/sysconfig/network || exit $R_INTERNAL
  43. test -f ./config && . ./config
  44. test -f scripts/functions && . scripts/functions || exit $R_INTERNAL
  45.  
  46. ######################################################################
  47. # check arguments and how we are called (in case of links)
  48. #
  49. SCRIPTNAME=${0##*/}
  50. debug $*
  51. case "${SCRIPTNAME}" in
  52.     ifdown-*) ACTION=close ;;
  53.     ifstatus-*) ACTION=check ;;
  54.     *) usage
  55. esac
  56. INTERFACE=$1
  57. case "$INTERFACE" in ""|-h|*help*) usage; esac
  58. shift
  59. if [ -n "$1" -a "$1" != "-o" ] ; then
  60.     CONFIG=$INTERFACE
  61.     INTERFACE=$1
  62. fi
  63. shift
  64. test "$1" = "-o" && shift
  65. OPTIONS="$@"
  66. MODE=manual
  67. FIRST_SIGNAL=-15
  68. SECOND_SIGNAL=""
  69. while [ $# -gt 0 ]; do
  70.     case $1 in
  71.         boot|onboot) MODE=onboot ;;
  72.         hotplug)     MODE=hotplug ;;
  73.         try)         FIRST_SIGNAL=-0 ;;
  74.         force)       SECOND_SIGNAL=-9 ;;
  75.         quiet)       be_quiet_has_gone ;;
  76.         debug)       DEBUG=yes ;;
  77.         *)           debug "unknown option $1 ignored" ;;
  78.     esac
  79.     shift
  80. done
  81.  
  82. ######################################################################
  83. # get the interface and check if it is available or up
  84. # we do this just for fun, because there might be connections of already
  85. # unplugged devices which are neither available nor up
  86. #
  87. if ! is_iface_available ${INTERFACE%:*} ; then
  88.     debug "interface ${INTERFACE} is not available"
  89.     # exit $R_NODEV
  90. fi
  91. if ! is_iface_up ${INTERFACE%:*} ; then
  92.     debug "interface ${INTERFACE} is not up"
  93.     # exit $R_NOTRUNNING
  94. fi
  95.  
  96. ######################################################################
  97. # check presence of configuration file and source it
  98. #
  99. test -f ./ifcfg-$CONFIG && . ./ifcfg-$CONFIG
  100.  
  101. nfscheck() {
  102.     local DEVICE MTP TYPE OPTS REST
  103.     ALLMTP=""
  104.     while read DEVICE MTP TYPE OPTS REST; do
  105.         test "$TYPE" != nfs && continue
  106.         HOST=${DEVICE%:*}
  107.         for OPT in `IFS=,; echo $OPTS`; do
  108.             case $OPT in addr*) HOST_ADDR=${OPT#addr=};; esac
  109.         done
  110.         ifuser $INTERFACE $HOST_ADDR || continue
  111.         ALLMTP="$ALLMTP $MTP"
  112.         NFS_MESSAGE="$NFS_MESSAGE\n   $DEVICE on $MTP (using $INTERFACE)"
  113.     done < /etc/mtab
  114.     test -z "`echo $ALLMTP`" || return 1
  115. }
  116.  
  117. getdests() {
  118.     local PROTO RQ SQ LOCAL FOREIGN STATE REST FHOST FPORT LHOST LPORT N=0
  119.     TCP_PORTS=""
  120.     UDP_PORTS=""
  121.     while read PROTO RQ SQ LOCAL FOREIGN STATE REST; do
  122.         N=$((N+1)); test $N -le 2 && continue
  123.         FHOST=${FOREIGN%:*}
  124.         FPORT=${FOREIGN##*:}
  125.         ifuser $INTERFACE $FHOST || continue
  126.         if [ "$1" != "-a" -a "$2" != "-a" ] ; then
  127.             case "$STATE" in FIN_WAIT*|CLOSE_WAIT|TIME_WAIT|CLOSE) continue; esac
  128.             case "$FHOST" in 127.0.0*|0.0.0.0) continue; esac
  129.             case "$FPORT" in \*|53) continue; esac
  130.         fi
  131.         LHOST=${LOCAL%:*}
  132.         LPORT=${LOCAL##*:}
  133.         case "$PROTO" in
  134.             tcp)
  135.                 for p in $TCP_PORTS; do
  136.                     test "$p" = "$LPORT" && continue 2
  137.                 done
  138.                 TCP_PORTS="$TCP_PORTS $LPORT"
  139.                 ;;
  140.             udp)
  141.                 for p in $UDP_PORTS; do
  142.                     test "$p" = "$LPORT" && continue 2
  143.                 done
  144.                 UDP_PORTS="$UDP_PORTS $LPORT"
  145.                 ;;
  146.             *)
  147.                 OTHER_LINES="$OTHER_LINES $PROTO $RQ $SQ $LOCAL $FOREIGN $STATE $REST"
  148.                 ;;
  149.         esac
  150.     done < <(netstat -n -tuw)
  151. # Alte Codefragmente:
  152. #    LHIP=`echo $(sed -n -e 's/[[:space:]]*localhost.*$//p' /etc/hosts) \
  153. #            | sed 's/ /\\\\|/g'`
  154. #    DESTS=`netstat -ntuw | getdests`
  155. #    DESTS=`echo $DESTS | sort -u | grep -v "$LHIP"`
  156. #    /sbin/ifuser $INTERFACE $DESTS && exit 1
  157.     test -z "`echo $TCP_PORTS$UDP_PORTS`" || return 1
  158. }
  159.  
  160. case $ACTION in
  161.  
  162.     close)
  163.  
  164.         test "$CONNECTION_CLOSE_BEFORE_IFDOWN" != "yes" && exit $R_SUCCESS
  165.         test "$CONNECTION_SEND_KILL_SIGNAL" = "yes" \
  166.           -a "$FIRST_SIGNAL" = "-15" && SECOND_SIGNAL=-9
  167.         debug "Close all net connections"
  168.         getdests
  169.         # First send SIGTERM to all processes (or -0 if option try was set)
  170.         if test -n "${TCP_PORTS}" ; then
  171.             debug && fuser -auvn tcp ${TCP_PORTS}
  172.             fuser -n tcp $FIRST_SIGNAL -k ${TCP_PORTS}
  173.         fi
  174.         if test -n "${UDP_PORTS}" ; then
  175.             debug && fuser -auvn udp ${UDP_PORTS}
  176.             fuser -n udp $FIRST_SIGNAL -k ${UDP_PORTS}
  177.         fi
  178.         if [ "$CONNECTION_UMOUNT_NFS_BEFORE_IFDOWN" = "yes" ]; then
  179.             nfscheck
  180.             for MTP in $ALLMTP; do
  181.                 debug && fuser -auvm $MTP
  182.                 fuser $FIRST_SIGNAL -k -m $MTP
  183.                 umount -v $MTP
  184.             done
  185.         fi
  186.  
  187.         # If option force was set we will send SIGKILL to every process that is
  188.         # still active
  189.         if [ -n "$SECOND_SIGNAL" ] ; then
  190.             sleep 3
  191.             getdests
  192.             if test -n "${TCP_PORTS}" ; then
  193.                 debug && fuser -auvn tcp ${TCP_PORTS}
  194.                 fuser -n tcp $SECOND_SIGNAL -k ${TCP_PORTS}
  195.             fi
  196.             if test -n "${UDP_PORTS}" ; then
  197.                 debug && fuser -auvn udp ${UDP_PORTS}
  198.                 fuser -n udp $SECOND_SIGNAL -k ${UDP_PORTS}
  199.             fi
  200.             if [ "$CONNECTION_UMOUNT_NFS_BEFORE_IFDOWN" = "yes" ]; then
  201.                 nfscheck
  202.                 for MTP in $ALLMTP; do
  203.                     debug && fuser -auvm $MTP
  204.                     fuser $SECOND_SIGNAL -k -m $MTP
  205.                     umount -f -v $MTP
  206.                 done
  207.             fi
  208.         fi
  209.         ;;
  210.  
  211.     check)
  212.  
  213.         test "$CONNECTION_CHECK_BEFORE_IFDOWN" != yes \
  214.              -a "$CONNECTION_SHOW_WHEN_IFSTATUS" != yes && exit $R_SUCCESS
  215.         RETURN=$R_SUCCESS
  216.         if ! getdests; then
  217.             test "$CONNECTION_SHOW_WHEN_IFSTATUS" = yes &&
  218.                 message "There are open connections:" \
  219.                     "${TCP_PORTS:+`fuser -auvn tcp $TCP_PORTS`}" \
  220.                     "${UDP_PORTS:+\n`fuser -auvn udp $UDP_PORTS`}"
  221.             RETURN=$R_BUSY
  222.         fi
  223.         if ! nfscheck; then
  224.             test "$CONNECTION_SHOW_WHEN_IFSTATUS" = yes &&
  225.                 message "There are nfs mounts:$NFS_MESSAGE"
  226.             RETURN=$R_BUSY
  227.         fi
  228.         test "$CONNECTION_CHECK_BEFORE_IFDOWN" != yes && exit $R_SUCCESS
  229.         exit $RETURN
  230.         ;;
  231. esac
  232.