From 6d1e9c8e0a786da8eb7a8f5fb32cf8d3e0d19405 Mon Sep 17 00:00:00 2001 From: bluhm Date: Thu, 15 Jan 2015 13:15:17 +0000 Subject: [PATCH] Add a test for syslogd that reconnects to a TCP syslog server after an established connection has been closed. --- regress/usr.sbin/syslogd/Server.pm | 24 ++++++- .../syslogd/args-server-tcp-reconnect.pl | 65 +++++++++++++++++++ regress/usr.sbin/syslogd/funcs.pl | 15 +++-- 3 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 regress/usr.sbin/syslogd/args-server-tcp-reconnect.pl diff --git a/regress/usr.sbin/syslogd/Server.pm b/regress/usr.sbin/syslogd/Server.pm index 6d4c46edb48..5782355753f 100644 --- a/regress/usr.sbin/syslogd/Server.pm +++ b/regress/usr.sbin/syslogd/Server.pm @@ -1,6 +1,6 @@ -# $OpenBSD: Server.pm,v 1.4 2014/12/31 01:25:07 bluhm Exp $ +# $OpenBSD: Server.pm,v 1.5 2015/01/15 13:15:17 bluhm Exp $ -# Copyright (c) 2010-2014 Alexander Bluhm +# Copyright (c) 2010-2015 Alexander Bluhm # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -36,6 +36,11 @@ sub new { $self->{listenproto} ||= "udp"; defined($self->{listendomain}) or croak "$class listen domain not given"; + return $self->listen(); +} + +sub listen { + my $self = shift; $SSL_ERROR = ""; my $iosocket = $self->{listenproto} eq "tls" ? "IO::Socket::SSL" : "IO::Socket::INET6"; @@ -63,6 +68,21 @@ sub new { return $self; } +sub close { + my $self = shift; + $self->{ls}->close() + or die ref($self)," ",ref($self->{ls}), + " socket close failed: $!,$SSL_ERROR"; + delete $self->{ls}; + return $self; +} + +sub run { + my $self = shift; + Proc::run($self, @_); + return $self->close(); +} + sub child { my $self = shift; diff --git a/regress/usr.sbin/syslogd/args-server-tcp-reconnect.pl b/regress/usr.sbin/syslogd/args-server-tcp-reconnect.pl new file mode 100644 index 00000000000..343f10ed26a --- /dev/null +++ b/regress/usr.sbin/syslogd/args-server-tcp-reconnect.pl @@ -0,0 +1,65 @@ +# The TCP server closes the connection to syslogd. +# The client writes a message to Sys::Syslog native method. +# The syslogd writes it into a file and through a pipe. +# The syslogd does a TCP reconnect and passes it to loghost. +# The server receives the message on its new accepted TCP socket. +# Find the message in client, pipe, syslogd, server log. +# Check that syslogd and server close and reopen the connection. + +use strict; +use warnings; +use Socket; + +our %args = ( + client => { + func => sub { + my $self = shift; + write_between2logs($self, sub { + ${$self->{syslogd}}->loggrep("Connection refused", 5) + or die "no connection refused in syslogd.log"; + }); + }, + }, + syslogd => { + loghost => '@tcp://127.0.0.1:$connectport', + loggrep => { + qr/Logging to FORWTCP \@tcp:\/\/127.0.0.1:\d+/ => '>=6', + qr/syslogd: connect .* Connection refused/ => '>=2', + get_between2loggrep(), + }, + }, + server => { + listen => { domain => AF_INET, proto => "tcp", addr => "127.0.0.1" }, + redo => 0, + func => sub { + my $self = shift; + read_between2logs($self, sub { + if ($self->{redo}) { + $self->{redo}--; + return; + } + $self->close(); + shutdown(\*STDOUT, 1) + or die "shutdown write failed: $!"; + ${$self->{syslogd}}->loggrep("Connection refused", 5) + or die "no connection refused in syslogd.log"; + $self->listen(); + $self->{redo}++; + }); + }, + loggrep => { + qr/Accepted/ => 2, + qr/syslogd: loghost .* connection close/ => 1, + qr/syslogd: connect .* Connection refused/ => 1, + get_between2loggrep(), + }, + }, + file => { + loggrep => { + qr/syslogd: connect .* Connection refused/ => '>=1', + get_between2loggrep(), + }, + }, +); + +1; diff --git a/regress/usr.sbin/syslogd/funcs.pl b/regress/usr.sbin/syslogd/funcs.pl index 382ab1f8f70..93440059fd8 100644 --- a/regress/usr.sbin/syslogd/funcs.pl +++ b/regress/usr.sbin/syslogd/funcs.pl @@ -1,4 +1,4 @@ -# $OpenBSD: funcs.pl,v 1.9 2015/01/01 19:58:48 bluhm Exp $ +# $OpenBSD: funcs.pl,v 1.10 2015/01/15 13:15:17 bluhm Exp $ # Copyright (c) 2010-2015 Alexander Bluhm # @@ -131,10 +131,15 @@ sub read_message { local $_; for (;;) { - # reading udp packets works only with sysread() - defined(my $n = sysread(STDIN, $_, 8194)) - or die ref($self), " read log line failed: $!"; - last if $n == 0; + if ($self->{listenproto} eq "udp") { + # reading udp packets works only with sysread() + defined(my $n = sysread(STDIN, $_, 8194)) + or die ref($self), " read log line failed: $!"; + last if $n == 0; + } else { + defined($_ = ) + or last; + } chomp; print STDERR ">>> $_\n"; last if /$regex/; -- 2.20.1