#!/bin/sh # # run-ping - script to generate ICSI's WWW BAGNet ping pages. # # written by Wieland Holfelder (whd@icsi.berkeley.edu) 12/08/94 # # changes by Bernd Lamparter (lamparter@icsi.berkeley.edu) 5/12/94 # # This script needs the BAGNet host file from # ftp://matmos.hpl.hp.com/pub/bagnet/hosts # and the ping URL file available from # http://www.icsi.berkeley.edu/BAGNet/bagnet.urls # # And now the whole thing again, but with the help of cron # # The script is started from one of the hosts on all the others. # Makes it much simpler compared to the at command # # Use absolute Paths PATH=""; export PATH ARP=/usr/sbin/arp AT=/usr/bin/at ATQ=/usr/bin/atq AWK=/usr/bin/awk BASENAME=/usr/bin/basename CAT=/usr/bin/cat CP=/usr/bin/cp DATE=/usr/bin/date ECHO=/usr/ucb/echo EXPR=/usr/ucb/expr GREP=/usr/bin/grep NETSTAT=/usr/ucb/netstat IFCONFIG=/usr/sbin/ifconfig MAIL=/usr/ucb/mail PING=/usr/sbin/ping PRINTF=/bin/printf RM=/usr/bin/rm RSH=/usr/bin/rsh SED=/usr/ucb/sed TEST=/usr/ucb/test UNAME=/usr/bin/uname WC=/usr/ucb/wc SORT=/usr/bin/sort # Preamble NUMBER=$1 ATM_IF=$2 IP=$3 WORKDIR=$4 ICSIBAG=icsibag$NUMBER HOST=`/usr/ucb/hostname` NETADDR=192.6.28 # BAGNET network address TIMEOUT=1 # specified in seconds NB_OF_PACKETS=10 PACKET_SIZE=1024 MAIL_TO=bag-matrix@atg.apple.com IP_MULTICAST1=224.0.0.1 IP_MULTICAST2=224.2.175.194 NUMBER_MC_PINGS=60 PPATH=/n/smorgasbord/export/http/htdocs/BAGNet HOSTS_FILE=${PPATH}/bagnet.hosts URL_FILE=${PPATH}/bagnet.urls LOG_FILE=${PPATH}/$ICSIBAG.log STAT_FILE=${PPATH}/$ICSIBAG.stat MAIL_FILE=${PPATH}/$ICSIBAG.mail MAX_FILE=${PPATH}/$ICSIBAG.max TMP_PING_FILE=${PPATH}/$ICSIBAG-ping.tmp HTML_PING_FILE=${PPATH}/$ICSIBAG-ping.html TMP_NEVER_FILE=${PPATH}/$ICSIBAG-never.tmp HTML_NEVER_FILE=${PPATH}/$ICSIBAG-never.html MULTICAST_FILE=${PPATH}/$ICSIBAG-multicast.html MULTICAST_MAX_FILE=${PPATH}/$ICSIBAG-multicastmax.html if $TEST ! -f $HOSTS_FILE then $ECHO This script needs the BAGNet host file from $ECHO ftp://matmos.hpl.hp.com/pub/bagnet/hosts exit 1 fi if $TEST ! -f $URL_FILE then $ECHO This script needs the ping URL file from $ECHO http://www.icsi.berkeley.edu/BAGNet/bagnet.url exit 1 fi if $IFCONFIG $ATM_IF then $ECHO ATM interface on $ICSIBAG OK else $ECHO The ATM interface on $ICSIBAG is down! exit 1 fi if $TEST ! -d $PPATH then $ECHO "Yikes! $PPATH missing" exit 1 fi # if the statistics file is not there, start new statistics if $TEST -f $STAT_FILE then STAT_TIME=`$CAT $STAT_FILE` else $RM -f $LOG_FILE $RM -f $MAX_FILE STAT_TIME=`$DATE` $ECHO $STAT_TIME > $STAT_FILE fi # write the header for the ping file $RM -f $TMP_PING_FILE $CAT << EndOfText >> $TMP_PING_FILE BAGNet as seen from ICSI

BAGNet as seen from ICSI


