INN commit: trunk/scripts (innreport.in)
INN Commit
Russ_Allbery at isc.org
Fri Jan 9 19:35:12 UTC 2009
Date: Friday, January 9, 2009 @ 11:35:11
Author: iulius
Revision: 8280
* Use of a modified version of time parsing code that performs
faster and more correctly.
* Fix the parsing during leap years.
Thanks to Alexander Bartolich for the patch.
see #90
(Daylight savings time are still mishandled.)
Modified:
trunk/scripts/innreport.in
--------------+
innreport.in | 69 ++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 51 insertions(+), 18 deletions(-)
Modified: innreport.in
===================================================================
--- innreport.in 2009-01-08 20:26:26 UTC (rev 8279)
+++ innreport.in 2009-01-09 19:35:11 UTC (rev 8280)
@@ -331,7 +331,36 @@
my ($total_line, $total_size) = (0, 0);
my ($suffix, $HTML_output, %config, $first_date, $last_date,
%prog_type, %prog_size);
+my ( $isLeapYear, @month_to_dayofyear, %month_to_dayofyear );
+{
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime(time);
+ $year += 1900;
+ $isLeapYear =
+ (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0);
+
+ @month_to_dayofyear = $isLeapYear
+ ? ( -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 )
+ : ( -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333 );
+
+ %month_to_dayofyear =
+ (
+ 'Jan' => $month_to_dayofyear[ 0],
+ 'Feb' => $month_to_dayofyear[ 1],
+ 'Mar' => $month_to_dayofyear[ 2],
+ 'Apr' => $month_to_dayofyear[ 3],
+ 'May' => $month_to_dayofyear[ 4],
+ 'Jun' => $month_to_dayofyear[ 5],
+ 'Jul' => $month_to_dayofyear[ 6],
+ 'Aug' => $month_to_dayofyear[ 7],
+ 'Sep' => $month_to_dayofyear[ 8],
+ 'Oct' => $month_to_dayofyear[ 9],
+ 'Nov' => $month_to_dayofyear[10],
+ 'Dec' => $month_to_dayofyear[11],
+ );
+}
+
my $HTML_header = '';
my $HTML_footer = '';
@@ -394,9 +423,14 @@
my $res;
my ($day, $hour, $prog, $left) =
$_ =~ m/^(\S+\s+\S+) (\S+) \S+ (\S+): \[ID \d+ \S+\] (.*)$/o;
+
+ unless ($day)
+ { # Dec 14 03:01:14 localhost innd: SERVER servermode paused
+ ($day, $hour, $prog, $left) =
+ $_ =~ m/^(\S+\s+\S+) (\S+) \S+ (\S+): (.*)$/o;
+ }
+
($day, $hour, $prog, $left) =
- $_ =~ m/^(\S+\s+\S+) (\S+) \S+ (\S+): (.*)$/o unless $day;
- ($day, $hour, $prog, $left) =
$_ =~ m/^(\S+\s+\S+) (\S+) \d+ \S+ (\S+): (.*)$/o unless $day;
unless ($day) {
@@ -467,7 +501,7 @@
# every write or print on the currently selected output channel.
$| = $DEBUG;
-die "no data. Abort.\n" unless $total_line;
+die "No data. Abort.\n" unless $total_line;
my $sec_glob = &ConvDate($last_date) - &ConvDate($first_date);
unless ($sec_glob) {
@@ -490,8 +524,8 @@
# Adjust the year because syslog doesn't record it. We assume that
# it's the current year unless the last date is in the future.
my $ld = &ConvDate($last_date);
- $dy-- if $ld > $ts + 60 * ($tm + 60 * ($th + 24 * ($dd - 1 +
- substr("000031059090120151181212243273304334", $dm * 3, 3)))) ||
+ $dy-- if $ld > $ts + 60 * ($tm + 60 * ($th + 24 * ($dd +
+ $month_to_dayofyear[ $dm ]))) ||
$ld < &ConvDate($first_date);
($dm, $dd, $th, $tm, $ts) = ($ddm, $d, $h, $mn, $s);
}
@@ -660,18 +694,17 @@
return 1;
}
-# convert a date to a number of seconds
-sub ConvDate {
- # usage: $num = &ConvDate ($date);
- # date format is Aug 22 01:49:40
+# Convert a date to number of seconds since 1st of January.
+# Leap years are handled correctly, daylight saving is not.
+# Usage: $num = &ConvDate ($date);
+# Date format is "Aug 22 01:49:40"
+sub ConvDate($) {
my $T = shift;
- my ($m, $d, $h, $mn, $s) = $T =~ /^(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)$/;
- my $out = $s + 60 * $mn + 3600 * $h + 86400 * ($d - 1);
-
- $m = substr("000031059090120151181212243273304334",
- index ("JanFebMarAprMayJunJulAugSepOctNovDec", $m), 3);
- $out += $m * 86400;
- return $out;
+ my ($m, $d, $h, $mn, $s) = $T =~ /^(\S\S\S)\s+(\d+)\s+(\d+):(\d+):(\d+)$/;
+ confess "Invalid date $T" unless($m);
+ $m = $month_to_dayofyear{ $m };
+ confess "Invalid month name in $T" unless($m);
+ return $s + 60 * $mn + 3600 * $h + 86400 * ($d + $m);
}
# Compare 2 filenames
@@ -2558,7 +2591,7 @@
my $result;
eval { local $^W = $DEBUG; $result = &$sub(); };
- if ($@ && $DEBUG) { confess "EvalHash($v) raises $@"; }
+ if ($@ && $DEBUG > 1) { confess "EvalHash($v) raises $@"; }
if (ref($result) ne 'HASH')
{ confess "EvalHash($v) does not return reference to hash."; }
return $result;
@@ -2575,7 +2608,7 @@
my $r;
eval { local $^W = $DEBUG; ($r) = &$sub(); };
- if ($@ && $DEBUG) { confess "EvalExpr($v) raises $@"; }
+ if ($@ && $DEBUG > 1) { confess "EvalExpr($v) raises $@"; }
return ($r || 0);
}
More information about the inn-committers
mailing list