#!/usr/bin/perl -w
#
# Xydroid status XML file generator
#
# (C) Copyright 2009 Rune B. Broberg
# All rights reserved
#
# This software is not for public consumption until further notice.
#
use strict;

my $file = "/var/www/xydroid/xymon.xml";

my $xml_interval   = 60;
my $prune_interval = 3600;

my $timestamp = time;
my $prunetime = time;

my %hosts = ("ds1" => "true",
             "ds2" => "true");
my %services = ("ldap" => "true");
my %exacts = ("hel:http" => "true");

my %statuses;
my %updates;
my %outputs;

while (<>) {
	chomp;
	if (m/^\@\@status/) {
        #print "DEBUG: $_\n";
		my ($type,$timestamp,$sender,$origin,$host,$service,$expiretime,$status,$flags,$oldstatus,$changetime,$ackexpiretime,$ackmessage,$disableexpiretime,$disablemessage) = split /\|/;
                next unless ($hosts{$host} || $services{$service} ||$exacts{"$host:$service"});

	    	my $output = "";

                my $i=0;
		while (<>) {
			last if m/^\@\@$/;
                        last if $i++ > 10;
                        last if length($output) > 400;
			$output .= $_;
		}

		my $name = "$host:$service";

		$timestamp = abs($timestamp);

		$statuses{$name} = $status;
		$updates{$name} = $timestamp;
		$outputs{$name} = $output;
	}

	my $newtimestamp = time;
    if ($newtimestamp - $prunetime > $prune_interval) {
        # Prune the database of services not updated since $prunetime
        my $i = 0;
        for (keys %updates) {
            if ($updates{$_} < $prunetime) {
                $i++;
                delete $updates{$_};
                delete $statuses{$_};
                delete $outputs{$_};
            }
        }
        $prunetime = time;
        print "Removed $i services\n";
    }
	if ($newtimestamp - $timestamp > $xml_interval) {
                open(FILE, '>', $file . ".new");
                print FILE "<XymonStatus updated=\"";
                print FILE scalar localtime($newtimestamp);
                print FILE "\">\n";
        my $i = 0;
		for (keys %statuses) {
                    $i++;
                    print FILE "<XymonService name=\"$_\" status=\"";
           			print FILE $statuses{$_};
                    print FILE "\" updated=\"";
                    print FILE scalar localtime($updates{$_});
                    print FILE "\"><![CDATA[";
                    print FILE $outputs{$_};
                    print FILE "]]></XymonService>\n";
		}
                print FILE "</XymonStatus>";
                close(FILE);
                rename($file . ".new", $file);
                print "Wrote $i services\n";
                $timestamp = time;
                #exit; # For debugging purposes
	}
}
