chiark / gitweb /
new invoke script
[rrd-graphs.git] / incoming-connections
1 #!/usr/bin/perl -w
2
3 use strict qw(refs vars);
4 use Parse::Syslog;
5 use POSIX;
6
7 @ARGV==1 or die;
8
9 our ($site) = @ARGV;
10
11 our @col2num;
12 our %num2col;
13
14 sub report ($$$) {
15     my ($ts,$col,$how) = @_;
16     my $o= '';
17     my $n= 0;
18     foreach (my $i=0; $i<@col2num; $i++) {
19         if (defined $col2num[$i]) {
20             $n++;
21             $o .= $col==$i ? " $how" : " |";
22         } else {
23             $o .= '  ';
24         }
25     }
26     printf "%s %3d %s\n", $ts, $n, $o or die $!;
27 }
28
29 sub event ($$$;$);
30 sub event ($$$;$) {
31     my ($ts, $num, $how, $openclose) = @_;
32     my $col= $num2col{$num};
33     if (!defined $col) {
34         if ($openclose>0) {
35             for ($col=0; defined $col2num[$col]; $col++) { }
36             $num2col{$num}= $col;
37             $col2num[$col]= $num;
38             report($ts, $col, $how);
39         } else {
40             event($ts, $num, '?', +1);
41             $col= $num2col{$num};
42             report($ts, $col, $how);
43         }
44     } else {
45         report($ts, $col, $how);
46     }
47     if ($openclose < 0) {
48         delete $num2col{$num};
49         $col2num[$col]= undef;
50     }
51 }
52
53 my $in= new IO::File '<& STDIN';
54 my $slp= Parse::Syslog->new($in);
55 while (my $sl= $slp->next) {
56     next unless $sl->{program} eq 'innd';
57     $_= $sl->{text};
58     s/^([^ :]+)// or next;
59 #print STDERR ">$1<\n";
60     next unless $1 eq $site;
61
62     my $timestamp= strftime "%Y-%m-%d %H:%M:%S", localtime $sl->{timestamp};
63
64 #print STDERR "eventing\n";
65     if (m/^\:(\d+) inactive\b/) {
66         event($timestamp, $1, ':',  0);
67     } elsif (m/^\:(\d+) checkpoint\b/) {
68         event($timestamp, $1, 'I',  0);
69     } elsif (m/^\:(\d+) NCmode\b/) {
70         event($timestamp, $1, '#',  0);
71     } elsif (m/^\:(\d+) closed\b/) {
72         event($timestamp, $1, '^', -1);
73     } elsif (m/^ connected (\d+)\b/) {
74         event($timestamp, $1, 'v', +1);
75     }
76 #print STDERR "evented\n";
77 }