--- /dev/null
+#!/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";
+}