#!/usr/athena/bin/perl -w
#
# $Id: imapmon.pl,v 1.8 2006/08/14 02:09:20 jhawk Exp jhawk $
#

use FindBin;
#use strict;

use lib "$FindBin::Bin/lib/perl5";
use lib "$FindBin::Bin/lib/perl5/site_perl";

use Net::SMTP;
use POSIX qw(strftime);
use Time::HiRes qw(gettimeofday);

sub sendprobe {
    my ($key, $server, $addr) = @_;

    my $fromaddr = 'jhawk@MIT.EDU';
    my $r;
    my ($smtp, $starttime, $connecttime, $datatime, $rfctime, $senttime);

    
    
    print "Probing $addr via $server ";

    # return values checks?
    $starttime = gettimeofday();
    $smtp = Net::SMTP->new($server,
			   Timeout => 30,
			   Debug => 0);
    if (!$smtp) {
	print "...failed\n";
	return $smtp;
    }
    $connecttime = gettimeofday();
    print "fromaddr $fromaddr ";
    $smtp->mail("$fromaddr");
    $smtp->to($addr);
    $datatime = gettimeofday();
# date-time       =       [ day-of-week "," ] date FWS time [CFWS]
# date            =       day month year

    $rfctime = strftime("%a, %e %b %Y %T %z", localtime);
#     print "at $rfctime...";
    $r = $smtp->data(
"To: John Hawkinson <$addr>
From: John Hawkinson <$fromaddr>
Subject: imapmon test probe $key
Date: $rfctime
Message-ID: <jhawk.key.$key\@zorkmid.mit.edu>

datatime $datatime
key $key
");
    if ($r) {
		print "sent.\n";
	    } else {
# XXX: What do we do to find out how it failed?!
		print "FAILED!\n";
    }
    $senttime = gettimeofday();
    $smtp->quit;

    return ($server, $starttime, $connecttime, $datatime, $senttime);
}

sub keyprobe {
    my ($server, $addr ) = @_;

    my $key = int(rand(2**32));
    $sent{$key} = [sendprobe($key, $server, $addr)];
}


# @_ = sendprobe("",  "mcs.mit.edu"    , 'jhawk@MIT.EDU',    );
# @_ = sendprobe("",  "mail.netbsd.org", 'jhawk@netbsd.org', );
# @_ = sendprobe("",  "www.netbsd.org" , 'jhawk@netbsd.org', );
#      sendprobe("",  "cccs.mit.edu"   , 'jhawk@MIT.EDU',    );


# for (1..100) {
# keyprobe("alum-1.mit.edu"    , 'jhawk@alum.MIT.EDU'   );
# keyprobe("alum-2.mit.edu"    , 'jhawk@alum.MIT.EDU'   );
# keyprobe("W92-130-BARRACUDA-1.mit.edu"   , 'jhawk@alum.mit.edu');
# }

# keyprobe("mail.netbsd.org", 'jhawk@netbsd.org');
# keyprobe("www.netbsd.org" , 'jhawk@netbsd.org');
# 

#keyprobe("FORT-POINT-STATION.mit.edu"    , 'jhawk@MIT.EDU'   );
#keyprobe("W92-130-BARRACUDA-1.mit.edu"   , 'jhawk@MIT.EDU'   );
#keyprobe("W92-130-BARRACUDA-2.mit.edu"   , 'jhawk@MIT.EDU'   );
#keyprobe("W92-130-BARRACUDA-3.mit.edu"   , 'jhawk@MIT.EDU'   );
#keyprobe("W92-130-BARRACUDA-3.mit.edu"   , 'jhawk@MIT.EDU'   );
#keyprobe("MANAWATU-MAIL-CENTRE.MIT.EDU"  , 'jhawk@MIT.EDU'   );
#keyprobe("MELBOURNE-CITY-STREET.MIT.EDU"  , 'jhawk@MIT.EDU'   );
#keyprobe("OUTGOING.MIT.EDU"  , 'jhawk@MIT.EDU'   );

for (1..100) {
keyprobe("M24-004-BARRACUDA-1.mit.edu."   , 'jhawk@MIT.EDU'   );
keyprobe("W92-130-BARRACUDA-1.mit.edu."   , 'jhawk@MIT.EDU'   );
keyprobe("W92-130-BARRACUDA-2.mit.edu."   , 'jhawk@MIT.EDU'   );
keyprobe("W92-130-BARRACUDA-3.mit.edu."   , 'jhawk@MIT.EDU'   );
}

# failure test:
#keyprobe("po10.mit.edu"   , 'jhawk@PO12.LOCAL');

#keyprobe("po11.mit.edu"   , 'sipb2@po11.LOCAL');

#foreach (keys %sent) {
# Sort on time of connect.
foreach (sort { $sent{$a}[1] <=> $sent{$b}[1] } keys %sent) {
printf "%-10.10s %-20.20s %6.3f %6.3f %6.3f %6.3f %6.3f\n",
     $_, $sent{$_}[0],
     $sent{$_}[1],
     $sent{$_}[2]-$sent{$_}[1],
     $sent{$_}[3]-$sent{$_}[2],
     $sent{$_}[4]-$sent{$_}[3],
     $sent{$_}[4]-$sent{$_}[1];
}
