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 perl
- my $field_delim = "<>"; # html field delimiter
- my @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 here
- sub 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;
- }
|