The information current as of `$DATE`. It is updated once an hour. Ping times are an average for $NB_OF_PACKETS ICMP packets with $PACKET_SIZE bytes of data. The statistics were started at $STAT_TIME.

BAGNet as seen from icsibag${NUMBER}.icsi.berkeley.edu ($IP):

EndOfText

# write the header for the never file
$RM -f $TMP_NEVER_FILE
$CAT << EndOfText >> $TMP_NEVER_FILE
BAGNet hosts never seen from ICSI

BAGNet hosts never seen from ICSI


The information current as of `$DATE`. It is updated once an hour. The statistics were started at $STAT_TIME.

BAGNet hosts never seen from icsibag${NUMBER}.ICSI.Berkeley.EDU ($IP):

EndOfText

# Remove old mail file
$RM -f $MAIL_FILE


# Now do the pinging
( NB_OF_HOSTS=0
  while read IP_ADDR H_NAME rubbish
do
	if $TEST X$IP_ADDR != "X#" -a "X$IP_ADDR" != "X"
	then 
	  # get url from url file:
	  PINGURL=`$GREP -w "$IP_ADDR" $URL_FILE | $AWK '{print $2}'`

	  LENGTH=26
	  NAME=$H_NAME
	  if $TEST -n "$PINGURL" 
	  then
	    URLLENGTH=`$ECHO $PINGURL | $AWK '{ print length($1) }'`
	    URLLENGTH=`$EXPR $URLLENGTH + 15`
	    NAME=''$H_NAME''
	    LENGTH=`$EXPR $LENGTH + $URLLENGTH`
	  fi

	  # get lastseen info
	  $TEST -f $LOG_FILE && LASTSEEN=`$GREP -w $IP_ADDR $LOG_FILE`

	  # try to reach the host
  	  if $PING $IP_ADDR $TIMEOUT >/dev/null 
	  then
	    NB_OF_HOSTS=`$EXPR $NB_OF_HOSTS + 1`
	    $ECHO $IP_ADDR is alive >> $MAIL_FILE
	    # get ping avg.
	    TIME=`$PING -s -n $IP_ADDR $PACKET_SIZE $NB_OF_PACKETS \
		| $SED 's/=/ /g' \
		| $AWK '{ if ( $2 == "bytes" ) {sum+=$8; cnt++;};
			} END { if (cnt!=0) {print sum/cnt;} 
				else { print 0; } }'`
	    $ECHO "  `$PRINTF \"%-${LENGTH}.${LENGTH}s\" \"$NAME\"` `$PRINTF \"%-14.14s\" \"($IP_ADDR)\"` `$PRINTF \" ping time: %3.2f ms.\" $TIME`">> $TMP_PING_FILE
	    DT=`$DATE +"%D %T"` 
	    if $TEST -n "$LASTSEEN"
	    then
	      $RM -f ${LOG_FILE}.tmp
	      $SED "s=$LASTSEEN=$IP_ADDR $DT=" $LOG_FILE > ${LOG_FILE}.tmp
	      $CP ${LOG_FILE}.tmp $LOG_FILE
	      $RM -f ${LOG_FILE}.tmp
	    else
	      $ECHO "$IP_ADDR $DT" >> $LOG_FILE
	    fi  
	  else
	    if $TEST -n "$LASTSEEN" 
   	    then
	      DATE_LASTSEEN=`$ECHO $LASTSEEN | $AWK '{ printf("%s", $2) }'`
	      TIME_LASTSEEN=`$ECHO $LASTSEEN | $AWK '{ printf("%s", $3) }'`
	      $ECHO "  `$PRINTF \"%-${LENGTH}.${LENGTH}s\" \"$NAME\"` `$PRINTF \"%-14.14s\" \"($IP_ADDR)\"` `$PRINTF \" last seen: %s %s\" $DATE_LASTSEEN $TIME_LASTSEEN`">> $TMP_PING_FILE
	    else
	      $ECHO "  `$PRINTF \"%-${LENGTH}.${LENGTH}s\" \"$NAME\"` `$PRINTF \"%-14.14s\" \"($IP_ADDR)\"` was never seen :-(" >> $TMP_NEVER_FILE
	    fi
	  fi
	fi
    done 
    $ECHO $NB_OF_HOSTS > $ICSIBAG.nbh
) < $HOSTS_FILE
# Done pinging...

