| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | #!/usr/bin/perl## $Id: https.monitor,v 1.15 2000/02/04 23:34:03 andrewr Exp $## An extremely simple https monitor for mon.## Code structure based on Jon Meek & Jim Trocki's http.monitor program.## https code taken from the get_page.pl function from the# Net::SSLeay distribution by Sampo Kellomaki <sampo@iki.fi>## It makes use of the Net::SSLeay library and the OpenSSL package# (www.openssl.org).## To get around the problem that Net::SSLeay carps to STDERR# uncontrollably about a number of things (e.g. connection refused),# we get around this by running the actual ssl get as an escaped# perl program and dropping the stderr of that instance. Gross, but# strangely effective.## Use the -v option if you actually want to see the full result and# all headers. You'd never use this from mon, since it provides# non-mon-compliant output, but it can be interesting from the command# line.####     Distribution and use of this program is under the same terms#     as the OpenSSL package itself (i.e. free, but mandatory#     attribution; NO WARRANTY). Please consult COPYRIGHT file in#     the root of the SSLeay distribution.#use strict;use Socket;use Net::SSLeay qw(die_now die_if_ssl_error) ;use Getopt::Std;#use English;#Net::SSLeay::load_error_strings();#Net::SSLeay::SSLeay_add_ssl_algorithms();# Comment this out since on systems without a /dev/[u]random this# line causes an unneccesary carp which will confuse mon.# If you use Linux or BSD or other OS which supports a random device,# feel free to uncomment this line.#Net::SSLeay::randomize();use vars qw($opt_p $opt_t $opt_u $opt_v);getopts ("vp:t:u:");my $PORT = $opt_p || 443;my $TIMEOUT = $opt_t || 30;my $URL = $opt_u || "/";my $perl = "/usr/bin/perl";      # where you keep perlmy $field_delim = "<>";          # html field delimitermy @failures = ();my @detail = ();my ($host, $OK, $default_header, $auth_header, $end_header, $request_header, $msg);my ($dest_ip, $dest_serv, $sockaddr_template, $dest_serv_params, $ctx, $ssl, $res, $reply, $got, $ServerOK);foreach $host (@ARGV) {    $OK = &httpsGET($host, $PORT, $URL);    if (!defined ($OK) || $OK == 0) {        push (@failures, $host);    }}if (@failures == 0) {    exit 0;}print "@failures\n";print join(";",@detail);exit 1;#  Main function begins heresub httpsGET {    my ($site, $port, $path) = (@_);    my $total_bytes = 0;       #set total bytes transferred to 0    my ($page, $result, %headers);#    print "attempting to contact site $site on port $port with path $path\n";    eval {    local $SIG{ALRM} = sub { die "Timeout Alarm" };        alarm $TIMEOUT;    $result = `$perl -e'use Net::SSLeay ; Net::SSLeay::SSLeay_add_ssl_algorithms() ; print join("$field_delim",Net::SSLeay::get_https("$site", "$port", "$path"))' 2>/dev/null`;    alarm 0; #cancel the alarm    ($page, $result, %headers) = split ("<>",$result);    print "Result was `$result'\n" if $opt_v;    foreach my $h (sort keys %headers) {        print "Header `$h'\tvalue `$headers{$h}'\n" if $opt_v;    }    if ($result =~ /^HTTP\/([\d\.]+)\s+(200|301|302)\b/) {            $ServerOK = 1;        } else {            $ServerOK = 0;        push(@detail,"$result");        }    };    if ($EVAL_ERROR and ($EVAL_ERROR eq 'Timeout Alarm')) {        print "**** Time Out\n";        return 0;    }    return $ServerOK;}
 |