xref: /openbsd-src/regress/usr.sbin/syslogd/args-selector.pl (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1# The client sends messages with different facility and severity.
2# The syslogd writes into multiple files depending on priority.
3# The syslogd writes it into a file and through a pipe.
4# The syslogd passes it via UDP to the loghost.
5# The server receives the message on its UDP socket.
6# Find the message in client, file, pipe, syslogd, server log.
7# Check that the messages appear in the correct log files.
8
9use strict;
10use warnings;
11use Sys::Syslog;
12
13my (@messages, @priorities);
14foreach my $fac (qw(local5 local6 local7)) {
15    foreach my $sev (qw(notice warning err)) {
16	my $msg = "$fac.$sev";
17	push @messages, $msg;
18	no strict 'refs';
19	my $prio = ("Sys::Syslog::LOG_".uc($fac))->() |
20	    ("Sys::Syslog::LOG_".uc($sev))->();
21	push @priorities, $prio;
22    }
23}
24
25my %selector2messages = (
26    "*.*" => [@messages],
27    "*.info" => [@messages],
28    "*.notice" => [@messages],
29    "*.warning" => [ grep { /\.(warning|err)$/ } @messages],
30    "*.err" => [ grep { /\.err$/ } @messages],
31    "*.crit" => [],
32    "*.none" => [],
33    "local5.*" => [qw(local5.notice local5.warning local5.err)],
34    "local5.info" => [qw(local5.notice local5.warning local5.err)],
35    "local5.notice" => [qw(local5.notice local5.warning local5.err)],
36    "local5.warning" => [qw(local5.warning local5.err)],
37    "local5.err" => [qw(local5.err)],
38    "local5.crit" => [],
39    "local5.none" => [],
40    "local5.warning;local5.err" => [qw(local5.err)],
41    "local5.err;local5.warning" => [qw(local5.warning local5.err)],
42    "local6.warning;local7.err" => [qw(local6.warning local6.err local7.err)],
43    "local6.err;local7.err" => [qw(local6.err local7.err)],
44    "local6,local7.err" => [qw(local6.err local7.err)],
45    "local6,local7.warning;local6.err" => [qw(local6.err local7.warning
46	local7.err)],
47    "*.*;local6,local7.none" => [qw(local5.notice local5.warning local5.err)],
48);
49
50sub selector2config {
51    my %s2m = @_;
52    my $conf = "";
53    my $i = 0;
54    foreach my $sel (sort keys %s2m) {
55	$conf .= "$sel\t\$objdir/file-$i.log\n";
56	$i++;
57    }
58    return $conf;
59}
60
61sub messages2loggrep {
62    my %s2m = @_;
63    my @loggrep;
64    foreach my $sel (sort keys %s2m) {
65	my @m = @{$s2m{$sel}};
66	my (%msg, %nomsg);
67	@msg{@m} = ();
68	@nomsg{@messages} = ();
69	delete @nomsg{@m};
70	push @loggrep, {
71	    (map { qr/: $_$/ => 1 } sort keys %msg),
72	    (map { qr/: $_$/ => 0 } sort keys %nomsg),
73	};
74    }
75    return @loggrep;
76}
77
78our %args = (
79    client => {
80	func => sub {
81	    my $self = shift;
82	    for (my $i = 0; $i < @messages; $i++) {
83		syslog($priorities[$i], $messages[$i]);
84	    }
85	    write_log($self);
86	},
87    },
88    syslogd => {
89	conf => selector2config(%selector2messages),
90    },
91    multifile => [
92	(map { { loggrep => $_ } } (messages2loggrep(%selector2messages))),
93    ],
94    server => {
95	loggrep => { map { qr/ <$_>/ => 1 } @priorities },
96    },
97    file => {
98	loggrep => { map { qr/: $_$/ => 1 } @messages },
99    },
100);
101
1021;
103