#!/usr/bin/perl -w
# -*- perl -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# OceGraphs Authors
# https://www.ocelot.cascaded.net/~anton/ocegraphs/
#
# Copyright (C) 2010, 2012 Ian Jackson
#
# Author: Ian Jackson <ijackson@chiark.greenend.org.uk>

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";
}
