#!/usr/bin/perl use warnings; use strict; use Test::More tests => 14; use POE::Filter::Syslog; use POSIX qw(strftime setlocale LC_ALL LC_CTYPE); my $filter = POE::Filter::Syslog->new(); my $loc = setlocale( LC_ALL, 'C' ); # # Syslog uses an ambiguous datetime format. No year and no timezone. # # # correct this test for timezone issues # my $now = time(); my $ts = strftime("%b %d %H:%M:%S", localtime($now)); my $complex = "<1>$ts /USR/SBIN/CRON[16273]: (root) CMD (test -x /usr/lib/sysstat/sa1 && /usr/lib/sysstat/sa1)"; my $simple = "<1>$ts sungo: pie"; my $nodate = '<78>CROND[19679]: (root) CMD (/usr/bin/mrtg /etc/mrtg/mrtg.cfg)'; my $newline = "<1>$ts /USR/SBIN/CRON[16273]: (root) CMD (test -x /usr/lib/sysstat/sa1 \n&& /usr/lib/sysstat/sa1)"; my $records; # # simple # eval { $records = $filter->get([ $simple ]); }; ok(!$@, 'get() does not throw an exception'); ok(defined $records && @$records, "get() returns data when fed valid string"); is_deeply($records->[0], { 'msg' => 'sungo: pie', 'time' => $now, 'pri' => '1', 'facility' => 0, 'severity' => 1, }, 'get() returns proper data when fed valid simple string' ); # # Complex # $records = undef; eval { $records = $filter->get([ $complex ]); }; ok(!$@, 'get() does not throw an exception'); ok(defined $records && @$records, "get() returns data when fed valid string"); is_deeply($records->[0], { 'msg' => '/USR/SBIN/CRON[16273]: (root) CMD (test -x /usr/lib/sysstat/sa1 && /usr/lib/sysstat/sa1)', 'time' => $now, 'pri' => '1', 'facility' => 0, 'severity' => 1, }, 'get() returns proper data when fed valid complex string'); # # nodate # $records = undef; eval { $records = $filter->get([ $nodate ]); }; ok(!$@, 'get() does not throw an exception'); ok(defined $records && @$records, "get() returns data when fed valid string"); is_deeply($records->[0], { 'msg' => 'CROND[19679]: (root) CMD (/usr/bin/mrtg /etc/mrtg/mrtg.cfg)', 'time' => time(), 'pri' => '78', 'facility' => 9, 'severity' => 6, }, '_parse_syslog_message() returns proper data when given string with no date'); # # bogus data # $records = undef; eval { $records = $filter->get([ "I am not a syslog message" ]); }; ok(!$@, 'get() does not throw an exception'); ok(defined $records && !@$records, "get() returns no data when fed invalid string"); # # data with a \n in it # apparently syslog-ng sends this # $records = undef; eval { $records = $filter->get([ $newline ]); }; ok(!$@, 'get() does not throw an exception'); ok(defined $records && @$records, "get() returns data when fed valid string"); is_deeply($records->[0], { 'msg' => "/USR/SBIN/CRON[16273]: (root) CMD (test -x /usr/lib/sysstat/sa1 \n&& /usr/lib/sysstat/sa1)", 'time' => $now, 'pri' => '1', 'facility' => 0, 'severity' => 1, }, 'get() returns proper data when fed valid string containing newlines');