Attached is "monfailures", a simple command line Mon client that does
a "list failures" and outputs a short summary. It's meant for the staff
at my shop who are too lazy to fire up their Web browsers to check
Mon. I can add this command to their .profile so at least they
will see any failures when they log in each morning.
A typical invocation of "monfailures" would look like this (we hope):
$ monfailures
No failures found.
And if something Mon was watching had failed, you might see a list
like this:
Hostgroup:Service Down Since Error Summary
----------------- ---------- -------------
frog-servers:ping Fri Jan 11 04:58:40 [acked] frog1
msmail:smtp999 Fri Jan 11 04:58:54 msmail33
Note the "[acked]" flag for an acknowledged failure.
Since in my shop, the Mon username and password are hardcoded in
the script (got to make it easy for those lazy operators :-), I
put the script into inetd on a high-numbered port so the staff can
do something like "netcat monhost 12345" to see the current status
(actually, I wrote a short script to do that to further ease the
burden on the command-line challenged folks).
-- Ed
#!/usr/bin/perl -w
# Quickly show Mon failure status from command line.
# to configure, hard-code the user and password for either
# your public Mon username or a username that is only allowed
# to use the "list" command and nothing else. I run this
# script out of inetd on the mon server so the people who can
# see its results can't read the script (and see the hard-coded
# password).
# Written by Ed Ravin <[EMAIL PROTECTED]> Wed Jan 2 12:23:44 EST 2002
# Release Version: 1.2
# $Header$
use strict;
my %opt;
use Getopt::Long;
GetOptions (\%opt, "debug", "server=s", "port=s", "user=s", "password=s");
############################ configurable stuff
my $default_user="readonly";
my $default_password= "public";
############################
my $debug= $opt{'debug'} || 0;
my (%failures);
my ($now);
use Mon::Client;
my $mon;
# find the client
if (!defined ($mon = Mon::Client->new)) {
die "$0: could not create client object: $@";
}
if (defined $opt{'server'}) {
$mon->host ($opt{'server'});
}
else {
$mon->host ("localhost");
}
$mon->port ($opt{'port'}) if (defined $opt{'port'});
$mon->username($opt{'user'} || $default_user);
$mon->password($opt{'password'} || $default_password);
$mon->connect;
die "$0: Could not connect to server: " . $mon->error . "\n"
unless $mon->connected;
$mon->login;
die "$0: login failure: " . $mon->error . "\n" if $mon->error;
# Load data from Mon
%failures = $mon->list_failures;
die "$0: Error doing list_failures : " . $mon->error
if ($mon->error);
$now= time; # time mon data was fetched
# group=thathost service=port8888 opstatus=0 last_opstatus=0 exitval=1 timer=11
# last_success=0 last_trap=0 last_check=955058065 ack=0 ackcomment=''
# alerts_sent=0 depstatus=0 depend='' monitor='tcp.monitor -p 8888'
# last_summary='thathost'
# last_detail='\0athathost could not connect: Connection refused\0a'
# last_failure=955058067 interval=60 first_failure=955055062
# failure_duration=3052
my ($watch, $service, $downtime, $summary, $acked);
format STDOUT_TOP =
Hostgroup:Service Down Since Error Summary
----------------- ---------- -------------
.
format STDOUT =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<
$watch . ":" . $service, $downtime, $summary
.
# list out any failures
if (%failures)
{
foreach $watch (keys %failures) {
foreach $service (keys %{$failures{$watch}}) {
my $sref= \%{$failures{$watch}->{$service}};
$downtime= localtime $sref->{'first_failure'};
$acked= $sref->{'ack'} !=0;
$summary= $sref->{'last_summary'};
$summary= "[acked] $summary" if $acked;
write;
}
}
print "\n";
exit(1);
}
else
{
print "No failures found.\n";
exit(0);
}