This is from a conversation on the hobbit list. It provides an example of a server-side module by Henrik.
----
I'm not familiar with Perl at all, but a couple of hours work produced this, which appears to work fine. I'll include it as a sample of how to hook into the Xymon server-side channels.
To use it, put it in your ~hobbit/server/ext/ directory, and add this to your hobbitlaunch.cfg on your server:
[rootlogin]
ENVFILE /usr/lib/hobbit/server/etc/hobbitserver.cfg
NEEDS hobbitd
CMD hobbitd_channel --channel=client --log=$BBSERVERLOGS/rootlogin.log $BBHOME/ext/rootlogin.pl
#!/usr/bin/perl -w
#*----------------------------------------------------------------------------*/
#* Xymon client message processor. */
#* */
#* This perl program shows how to create a server-side module using the */
#* data sent by the Xymon clients. This program is fed data from the */
#* Xymon "client" channel via the hobbitd_channel program; each client */
#* message is processed by looking at the [who] section and generates */
#* a "login" status that goes red when an active "root" login is found. */
#* */
#* Written 2007-Jan-28 by Henrik Storner */
#* */
#* This program is in the public domain, and may be used freely for */
#* creating your own Xymon server-side modules. */
#* */
#*----------------------------------------------------------------------------*/
# $Id: rootlogin.pl,v 1.1 2007/01/28 12:42:34 henrik Exp $
my $bb;
my $bbdisp;
my $hobbitcolumn = "login";
my $hostname = "";
my $msgtxt = "";
my %sections = ();
my $cursection = "";
sub processmessage;
# Get the BB and BBDISP environment settings.
$bb = $ENV{"BB"} || die "BB not defined";
$bbdisp = $ENV{"BBDISP"} || die "BBDISP not defined";
# Main routine.
#
# This reads client messages from , looking for the
# delimiters that separate each message, and also looking for the
# section markers that delimit each part of the client message.
# When a message is complete, the processmessage() subroutine
# is invoked. $msgtxt contains the complete message, and the
# %sections hash contains the individual sections of the client
# message.
while ($line = ) {
if ($line =~ /^\@\@client\#/) {
# It's the start of a new client message - the header looks like this:
# @@client#830759/HOSTNAME|1169985951.340108|10.60.65.152|HOSTNAME|sunos|sunos
# Grab the hostname field from the header
@hdrfields = split(/\|/, $line);
$hostname = $hdrfields[3];
# Clear the variables we use to store the message in
$msgtxt = "";
%sections = ();
}
elsif ($line =~ /^\@\@/) {
# End of a message. Do something with it.
processmessage();
}
elsif ($line =~ /^\[(.+)\]/) {
# Start of new message section.
$cursection = $1;
$sections{ $cursection } = "\n";
}
else {
# Add another line to the entire message text variable,
# and the the current section.
$msgtxt = $msgtxt . $line;
$sections{ $cursection } = $sections{ $cursection } . $line;
}
}
# This subroutine processes the client message. In this case,
# we watch the [who] section of the client message and alert
# if there is a root login active.
sub processmessage {
my $color;
my $summary;
my $statusmsg;
my $cmd;
# Dont do anything unless we have the "who" section
return unless ( $sections{"who"} );
# Is there a "root" login somewhere in the "who" section?
# Note that we must match with /m because there are multiple
# lines in the [who] section.
if ( $sections{"who"} =~ /^root /m ) {
$color = "red";
$summary = "ROOT login active";
$statusmsg = "&red ROOT login detected!\n\n" . $sections{"who"};
}
else {
$color = "green";
$summary = "OK";
$statusmsg = "&green No root login active\n\n" . $sections{"who"};
}
# Build the command we use to send a status to the Xymon daemon
$cmd = $bb . " " . $bbdisp . " \"status " . $hostname . "." . $hobbitcolumn . " " . $color . " " . $summary . "\n\n" . $statusmsg . "\"";
# And send the message
system $cmd;
}