From 748aca8e44f7a19fb38f861ea67990fb00933a94 Mon Sep 17 00:00:00 2001 From: Mark Harrison <mark@omniti.com> Date: Thu, 15 May 2008 21:48:02 +0000 Subject: [PATCH] Split out the modules from Modules.pm to the Modules/ directory. Also made sure each module returned a true value. git-svn-id: https://labs.omniti.com/resmon/trunk@92 8c0face9-b7db-6ec6-c4b3-d5f7145c7d55 --- lib/Resmon/Module.pm | 180 ---------------------------- lib/Resmon/Module/A1000.pm | 2 +- lib/Resmon/Module/DATE.pm | 11 ++ lib/Resmon/Module/DHCPLEASES.pm | 1 + lib/Resmon/Module/DISK.pm | 26 ++++ lib/Resmon/Module/ECCMGR.pm | 2 +- lib/Resmon/Module/FAULTS.pm | 2 +- lib/Resmon/Module/FILEAGE.pm | 18 +++ lib/Resmon/Module/FILESIZE.pm | 20 ++++ lib/Resmon/Module/FRESHSVN.pm | 1 + lib/Resmon/Module/INODES.pm | 1 - lib/Resmon/Module/LOGFILE.pm | 56 +++++++++ lib/Resmon/Module/NETBACKUPTAPE.pm | 2 +- lib/Resmon/Module/NETSTAT.pm | 26 ++++ lib/Resmon/Module/PGREP.pm | 2 +- lib/Resmon/Module/REMOTEFILESIZE.pm | 23 ++++ lib/Resmon/Module/SMFMAINTENANCE.pm | 1 + lib/Resmon/Module/WALCHECK.pm | 2 +- lib/Resmon/Module/ZIMBRA.pm | 1 + lib/Resmon/Module/ZPOOL.pm | 1 + lib/Resmon/Module/ZPOOLERRS.pm | 1 + 21 files changed, 192 insertions(+), 187 deletions(-) create mode 100644 lib/Resmon/Module/DATE.pm create mode 100644 lib/Resmon/Module/DISK.pm create mode 100644 lib/Resmon/Module/FILEAGE.pm create mode 100644 lib/Resmon/Module/FILESIZE.pm create mode 100644 lib/Resmon/Module/LOGFILE.pm create mode 100644 lib/Resmon/Module/NETSTAT.pm create mode 100644 lib/Resmon/Module/REMOTEFILESIZE.pm diff --git a/lib/Resmon/Module.pm b/lib/Resmon/Module.pm index cb80c51..90bcab0 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 72825c4..9a59c1e 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 0000000..498b6f3 --- /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 f8dbad1..0db8af0 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 0000000..a443e77 --- /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 b9f20ea..0b03217 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 e79c2c7..8c3e531 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 0000000..7ec6c22 --- /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 0000000..d279b94 --- /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 b2b5de8..e15946f 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 b76c64f..9d5bbcf 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 0000000..805c54d --- /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 59dbef5..750cc70 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 0000000..2c38e19 --- /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 046fe4c..6947e1f 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 0000000..7ad85aa --- /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 ec0992f..aa92b4e 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 220f100..e41ab8e 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 c52b24e..0f0c534 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 3fda6aa..fd5bf6b 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 542d958..aca9814 100755 --- a/lib/Resmon/Module/ZPOOLERRS.pm +++ b/lib/Resmon/Module/ZPOOLERRS.pm @@ -46,3 +46,4 @@ sub handler { } return "BAD", "no data" }; +1; -- GitLab