Ascend Archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: (ASCEND) Users online time...



Since everybody wants this script, I'm forwarding a copy of it to the
list.  You'll need the SNMP perl module (www.perl.com and go into the
CPAN mirror), the Getopt::Std perl module (also at CPAN), and the ascend
mib.

Example usage is the following shell script called maxcheck:

--------begin maxcheck------------
#!/bin/sh
if [ "$1" != "" ]; then
  home_binary=/location/of/maxcall
  $home_binary -h $1 -c <read community string>
else echo "usage: maxcheck max-ip-address" ;
fi
--------end maxcheck--------------

or you can just do "maxcall -h <ip address> -c <read community>" from the
command line.

My personal favorite is to run a script I call mc that runs maxcall:

------begin mc-------------------
#!/usr/bin/perl
system("maxcheck xxx.xxx.xxx.xxx"); #where xxx.xxx.xxx.xxx is a max IP.
system("maxcheck xxx.xxx.xxx.xxx"); # the next max
system("maxcheck xxx.xxx.xxx.xxx"); # and so on
system("maxcheck xxx.xxx.xxx.xxx"); # and so on.
-----End MC----------------------

the syntax is mc | grep <username> and you can find out what max the user
is on, or just mc and get all the users online (I suggest piping it to
more).

Enjoy,
Joe Shaw - jshaw@insync.net
NetAdmin - Insync Internet Services

On Sun, 30 Nov 1997, Michael Dickens wrote:

> Joe;
> 
> Any ideas on where to find 'maxcall'
> 
> TIA
> 
> Michael


#!/usr/local/bin/perl

#    This program is free software; you can redistribute it and/or modify
#    it under the terms of either:
#
#      a) the GNU General Public License as published by the Free
#      Software Foundation; either version 1, or (at your option) any
#      later version, or
#
#      b) the "Artistic License" which comes with this Kit.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
#    the GNU General Public License or the Artistic License for more details.

#
# Bugs & suggestions to <nectar@communique.net>
#

use SNMP;
use Getopt::Std;

getopts( "h:c:m:" );

$callref    = $ARGV[ 0 ];
$host       = $opt_h ? $opt_h : "max";
$community  = $opt_c ? $opt_c : "public";
$ascend_mib = $opt_m ? $opt_m : "/usr/local/lib/mib/ascend.mib";

@service =  ( "None", "Other", "PPP", "SLIP", "Multilink PPP+", "X.25",
             "Combinet", "Frame Relay", "EU RAW", "EU UI", "TELNET",
             "TELNET Binary", "TCP Clear", "Terminal Serv",
             "Multilink PPP" );

$session = init_snmp( $host, $community );

( $sys_startup, $secs_since_startup, $count_calls ) =
	snmpget( new SNMP::VarList( ['sysAbsoluteStartupTime', '0'],
	['sysSecsSinceStartup', '0'], ['callStatusMaximumEntries', '0'] ));

if ( $callref ) {
	display_call( $callref );
} else {
	list_calls();
}

sub list_calls {
	my ( $i, $c, $num_calls );

	print_header();
	for ( $i = 1; $i <= $count_calls; $i++ ) {
		if ( $c = get_call( $i ) ) {
			print_call( $c );
			if ( $c->{'modemslot'} ) {
				$analog_calls++;
			} else {
				$digital_calls++;
			}
		}
	}
	printf( "\n%d analog calls, %d digital calls, %d calls total\n",
		$analog_calls, $digital_calls, $analog_calls + $digital_calls );
}

sub display_call {
	my $key			= shift;
	my $call_index;

  # If the key is all digits,
	if ( $key =~ /^\d+$/ ) { 
	   # Then look up the call by call reference number
		$call_index = get_call_by_callref( $key );
	} else {                
       # else look up the call by user name
		$call_index = get_call_by_username( $key );
	}
	if ( $call_index ) {
		my $c; 
		($c = get_call_full( $call_index )) and print_call_full( $c );
	} else {
		print "Call not found.\n";
	}
}

sub get_call_by_callref {
	my $callref_wanted = shift;
	my $i;

	for ( $i = 1; $i <= $count_calls; $i++ ) {
		if ( snmpget( "callStatusCallReferenceNum.$i" ) == $callref_wanted ) {
			return $i;
		}
	}
	0;
}

sub get_call_by_username {
	my $username_wanted = shift;
	my ( $i, $valid, $session );
	
	for ( $i = 1; $i <= $count_calls; $i++ ) {
		($valid, $session) = snmpget( new SNMP::VarList(
			['callStatusValidFlag',$i], ['callSessionIndex',$i]));
		if ( $valid == 2 and snmpget( "ssnStatusUserName.$session" ) eq $username_wanted ) {
			return $i;
		}
	}
	0;
}

