quick script to pull load average
Needed to code up something rather quickly today to monitor load average on our servers and send a notification. I should look into getting OpenNMS to do this, but it only took a few tweaks to an existing program to create this. Before hand you need nmap running and creating the servers.txt and SNMP setup on the servers.
#!/usr/bin/perl -w
use strict;
use Net::SNMP;
use MIME::Lite;
use POSIX;
my %servers;
my %skip_list = (
'10.168.0.1' => 'Pix',
'10.168.1.101' => 'Power Strip',
'10.168.1.102' => 'Power Strip',
'10.168.5.100' => 'Windows Backup Server aka The Sux',
);
my $date = strftime('%Y-%m-%d',localtime(time));
open(FILE,"<","servers.txt");
while (<FILE>) {
my $line = $_;
my ($ip,$hostname) = $line =~ /^Host\: (\d+\.\d+\.\d+\.\d+) \((.*?)\)/;
next if ( !$ip || !$hostname );
#print "$ip $hostname\n";
$servers{$ip} = $hostname;
}
close(FILE);
my $output;
my $urgent;
my $watch;
foreach my $server ( sort keys %servers ) {
#print "QUERY SERVER $server\n";
next if ( $skip_list{$server} );
eval {
my ($session, $error) = Net::SNMP->session(
-version => 'snmpv2c',
-hostname => $server || 'localhost',
-community => 'public',
-port => 161
);
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
next;
}
my $loadAverage = '1.3.6.1.4.1.2021.10.1.5.2';
my $result = $session->get_request(
-varbindlist => [$loadAverage]
);
if (!defined($result)) {
printf("ERROR: %s.\n", $session->error);
$session->close;
next;
}
my $load = sprintf( '%.2f', ( $result->{$loadAverage} / 100 ) );
#print "Load $server\t$load\n";
$session->close;
if ( $load > 5 ) {
$watch .= "$servers{$server}($server) LOAD: $load\n\n";
}
}
}
if ($watch && $watch ne '') {
$watch .= "\n\nSYSRPTID-007\n\n";
my $msg = MIME::Lite->new(
From => 'me@host.com',
To => 'me@host.com',
Subject => "[SYS Report] Load Check $date",
Type => 'text/plain',
Sender => 'me@host.com',
Data => "$watch"
);
MIME::Lite->send('smtp','outbound.host.com', Timeout=>60, Hello => 'outbound.host.com');
$msg->send();
#print "$watch\n";
}
exit;