Blame contrib/PMLines/PMLines.pl

Packit 667938
#!/usr/bin/perl
Packit 667938
Packit 667938
# PMLines.pl
Packit 667938
#
Packit 667938
# 1998/08/04
Packit 667938
Packit 667938
#
Packit 667938
# Created by  Carlos.Canau@EUnet.pt with cfgmaker  from Tobias Oetiker
Packit 667938
# <oetiker@ee.ethz.ch> as skeleton
Packit 667938
#
Packit 667938
# returns:
Packit 667938
# #modems
Packit 667938
# #isdn
Packit 667938
# sysName
Packit 667938
# sysUptime
Packit 667938
#
Packit 667938
Packit 667938
# 1998/10/30
Packit 667938
#
Packit 667938
# Modified by Butch Kemper <kemper@tstar.net> to allow multiple PortMasters
Packit 667938
# to be specified on the argument line and to output the totals.
Packit 667938
#
Packit 667938
Packit 667938
# 1999/4/18
Packit 667938
#
Packit 667938
# Modified by Butch Kemper <kemper@tstar.net> to process PM2 systems and
Packit 667938
# to distingish between async and isdn ports.
Packit 667938
#
Packit 667938
# Changed name to PM2lines.pl
Packit 667938
#
Packit 667938
Packit 667938
# 1999/4/19
Packit 667938
#
Packit 667938
# Modified by Butch Kemper <kemper@tstar.net> to process both PM2 and PM3
Packit 667938
# systems.
Packit 667938
#
Packit 667938
# Changed name to PMlines.pl
Packit 667938
#
Packit 667938
Packit 667938
Packit 667938
# 2000/9/5
Packit 667938
#
Packit 667938
# Modified by Robert Boyle (robert@tellurian.net) to work with 
Packit 667938
# Lucent's VERY broken PM4 SNMP. Now uses modem number in use to determine if
Packit 667938
# call is ISDN or analog. If modem = "M0" then call is ISDN 
Packit 667938
# Not pretty, but it does work. Somone who is a better PERL programmer than I 
Packit 667938
# may want to integrate these changes into the base PMlines.pl script and make
Packit 667938
# determination of which method to use based on chassis type.
Packit 667938
#
Packit 667938
# Changed name to PM4lines.pl
Packit 667938
#
Packit 667938
Packit 667938
# 2000/9/19
Packit 667938
#
Packit 667938
# Modified AGAIN by Robert Boyle (robert@tellurian.net) to work with 
Packit 667938
# all Lucent Portmaster 2/3/4 chassis. Now uses port speed to determine if
Packit 667938
# call is ISDN or analog. If speed is 56000 or 64000 then call is ISDN. 
Packit 667938
# This may cause a false ISDN reading if someone has a perfect v.90 connection.
Packit 667938
#
Packit 667938
# Changed name back to PMlines.pl
Packit 667938
#
Packit 667938
Packit 667938
Packit 667938
use SNMP_Session;
Packit 667938
use BER;
Packit 667938
use Socket;
Packit 667938
use strict;
Packit 667938
Packit 667938
%snmpget::OIDS = (  'sysName' => '1.3.6.1.2.1.1.5.0',
Packit 667938
		    'sysUptime' => '1.3.6.1.2.1.1.3.0',
Packit 667938
		    'ifNumber' =>  '1.3.6.1.2.1.2.1.0',
Packit 667938
		    'PMip' => '1.3.6.1.4.1.307.3.2.1.1.1.14',
Packit 667938
		    'PMty' => '1.3.6.1.4.1.307.3.2.1.1.1.11',
Packit 667938
		);
