html/snmpup.pl


   1 use strict;
   2 use Net::SNMP;
   3 use vars qw($VERSION %IRSSI);
   4 
   5 # Changes:
   6 # Apr 6:
   7 # - Added debug option
   8 # - Checks for remote OS type.. Windows' snmpd is somewhat different
   9 # - Included load averages
  10 # - Multiple hosts support
  11 # Mar 13:
  12 # - Typofixes
  13 
  14 $VERSION = "2.00";
  15 %IRSSI = (
  16 	authors => "Rick (strlen) Jansen",
  17 	contact => "strlen\@shellz.nl",
  18 	name => "snmpup",
  19 	description => "This script queries remote hosts (/snmpup <host1> <host2> <hostN>) running snmpd for it's uptime and cpu usage",
  20 	license => "GPL/2",
  21 	changed => "Sun Apr 6 17:57:28 CET 2002"
  22 );
  23 
  24 use Irssi;
  25 sub snmpup {
  26 	my ($input, $server, $data) = @_;
  27 
  28 	# Assume $input are hostnames if no debug flag is given
  29 	my (@hostnames, $debug, @mibs, $hostname);
  30 	
  31 	if ($input !~ /^\-d/) {
  32 		@hostnames = split(" ",$input);
  33 		$debug = 0;
  34 	} else {
  35 		$input =~ s/^\-d //;
  36 		@hostnames = split(" ",$input);
  37 		$debug = 1;
  38 	}
  39 	if (!@hostnames) { Irssi::print("snmpup: invalid syntax: $input"); return }
  40 
  41 	my $hostUpTime = '1.3.6.1.2.1.25.1.1.0';
  42 	my $sysSystem = '1.3.6.1.2.1.1.1.0';
  43 	my $sysUpTime = '1.3.6.1.2.1.1.3.0';
  44 	my $hrLoad = '1.3.6.1.2.1.25.3.3.1.2.1';
  45 	my $laLoadInt1 = '1.3.6.1.4.1.2021.10.1.5.1';
  46 	my $laLoadInt5 = '1.3.6.1.4.1.2021.10.1.5.2';
  47 	my $laLoadInt15 = '1.3.6.1.4.1.2021.10.1.5.3';
  48 	
  49 	foreach $hostname (@hostnames) {
  50 		my ($session, $error) = Net::SNMP->session(
  51 					-hostname	=>	$hostname,
  52 					-community	=>	'public',
  53 					-port		=>	'161',
  54 					);
  55 		if (!defined($session)) {
  56 			$server->command("/msg ".$data->{name}." Unable to create SNMP connection: $error");
  57 			return;
  58 		} elsif ($debug) {
  59 			Irssi::print("Net::SNMP session created.");
  60 		}
  61 
  62 		my $a = $session->get_request(-varbindlist=>[$sysSystem]);
  63 
  64 		my $system = $a->{$sysSystem};
  65 
  66 		if ($debug) {
  67 			Irssi::print("Remote system type is $system");
  68 		}
  69 
  70 		if ($system =~ /Windows/) { 
  71 			@mibs = [$sysUpTime,$hrLoad];
  72 		} else {
  73 			@mibs = [$hostUpTime,$laLoadInt1,$laLoadInt5,$laLoadInt15];
  74 		}
  75 
  76 		my $result = $session->get_request(-varbindlist=>@mibs);
  77 
  78 		if (!defined($result)) {
  79 			my $err = $session->error;
  80 			$server->command("/msg ".$data->{name}." SNMP get error: $err");
  81 			$session->close();
  82 		} else {
  83 			my $host = $session->hostname; 
  84 			my ($uptime, $load);
  85 			if ($system =~ /Windows/) {
  86 				$uptime = $result->{$sysUpTime};
  87 				$load = sprintf("CPU Usage: %d%",$result->{$hrLoad});
  88 			} else {
  89 				$uptime = $result->{$hostUpTime};
  90 				$load = sprintf("load averages: %.2f, %.2f, %.2f",
  91 						   $result->{$laLoadInt1} / 100,
  92 						   $result->{$laLoadInt5} / 100,
  93 					   	$result->{$laLoadInt15} / 100);
  94 			}
  95 			$server->command("/msg ".$data->{name}." SNMP uptime for host '$host' is $uptime, $load");
  96 			$session->close();
  97 		}
  98 		$session->close();
  99 	}
 100 }
 101 Irssi::command_bind("snmpup","snmpup");