Skip to content
Snippets Groups Projects
Commit 194d789e authored by Mark Harrison's avatar Mark Harrison
Browse files

Remove old resmon1 modules

They are still available in the resmon1 branch if needed.
parent a15fd399
No related branches found
No related tags found
No related merge requests found
Showing
with 0 additions and 735 deletions
package Resmon::Module::A1000;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $unit = $arg->{'object'};
my $output = cache_command("/usr/lib/osa/bin/healthck -a", 500);
my ($line) = grep(/^$unit:/, split(/\n/, $output));
if ($line =~ /:\s+(.+)/) {
return "OK($1)") if($1 eq $arg->{'status'};
return "BAD($1)";
}
return "BAD(no data)";
};
1;
package Resmon::Module::ADAPTEC;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
use strict;
@ISA = qw/Resmon::Module/;
# Adaptec RAID status
# requires the arcconf program to be installed (defaults to /usr/StorEdge, but
# you can specify this in the config variable arcconf.
#
# Example config:
# ADAPTEC {
# 1 : noop
# }
#
# ADAPTEC {
# 1 : arcconf => /usr/StorMan/arcconf
# }
sub handler {
my $arg = shift;
# Unit number
my $unit = $arg->{'object'};
# Path to arcconf program
my $arcconf = $arg->{'arcconf'} || '/usr/StorMan/arcconf';
my $status = "BAD";
my $message = "No output";
my $output = cache_command("$arcconf getconfig $unit AD", 500);
foreach (split(/\n/, $output)) {
if (/Logical devices\/Failed\/Degraded\s+:\s+\d+\/(\d+)\/(\d+)/) {
my $failed = $1;
my $degraded = $2;
if ($failed == 0 || $degraded == 0) {
$status = "OK";
}
$message = "$failed Failed, $degraded Degraded";
last;
}
}
return $status, $message;
};
1;
package Resmon::Module::ALTQSTAT;
use Resmon::ExtComm qw/cache_command/;
use Resmon::Module;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $os = $arg->fresh_status();
return $os if $os;
my $unit = $arg->{'object'};
my $status = cache_command("pfctl -sq 2>&1 | grep 'Bad file descriptor'", 500);
chomp $status;
if($status) {
return $arg->set_status("BAD(ALTQ needs reloading - $status)\n");
} else {
return $arg->set_status("OK(ALTQ running fine)\n");
}
};
1;
package Resmon::Module::BACULADIR;
use Resmon::ExtComm qw/cache_command/;
use Resmon::Module;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $os = $arg->fresh_status();
return $os if $os;
my $unit = $arg->{'object'};
my $status = cache_command("echo 'st dir' | /opt/bacula/sbin/bconsole | grep '^Daemon'", 500);
chomp $status;
if($status) {
return $arg->set_status("OK(UP $status)\n");
} else {
return $arg->set_status("BAD(BAD no status returned)\n");
}
};
1;
package Resmon::Module::BACULAJOBS;
use Resmon::Module;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
use lib qw(/www/CPAN/lib/site_perl /opt/CPAN/lib/site_perl);
use DBI;
use DBD::Pg;
sub handler {
my $arg = shift;
my $jobname = $arg->{'object'};
my $level = $arg->{'level'};
my $age = $arg->{'age'};
print "$jobname, $level, $age\n";
my $db_name= 'bacula';
my $db_user = 'bacula';
my $db_pass = '';
my $dsn = "DBI:Pg:database=$db_name;host=127.0.0.1;port=5432";
my $dbh = DBI->connect($dsn, $db_user, $db_pass, { PrintError => 1, AutoCommit => 1 });
my $query = "SELECT count(*) FROM job j WHERE j.name=? AND j.type='B' AND j.level=? AND j.jobstatus='T' AND j.starttime > current_timestamp - ? * interval '1 hours'";
my $sth = $dbh->prepare($query);
$sth->execute($jobname, $level, $age) || die $dbh->errstr;
my $count = $sth->fetchrow_hashref->{'count'};
my $status;
if ($count > 0) {
$status = 'OK';
} else {
$status = 'BAD';
}
$sth->finish;
$dbh->disconnect;
return $status, "$count job(s) in the last $age hours";
}
1;
package Resmon::Module::BACULATAPE;
use Resmon::ExtComm qw/cache_command/;
use Resmon::Module;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $os = $arg->fresh_status();
return $os if $os;
my $unit = $arg->{'object'};
my $drives_up = cache_command("echo 'status storage=$unit' | /opt/bacula/sbin/bconsole | /bin/grep $unit | /bin/grep Device | /bin/grep -c 'is mounted'", 500);
chomp $drives_up;
if($drives_up > 0) {
return $arg->set_status("OK($drives_up UP)\n");
} else {
return $arg->set_status("BAD($drives_up UP)\n");
}
};
1;
#!/usr/bin/perl
use strict;
package Resmon::Module::BSD_CHECK_TEMP;
use Resmon::Module;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my $DEBUG=1;
sub handler {
my $arg = shift;
my ($sensor,$chip)=split('@', $arg->{'object'});
print STDERR "sensor=$sensor; chip=$chip\n" if $DEBUG;
$sensor =~s/\+/ /g;
my $warning = $arg->{'warning'};
my $critical = $arg->{'critical'};
$warning = $critical if not $warning;
my $output = cache_command("sysctl -n hw.sensors.$chip.$sensor", 30);
print STDERR $output if $DEBUG;
my $temp;
my $units;
$output =~ m/(-?\d+\.?\d*)\s+(\w+)/;
($temp, $units) = ($1, $2);
return "OK", {
message => "$temp $units $sensor\@$chip",
temp => [$temp, "i"],
} if ($temp && ($temp < $warning));
return "WARNING", {
message => "$temp $units $sensor\@$chip",
temp => [$temp, "i"],
} if ($temp && ($temp < $critical));
return "BAD", {
message => "$temp $units $sensor@$chip",
temp => [$temp, "i"],
};
};
1;
#!/usr/bin/perl
use strict;
package Resmon::Module::BSD_DISK_TEMP;
use Resmon::Module;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my $DEBUG=2;
sub handler {
my $arg = shift;
my $disk=$arg->{'object'};
print STDERR "disk: $disk\n" if $DEBUG>1;
my $warning = $arg->{'warning'};
print STDERR "warning: $warning\n" if $DEBUG>1;
my $critical = $arg->{'critical'};
print STDERR "critical: $critical\n" if $DEBUG>1;
$warning = $critical if not $warning;
my $output = cache_command("/sbin/atactl /dev/$disk readattr", 30);
print STDERR "output:$output\n" if $DEBUG>1;
my ($line) = grep (/Temperature/, split(/\n/, $output));
print STDERR "line:$line\n" if $DEBUG>1;
print STDERR "arr:",join("|",split(/\s+/,$line)),"\n" if $DEBUG>1;
my $temp = (split(/\s+/,$line))[3];
return "OK($temp $disk)" if ($temp && ($temp<$warning));
return "WARNING($temp disk)" if ($temp && ($temp<$critical));
return "BAD($temp $disk)";
};
1;
#!/usr/bin/perl
use strict;
package Resmon::Module::CHECK_DISK_TEMP;
use Resmon::Module;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my $DEBUG=2;
sub handler {
my $arg = shift;
my $disk=$arg->{'object'};
print STDERR "disk: $disk\n" if $DEBUG>1;
my $warning = $arg->{'warning'};
print STDERR "warning: $warning\n" if $DEBUG>1;
my $critical = $arg->{'critical'};
print STDERR "critical: $critical\n" if $DEBUG>1;
$warning = $critical if not $warning;
my $output = cache_command("/usr/sbin/smartctl -a /dev/$disk", 30);
print STDERR "output:$output\n" if $DEBUG>1;
my ($line) = grep (/Current Drive Temperature/, split(/\n/, $output));
print STDERR "line:$line\n" if $DEBUG>1;
print STDERR "arr:",join("|",split(/\s+/,$line)),"\n" if $DEBUG>1;
my $temp = (split(/\s+/,$line))[3];
return "OK($temp $disk)" if ($temp && ($temp<$warning));
return "WARNING($temp disk)" if ($temp && ($temp<$critical));
return "BAD($temp $disk)";
};
1;
package Resmon::Module::DATE;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
return "OK(".time().")";
}
1;
package Resmon::Module::DHCPLEASES;
use Resmon::ExtComm qw/cache_command run_cmd/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $net = $arg->{'object'};
my $file = "/var/db/dhcpd.leases";
my %ips;
open (IN, '<', $file);
my $date = run_cmd("date -u +'%Y/%m/%d %H:%M:%S;'");
my ($actives,$mynet,$ip,$starts,$ends)=(0,'','','','');
while (<IN>) {
if (/^lease/) {
my $lease=$_;
$mynet = ($lease =~ m/($net.\d+)/);
$ip = $1;
($starts,$ends)=('','');
## print STDERR "mynet:($mynet,$net)\n";
}
if ($mynet) {
## print STDERR "in mynet:";
if(/starts/) {
s/\s+starts\s+\d\s+//;
$starts = $_;
## print STDERR "starts:($starts)\n";
}elsif (/ends/) {
s/\s+ends\s+\d\s+//;
$ends = $_;
## print STDERR "ends:($ends)\n";
}elsif (/^}/) {
if (($starts le $date ) && ($ends ge $date)){
if (!$ips{$ip}) {
$actives +=1;
$ips{$ip} = 1;
}
## print STDERR "ACTIVE!}", $_;
}else{
## print STDERR "not active}", $_;
## print STDERR "because today:($date)\n";
}
}
}elsif (/^}/) {
## print STDERR "not in mynet}", $_;
}
}
my ($warn,$crit)=($arg->{'warn'},$arg->{'crit'});
if ($actives < $warn) {
return("OK($actives leases)");
}elsif ($actives < $crit) {
return("WARNING($actives leases)");
}else {
return("BAD($actives leases)");
}
};
1;
package Resmon::Module::DNS;
use Resmon::Module;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
# Checks the dns server status on onager
sub handler {
my $self = shift;
my $object = $self->{object};
my $key = "-k $self->{key}" if $self->{key};
my $output = cache_command("rndc $key status 2>&1", 600);
if ($output) {
foreach (split(/\n/, $output)) {
if (/server is up and running/) {
return "OK", "$_";
} elsif (/^rndc: neither \S+ nor (\S+) was found$/) {
return "BAD", "Key file $1 not found";
} elsif (/connection refused/) {
return "BAD", "$_";
}
}
}
return "BAD", "no data";
}
1;
package Resmon::Module::ECCMGR;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
# Note: This requires you have access to the ecelerity control lib. The
# easiest way to do this is to start resmon using ecelerity's perl install.
use Ecelerity::Control;
# Sample config for resmon.conf
# (The module doesn't actually use anything other than 'services' to use as
# a label)
# ECCMGR {
# eccmgr : socket => /tmp/2026
# }
sub handler {
my $arg = shift;
my $proc = $arg->{'object'};
my $socket = $arg->{'socket'} || '/tmp/2026';
# Connect to ecelerity
my $ec = Ecelerity::Control->new({"Control" => $socket});
eval {
# Check the version
$version = $ec->command('version');
};
if ($@) {
# Catch any could not connect error
$@ =~ /^(.*) at/; # Fetch just the error message and no file/line no.
return "BAD($1)";
}
if ($version =~ /(eccmgr version: .*)\n/) {
return "OK($1)";
} else {
# Something other than eccmgr responded, print out a version string
$version =~ s/\n/ /g;
$version =~ s/#//g;
return "BAD(eccmgr not running: $version)";
}
};
1;
package Resmon::Module::FRESHSVN;
use strict;
use Resmon::ExtComm qw/cache_command run_cmd/;
use vars qw/@ISA/;
use File::Find;
@ISA = qw/Resmon::Module/;
sub handler {
# Find location of subversion binary
my $svn = 'svn';
for my $path (qw(/usr/local/bin /opt/omni/bin)) {
if (-x "$path/svn") {
$svn = "$path/svn";
last;
}
}
my $arg = shift;
my $dir = $arg->{'object'};
my $moutput = cache_command("$svn info $dir", 60);
my @mlines = split (/\n/,$moutput);
my ($URL,$mr);
for(@mlines) {
if (/^URL:\s*(.*)$/) { $URL=$1; }
elsif (/^Revision:\s*(\d+)/) { $mr = $1; }
}
return ("BAD(wrong URL, in conf:".$arg->{'URL'}.", checked out: $URL)") if ($URL ne $arg->{'URL'});
my $uoutput = cache_command("$svn info --non-interactive $URL", 60);
my @ulines = split (/\n/,$uoutput);
my ($ur);
for(@ulines) {
if (/^Last Changed Rev:\s*(\d+)/) { $ur = $1; }
}
if(!$ur){ return "BAD(Unable to determine latest revision in repository)"; }
if($ur <= $mr){ return "OK(rev:$ur)"; }
else{
my ($cY,$cM,$cD,$ch,$cm,$cs) = split (/ /,
run_cmd("date '+%Y %m %d %H %M %S'"));
my $cTime=$cs+60*($cm+60*($ch+24*($cD+31*($cM+12*$cY))));
my $dNow = "$cM/$cD/$cY $ch:$cm:$cs"; chomp $dNow;
my ($uY,$uM,$uD,$uh,$um,$us);
for(@ulines) {
if (/^Last Changed Date:\s*(\d{4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{2}):(\d{2})/) {
($uY,$uM,$uD,$uh,$um,$us) = ($1,$2,$3,$4,$5,$6);
}
}
my $uTime = $us+60*($um+60*($uh+24*($uD+31*($uM+12*$uY))));
my $dCommitted = "$uM/$uD/$uY $uh:$um:$us";
my $lag=$cTime-$uTime;
my $maxlag=$arg->{'maxlag'}*60 || 330;
if ($lag <= $maxlag){
return "OK(delay $lag is less than $maxlag)";
}
elsif ( ( ($us+60*($um+60*($uh+24*$uD))) < $maxlag )
&& ( ($cs+60*($cm+60*($ch+24*$cD))) < 2 * $maxlag )
)
{
return("WARNING(check unreliable, check later)");
}
else {
return("BAD(now $dNow, my rev:$mr, repo rev:$ur, committed: $dCommitted)");
}
}
}
1;
#!/usr/bin/perl
use strict;
package Resmon::Module::LINUX_CHECK_TEMP;
use Resmon::Module;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my $DEBUG=0;
sub handler {
my $arg = shift;
my ($sensor,$chip)=split('@', $arg->{'object'});
print STDERR "sensor=$sensor; chip=$chip\n" if $DEBUG;
$sensor =~s/\+/ /g;
my $warning = $arg->{'warning'};
my $critical = $arg->{'critical'};
$warning = $critical if not $warning;
my $output = cache_command("/usr/bin/sensors $chip", 30);
print STDERR $output if $DEBUG;
my @lines = split(/\n/, $output);
my ($temp,$continues);
for my $line (@lines) {
if ($line =~ /^$sensor:\s*[+-]?([\d.]+)/) {
$temp=$1;
## print "case 1 temp:$temp line $line\n" if $DEBUG>1;
last;
}
elsif($line =~ /^$sensor:/){
$continues = 1;
## print "case 2 continues: $line\n" if $DEBUG>1;
}elsif ($line =~ /^\S/) {
$continues = 0;
## print "case 3 discontinues: $line\n" if $DEBUG>1;
}
if($continues && $line =~ /^\s*[+-]?([\d.]*)°C/){
$temp=$1;
## print "case 4 temp:$temp line $line\n" if $DEBUG>1;
last;
}
## print "case 5 continues=$continues and line $line\n" if $DEBUG>1;
}
return "OK($temp $sensor\@$chip)" if ($temp && ($temp<$warning));
return "WARNING($temp $sensor\@$chip)" if ($temp && ($temp<$critical));
return "BAD($temp $sensor@$chip)";
};
1;
package Resmon::Module::LOGFILE;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my %logfile_stats;
sub handler {
my $arg = shift;
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 "BAD($arg->{nerrs}: $arg->{errors})";
}
return "OK(0)";
}
} else {
# File is a different file now
$arg->{lastsize} = 0;
$arg->{nerrs} = 0;
$arg->{errors} = '';
}
}
if(!open(LOG, "<$file")) {
return "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 "BAD($arg->{nerrs}: $arg->{errors})";
}
return "OK(0)";
}
1;
package Resmon::Module::MDSTAT;
use strict;
use Resmon::ExtComm qw/cache_command/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
my $statfile = '/proc/mdstat';
sub handler {
my $arg = shift;
open FH, "<$statfile";
my $getnext = 0;
my $status = "OK";
my @message = ();
my $array = "";
while (<FH>) {
chomp;
if (/^(md[0-9]+)\s*:\s+/) {
$array = $1;
my $messageline = "$array ";
my @baddevs = ();
foreach my $part (split(/ /,"$'")) {
if ($part eq "active") {
$messageline .= "active ";
} elsif ($part eq "inactive") {
$status = "BAD";
$messageline .= "inactive ";
} elsif ($part =~ /^([a-z0-9]+)\[(\d+)\](?:\((\S+)\))?$/) {
if ($3 eq "F") {
$status = "BAD";
push @baddevs, $1;
}
}
}
chop $messageline;
if (@baddevs) {
$messageline = "$messageline - " . join(', ', @baddevs) .
" faulted";
}
push @message, $messageline;
} elsif (/\[([U_]+)\]/) {
my $devices = $1;
my $count = ($devices =~ tr/_//);
if ($count > 0) {
$status = "BAD";
# Plural if required
my $s = '';
if ($count > 1) {
$s = 's';
}
push @message, "$array - $count device$s down";
}
}
}
return $status, join('; ', @message);
};
1;
package Resmon::Module::NAGIOS;
use Resmon::ExtComm qw/cache_command run_cmd/;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
# Runs a nagios check script as a resmon check
# Example config file:
# NAGIOS {
# /path/to/check_something : args => -a my args
# /path/to/check_something_else : args => -a my args -w 10 -c 20
# }
sub handler {
my $arg = shift;
my $script = $arg->{'object'} || return "BAD", "No script specified";
my $scriptargs = $arg->{'args'};
my $output = run_cmd("$script $scriptargs");
my $retval = $?;
if ($retval == -1) {
return "BAD", "command returning -1";
}
$retval = $retval >> 8;
my $status = "BAD";
# 0 - OK, 1 - WARNING, 2 - CRITICAL, 3 - UNKNOWN
# Treat UNKNOWN (and any other return code) as bad
if ($retval == 0) {
$status = "OK";
} elsif ($retval == 1) {
$status = "WARNING";
} elsif ($retval == 3) {
$output = "UNKNOWN: $output";
}
if ($output) {
($output, $perfdata) = split(/\s*\|\s*/, $output, 2);
chomp($output);
chomp($perfdata);
# This will show up in the resmon status page
if ($perfdata) {
$arg->{'perfdata'} = $perfdata;
}
return $status, $output;
} else {
return "BAD", "No output from check";
}
}
1;
package Resmon::Module::NETBACKUPTAPE;
use Resmon::ExtComm qw/cache_command/;
use Resmon::Module;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $unit = $arg->{'object'};
my $output = cache_command("/usr/openv/volmgr/bin/vmoprcmd -d ds", 500);
my $down = 0;
my $up = 0;
foreach my $line (split(/\n/, $output)) {
if ($line =~ /^\s*(\d+)\s+\S+\s+(\S+)/) {
my $tape = $1;
if($2 =~ /DOWN/) { $down++; }
else { $up++; }
}
}
if($down || !$up) {
return "BAD($up UP, $down DOWN)\n";
}
return "OK($up UP)\n";
};
1;
package Resmon::Module::PING;
use Resmon::ExtComm qw/cache_command/;
use Resmon::Module;
use Switch;
use vars qw/@ISA/;
@ISA = qw/Resmon::Module/;
sub handler {
my $arg = shift;
my $host = $arg->{'object'};
# Limit in ms above which to go critical
my $limit = $arg->{'limit'} || "200";
switch ($^O) {
case 'solaris' {
$pingcmd = "ping -s $host 56 1"}
else {
$pingcmd = "ping -c 1 $host"}
}
my $output = cache_command($pingcmd, 30);
my ($line) = grep(/bytes from\s*/, split(/\n/, $output));
if(my ($ms) = $line =~ /time= ?([0-9.]+) ?ms/) {
if($ms <= $limit) {
return "OK", "$ms ms";
}
return "BAD", "$ms ms";
}
return "BAD", "no data";
}
1;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment