chiark / gitweb /
Script for showing news connections
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jul 2010 11:23:17 +0000 (12:23 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jul 2010 11:23:17 +0000 (12:23 +0100)
incoming-connections [new file with mode: 0755]

diff --git a/incoming-connections b/incoming-connections
new file mode 100755 (executable)
index 0000000..794f181
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+
+use strict qw(refs vars);
+use Parse::Syslog;
+use POSIX;
+
+@ARGV==1 or die;
+
+our ($site) = @ARGV;
+
+our @col2num;
+our %num2col;
+
+sub report ($$$) {
+    my ($ts,$col,$how) = @_;
+    my $o= '';
+    my $n= 0;
+    foreach (my $i=0; $i<@col2num; $i++) {
+        if (defined $col2num[$i]) {
+            $n++;
+            $o .= $col==$i ? " $how" : " |";
+        } else {
+            $o .= '  ';
+        }
+    }
+    printf "%s %3d %s\n", $ts, $n, $o or die $!;
+}
+
+sub event ($$$;$);
+sub event ($$$;$) {
+    my ($ts, $num, $how, $openclose) = @_;
+    my $col= $num2col{$num};
+    if (!defined $col) {
+        if ($openclose>0) {
+            for ($col=0; defined $col2num[$col]; $col++) { }
+            $num2col{$num}= $col;
+            $col2num[$col]= $num;
+            report($ts, $col, $how);
+        } else {
+            event($ts, $num, '?', +1);
+            $col= $num2col{$num};
+            report($ts, $col, $how);
+        }
+    } else {
+        report($ts, $col, $how);
+    }
+    if ($openclose < 0) {
+        delete $num2col{$num};
+        $col2num[$col]= undef;
+    }
+}
+
+my $in= new IO::File '<& STDIN';
+my $slp= Parse::Syslog->new($in);
+while (my $sl= $slp->next) {
+    next unless $sl->{program} eq 'innd';
+    $_= $sl->{text};
+    s/^([^ :]+)// or next;
+#print STDERR ">$1<\n";
+    next unless $1 eq $site;
+
+    my $timestamp= strftime "%Y-%m-%d %H:%M:%S", localtime $sl->{timestamp};
+
+#print STDERR "eventing\n";
+    if (m/^\:(\d+) inactive\b/) {
+        event($timestamp, $1, ':',  0);
+    } elsif (m/^\:(\d+) checkpoint\b/) {
+        event($timestamp, $1, 'I',  0);
+    } elsif (m/^\:(\d+) NCmode\b/) {
+        event($timestamp, $1, '#',  0);
+    } elsif (m/^\:(\d+) closed\b/) {
+        event($timestamp, $1, '^', -1);
+    } elsif (m/^ connected (\d+)\b/) {
+        event($timestamp, $1, 'v', +1);
+    }
+#print STDERR "evented\n";
+}