diff --git a/lib/Resmon/Module.pm b/lib/Resmon/Module.pm index cb80c510af4645ca1185c98e6e303617961908f9..90bcab067f6c8ea1570f5bc755146b08a722b1bc 100755 --- a/lib/Resmon/Module.pm +++ b/lib/Resmon/Module.pm @@ -73,186 +73,6 @@ sub config_as_hash { } return $conf; } -#### Begin actual monitor functions #### - -package Resmon::Module::DATE; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $arg->set_status("OK(".time().")"); -} - -package Resmon::Module::DISK; -use Resmon::ExtComm qw/cache_command/; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -my $dfcmd = ($^O eq 'linux') ? 'df -kP' : 'df -k'; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $devorpart = $arg->{'object'}; - my $output = cache_command("$dfcmd", 120); - my ($line) = grep(/$devorpart\s*/, split(/\n/, $output)); - if($line =~ /(\d+)%/) { - if($1 > $arg->{'limit'}) { - return $arg->set_status("BAD($1% full)"); - } - if(exists $arg->{'warnat'} && $1 > $arg->{'warnat'}) { - return $arg->set_status("WARNING($1% full)"); - } - return $arg->set_status("OK($1% full)"); - } - return $arg->set_status("BAD(no data)"); -} - -package Resmon::Module::LOGFILE; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -my %logfile_stats; -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $file = $arg->{'object'}; - my $match = $arg->{'match'}; - my $max = $arg->{'max'} || 8; - my @statinfo = stat($file); - if(exists($arg->{file_dev})) { - if(($arg->{file_dev} == $statinfo[0]) && - ($arg->{file_ino} == $statinfo[1])) { - if($arg->{lastsize} == $statinfo[7]) { - if($arg->{errors}) { - return $arg->set_status("BAD($arg->{nerrs}: $arg->{errors})"); - } - return $arg->set_status("OK(0)"); - } - } else { - # File is a different file now - $arg->{lastsize} = 0; - $arg->{nerrs} = 0; - $arg->{errors} = ''; - } - } - if(!open(LOG, "<$file")) { - return $arg->set_status("BAD(ENOFILE)"); - } - seek(LOG, $arg->{lastsize}, 0); - - while(<LOG>) { - chomp; - if(/$match/) { - if($arg->{nerrs} < $max) { - $arg->{errors} .= " " if(length($arg->{errors})); - $arg->{errors} .= $_; - } - $arg->{nerrs}++; - } - } - - # Remember where we were - $arg->{file_dev} = $statinfo[0]; - $arg->{file_ino} = $statinfo[1]; - $arg->{lastsize} = $statinfo[7]; - - if($arg->{nerrs}) { - return $arg->set_status("BAD($arg->{nerrs}: $arg->{errors})"); - } - return $arg->set_status("OK(0)"); -} - -package Resmon::Module::FILESIZE; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $file = $arg->{'object'}; - my @statinfo = stat($file); - my $size = $statinfo[7]; - my $minsize = $arg->{minimum}; - my $maxsize = $arg->{maximum}; - return $arg->set_status("BAD(too big, $size > $maxsize)") - if($maxsize && ($size > $maxsize)); - return $arg->set_status("BAD(too small, $size < $minsize)") - if($minsize && ($size > $minsize)); - return $arg->set_status("OK($size)"); -} - -package Resmon::Module::REMOTEFILESIZE; -use vars qw/@ISA/; -use Resmon::ExtComm qw/cache_command/; -@ISA = qw/Resmon::Module/; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $host = $arg->{'host'}; - my $file = $arg->{'object'}; - my $output = cache_command("ssh -i /root/.ssh/id_dsa $host du -b $file", 600); - $output =~ /^(\d+)\s/; - my $size = $1; - my $minsize = $arg->{minimum}; - my $maxsize = $arg->{maximum}; - return $arg->set_status("BAD(too big, $size > $maxsize)") - if($maxsize && ($size > $maxsize)); - return $arg->set_status("BAD(too small, $size < $minsize)") - if($minsize && ($size > $minsize)); - return $arg->set_status("OK($size)"); -} - -package Resmon::Module::FILEAGE; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $file = $arg->{'object'}; - my @statinfo = stat($file); - my $age = time() - $statinfo[9]; - return $arg->set_status("BAD(too old $age seconds)") - if($arg->{maximum} && ($age > $arg->{maximum})); - return $arg->set_status("BAD(too new $age seconds)") - if($arg->{minimum} && ($age > $arg->{minimum})); - return $arg->set_status("OK($age)"); -} - -package Resmon::Module::NETSTAT; -use Resmon::ExtComm qw/cache_command/; -use vars qw/@ISA/; -@ISA = qw/Resmon::Module/; - -sub handler { - my $arg = shift; - my $os = $arg->fresh_status(); - return $os if $os; - my $output = cache_command("netstat -an", 30); - my @lines = split(/\n/, $output); - @lines = grep(/\s$arg->{state}\s*$/, @lines) if($arg->{state}); - @lines = grep(/^$arg->{localip}/, @lines) if($arg->{localip}); - @lines = grep(/^\s*[\w\d\*\.]+.*[\.\:]+$arg->{localport}/, @lines) if($arg->{localport}); - @lines = grep(/[\d\*\.]+\d+\s+$arg->{remoteip}/, @lines) - if($arg->{remoteip}); - @lines = grep(/[\d\*\.]+\s+[\d\*\.]+[\.\:]+$arg->{remoteport}\s+/, @lines) - if($arg->{remoteport}); - my $count = scalar(@lines); - return $arg->set_status("BAD($count)") - if($arg->{limit} && ($count > $arg->{limit})); - return $arg->set_status("BAD($count)") - if($arg->{atleast} && ($count < $arg->{atleast})); - return $arg->set_status("OK($count)"); -} $rmloading = "Demand loading"; 1; diff --git a/lib/Resmon/Module/A1000.pm b/lib/Resmon/Module/A1000.pm index 72825c409d5813ed1d10884a5634e89d5d0f7df5..9a59c1ec2242838409a3421981acd5303980e172 100644 --- a/lib/Resmon/Module/A1000.pm +++ b/lib/Resmon/Module/A1000.pm @@ -16,4 +16,4 @@ sub handler { } return $arg->set_status("BAD(no data)"); }; - +1; diff --git a/lib/Resmon/Module/DATE.pm b/lib/Resmon/Module/DATE.pm new file mode 100644 index 0000000000000000000000000000000000000000..498b6f31ef7dfee4d6f7929e324daf2af429bd82 --- /dev/null +++ b/lib/Resmon/Module/DATE.pm @@ -0,0 +1,11 @@ +package Resmon::Module::DATE; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $arg->set_status("OK(".time().")"); +} + +1; diff --git a/lib/Resmon/Module/DHCPLEASES.pm b/lib/Resmon/Module/DHCPLEASES.pm index f8dbad1bb6594450bd15aad6ac6c5e066c394c33..0db8af09da2e4348bcc2e12a87d929530b5cd43b 100755 --- a/lib/Resmon/Module/DHCPLEASES.pm +++ b/lib/Resmon/Module/DHCPLEASES.pm @@ -51,3 +51,4 @@ sub handler { return($arg->set_status("BAD($actives leases > $crit!)")); } }; +1; diff --git a/lib/Resmon/Module/DISK.pm b/lib/Resmon/Module/DISK.pm new file mode 100644 index 0000000000000000000000000000000000000000..a443e7775b44e88aaa1537105e11acd1cfc3fd18 --- /dev/null +++ b/lib/Resmon/Module/DISK.pm @@ -0,0 +1,26 @@ +package Resmon::Module::DISK; +use Resmon::ExtComm qw/cache_command/; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +my $dfcmd = ($^O eq 'linux') ? 'df -kP' : 'df -k'; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $devorpart = $arg->{'object'}; + my $output = cache_command("$dfcmd", 120); + my ($line) = grep(/$devorpart\s*/, split(/\n/, $output)); + if($line =~ /(\d+)%/) { + if($1 > $arg->{'limit'}) { + return $arg->set_status("BAD($1% full)"); + } + if(exists $arg->{'warnat'} && $1 > $arg->{'warnat'}) { + return $arg->set_status("WARNING($1% full)"); + } + return $arg->set_status("OK($1% full)"); + } + return $arg->set_status("BAD(no data)"); +} +1; diff --git a/lib/Resmon/Module/ECCMGR.pm b/lib/Resmon/Module/ECCMGR.pm index b9f20ea726e8d0e1e740f43c11bb9435d0658d8a..0b032173bb9084e8a292de9f4a3f4fcb95158c29 100644 --- a/lib/Resmon/Module/ECCMGR.pm +++ b/lib/Resmon/Module/ECCMGR.pm @@ -40,4 +40,4 @@ sub handler { return $arg->set_status("BAD(eccmgr not running: $version)"); } }; - +1; diff --git a/lib/Resmon/Module/FAULTS.pm b/lib/Resmon/Module/FAULTS.pm index e79c2c780f70c0034a37f254e040ef3b6a163f87..8c3e5315e478f34055c2460966af5165f1ac87a8 100755 --- a/lib/Resmon/Module/FAULTS.pm +++ b/lib/Resmon/Module/FAULTS.pm @@ -16,4 +16,4 @@ sub handler { } return $arg->set_status("OK(no faults)"); }; - +1; diff --git a/lib/Resmon/Module/FILEAGE.pm b/lib/Resmon/Module/FILEAGE.pm new file mode 100644 index 0000000000000000000000000000000000000000..7ec6c22fa4d45a503b6e34aa31c26d7a0b53f571 --- /dev/null +++ b/lib/Resmon/Module/FILEAGE.pm @@ -0,0 +1,18 @@ +package Resmon::Module::FILEAGE; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $file = $arg->{'object'}; + my @statinfo = stat($file); + my $age = time() - $statinfo[9]; + return $arg->set_status("BAD(too old $age seconds)") + if($arg->{maximum} && ($age > $arg->{maximum})); + return $arg->set_status("BAD(too new $age seconds)") + if($arg->{minimum} && ($age > $arg->{minimum})); + return $arg->set_status("OK($age)"); +} +1; diff --git a/lib/Resmon/Module/FILESIZE.pm b/lib/Resmon/Module/FILESIZE.pm new file mode 100644 index 0000000000000000000000000000000000000000..d279b947a9af052a5c42afce30bf5f03d093c758 --- /dev/null +++ b/lib/Resmon/Module/FILESIZE.pm @@ -0,0 +1,20 @@ +package Resmon::Module::FILESIZE; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $file = $arg->{'object'}; + my @statinfo = stat($file); + my $size = $statinfo[7]; + my $minsize = $arg->{minimum}; + my $maxsize = $arg->{maximum}; + return $arg->set_status("BAD(too big, $size > $maxsize)") + if($maxsize && ($size > $maxsize)); + return $arg->set_status("BAD(too small, $size < $minsize)") + if($minsize && ($size > $minsize)); + return $arg->set_status("OK($size)"); +} +1; diff --git a/lib/Resmon/Module/FRESHSVN.pm b/lib/Resmon/Module/FRESHSVN.pm index b2b5de8f3d9b05610ff7b70c8bd19cb425bde0b6..e15946f1daef2007ecc3af65ed672547dccd59e0 100644 --- a/lib/Resmon/Module/FRESHSVN.pm +++ b/lib/Resmon/Module/FRESHSVN.pm @@ -63,3 +63,4 @@ sub handler { } } } +1; diff --git a/lib/Resmon/Module/INODES.pm b/lib/Resmon/Module/INODES.pm index b76c64ff4014c0848cfc45af8bd1f12a403417d8..9d5bbcff26dbe458ef2eb62f63046640e2c17b17 100644 --- a/lib/Resmon/Module/INODES.pm +++ b/lib/Resmon/Module/INODES.pm @@ -34,4 +34,3 @@ sub handler { } 1; - diff --git a/lib/Resmon/Module/LOGFILE.pm b/lib/Resmon/Module/LOGFILE.pm new file mode 100644 index 0000000000000000000000000000000000000000..805c54d756087b909f51b6852cc3a053f7ccbced --- /dev/null +++ b/lib/Resmon/Module/LOGFILE.pm @@ -0,0 +1,56 @@ +package Resmon::Module::LOGFILE; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +my %logfile_stats; +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $file = $arg->{'object'}; + my $match = $arg->{'match'}; + my $max = $arg->{'max'} || 8; + my @statinfo = stat($file); + if(exists($arg->{file_dev})) { + if(($arg->{file_dev} == $statinfo[0]) && + ($arg->{file_ino} == $statinfo[1])) { + if($arg->{lastsize} == $statinfo[7]) { + if($arg->{errors}) { + return $arg->set_status("BAD($arg->{nerrs}: $arg->{errors})"); + } + return $arg->set_status("OK(0)"); + } + } else { + # File is a different file now + $arg->{lastsize} = 0; + $arg->{nerrs} = 0; + $arg->{errors} = ''; + } + } + if(!open(LOG, "<$file")) { + return $arg->set_status("BAD(ENOFILE)"); + } + seek(LOG, $arg->{lastsize}, 0); + + while(<LOG>) { + chomp; + if(/$match/) { + if($arg->{nerrs} < $max) { + $arg->{errors} .= " " if(length($arg->{errors})); + $arg->{errors} .= $_; + } + $arg->{nerrs}++; + } + } + + # Remember where we were + $arg->{file_dev} = $statinfo[0]; + $arg->{file_ino} = $statinfo[1]; + $arg->{lastsize} = $statinfo[7]; + + if($arg->{nerrs}) { + return $arg->set_status("BAD($arg->{nerrs}: $arg->{errors})"); + } + return $arg->set_status("OK(0)"); +} +1; diff --git a/lib/Resmon/Module/NETBACKUPTAPE.pm b/lib/Resmon/Module/NETBACKUPTAPE.pm index 59dbef5a5affe07abf6e3a1ad19078d2d19f98b4..750cc70598bf2dec350e8de327c5d8a05240528b 100644 --- a/lib/Resmon/Module/NETBACKUPTAPE.pm +++ b/lib/Resmon/Module/NETBACKUPTAPE.pm @@ -24,4 +24,4 @@ sub handler { } return $arg->set_status("OK($up UP)\n"); }; - +1; diff --git a/lib/Resmon/Module/NETSTAT.pm b/lib/Resmon/Module/NETSTAT.pm new file mode 100644 index 0000000000000000000000000000000000000000..2c38e1946190cd4f255acb0064d8f4459be6c0f1 --- /dev/null +++ b/lib/Resmon/Module/NETSTAT.pm @@ -0,0 +1,26 @@ +package Resmon::Module::NETSTAT; +use Resmon::ExtComm qw/cache_command/; +use vars qw/@ISA/; +@ISA = qw/Resmon::Module/; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $output = cache_command("netstat -an", 30); + my @lines = split(/\n/, $output); + @lines = grep(/\s$arg->{state}\s*$/, @lines) if($arg->{state}); + @lines = grep(/^$arg->{localip}/, @lines) if($arg->{localip}); + @lines = grep(/^\s*[\w\d\*\.]+.*[\.\:]+$arg->{localport}/, @lines) if($arg->{localport}); + @lines = grep(/[\d\*\.]+\d+\s+$arg->{remoteip}/, @lines) + if($arg->{remoteip}); + @lines = grep(/[\d\*\.]+\s+[\d\*\.]+[\.\:]+$arg->{remoteport}\s+/, @lines) + if($arg->{remoteport}); + my $count = scalar(@lines); + return $arg->set_status("BAD($count)") + if($arg->{limit} && ($count > $arg->{limit})); + return $arg->set_status("BAD($count)") + if($arg->{atleast} && ($count < $arg->{atleast})); + return $arg->set_status("OK($count)"); +} +1; diff --git a/lib/Resmon/Module/PGREP.pm b/lib/Resmon/Module/PGREP.pm index 046fe4cb70ef819270ac06d03822d5a066c03582..6947e1f2b419c8dd097b57a3ee3a9027320bf6c0 100755 --- a/lib/Resmon/Module/PGREP.pm +++ b/lib/Resmon/Module/PGREP.pm @@ -17,4 +17,4 @@ sub handler { } return($arg->set_status("BAD(no output)")); }; - +1; diff --git a/lib/Resmon/Module/REMOTEFILESIZE.pm b/lib/Resmon/Module/REMOTEFILESIZE.pm new file mode 100644 index 0000000000000000000000000000000000000000..7ad85aa2047df2ee874a9e0de534ee729d2f67dd --- /dev/null +++ b/lib/Resmon/Module/REMOTEFILESIZE.pm @@ -0,0 +1,23 @@ +package Resmon::Module::REMOTEFILESIZE; +use vars qw/@ISA/; +use Resmon::ExtComm qw/cache_command/; +@ISA = qw/Resmon::Module/; + +sub handler { + my $arg = shift; + my $os = $arg->fresh_status(); + return $os if $os; + my $host = $arg->{'host'}; + my $file = $arg->{'object'}; + my $output = cache_command("ssh -i /root/.ssh/id_dsa $host du -b $file", 600); + $output =~ /^(\d+)\s/; + my $size = $1; + my $minsize = $arg->{minimum}; + my $maxsize = $arg->{maximum}; + return $arg->set_status("BAD(too big, $size > $maxsize)") + if($maxsize && ($size > $maxsize)); + return $arg->set_status("BAD(too small, $size < $minsize)") + if($minsize && ($size > $minsize)); + return $arg->set_status("OK($size)"); +} +1; diff --git a/lib/Resmon/Module/SMFMAINTENANCE.pm b/lib/Resmon/Module/SMFMAINTENANCE.pm index ec0992f4c8891b6aa59a849eefbbc3dab702605b..aa92b4ecf4790ba24517dbd31d4b01d05212ebe0 100755 --- a/lib/Resmon/Module/SMFMAINTENANCE.pm +++ b/lib/Resmon/Module/SMFMAINTENANCE.pm @@ -24,3 +24,4 @@ sub handler { } return $arg->set_status("OK(no services in maintenance mode)"); }; +1; diff --git a/lib/Resmon/Module/WALCHECK.pm b/lib/Resmon/Module/WALCHECK.pm index 220f100a30b57fe052e9316f0f78f9d97418b8af..e41ab8e7fafeb683ad506ceda3e85a99cded7798 100644 --- a/lib/Resmon/Module/WALCHECK.pm +++ b/lib/Resmon/Module/WALCHECK.pm @@ -64,4 +64,4 @@ sub handler { return $arg->set_status( "OK(pitr replay is $tsplit[2] hours, $tsplit[1] minutes behind)"); } } - +1; diff --git a/lib/Resmon/Module/ZIMBRA.pm b/lib/Resmon/Module/ZIMBRA.pm index c52b24eaa67041f9f4c5fc22cab55c8bb9e325f8..0f0c534746e5d1f4e203a445f4d7f61a65cf214d 100644 --- a/lib/Resmon/Module/ZIMBRA.pm +++ b/lib/Resmon/Module/ZIMBRA.pm @@ -16,3 +16,4 @@ sub handler { } return $arg->set_status("OK(All services running)"); }; +1; diff --git a/lib/Resmon/Module/ZPOOL.pm b/lib/Resmon/Module/ZPOOL.pm index 3fda6aa7678a9989f5ef8dc6cecf816f9dc90a2c..fd5bf6b8283f6e74ba3c2b197b545e39e9e01b7a 100644 --- a/lib/Resmon/Module/ZPOOL.pm +++ b/lib/Resmon/Module/ZPOOL.pm @@ -21,3 +21,4 @@ sub handler { } return $arg->set_status("OK(all pools are healthy)"); }; +1; diff --git a/lib/Resmon/Module/ZPOOLERRS.pm b/lib/Resmon/Module/ZPOOLERRS.pm index 542d9585e9cc720ceb69eea14b4a9760f001febb..aca9814ccb0652824d85f40a4abf69661c557654 100755 --- a/lib/Resmon/Module/ZPOOLERRS.pm +++ b/lib/Resmon/Module/ZPOOLERRS.pm @@ -46,3 +46,4 @@ sub handler { } return "BAD", "no data" }; +1;