1use strict; 2use Net::SNMP; 3use 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 24use Irssi; 25sub 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} 101Irssi::command_bind("snmpup","snmpup"); 102