#!/usr/bin/perl -w use strict; use AnyEvent; use AnyEvent::Handle; use AnyEvent::Socket; use File::HomeDir; use Storable; my $stats = { ham => 0, spam => 0, block => 0, }; my $log_socket = File::HomeDir->my_home . '/var/log.sock'; my $stats_socket = File::HomeDir->my_home . '/var/stats.sock'; # regex to match the spamd log lines my $regex = '^[A-Z][a-z][a-z] ?\d{1,2} \d{2}:\d{2}:\d{2} vm-mail spamd\[\d+\]: spamd: result: ([Y.]) (-?\d+) '; tcp_server 'unix/', $log_socket, sub { my $h; $h = new AnyEvent::Handle fh => @_, on_eof => sub { $h->destroy; }, on_error => sub { $h->destroy; }, on_read => sub { $h->push_read(line => sub { my ($fh, $line) = @_; if ($line =~ m/$regex/) { if ($1 eq '.') { $stats->{ham}++; } elsif ($1 eq 'Y') { if ($2 > 10) { $stats->{block}++; } else { $stats->{spam}++; } } } }) }; }; tcp_server 'unix/', $stats_socket, sub { my $h; $h = new AnyEvent::Handle fh => @_, on_eof => sub { $h->destroy; }, on_error => sub { $h->destroy; }; $h->push_write(Storable::freeze($stats) . "\n"); $stats = { ham => 0, spam => 0, block => 0 }; $h->on_drain (sub { $h->destroy; undef $h; }); }; AnyEvent->condvar->recv;