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