sub print_header { 
	#	   12345678901234567890123456789012345678901234567890123456789012345678901234567890
	print "CallRef Elapsd Time Speed Channel Modem User       IP Address      Service\n"; 
	print "------- ----------- ----- ------- ----- ---------- --------------- -------------\n";
}

sub print_call {
	my $c = shift;
	
	printf( "%7d %11s %5d %7s %-5s %-10s %-15s %-13s\n",
		$c->{'callref'}, 
		asctimediff( $secs_since_startup, $c->{'timestamp'} ),
		$c->{'datarate'}, 
		sprintf( "%d/%02d", 2 * ($c->{'slot'} - 1) + $c->{'line'}, $c->{'chan'} ),
		$c->{'modemslot'} ? sprintf( " %d:%d", $c->{'modemslot'}, $c->{'modemnum'} ) : " ---", 
		$c->{'user'}, 
		$c->{'ipaddr'},
		$service[$c->{'service'}-1],
	 );
}

sub print_call_full {
	my $c = shift;
	
	print_call_full_line( 
		"CallRef",      $c->{'callref'}, 
		"Time Elapsed",  asctimediff( $secs_since_startup, $c->{'timestamp'} ),
	);
	print_call_full_line(
		"User",      $c->{'user'},
		"Service",   $service[$c->{'service'}-1],
	);
	print_call_full_line(
		"Data Rate",   $c->{'datarate'},
		"IP Address",  $c->{'ipaddr'}, 
	);
	print_call_full_line(
		"Channel", sprintf("%d/%02d", 2 * ($c->{'slot'} - 1) + $c->{'line'}, $c->{'chan'}),
		"Modem", $c->{'modemslot'} ? sprintf("%d:%d", $c->{'modemslot'}, $c->{'modemnum'} ) : "---",
	 );
	print_call_full_line(
		"MTU Size",    $c->{'mtu'},
		"Subnet Mask", $c->{'mask'},
	 );

	print "\n                                       In              Out\n";
	printf( " Bytes                    %16u %16u\n", $c->{'inoctets'}, $c->{'outoctets'} );
	printf( " Unicast Packets          %16u %16u\n", $c->{'inunipkts'}, $c->{'outunipkts'} );
	printf( " Broadcast/Multicast Pkts %16u %16u\n", $c->{'inmultipkts'}, $c->{'outmultipkts'} );
	printf( " Discarded Packets        %16u %16u\n", $c->{'indiscards'}, $c->{'outdiscards'} );
	printf( " Pkts w/unknown Protocol  %16u %16u\n", $c->{'inbadprotos'}, $c->{'outbadprotos'} );
}

sub print_call_full_line {
	printf( "%14s: %-18s %14s: %-18s\n", @_ );
}

sub get_call {
	my $i = shift;
	my $c = {};

	if ( snmpget( "callStatusValidFlag.$i" ) == 2 ) {
    	my $var = new SNMP::VarList (
                ['callStatusStartingTimeStamp', $i],
                ['callStatusCallReferenceNum', $i],
                ['callStatusDataRate', $i],
                ['callStatusSlotNumber', $i],
                ['callStatusSlotLineNumber', $i],
                ['callStatusSlotChannelNumber', $i],
                ['callStatusModemSlotNumber', $i],
                ['callStatusModemOnSlot', $i],
                ['callSessionIndex', $i]
			);
		( $c->{'timestamp'}, $c->{'callref'}, $c->{'datarate'},
		  $c->{'slot'}, $c->{'line'}, $c->{'chan'}, $c->{'modemslot'},
		  $c->{'modemnum'}, $c->{'session'} ) =
				snmpget( $var );
		$var = new SNMP::VarList (
				['ssnStatusUserName', $c->{'session'}],
				['ssnStatusUserIPAddress', $c->{'session'}],
				['ssnStatusCurrentService', $c->{'session'}]
			);
		( $c->{'user'}, $c->{'ipaddr'}, $c->{'service'} ) =
				snmpget( $var );
		$c->{'ipaddr'} =  join( ".", unpack( "C4", $c->{'ipaddr'} ));
		( $c->{'ipaddr'} =~ /0\.0\.0\.0/ ) && ( $c->{'ipaddr'} = "n/a" );
	
		$c;
	} else {
		0;
	}
}

