#!/usr/local/bin/perl -w =pod =head1 NAME swap.monitor - monitor swap space usage via SNMP =head1 SYNOPSIS swap.monitor [ --community=community ] [ --percent=p ] host [...] =head1 ARGUMENTS =over 4 =item --community=community SNMP community (default=public) =item --percent=p The monitor is deemed to fail if swap space utilisation is >= p (default=75). =item host [...] Space separated list of hosts to monitor. =back =head1 DESCRIPTION B monitors swap space usage via the UCSD SNMP agent. It is designed to be used as a monitor for the B package. As such if any host's swap utilisation is >= a particular percentage it will return 1 and output the hostnames that failed and the percentage of the swap in use. If all hosts meet the utilisation criteria 0 is returned. The swap space statistics must be collected from an extension to the SNMP agent named 'swap' which returns the percentage of swap space in use. =head1 BUGS The swap statistics should really be collected from a MIB but there didn't seem to be one which worked for Linux and Solaris. =head1 SEE ALSO F - snmp agent extenstion for monitoring swap space I I =head1 AUTHOR Paul Sharpe Epaul@miraclefish.comE =head1 COPYRIGHT Copyright (c) 1998 Paul Sharpe. England. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use Pod::Usage; use SNMP; use Getopt::Long; $opt_community = $opt_percent = undef; pod2usage("") unless GetOptions("community=s","percent=i"); pod2usage("") unless @ARGV; $community = $opt_community || 'public'; $percent = $opt_percent || 75; # don't load the whole mib # enterprises.ucdavis.extTable.extEntry.extNames $extNames = '.1.3.6.1.4.1.2021.8.1.2'; # enterprises.ucdavis.extTable.extEntry.extOutput $extOutput = '.1.3.6.1.4.1.2021.8.1.101'; $ENV{'MIBS'} = ''; $SNMP::use_long_names = 1; for $host (@ARGV) { $session = new SNMP::Session(DestHost => $host, Community => $community); $var = new SNMP::Varbind([$extNames]); $match = 0; for($swap = $session->getnext($var); $var->tag =~ /$extNames/ # still in table and not $session->{ErrorStr}; # and not end of mib or other error $swap = $session->getnext($var) ) { $match = 1, last if $swap eq 'swap'; } if ( $session->{ErrorNum} ) { push(@failures,"$host $session->{ErrorStr}"); } elsif ( $match ) { my($suffix) = $var->tag =~ /\.(\d+)$/; my $var = new SNMP::Varbind(["$extOutput.$suffix"]); my $p = $session->get($var); push(@failures,"$host swap space is $p% full") if $p >= $percent; } else { push(@failures,"$host SNMP agent isn't monitoring swap space"); } } if (@failures) { print join (", ", @failures), "\n"; exit 1; } exit 0;