#!/usr/athena/bin/perl -w
#
# $Id: imapmon.pl,v 1.5 2004/05/31 01:39:58 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 Time::HiRes qw(gettimeofday);

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

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

    
    
    print "Probing $addr via $server ";

    # return values checks?
    $starttime = gettimeofday();
    $smtp = Net::SMTP->new($server,
			   Timeout => 30,
			   Debug => 0);
    $connecttime = gettimeofday();
    $smtp->mail($fromaddr);
    $smtp->to($addr);
    $datatime = gettimeofday();
    print "at $datatime...";
    $r = $smtp->data(
"To: $addr
From: $fromaddr
Subject: imapmon test probe

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',    );

# keyprobe("mail.netbsd.org", 'jhawk@netbsd.org');
# keyprobe("www.netbsd.org" , 'jhawk@netbsd.org');
# 
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("cccs.mit.edu"   , 'jhawk@MIT.EDU'   );
# keyprobe("gcs.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\n",
     $_, $sent{$_}[0],
     $sent{$_}[1],
     $sent{$_}[2]-$sent{$_}[1],
     $sent{$_}[3]-$sent{$_}[2],
     $sent{$_}[4]-$sent{$_}[3];
}
