#!/usr/bin/perl -wT # # Copyright (c) 2000 Hugo Gayosso # # Description: # Nagios plug-in that monitors the resources on an HP-UX machine # by querying the SNMP daemon # # License: General Public License (GPL) # http://www.gnu.org/copyleft/gpl.txt # # ChangeLog # # Requirements: Perl 5.005 or higher # Variable initialization $ENV{'PATH'}=""; $ENV{'ENV'}=""; $ENV{'BASH_ENV'}=""; if (-e "/usr/bin/snmpwalk") { $snmpwalk = "/usr/bin/snmpwalk"; } elsif (-e "/usr/local/bin/snmpwalk") { $snmpwalk = "/usr/local/bin/snmpwalk"; } # HP-UX SNMP OIDs $filesystemID1_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.1"; $mounted_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.3"; $totalspace_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.4"; $freespace_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.6"; $path_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.10"; $cpu_5min_OID = ".1.3.6.1.4.1.11.2.3.1.1.4"; use Getopt::Long; GetOptions( "check-filesystem" => \$chk_fs, "show-filesystems" => \$show_fs, "check-filesystemID" => \$chk_fsid, "check-cpu" => \$chk_cpu, "host=s" => \$target_host, "community=s" => \$target_community, "filesystemID1=i" => \$fsid1_opt, "filesystem=s" => \$fs_opt, "protocol:s" => \$proto_opt, "warning=i" => \$warning_opt, "critical=i" => \$critical_opt); $proto_opt = 1 unless $proto_opt == 1 || $proto_opt == '2c' || $proto_opt == 3; if ($chk_fs) { walk_data($snmpwalk, $target_host, $target_community, $mounted_OID,$proto_opt ); walk_data($snmpwalk, $target_host, $target_community, $totalspace_OID,$proto_opt ); walk_data($snmpwalk, $target_host, $target_community, $freespace_OID,$proto_opt ); check_filesystem($fs_opt, $warning_opt, $critical_opt); } elsif ($show_fs) { walk_data($snmpwalk, $target_host, $target_community, $filesystemID1_OID,$proto_opt); walk_data($snmpwalk, $target_host, $target_community, $mounted_OID,$proto_opt ); walk_data($snmpwalk, $target_host, $target_community, $path_OID,$proto_opt); show_filesystem(); } elsif ($chk_fsid){ $totalspace_fsID_OID = "$totalspace_OID.$fsid1_opt"; $freespace_fsID_OID = "$freespace_OID.$fsid1_opt"; walk_data($snmpwalk, $target_host, $target_community, $totalspace_fsID_OID,$proto_opt); walk_data($snmpwalk, $target_host, $target_community, $freespace_fsID_OID,$proto_opt); check_filesystemID1($fsid1_opt, $warning_opt, $critical_opt); } elsif ($chk_cpu) { get_cpu_load($snmpwalk, $target_host, $target_community, $cpu_5min_OID,$proto_opt); check_cpu_5min($cpu, $warning_opt, $critical_opt); } else { print "\n\nUsage:\n"; print "Checking 5-min CPU Load:\n"; print " $0 --check-cpu -warning --critical --host --community --protocol \n\n"; print "Checking local filesystem mounted on a host:\n"; print " $0 --show-filesystems --host --community --protocol \n\n"; print "Checking by filesystem name:\n"; print " $0 --check-filesystem --filesystem --warning <% used space> --critical <% used space> --host --community --protocol \n\n"; print "Checking by filesystem ID:\n"; print " $0 --check-filesystemID --filesystemID --warning <% used space> --critical <% used space> --host --community --protocol \n\n"; } sub get_cpu_load { my ($snmpwalk, $target_host, $target_community, $OID,$vers) = @_; die "cannot fork: $!" unless defined($pid = open(SNMPWALK, "-|")); if ($pid) { # parent while () { my @snmpdata = split(/:/,$_); $cpu = $snmpdata[1]/100; } close(SNMPWALK) or warn "kid exited $?"; } else { # child exec($snmpwalk,'-c',$target_community,'-v',$vers,$target_host,$OID) or die "can't exec program: $!"; } } sub walk_data { #This function queries the SNMP daemon for the specific OID my ($snmpwalk, $target_host, $target_community, $OID,$vers) = @_; die "cannot fork: $!" unless defined($pid = open(SNMPWALK, "-|")); if ($pid) { # parent while () { $output = $_; sort_walk_data($output); } close(SNMPWALK) or warn "kid exited $?"; } else { # child exec($snmpwalk,'-c',$target_community,'-v',$vers,$target_host,$OID) or die "can't exec program: $!"; } } sub sort_walk_data { my ($snmp_data) = @_; @fields = split(/\./,$snmp_data); $item = $fields[8]; $filesystemID1 = $fields[9]; @fields2 = split(/=/,$fields[10]); # $filesystemID2 = $fields2[0]; $value = $fields2[1]; chomp($value); if ($value =~ /"/) { @fields3 = split(/"/,$value); $value = $fields3[1]; } if ($item == 3) { $mounted{$filesystemID1} = "$value"; } elsif ($item == 4) { $totalspace{$filesystemID1} = "$value"; } elsif ($item == 6) { $freespace{$filesystemID1} = "$value"; } elsif ($item == 10) { $filesystempath{$filesystemID1} = "$value"; } } sub show_filesystem { print "\n\nfilesystemID1\tmounted filesystem\tfilesystem path\n"; foreach $element (keys %mounted) { print "$element\t$mounted{$element}\t\t$filesystempath{$element}\n"; } print "\n\n"; } sub check_filesystem { # Warning = percentage of used space >= $warning and < $critical # Critical = percentage of used space > $warning and >= $critical # OK = percentage of used space < $warning and < $critical my ($mounted_filesystem, $warning, $critical) = @_; foreach $element (keys %mounted) { if ($mounted{$element} eq $mounted_filesystem) { my $warning_result = $totalspace{$element}*(100-$warning)/100; my $critical_result = $totalspace{$element}*(100-$critical)/100; my $result_percent = $freespace{$element}*100/$totalspace{$element}; if (($freespace{$element} <= $warning_result) && ($freespace{$element} > $critical_result)) { printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 1; } elsif ($freespace{$element} <= $critical_result) { printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 2; } else { printf "Disk ok - %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 0; } } } print "$mounted_filesystem doesn't exist in $target_host\n\n"; exit -1; } sub check_filesystemID1{ # Warning = percentage of used space >= $warning and < $critical # Critical = percentage of used space > $warning and >= $critical # OK = percentage of used space < $warning and < $critical my ($fsid1, $warning, $critical) = @_; foreach $element (keys %totalspace) { if ($element eq $fsid1) { my $warning_result = $totalspace{$element}*(100-$warning)/100; my $critical_result = $totalspace{$element}*(100-$critical)/100; my $result_percent = $freespace{$element}*100/$totalspace{$element}; if (($freespace{$element} <= $warning_result) && ($freespace{$element} >= $critical_result)) { printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 1; } elsif ($freespace{$element} <= $critical_result) { printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 2; } else { printf "Disk ok - %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; exit 0; } } } print "$fsid1 doesn't exist in $target_host\n\n"; exit -1; } sub check_cpu_5min { my ($cpu, $warn, $crit) = @_; if ($cpu >= $crit) { print "Critical- 5-min load: $cpu\n"; exit 2; } elsif ($cpu >= $warn) { print "Warning - 5-min load: $cpu\n"; exit 1; } else { print "Load ok - 5-min load: $cpu\n"; exit 0; } }