Hi list,

We have some citrix servers over here we want to monitor. Below you can find 
the code of our citrix.monitor

Jeroen


--- citrix.monitor ---

#!/usr/bin/perl -w
#
# try to connect to a citrix server and wait for the ica prompt.
#
# Arguments are "host [host...]"
#
# Jeroen Moors, [EMAIL PROTECTED]
#
#    Copyright (C) 2005, Jeroen Moors
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
use Getopt::Std;
use Socket;

my %opt;
getopts ("t:", \%opt);

my $PORT = 1494;
my $TIMEOUT = $opt{"t"} || 10;

my @failures = ();
my @detail = ();

my $ALARM = 0;

foreach my $host (@ARGV) {
    my $pro = getprotobyname ('tcp');

    if (!defined $pro) {
        die "could not getprotobyname\n";
    }

    if (!defined socket (S, PF_INET, SOCK_STREAM, $pro)) {
        die "could not create socket: $!\n";
    }

    my $a = inet_aton ($host);
    if (!defined $a) {
        push @failures, $host;
        push @detail, "$host could not inet_aton";
        close (S);
        next;
    }

    my $sin = sockaddr_in ($PORT, $a);
    if (!defined $sin) {
        push @failures, $host;
        push @detail, "$host could not sockaddr_in";
        close (S);
        next;
    }

    my $r;

    eval {
        local $SIG{"ALRM"} = sub { die "alarm\n" };

        alarm $TIMEOUT;

        $r = connect (S, $sin);
        my $return_string;
        while (my $char = getc(S)) {
                $return_string .= $char;
                if ( $return_string =~ /ICA/) {
                        alarm 0;
                        last;
                }
        }
    };

    if ($@) {
        push @failures, $host;

        if ($@ eq "alarm\n") {
            push @detail, "$host timeout";

        } else {
            push @detail, "$host interrupted syscall: $!";
        }

        close (S);
        next;
    }

    if (!defined $r) {
        push @failures, $host;
        push @detail, "$host could not connect: $!";
        close (S);
        next;
    }

    if (!defined close (S)) {
        push @failures, $host;
        push @detail, "$host could not close socket: $!";
        next;
    }
}

if (@failures == 0) {
    exit 0;
}

print join (" ", sort @failures), "\n";
print "\n", join ("\n", @detail), "\n";

exit 1;


--- end of file ---

_______________________________________________
mon mailing list
mon@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/mon

Reply via email to