Differences

This shows you the differences between two versions of the page.

Link to this comparison view

tutorials:ssmodule [2009/02/01 03:09] (current)
Line 1: Line 1:
 +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:
 +
 +<​code>​
 +[rootlogin]
 + ENVFILE /​usr/​lib/​hobbit/​server/​etc/​hobbitserver.cfg
 + NEEDS hobbitd
 + CMD hobbitd_channel --channel=client --log=$BBSERVERLOGS/​rootlogin.log $BBHOME/​ext/​rootlogin.pl
 +</​code>​
 +
 +<code perl>
 +#​!/​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 <​henrik@hswn.dk> ​                    */
 +#*                                                                            */
 +#* 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 <​STDIN>,​ 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 = <​STDIN>​) {
 + 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;
 +}
 +</​code>​
  • tutorials/ssmodule.txt
  • Last modified: 2009/02/01 03:09
  • (external edit)