home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / lib / YaST2 / servers_non_y2 / ag_hostnames < prev    next >
Text File  |  2006-11-29  |  5KB  |  200 lines

  1. #!/bin/bash
  2.  
  3. # File:        ag_hostnames
  4. # Package:    Network configuration
  5. # Summary:    Agent for reading hostnames from local network
  6. # Authors:    Michal Svec, Martin Vidner
  7. #
  8. # $Id: ag_hostnames 17789 2004-06-11 12:13:04Z visnov $
  9. #
  10. # Agent for reading
  11. # - hostnames from local network
  12. # - hostnames of hosts that have a particular TCP port open
  13. # - hostnames of hosts that have a particular RPC service open
  14. # - hostnames of samba servers
  15. #
  16. # Note: hostnames are not sorted.
  17.  
  18. if [ x$1 = x-d ]; then
  19.     set -x
  20. else
  21.     exec 2>/dev/null
  22. fi
  23.  
  24. # We want to parse English output
  25. export LC_ALL=C
  26.  
  27. # this function is duplicated in ag_showexports and ag_hostnames
  28. # after $1 seconds, kill $2 and all its children
  29. # return $2's exit status
  30. function kill_after() {
  31.     local TIMEOUT=$1
  32.     local LONG_PID=$2
  33.  
  34.     {
  35.     sleep $TIMEOUT
  36.     LONG_CHILDREN_PIDS=`ps --ppid $LONG_PID --no-headers -o pid`
  37.     kill $LONG_PID $LONG_CHILDREN_PIDS
  38.     } &
  39.     SLEEP_PID=$!
  40.  
  41.     # now wait until the long command finishes or is killed
  42.     wait $LONG_PID
  43.     local RET=$?
  44.     # if it did not exit because of a signal,
  45.     # then the killer is useless and we will kill him instead
  46.     if [ $RET -lt 128 ]; then
  47.     kill $SLEEP_PID
  48.     fi
  49.     return $RET
  50. }
  51.  
  52. # RETVAL convention avoids passing return values as stdout
  53. # and thus spawning new processes
  54.  
  55. # uses RETVAL
  56. function ycp_item() {
  57.     RETVAL="\"$1\", "
  58. }
  59.  
  60. function lookup_ip() {
  61.     local ip=$1
  62.     if [ $BADLOOKUP != 4 ] ; then
  63. #    NAME=$(dig +short +tries=1 +time=1 -x $ip | sed -e 's/\.$//')
  64. #    NAME=$(dig +short -x $ip | sed -e 's/\.$//')
  65. #    NAME=$(host -W1 $ip | sed -n '/.*domain name pointer \(.*\)\.$/s//\1/p')
  66.     NAME="$(getent hosts "$ip" | sed -e 's/^[0-9. ]*//')"
  67.     [ -z "$NAME" ] && BADLOOKUP=$(expr $BADLOOKUP + 1)
  68.     NAME="${NAME:-$ip}"
  69.     else
  70.     NAME="$ip"
  71.     fi
  72.     RETVAL="$NAME"
  73. }
  74.  
  75. # uses RETVAL
  76. function broadcast_addr() {
  77.     # may be empty
  78.     local INTERFACE=$1
  79.     RETVAL=$(/sbin/ifconfig $INTERFACE | sed -n '/.*Bcast:\([0-9.]*\).*/s//\1/p' | head -n 1)
  80. }
  81.  
  82. # uses RETVAL
  83. function broadcast_ping() {
  84.     # wait long enough to gather as many hosts as possible, #40582
  85.     RETVAL=$(ping -b -w 10 "$BROADCAST" | sed -n '/.*from \([0-9.]\+\).*/s//\1/p'  | sort -u)
  86. }
  87.  
  88. # uses exit status
  89. # is_port_open $ADDR $PORT
  90. function is_port_open() {
  91.     /usr/bin/netcat -w 1 -z $1 $2
  92. }
  93.  
  94. # uses exit status
  95. # is_rpc_service_open_long $ADDR $SERVICE
  96. function is_rpc_service_open_long() {
  97.     #hack: not quoting $2 enables scanning for a particular version
  98.     /usr/sbin/rpcinfo -u "$1" $2 >/dev/null || \
  99.     /usr/sbin/rpcinfo -t "$1" $2 >/dev/null
  100. }
  101.  
  102. # uses exit status
  103. # is_rpc_service_open $ADDR $SERVICE
  104. # calls is_rpc_service_open but kills it if it takes too long
  105. function is_rpc_service_open() {
  106.     is_rpc_service_open_long "$1" "$2" &
  107.     kill_after 2 $!
  108. #    local RET=$?
  109. #    echo "result: $RET" >&2
  110. #    return $RET
  111. }
  112.  
  113. # hostnames [-p portnum|-r rpcservice] [interface]
  114. # echoes the output
  115. function hostnames() {
  116.     local PORT
  117.     local SERVICE
  118.     local INTERFACE
  119.     if [ x$1 = x-p ]; then
  120.     PORT=$2
  121.     shift 2
  122.     elif [ x$1 = x-r ]; then
  123.     SERVICE="$2"
  124.     shift 2
  125.     fi
  126.     INTERFACE=$1
  127.  
  128.     BADLOOKUP=0
  129.     if [ $IP_ONLY != 0 ]; then
  130.     BADLOOKUP=4
  131.     fi
  132.     broadcast_addr $INTERFACE; BROADCAST=$RETVAL
  133.     if [ "$BROADCAST" ] ; then
  134.     broadcast_ping; IPS=$RETVAL
  135.     ANSWER=
  136.     for IP in $IPS ; do
  137.         # filter out hosts that do not have the wanted service
  138.         if [ -n "$PORT" ]; then
  139.         is_port_open $IP $PORT || IP=""
  140.         elif [ -n "$SERVICE" ]; then
  141.         is_rpc_service_open $IP "$SERVICE" || IP=""
  142.         fi
  143.  
  144.         if [ -n "$IP" ] ; then
  145.         lookup_ip $IP; ycp_item $RETVAL; ANSWER="$ANSWER $RETVAL"
  146.         fi
  147.     done
  148.     echo '[' "$ANSWER" ']'
  149.     else
  150.     echo '[]'
  151.     fi
  152. }
  153.  
  154. while true ; do
  155.     IFS=
  156.     read COMMAND || exit
  157.     unset IFS
  158.     # strip leading backquote introduced by NI
  159.     COMMAND=${COMMAND#\`}
  160.  
  161.     IP_ONLY=0
  162.     case "$COMMAND" in
  163.     "result ("*)
  164.         exit
  165.         ;;
  166.     'Dir (.)')
  167.         echo '[ "rpc", "interface", "samba" ]'
  168.         ;;
  169.     'Read (.)')
  170.         hostnames
  171.         ;;
  172.     'Read (.,'*)
  173.         PORT=$(echo "$COMMAND" | sed 's/^Read (., *\(.*\))/\1/')
  174.         hostnames -p $PORT
  175.         ;;
  176.     'Read (.rpc,'*)
  177.         SERVICE=$(echo "$COMMAND" | sed 's/^Read (.rpc, *"\(.*\)")/\1/')
  178.         hostnames -r "$SERVICE"
  179.         ;;
  180.     'Read (.ip.rpc,'*)
  181.         SERVICE=$(echo "$COMMAND" | sed 's/^Read (.ip.rpc, *"\(.*\)")/\1/')
  182.         IP_ONLY=1
  183.         hostnames -r "$SERVICE"
  184.         ;;
  185.     'Read (.interface,'*)
  186.         INTERFACE=$(echo "$COMMAND" | sed 's/^Read (.interface, *"\(.*\)")/\1/')
  187.         hostnames $INTERFACE
  188.         ;;
  189.     'Read (.samba)')
  190.         echo -n [
  191.         nmblookup -M -T - | awk -F '[, \t]+' '/<01>/ { printf "\"%s\", ", $1; }'
  192.         echo ]
  193.         ;;
  194.     *)
  195.         echo nil
  196.     esac
  197. done
  198.  
  199. # EOF
  200.