On Sat, Jun 08, 2002 at 12:10:34AM +0200, David Amiel wrote:
> Hi,
> 
> I would like to know if someone has tried to simulate a website browsing and
> monitor it with mon ?
> 
> Though the http monitor script validate the web server is responding, it
> can't validate the service hosted on this webserver is correctly running ..
> 
> Any ideas ?
> 

Some time ago I needed to monitor a page on our web site which requires user
login. I modified lwp-http.mon by Daniel Hagerty. I understand my version
is not perfect, but maybe someone will find it useful. Please see it attached.


-- 
Konstantin 'Kastus' Shchuka
Unix System Administrator
ePocrates Inc.

#!/usr/bin/perl
# File:         lwp-http-post.monitor
# Author:       Kastus Shchuka, [EMAIL PROTECTED]
# Date:         Thu Apr 18 19:10:11 PDT 2002
# Description:  Perform an HTTP POST preceded by GET to set cookies, following 
redirections -- using LWP.
# Based on:     lwp-http.mon by Daniel Hagerty, [EMAIL PROTECTED]
#

#use strict;

use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common qw(GET POST);
use Getopt::Std;
use File::Basename;
use URI;

###

use vars qw($opt_h $opt_p $opt_t $opt_z $opt_d $opt_r $opt_s $opt_P
            $opt_v $opt_c $opt_f);

##

# Configure this.
my $maintainer = '[EMAIL PROTECTED]';

##

my $port;
my $directory;
my $regex;
my $proto = "http";
my $timeout = 60;
my $formdata;

my $version = "0.1";
my $agent = "Yet Another Monitor Bot/$version";

my $u_proto;

# We make our own specialization of LWP::UserAgent that performs
# redirection in POST requests

{
        package RequestAgent;
        @ISA = qw(LWP::UserAgent);

        sub new
        {
                my $self = LWP::UserAgent::new(@_);
                $self->agent("lwp-request/$main::VERSION");
                $self;
        }

        sub redirect_ok
                { 1; }
}


###

sub main {
        do_usage() if(@_ == 0);

        $directory = $opt_d if($opt_d);
        $port = $opt_p if($opt_p);
        $timeout = $opt_t if($opt_t);
        $regex = $opt_r if($opt_r);
        $proto = "https" if ($opt_s);
        $proto = $opt_P if($opt_P);
        
        $formdata = $opt_f if ($opt_f);


        $directory =~ s/^\///;  # Nuke leading slash
        $u_proto = $proto; $u_proto =~ tr/[a-z]/[A-Z]/;

        my $ua = RequestAgent->new() || lose("LWP create failure");
        $ua->agent($agent);
        $ua->from($maintainer);
        $ua->timeout($timeout);

        my @failed;
        my %failure;
host:
        foreach my $host (@_) {
                my $ht_lose = sub {
                        push(@failed, $host);
                        $failure{$host} = join(" ", @_);

                        # This generates a warning.
                        next host;
                };
        
                if($opt_c) {
                        # Generate new cookies for each host.
                        my $cookies = HTTP::Cookies->new() ||
                        &{$ht_lose}("HTTP::Cookies create failure");

                        $ua->cookie_jar($cookies);
                }

                my $uri_str = "$proto://$host/$directory";
                my $request = HTTP::Request->new("GET" => $uri_str) ||
                        &{$ht_lose}("HTTP::Request create failure");
                my $req = GET $uri_str;
                my $uri = $req->uri();
                $uri->port($port) if(defined($port));

                my $response = $ua->request($req) ||
                        &{$ht_lose}("UserAgent GET request failure");

                unless($response->is_success) {
                        &{$ht_lose}("Request failed:", $response->message);
                }

                $req = POST $uri_str;
                my $uri = $req->uri();
                $uri->port($port) if(defined($port));
                $req->content($formdata);
                $response = $ua->request($req) ||
                        &{$ht_lose}("UserAgent POST request failure");

                unless($response->is_success) {
                        &{$ht_lose}("Request failed:", $response->message);
                }

                my $strref = $response->content_ref;
                if(!$opt_z && length($$strref) == 0) {
                        &{$ht_lose}("Empty document");
                }

                if(defined($regex)) {
                        my $winning;
                        map {$winning++ if(/$regex/);} split("\n", $$strref);
                        if($opt_v) {
                                &{$ht_lose}("Failure regex matches:", $winning) 
if($winning);
                        } elsif(!$winning) {
                                &{$ht_lose}("Regex not found");
                        }
                }
        }
        if(@failed) {
                print "$u_proto Failures: " . join(" ", @failed) . "\n";
                foreach my $fail (@failed) {
                        print "$fail: $failure{$fail}\n";
                }
                exit(1);
        }
        exit;
}

sub lose {
        die join(" ", @_);
}

sub do_usage {
        my $extended = shift;

        my $base = basename $0;
        print STDERR "Usage: $base [options...] hosts ...\n";
        if($extended) {
        print <<'EOF';
-h              Help.  You're reading it.
-d URL          URL to test on the remote host.  Default is /.
-p PORT         Port to connect to.  Default is proto specific.
-P PROTO        Protocol to fetch.  Default is http.
-s              Fetch via https.  Equivalent to -P https.
-t TIMEOUT      Timeout for the fetch.  Default is 60 seconds.
-r REGEX        A regular expression that the retrieved content must match.
-v              Invert the regular expression.  Content must NOT match.
-z              Supress zero-length check.
-c              Enable Cookies.
-f FORMDATA     form data in url-encoded format, e.g. login_name=foo&pwd=bar
EOF
        }
        exit 1;
}

###

getopts("hszvcp:t:d:r:P:f:") || do_usage();
do_usage($opt_h) if($opt_h);

&main(@ARGV);

# EOF

Reply via email to