98 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| # Copyright (c) 1999 Marius Gedminas <mged...@takas.lt>
 | |
| # Shows the route of an Internet mail message
 | |
| # Version 0.0.1pre-alpha
 | |
| #
 | |
| # Patched by Roland Rosenfeld <rol...@spinnaker.de>
 | |
| # $ Id: mailhops,v 1.3 2000/01/25 20:18:24 roland Exp roland $
 | |
| 
 | |
| use strict;
 | |
| use POSIX qw(mktime);
 | |
| use Date::Parse;
 | |
| 
 | |
| my $verbose = 0;
 | |
| 
 | |
| # Setup
 | |
| my %Months = (
 | |
|     Jan => 1,
 | |
|     Feb => 2,
 | |
|     Mar => 3,
 | |
|     Apr => 4,
 | |
|     May => 5,
 | |
|     Jun => 6,
 | |
|     Jul => 7,
 | |
|     Aug => 8,
 | |
|     Sep => 9,
 | |
|     Oct => 10,
 | |
|     Nov => 11,
 | |
|     Dec => 12,
 | |
|     );
 | |
| 
 | |
| # Read headers
 | |
| $/ = '';
 | |
| my $head = <>;
 | |
| $head =~ s/\n\s+/ /g;
 | |
| my @headers = split("\n", $head);
 | |
| 
 | |
| # Parse headers
 | |
| my @hops;
 | |
| for (@headers) {
 | |
|   next unless /^(>?Received|Date):/;
 | |
|   my $time;
 | |
|   my $host;
 | |
|   my $from;
 | |
|   if (/^Date:\s+(.*)/) {
 | |
|     $host = "Date:";
 | |
|     $time = $1;
 | |
|     $from = "";
 | |
|   } else {
 | |
|     $host = "(unknown)";
 | |
|     $host = $1 if /\sby\s+([a-z0-9\-_+.]+)\s/ && $1 ne "uid";
 | |
|     $from = "(unknown)";
 | |
|     $from = $1 if /\sfrom\s+([a-z0-9\-_+.]+(?:\s+[(].+?[)]))\s/;
 | |
|     $time = "(unknown)";
 | |
|     $time = $1 if /;\s+(.+)$/;
 | |
|     $time =~ s/using.*//;
 | |
|   }
 | |
| 
 | |
|   my $epoch = str2time ($time);
 | |
| 
 | |
|   unshift @hops, { HOST => $host, FROM => $from, TIME => $epoch};
 | |
| }
 | |
| 
 | |
| # Print output
 | |
| print "    Host                            Date received (local)   Lag       
 | |
| Total lag\n";
 | |
| my $nr = 0;
 | |
| my ($first, $prev);
 | |
| for (@hops) {
 | |
|   my $host = $_->{HOST};
 | |
|   my $from = $_->{FROM};
 | |
|   my $time = $_->{TIME};
 | |
|   $first = $prev = $time unless defined $first;
 | |
|   printf "%2d. %-31.31s", ++$nr, $host;
 | |
|   do { print "\n"; next } unless defined $time;
 | |
| 
 | |
|   my $delta = $time - $prev;
 | |
|   my $neg = $delta < 0; $delta = abs($delta);
 | |
|   my $delta_h = int($delta / 3600);
 | |
|   my $delta_m = int(($delta - $delta_h * 3600) / 60);
 | |
|   my $delta_s = ($delta - $delta_h * 3600 - $delta_m * 60);
 | |
| 
 | |
|   my ($sec,$min,$hour,$day,$mon,$year,undef,undef,$dst) = localtime($time);
 | |
| 
 | |
|   printf "  %4d-%02d-%02d  %02d:%02d:%02d  %s%02d:%02d:%02d",
 | |
|          1900+$year, $mon+1, $day, $hour, $min, $sec,
 | |
|          $neg ? '-' : ' ', $delta_h, $delta_m, $delta_s;
 | |
| 
 | |
|   $delta = $time - $first;
 | |
|   $neg = $delta < 0; $delta = abs($delta);
 | |
|   $delta_h = int($delta / 3600);
 | |
|   $delta_m = int(($delta - $delta_h * 3600) / 60);
 | |
|   $delta_s = ($delta - $delta_h * 3600 - $delta_m * 60);
 | |
|   printf "  %s%02d:%02d:%02d\n",
 | |
|          $neg ? '-' : ' ', $delta_h, $delta_m, $delta_s;
 | |
|   print  "     from $from\n" if $verbose;
 | |
|   $prev = $time;
 | |
| }
 |