chiark / gitweb /
Assert readable_callback before we call it
[innduct.git] / innduct-stats-report
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use Data::Dumper;
7
8 our %counts;
9
10 # Input lines look like this:
11 # May 23 19:00:02 chiark innduct[23236]: news.relativity.greenend.org.uk| info: completed feedfile read=76 (+bl=7,+err=0) missing=0 offered=76 (ch=76,nc=0) accepted=75 (ch=75,nc=0) unwanted=1 (id=1,bod=0,nc=0) rejected=0 (id=0,bod=0,nc=0) deferred=0 (id=0,bod=0,nc=0) missing=0 (id=0,bod=0,nc=0) connretry=0 (id=0,bod=0,nc=0)
12
13 if (@ARGV && $ARGV[0] =~ m/^\-/) {
14     die "$0: bad usage: no options supported\n";
15 }
16
17 while (<>) {
18     next unless
19         m/^ [:0-9A-Za-z ]+[ ]
20             \w+[ ]
21             innduct\[\d+\]:[ ]
22             ([^|<>: \t]+)\|[ ]
23             (?: info | notice ):[ ]
24             (?: completed | processed )[ ]
25             .*?
26             ( (?: [ ]
27                   (?: \w+ = \d+
28                     | \( [=+,0-9a-z]+ \)
29                    )
30                )+
31               )
32             $/x;
33     my ($site,$strs) = ($1,$2);
34     die unless $strs =~ m/^ read=/;
35
36     my $cur;
37     $strs .= ' ';
38     my $c= \%{ $counts{$site} };
39 #print Dumper($c);
40     for (;;) {
41         if ($strs =~ s/^[ ] (\w+) = (\d+) [ ]/ /x) {
42             $cur= $1;
43             $c->{$cur} += $2;
44         } elsif ($strs =~ s/^
45                  [ ] \(
46                    ( \+? \w+ ) = (\d+)
47                    (?: , ([^()]+) )?
48                  \) [ ]/ sprintf " (%s) ", defined $3 ? $3 : '' /xe) {
49             $c->{"${cur}_$1"} += $2;
50         } elsif ($strs =~ s/^ \(\) / /) {
51         } elsif ($strs eq ' ') {
52             last;
53         } else {
54             die "$_ // $strs ?";
55         }
56     }
57  
58 #    print "$site|";
59 #    foreach my $k (sort keys %$c) { printf " %s=%d", $k, $c->{$k}; }
60 #    print "\n";
61 }
62
63 #print STDERR Dumper(\%counts);;
64
65 our $cwr;
66 our $site;
67 our $processed;
68
69 foreach $site (sort keys %counts) {
70     $cwr= $counts{$site};
71     $processed= $cwr->{offered} - $cwr->{deferred};
72     write;
73 }
74
75 sub pct ($$) {
76     my ($dend,$dor) = @_;
77     return undef unless defined($dend) and $dor;
78     return $dend * 100.0 / $dor;
79 }
80
81 sub amt ($) {
82     my ($v) = @_;
83     return '' unless defined $v;
84     if ($v < 9999) { return sprintf "%4d ", $v; }
85     if ($v < 9999e3) { return sprintf "%4dk", ($v / 1e3); }
86     return sprintf "%4dm", ($v / 1e3);
87 }
88
89 format STDOUT_TOP =
90 offrd defer acctd unwtd rejtd df% ac% rj% nochk nc% 
91 .
92 format STDOUT =
93 @>>>> @>>>> @>>>> @>>>> @>>>> ^## ^## ^## @>>>> ^## @<<<<<<<<<<<<<<<<<<<<<<<...
94 { (map { amt($cwr->{$_}) } qw(offered deferred accepted unwanted rejected)),
95   (pct($cwr->{deferred}, $cwr->{offered})),
96   (map { pct($cwr->{$_}, $processed) } qw(accepted rejected)),
97   ($cwr->{offered_nc} ? (amt($cwr->{offered_nc}),
98                          pct($cwr->{offered_nc}, $processed))
99                       : ('',undef)),
100   ($site)
101   }
102 .