#!/usr/bin/perl

# Server Mini Monitor srvmimo
# Überwachung von Severdiensten
#
# Mirko Kulpa
# http://www.nwlab.net/tutorials/srvmimo/srvmimo.html
# Version 1.0, Dezember 2004
#

# CGI wird nur für die Fehlersuche benötigt
use CGI;
use CGI::Carp 'fatalsToBrowser';

use IO::Socket;

# Konfiguration

my $target       = 'localhost';                         # Dieser Host wird getestet, IP-Adresse oder Hostname angeben
my $showtarget   = 1;                                   # Anzeige des Targets in der Ausgabe, 0 = keine Anzeige
my $talign       = 'left';                              # Ausrichtung der Anzeige, Mögliche Werte: left | center | right
my $border       = 0;                                   # Anzeige des Rahmens, 0 = kein Rahmen
my $bgcolor      = '#f0f0f0';                           # Hintergrundfarbe festlegen, #ffffff = weiss

my $beforeheader = '<font size="1" color="#111111">';   # Fontsize und Schriftfarbe festlegen
my $afterheader  = '</font>';                           # Ausgabe erfolgt nach dem Text, 
                                                        # HTML-Tags aus $beforeheader müssen geschlossen werden

my $beforetext   = '<font size="1">';
my $aftertext    = '</font>';
my $upbgcolor    = '#7cf916';                           # Hintergrundfarbe für Service OK, #00ff00 = grün
my $downbgcolor  = '#f98f16';                           # Hintergrundfarbe für Service down, #ff0000 = rot

# Liste der TCP-Ports, die Zahlen in portnum müssen mit den Texten in portserv übereinstimmen
my @portnum  = ( 21,    22,    23,       25,     80,     143,    443);
my @portserv = ("FTP", "SSH", "Telnet", "SMTP", "HTTP", "IMAP", "HTTPS");

# Ende der Konfiguration

my ( $i, $status );

# header ausgeben
print "Content-type: text/html\nExpires: 0\n\n";

print "<table bgcolor=\"$bgcolor\" cellpadding=\"2\" cellspacing=\"2\" border=\"$border\" rules=none align=\"$talign\"><tr><td>\n";
print "<table bgcolor=\"$bgcolor\" cellpadding=\"2\" cellspacing=\"2\" border=\"0\">\n";

if ($showtarget) { print "\n<tr><td align=\"center\">" . $beforeheader . $target . $afterheader . "</td></tr>\n"; }

for ($i=0; $i <=$#portnum; $i++) {

    if ( IO::Socket::INET->new(PeerAddr=>"$target:$portnum[$i]",Proto=>'tcp',Timeout=>1) )
     { $status = $upbgcolor; }   # service up
    else
     { $status = $downbgcolor;}    # service down

    print "\n<tr><td align=\"center\" bgcolor=\"$status\">" . $beforetext . $portserv[$i] . $aftertext . "</td></tr>\n";

}

print "\n<tr><td align=\"center\">" . $beforeheader . "srvmimo 1.0 by<br><a href=\"http://www.nwlab.net\">www.nwlab.net</a>";
print $afterheader . "</td></tr>\n</table></td></tr></table>";


exit;

