Home | History | Annotate | Download | only in ns-tools
      1 #!/bin/sh
      2 
      3 ################################################################################
      4 ##                                                                            ##
      5 ## Copyright (c) International Business Machines  Corp., 2005                 ##
      6 ##                                                                            ##
      7 ## This program is free software;  you can redistribute it and#or modify      ##
      8 ## it under the terms of the GNU General Public License as published by       ##
      9 ## the Free Software Foundation; either version 2 of the License, or          ##
     10 ## (at your option) any later version.                                        ##
     11 ##                                                                            ##
     12 ## This program is distributed in the hope that it will be useful, but        ##
     13 ## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
     14 ## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
     15 ## for more details.                                                          ##
     16 ##                                                                            ##
     17 ## You should have received a copy of the GNU General Public License          ##
     18 ## along with this program;  if not, write to the Free Software               ##
     19 ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
     20 ##                                                                            ##
     21 ##                                                                            ##
     22 ################################################################################
     23 #
     24 # File:
     25 #   find_portbundle
     26 #
     27 # Description:
     28 #   Find a bundle of consecutive ports
     29 #
     30 # Arguments:
     31 #   $1: tcp or udp
     32 #   $2: port which is the start point to check
     33 #   $3: quantity of the ports
     34 #
     35 # Returns:
     36 #   0: Success
     37 #   1: Fail
     38 #
     39 # Author:
     40 #   Mitsuru Chinen <mitch (at] jp.ibm.com>
     41 #
     42 # History:
     43 #   Oct 19 2005 - Created (Mitsuru Chinen)
     44 #
     45 #-----------------------------------------------------------------------
     46 #Uncomment line below for debug output.
     47 #trace_logic=${trace_logic:-"set -x"}
     48 $trace_logic
     49 
     50 # Make sure the value of LTPROOT
     51 LTPROOT=${LTPROOT:-`(cd ../../../../ ; pwd)`}
     52 export LTPROOT
     53 
     54 
     55 # Check argument
     56 if [ $# -ne 3 ] ; then
     57     echo "Usage: find_portbundle protocol start_port quantity_of_ports" >&2
     58     exit 1
     59 fi
     60 protocol=$1
     61 start_port=$2
     62 port_quantity=$3
     63 
     64 # Specify the option of the nestat command
     65 case $protocol in
     66     tcp)
     67     proto_opt="-t"
     68     ;;
     69     udp)
     70     proto_opt="-u"
     71     ;;
     72     *)
     73     echo "$protocol is not supported" >&2
     74     exit 1
     75     ;;
     76 esac
     77 
     78 # Create the open port list
     79 port_list=`mktemp`
     80 netstat -a -n ${proto_opt} \
     81     | tail -n +3 \
     82     | awk '{ print $4 }' \
     83     | sed 's/^.*://' \
     84     | sort -n \
     85     | uniq > ${port_list}
     86 
     87 # Search the available ports
     88 skip=1
     89 min_port=$start_port
     90 max_port=`expr $min_port + $port_quantity - 1`
     91 if [ ${max_port} -gt 65535 ]; then
     92     rm -f $port_list
     93     exit 1
     94 fi
     95 
     96 while read line ; do
     97     # Skip to the required port
     98     if [ $skip -eq 1 ]; then
     99 	if [ $line -lt $start_port ]; then
    100 	    continue
    101 	else
    102 	    skip=0
    103 	fi
    104     fi
    105 
    106     # If required quantity of the port isn't available, seach in the next range
    107     if [ $line -le $max_port ]; then
    108 	min_port=`expr $line + 1`
    109 	max_port=`expr $min_port + $port_quantity - 1`
    110 	if [ $max_port -gt 65535 ]; then
    111 	    rm -f $port_list
    112 	    exit 1
    113 	fi
    114 	continue
    115     fi
    116     break
    117 done < $port_list
    118 
    119 rm -f $port_list
    120 
    121 # Print the result. If required quantity is not 1, print in range expression
    122 if [ $min_port -eq $max_port ]; then
    123     echo "$min_port"
    124 else
    125     echo "$min_port-$max_port"
    126 fi
    127 
    128 exit 0
    129