Release new version 2.13.0
[grml-scripts.git] / usr_bin / mailhops
1 #!/usr/bin/perl -w
2 # Copyright (c) 1999 Marius Gedminas <mgedmin@takas.lt>
3 # Shows the route of an Internet mail message
4 # Version 0.0.1pre-alpha
5 #
6 # Patched by Roland Rosenfeld <roland@spinnaker.de>
7 # $ Id: mailhops,v 1.3 2000/01/25 20:18:24 roland Exp roland $
8
9 use strict;
10 use POSIX qw(mktime);
11 use Date::Parse;
12
13 my $verbose = 0;
14
15 # Setup
16 my %Months = (
17     Jan => 1,
18     Feb => 2,
19     Mar => 3,
20     Apr => 4,
21     May => 5,
22     Jun => 6,
23     Jul => 7,
24     Aug => 8,
25     Sep => 9,
26     Oct => 10,
27     Nov => 11,
28     Dec => 12,
29     );
30
31 # Read headers
32 $/ = '';
33 my $head = <>;
34 $head =~ s/\n\s+/ /g;
35 my @headers = split("\n", $head);
36
37 # Parse headers
38 my @hops;
39 for (@headers) {
40   next unless /^(>?Received|Date):/;
41   my $time;
42   my $host;
43   my $from;
44   if (/^Date:\s+(.*)/) {
45     $host = "Date:";
46     $time = $1;
47     $from = "";
48   } else {
49     $host = "(unknown)";
50     $host = $1 if /\sby\s+([a-z0-9\-_+.]+)\s/ && $1 ne "uid";
51     $from = "(unknown)";
52     $from = $1 if /\sfrom\s+([a-z0-9\-_+.]+(?:\s+[(].+?[)]))\s/;
53     $time = "(unknown)";
54     $time = $1 if /;\s+(.+)$/;
55     $time =~ s/using.*//;
56   }
57
58   my $epoch = str2time ($time);
59
60   unshift @hops, { HOST => $host, FROM => $from, TIME => $epoch};
61 }
62
63 # Print output
64 print "    Host                            Date received (local)   Lag       Total lag\n";
65 my $nr = 0;
66 my ($first, $prev);
67 for (@hops) {
68   my $host = $_->{HOST};
69   my $from = $_->{FROM};
70   my $time = $_->{TIME};
71   $first = $prev = $time unless defined $first;
72   printf "%2d. %-31.31s", ++$nr, $host;
73   do { print "\n"; next } unless defined $time;
74
75   my $delta = $time - $prev;
76   my $neg = $delta < 0; $delta = abs($delta);
77   my $delta_h = int($delta / 3600);
78   my $delta_m = int(($delta - $delta_h * 3600) / 60);
79   my $delta_s = ($delta - $delta_h * 3600 - $delta_m * 60);
80
81   my ($sec,$min,$hour,$day,$mon,$year,undef,undef,$dst) = localtime($time);
82
83   printf "  %4d-%02d-%02d  %02d:%02d:%02d  %s%02d:%02d:%02d",
84          1900+$year, $mon+1, $day, $hour, $min, $sec,
85          $neg ? '-' : ' ', $delta_h, $delta_m, $delta_s;
86
87   $delta = $time - $first;
88   $neg = $delta < 0; $delta = abs($delta);
89   $delta_h = int($delta / 3600);
90   $delta_m = int(($delta - $delta_h * 3600) / 60);
91   $delta_s = ($delta - $delta_h * 3600 - $delta_m * 60);
92   printf "  %s%02d:%02d:%02d\n",
93          $neg ? '-' : ' ', $delta_h, $delta_m, $delta_s;
94   print  "     from $from\n" if $verbose;
95   $prev = $time;
96 }