Apple Enterprise - NeXTanswers Support Archive
Enterprise
[Index]
[Download]


Search NeXTanswers for:

 #! /bin/sh -u
#
# @(#)ni_connections $Revision: 1.2 $ $Date: 93/07/23 19:18:13 $
# $Author: amm $, $Locker:  $: $State: Rel1 $
# $Source: /Users/amm/ni_connections/RCS/ni_connections.sh,v $
#
# Update log at end of file
#
# ni_connections: show extant NetInfo connections
#
# Copyright 1993 by NeXT Computer, Inc.  All rights reserved.

PATH=/usr/bin:/bin:/usr/ucb:/usr/etc:/etc
readonly PATH

ECHO=echo
ERROR=$ECHO
WARNING=$ECHO
DEBUG=$ECHO
TRUE=true
FALSE=false
BASENAME=basename
RM=rm
CAT=cat
readonly ECHO ERROR WARNING DEBUG TRUE FALSE BASENAME RM CAT

AWK=awk
NIDOMAIN=nidomain
BM=bm
NETSTAT=netstat
SNMPNETSTAT=snmpnetstat
SORT=sort
HOSTNAME=hostname
SED=sed
readonly AWK NIDOMAIN BM NETSTAT SNMPNETSTAT SORT HOSTNAME SED

LOCALTAG="tag=local"
TEMP=/tmp/Bindings-$$
readonly LOCALTAG TEMP

# General return codes
E_OK=0
E_ShellError=1
E_BadSyntax=2
E_Intr=3
E_Quit=4
E_Term=5
readonly E_OK E_ShellError E_BadSyntax E_Intr E_Quit E_Term

E_NStat=6
readonly E_NStat

D_ArgV=localhost
D_SkipLocal=$TRUE
D_NumericInfo=$FALSE
D_NumericFlag=
readonly D_ArgV D_SkipLocal D_NumericInfo D_NumericFlag

cleanup=$TRUE

PGMNAME=`$BASENAME ${0} .sh`
USAGE=\
"Usage: ${PGMNAME} [-l] [-n] [host]
	Use ${PGMNAME} -help for details"
EXPLANATION="Arguments:
	-l	Show connections to the local domain
	-n	Use and show numeric addresses, instead of names
	host	Name of host whose connections should be checked

Defaults: $D_ArgV"
EXAMPLES="${PGMNAME}
${PGMNAME} -l rhino"
readonly PGMNAME USAGE EXPLANATION EXAMPLES

case ${1-NotHelp} in
-help | -HELP | -Help)	# User wants more info
    $ERROR 1>&2 "${USAGE}"
    # For proper formatting, ${EXPLANATION} *MUST* be double-quoted, below
    # If you remove the double-quotes, add '\n's to the end of each line
    # in the definition of EXPLANATION, above.
    $ERROR 1>&2 "${EXPLANATION}"
    $ERROR 1>&2 "Examples: ${EXAMPLES}"
    exit ${E_OK}
    ;;
esac

# Assume all will be well.
exitcode=$E_OK

# Signal handlers
# Normal termination handler; helps ensure clean exit
trap \
	"if \$cleanup; then
	    $RM -f $TEMP;
	 fi
	    exit \$exitcode" \
    0
# Handler for SIGHUP and SIGINT.  Print a message and clean up.
trap \
	"$ERROR 1>&2 'Interrupted; cleaning up.';
	    exitcode=$E_Intr; exit" \
    1 2
# Handler for SIGQUIT.  Leave the temp files for autopsy.
trap \
	"$ERROR 1>&2 'QUIT received; temp file $TEMP remains.';
	    cleanup = $FALSE;
	    exitcode=$E_Quit; exit" \
    3
# Handler for SIGTERM.  Clean up.
trap \
	"$ERROR 1>&2 'Terminated; cleaning up.';
	    exitcode=$E_Term; exit" \
    15

while [ $# -gt 0 ]; do
    case ${1} in
    -l ) # Show the local domain
	SkipLocal=$FALSE
	;;
    -n ) # Numeric information
	NumericInfo=$TRUE
	NumericFlag=-n
	;;
    -* ) # Unknown flag
	$ERROR 1>&2 "${PGMNAME}: unknown flag ${1}"
	$ERROR 1>&2 "${USAGE}"
	exitcode=${E_BadSyntax}; exit
	;;
    *)	# Arguments follow
	break
	;;
    esac
    shift
done

host=${@-$D_ArgV}
SkipLocal=${SkipLocal-$D_SkipLocal}
NumericInfo=${NumericInfo-$D_NumericInfo}
NumericFlag=${NumericFlag-$D_NumericFlag}

is_local=$FALSE

if [ "$host" != "localhost" ]; then
    for h in `$HOSTNAME`; do
	if [ "$h" = "$host" ]; then
	    is_local=$TRUE
	    break
	fi
    done
else
    is_local=$TRUE
fi

if $is_local; then
    NSTAT="$NETSTAT $NumericFlag"
    args=""
else
    NSTAT="$SNMPNETSTAT $NumericFlag"
    args=$host
fi

$NSTAT $args | $SORT +4 > $TEMP
status=$?
if [ 0 -ne $status ]; then
    $ERROR 1>&2 "Cannot get connection information; $NSTAT status $status"
    exitcode=$E_NStat
    exit $exitcode
fi

# $TEMP now has netstat sorted by remote port.  There's some garbage in
# there, though; e.g. (note that this has been sorted, and isn't in the
# order netstat prints it):
#
#Active Internet connections
#udp        0      0  localhost.ntp          *.*                   
#udp        0      0  nescorna.ntp           *.*                   
#Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
#
# We'll get rid of it by filtering in awk for tcp or udp and not *.*

for port in `$AWK \
	'/^[tu][cd]p/ && $5 !~ /\*\.\*/	{printf "%s.%s\n", $5, $1}' $TEMP`; do
    if $NumericInfo; then
        # port has REMOTEIP.PORTNUM.TYPE, e.g., 192.42.172.5.666.tcp
	# We want the IP Address in $1, the port in $2, and the type in $3
	set `$ECHO "$port" | $SED 's/^\(..*\)\.\(..*\)\.\(..*\)$/\1 \2 \3/'`
    else
	# port has REMOTEHOST.PORTNUM.TYPE, e.g., rhino.666.tcp
	# We want the hostname in $1, port in $2, and type in $3
    	set `$ECHO "$port" | $AWK -f. '{printf "%s %s %s", $1, $2, $3}'`
    fi
    line=`$NIDOMAIN -l $1 | $BM "$3=$2"`
    if [ -n "$line" ]; then
	case "$line" in
	${LOCALTAG}* ) # This line refers to the local domain
	    if $SkipLocal; then
		continue
	    fi
	    ;;
	esac
	$ECHO "$line" | $AWK '{print $1}' | \
	    $AWK -F= '{printf "connected to %s on ", $2}'
	$ECHO "$1 via $3 port $2"
    fi
done

exit $exitcode

# $Log:	ni_connections.sh,v $
# Revision 1.2  93/07/23  19:18:13  amm
# Modifications for numeric option, and for release with NSiF.
# 
# Revision 1.1  93/03/30  17:49:36  amm
# Initial revision
# 


OpenStep | Alliances | Training | Tech Support | Where to Buy