Packit 667938
Packit 667938
my($tot_isdn,$tot_modems,$args) = (0,0,0);
Packit 667938
my($input_string,$PROGNAME,$sysUptime,$sysName,$interfaces)="";
Packit 667938
($PROGNAME = $0) =~ s/.*\///;
Packit 667938
Packit 667938
diexit(0) if $#ARGV < 0;
Packit 667938
Packit 667938
for ($args=0; $args < $#ARGV+1; $args++) {
Packit 667938
   $input_string = $ARGV[$args];
Packit 667938
   my($community,$router) = split /\@/, $input_string;
Packit 667938
Packit 667938
   diexit(0) unless $community && $router;
Packit 667938
Packit 667938
   ($sysName,$sysUptime,$interfaces) =
Packit 667938
      snmpget($router,$community,'sysName','sysUptime','ifNumber');
Packit 667938
   my @PMip = snmpgettable($router,$community,'PMip');
Packit 667938
   my @PMty = snmpgettable($router,$community,'PMty');
Packit 667938
   my ($i);
Packit 667938
Packit 667938
   for ($i=0; $i < $#PMip+1; $i++) 
Packit 667938
         {
Packit 667938
Packit 667938
      if ($PMip[$i] ne "0.0.0.0") {
Packit 667938
         if ($PMty[$i] ne "56000" and $PMty[$i] ne "64000") {
Packit 667938
			$tot_modems++;
Packit 667938
         }
Packit 667938
         else {
Packit 667938
            $tot_isdn++;
Packit 667938
		 }
Packit 667938
      }
Packit 667938
   }
Packit 667938
}
Packit 667938
Packit 667938
printf "$tot_modems\n";
Packit 667938
printf "$tot_isdn\n";
Packit 667938
printf "$sysUptime\n";
Packit 667938
printf "$sysName\n";
Packit 667938
Packit 667938
exit(0);
Packit 667938
Packit 667938
sub diexit {
Packit 667938
   die ("USAGE: $PROGNAME  community\@portmaster [community\@portmaster]" .
Packit 667938
        " \.\.\.\n" .
Packit 667938
        "       community   = snmp read community string\n" .
Packit 667938
        "       portmaster  = FQN of PortMaster\n");
Packit 667938
}
Packit 667938
Packit 667938
sub snmpget{
Packit 667938
  my($host,$community,@vars) = @_;
Packit 667938
  my(@enoid, $var,$response, $bindings, $binding, $value, $inoid,$outoid,
Packit 667938
     $upoid,$oid,@retvals);
Packit 667938
  foreach $var (@vars) {
Packit 667938
    die "Unknown SNMP var $var\n"
Packit 667938
      unless $snmpget::OIDS{$var};
Packit 667938
    push @enoid,  encode_oid((split /\./, $snmpget::OIDS{$var}));
Packit 667938
  }
Packit 667938
  srand();
Packit 667938
  my $session = SNMP_Session->open ($host ,
Packit 667938
                                 $community,
Packit 667938
                                 161);
Packit 667938
  if ($session->get_request_response(@enoid)) {
Packit 667938
    $response = $session->pdu_buffer;
Packit 667938
    ($bindings) = $session->decode_get_response ($response);
Packit 667938
    $session->close ();
Packit 667938
    while ($bindings) {
Packit 667938
      ($binding,$bindings) = decode_sequence ($bindings);
Packit 667938
      ($oid,$value) = decode_by_template ($binding, "%O%@");
Packit 667938
      my $tempo = pretty_print($value);
Packit 667938
      $tempo=~s/\t/ /g;
Packit 667938
      $tempo=~s/\n/ /g;
Packit 667938
      $tempo=~s/^\s+//;
Packit 667938
      $tempo=~s/\s+$//;
Packit 667938
Packit 667938
      push @retvals,  $tempo;
Packit 667938
    }
Packit 667938
Packit 667938
    return (@retvals);
Packit 667938
  } else {
Packit 667938
    die "No answer from $input_string. You may be using the wrong community\n";
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
sub snmpgettable{
Packit 667938
  my($host,$community,$var) = @_;
Packit 667938
  my($next_oid,$enoid,$orig_oid,
Packit 667938
     $response, $bindings, $binding, $value, $inoid,$outoid,
Packit 667938
     $upoid,$oid,@table,$tempo);
Packit 667938
  die "Unknown SNMP var $var\n"
Packit 667938
    unless $snmpget::OIDS{$var};
Packit 667938
Packit 667938
  $orig_oid = encode_oid(split /\./, $snmpget::OIDS{$var});
Packit 667938
  $enoid=$orig_oid;
Packit 667938
  srand();
Packit 667938
  my $session = SNMP_Session->open ($host ,
Packit 667938
                                 $community,
Packit 667938
                                 161);
Packit 667938
  for(;;)  {
Packit 667938
    if ($session->getnext_request_response(($enoid))) {
Packit 667938
      $response = $session->pdu_buffer;
Packit 667938
      ($bindings) = $session->decode_get_response ($response);
Packit 667938
      ($binding,$bindings) = decode_sequence ($bindings);
Packit 667938
      ($next_oid,$value) = decode_by_template ($binding, "%O%@");
Packit 667938
      # quit once we are outside the table
Packit 667938
      last unless BER::encoded_oid_prefix_p($orig_oid,$next_oid);
Packit 667938
      $tempo = pretty_print($value);
Packit 667938
      #print "$var: '$tempo'\n";
Packit 667938
      $tempo=~s/\t/ /g;
Packit 667938
      $tempo=~s/\n/ /g;
Packit 667938
      $tempo=~s/^\s+//;
Packit 667938
      $tempo=~s/\s+$//;
Packit 667938
      push @table, $tempo;
Packit 667938
Packit 667938
    } else {
Packit 667938
      die "No answer from $input_string\n";
Packit 667938
    }
Packit 667938
    $enoid=$next_oid;
Packit 667938
  }
Packit 667938
  $session->close ();
Packit 667938
  return (@table);
Packit 667938
}