# get statistics
OLD_MAX=0
$TEST -f $MAX_FILE && OLD_MAX=`$CAT $MAX_FILE`

NB_OF_HOSTS=`$CAT $ICSIBAG.nbh` 
$RM $ICSIBAG.nbh
if $TEST $OLD_MAX -lt $NB_OF_HOSTS 
then
  $RM -f $MAX_FILE
  $ECHO $NB_OF_HOSTS > $MAX_FILE
fi

MAX=$NB_OF_HOSTS 
$TEST -f $MAX_FILE && MAX=`$CAT $MAX_FILE`
$TEST -f $LOG_FILE && MAX=`$WC -l $LOG_FILE | $AWK '{print $1 }'`

# We make now some tests and rearrange things if possible.
# That depends on the host, so we have a script for each of them:
echo $WORKDIR
#$WORKDIR/bin/$HOST $IP_MULTICAST1 $IP_MULTICAST2 $IP $WORKDIR

# Do a multicast ping (if the routing really goes to bagnet!)

MC_GATEWAY=`$NETSTAT -nr | $GREP 224.0.0.0 | $AWK "{ print \\$2 }"` 
if [ $MC_GATEWAY = $IP ]
then
#  if $ARP $IP_MULTICAST1 >/dev/null
#  then IP_MULTICAST=$IP_MULTICAST1
#  else IP_MULTICAST=$IP_MULTICAST2
#  fi
  $ECHO "

Hosts responding to a multicast ping ($IP_MULTICAST):

" >> $TMP_PING_FILE $PING -s $IP_MULTICAST $PACKET_SIZE $NUMBER_MC_PINGS |\ $AWK "/bytes/ { print \$4 } " |\ $SORT -u | $SED -e "s/://" > $MULTICAST_FILE $CAT $MULTICAST_FILE >> $TMP_PING_FILE NUMBER_OF_MULTICASTS=`$CAT $MULTICAST_FILE | $WC -l ` MAX_MULTI=0 $TEST -f $MULTICAST_MAX_FILE && MAX_MULTI=`$CAT $MULTICAST_MAX_FILE` if $TEST $NUMBER_OF_MULTICASTS -gt $MAX_MULTI then MAX_MULTI=$NUMBER_OF_MULTICASTS $ECHO $NUMBER_OF_MULTICASTS > $MULTICAST_MAX_FILE fi else NUMBER_OF_MULTICASTS=0 MAX_MULTI=0 $TEST -f $MULTICAST_MAX_FILE && MAX_MULTI=`$CAT $MULTICAST_MAX_FILE` fi # end multicast # write trailer of ping file $CAT << EndOfText >> $TMP_PING_FILE

Statistics (since $STAT_TIME):

Number of sites seen this time: $NB_OF_HOSTS
Max. number of sites seen from this host at a time: $MAX
Number of sites seen from this host at least once: $MAX
Number of hosts responding to a multicast ping: $NUMBER_OF_MULTICASTS
Max. number of hosts ever responding to a multicast ping: $MAX_MULTI

Hosts never seen from icsibag${NUMBER}.

More BAGNet-Ping-Pages.

EndOfText

$CAT << EndOfText >> $TMP_PING_FILE

Click here to return to ICSI's BAGNet Home Page.
Wieland Holfelder (whd@icsi.berkeley.edu) EndOfText # write trailer of never file $CAT << EndOfText >> $TMP_NEVER_FILE

Return to icsibag${NUMBER}'s ping page.

More BAGNet-Ping-Pages.


Click here to return to ICSI's BAGNet Home Page.
Bernd Lamparter (lampart@icsi.berkeley.edu) EndOfText $RM -f $HTML_NEVER_FILE $CP $TMP_NEVER_FILE $HTML_NEVER_FILE $RM -f $TMP_NEVER_FILE $RM -f $HTML_PING_FILE $CP $TMP_PING_FILE $HTML_PING_FILE $RM -f $TMP_PING_FILE # mail info for BAGNet ping matrix if $TEST $NUMBER -ne 4 then $MAIL -s "BAGNet Host $IP" $MAIL_TO < $MAIL_FILE fi