PMLines.pl
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:5k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # PMLines.pl
  3. #
  4. # 1998/08/04
  5. #
  6. # Created by  Carlos.Canau@EUnet.pt with cfgmaker  from Tobias Oetiker
  7. # <oetiker@ee.ethz.ch> as skeleton
  8. #
  9. # returns:
  10. # #modems
  11. # #isdn
  12. # sysName
  13. # sysUptime
  14. #
  15. # 1998/10/30
  16. #
  17. # Modified by Butch Kemper <kemper@tstar.net> to allow multiple PortMasters
  18. # to be specified on the argument line and to output the totals.
  19. #
  20. # 1999/4/18
  21. #
  22. # Modified by Butch Kemper <kemper@tstar.net> to process PM2 systems and
  23. # to distingish between async and isdn ports.
  24. #
  25. # Changed name to PM2lines.pl
  26. #
  27. # 1999/4/19
  28. #
  29. # Modified by Butch Kemper <kemper@tstar.net> to process both PM2 and PM3
  30. # systems.
  31. #
  32. # Changed name to PMlines.pl
  33. #
  34. # 2000/9/5
  35. #
  36. # Modified by Robert Boyle (robert@tellurian.net) to work with 
  37. # Lucent's VERY broken PM4 SNMP. Now uses modem number in use to determine if
  38. # call is ISDN or analog. If modem = "M0" then call is ISDN 
  39. # Not pretty, but it does work. Somone who is a better PERL programmer than I 
  40. # may want to integrate these changes into the base PMlines.pl script and make
  41. # determination of which method to use based on chassis type.
  42. #
  43. # Changed name to PM4lines.pl
  44. #
  45. # 2000/9/19
  46. #
  47. # Modified AGAIN by Robert Boyle (robert@tellurian.net) to work with 
  48. # all Lucent Portmaster 2/3/4 chassis. Now uses port speed to determine if
  49. # call is ISDN or analog. If speed is 56000 or 64000 then call is ISDN. 
  50. # This may cause a false ISDN reading if someone has a perfect v.90 connection.
  51. #
  52. # Changed name back to PMlines.pl
  53. #
  54. use SNMP_Session;
  55. use BER;
  56. use Socket;
  57. use strict;
  58. %snmpget::OIDS = (  'sysName' => '1.3.6.1.2.1.1.5.0',
  59.     'sysUptime' => '1.3.6.1.2.1.1.3.0',
  60.     'ifNumber' =>  '1.3.6.1.2.1.2.1.0',
  61.     'PMip' => '1.3.6.1.4.1.307.3.2.1.1.1.14',
  62.     'PMty' => '1.3.6.1.4.1.307.3.2.1.1.1.11',
  63. );
  64. my($tot_isdn,$tot_modems,$args) = (0,0,0);
  65. my($input_string,$PROGNAME,$sysUptime,$sysName,$interfaces)="";
  66. ($PROGNAME = $0) =~ s/.*///;
  67. diexit(0) if $#ARGV < 0;
  68. for ($args=0; $args < $#ARGV+1; $args++) {
  69.    $input_string = $ARGV[$args];
  70.    my($community,$router) = split /@/, $input_string;
  71.    diexit(0) unless $community && $router;
  72.    ($sysName,$sysUptime,$interfaces) =
  73.       snmpget($router,$community,'sysName','sysUptime','ifNumber');
  74.    my @PMip = snmpgettable($router,$community,'PMip');
  75.    my @PMty = snmpgettable($router,$community,'PMty');
  76.    my ($i);
  77.    for ($i=0; $i < $#PMip+1; $i++) 
  78.          {
  79.       if ($PMip[$i] ne "0.0.0.0") {
  80.          if ($PMty[$i] ne "56000" and $PMty[$i] ne "64000") {
  81. $tot_modems++;
  82.          }
  83.          else {
  84.             $tot_isdn++;
  85.  }
  86.       }
  87.    }
  88. }
  89. printf "$tot_modemsn";
  90. printf "$tot_isdnn";
  91. printf "$sysUptimen";
  92. printf "$sysNamen";
  93. exit(0);
  94. sub diexit {
  95.    die ("USAGE: $PROGNAME  community@portmaster [community@portmaster]" .
  96.         " ...n" .
  97.         "       community   = snmp read community stringn" .
  98.         "       portmaster  = FQN of PortMastern");
  99. }
  100. sub snmpget{
  101.   my($host,$community,@vars) = @_;
  102.   my(@enoid, $var,$response, $bindings, $binding, $value, $inoid,$outoid,
  103.      $upoid,$oid,@retvals);
  104.   foreach $var (@vars) {
  105.     die "Unknown SNMP var $varn"
  106.       unless $snmpget::OIDS{$var};
  107.     push @enoid,  encode_oid((split /./, $snmpget::OIDS{$var}));
  108.   }
  109.   srand();
  110.   my $session = SNMP_Session->open ($host ,
  111.                                  $community,
  112.                                  161);
  113.   if ($session->get_request_response(@enoid)) {
  114.     $response = $session->pdu_buffer;
  115.     ($bindings) = $session->decode_get_response ($response);
  116.     $session->close ();
  117.     while ($bindings) {
  118.       ($binding,$bindings) = decode_sequence ($bindings);
  119.       ($oid,$value) = decode_by_template ($binding, "%O%@");
  120.       my $tempo = pretty_print($value);
  121.       $tempo=~s/t/ /g;
  122.       $tempo=~s/n/ /g;
  123.       $tempo=~s/^s+//;
  124.       $tempo=~s/s+$//;
  125.       push @retvals,  $tempo;
  126.     }
  127.     return (@retvals);
  128.   } else {
  129.     die "No answer from $input_string. You may be using the wrong communityn";
  130.   }
  131. }
  132. sub snmpgettable{
  133.   my($host,$community,$var) = @_;
  134.   my($next_oid,$enoid,$orig_oid,
  135.      $response, $bindings, $binding, $value, $inoid,$outoid,
  136.      $upoid,$oid,@table,$tempo);
  137.   die "Unknown SNMP var $varn"
  138.     unless $snmpget::OIDS{$var};
  139.   $orig_oid = encode_oid(split /./, $snmpget::OIDS{$var});
  140.   $enoid=$orig_oid;
  141.   srand();
  142.   my $session = SNMP_Session->open ($host ,
  143.                                  $community,
  144.                                  161);
  145.   for(;;)  {
  146.     if ($session->getnext_request_response(($enoid))) {
  147.       $response = $session->pdu_buffer;
  148.       ($bindings) = $session->decode_get_response ($response);
  149.       ($binding,$bindings) = decode_sequence ($bindings);
  150.       ($next_oid,$value) = decode_by_template ($binding, "%O%@");
  151.       # quit once we are outside the table
  152.       last unless BER::encoded_oid_prefix_p($orig_oid,$next_oid);
  153.       $tempo = pretty_print($value);
  154.       #print "$var: '$tempo'n";
  155.       $tempo=~s/t/ /g;
  156.       $tempo=~s/n/ /g;
  157.       $tempo=~s/^s+//;
  158.       $tempo=~s/s+$//;
  159.       push @table, $tempo;
  160.     } else {
  161.       die "No answer from $input_stringn";
  162.     }
  163.     $enoid=$next_oid;
  164.   }
  165.   $session->close ();
  166.   return (@table);
  167. }