sub get_call_full {
	my $i = shift;
	my $c = {};

	if ( snmpget( "callStatusValidFlag.$i" ) == 2 ) {
    	my $var = new SNMP::VarList (
                ['callStatusStartingTimeStamp', $i],
                ['callStatusCallReferenceNum', $i],
                ['callStatusDataRate', $i],
                ['callStatusSlotNumber', $i],
                ['callStatusSlotLineNumber', $i],
                ['callStatusSlotChannelNumber', $i],
                ['callStatusModemSlotNumber', $i],
                ['callStatusModemOnSlot', $i],
                ['callStatusIfIndex', $i],
                ['callSessionIndex', $i]
			);
		( $c->{'timestamp'}, $c->{'callref'}, $c->{'datarate'},
		  $c->{'slot'}, $c->{'line'}, $c->{'chan'}, $c->{'modemslot'},
		  $c->{'modemnum'}, $c->{'if'}, $c->{'session'} ) =
				snmpget( $var );
		$var = new SNMP::VarList (
				['ssnStatusUserName', $c->{'session'}],
				['ssnStatusUserIPAddress', $c->{'session'}],
				['ssnStatusUserSubnetMask', $c->{'session'}],
				['ssnStatusCurrentService', $c->{'session'}],
			);
		( $c->{'user'}, $c->{'ipaddr'}, $c->{'mask'}, $c->{'service'} ) =
				snmpget( $var );
		$c->{'ipaddr'} = join( ".", unpack( "C4", $c->{'ipaddr'} ) );
		( $c->{'ipaddr'} =~ /0\.0\.0\.0/ ) && ( $c->{'ipaddr'} = "n/a" );
		$c->{'mask'} = join( ".", unpack( "C4", $c->{'mask'} ) );
		( $c->{'mask'} =~ /0\.0\.0\.0/ ) && ( $c->{'mask'} = "n/a" );
		if ( $c->{'if'} ) { 
			$var = new SNMP::VarList (
					['ifMtu', $c->{'if'}],
					['ifInOctets', $c->{'if'}],
					['ifOutOctets', $c->{'if'}],
					['ifInUcastPkts', $c->{'if'}],
					['ifOutUcastPkts', $c->{'if'}],
					['ifInNUcastPkts', $c->{'if'}],
					['ifOutNUcastPkts', $c->{'if'}],
					['ifInDiscards', $c->{'if'}],
					['ifOutDiscards', $c->{'if'}],
					['ifInErrors', $c->{'if'}],
					['ifOutErrors', $c->{'if'}],
					['ifInUnknownProtos', $c->{'if'}],
					['ifOutUnknownProtos', $c->{'if'}],
					['ifOutQLen', $c->{'if'}],
				);
			( $c->{'mtu'}, $c->{'inoctets'}, $c->{'outoctets'}, 
			  $c->{'inunipkts'}, $c->{'outunipkts'}, $c->{'inmultipkts'},
			  $c->{'outmultipkts'}, $c->{'indiscards'}, $c->{'outdiscards'},
			  $c->{'inerrors'}, $c->{'outerrors'}, $c->{'inbadprotos'},
			  $c->{'outbadprotos'}, $c->{'outqlen'} ) = snmpget( $var );
		}
	
		$c;
	} else {
		0;
	} 
}



sub init_snmp {
    $SNMP::auto_init_mib = 0;
    SNMP::setMib( $ascend_mib );
    new SNMP::Session( 'DestHost' => $_[0], 'Community' => $_[1] );
}

sub snmpget {
    my @rc = $session->get( @_ );
    if ( $session->{'ErrorStr'} ) {
        warn "get $var: $session->{'ErrorStr'}\n";
    }
    if ( wantarray() ) {
        @rc;
    } else {
        $rc[0];
    }
}

package asctime;

$init_time = 0;

sub main::asctime {
    my $time = shift;
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime( $time );

    unless ( $init_time ) {
        @DoW = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
        @MoY = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec');
        $init_time = 1;
    }

    sprintf("%s %2d %2d:%02d:%02d", $MoY[$mon], $mday, $hour, $min, $sec);
}

sub main::asctimediff {
	my $time_a = shift;
	my $time_b = shift;

	my $time_diff = abs( $time_a - $time_b );

	$time_diff -= ( my $hours   = int( $time_diff / 3600 ) ) * 3600;
	$time_diff -= ( my $minutes = int( $time_diff / 60 ) ) * 60;
	$time_diff -= ( my $seconds = $time_diff );
	
	sprintf( "%d:%02d:%02d", $hours, $minutes, $seconds );
}

Follow-Ups: