Add a test for syslogd that reconnects to a TCP syslog server after
authorbluhm <bluhm@openbsd.org>
Thu, 15 Jan 2015 13:15:17 +0000 (13:15 +0000)
committerbluhm <bluhm@openbsd.org>
Thu, 15 Jan 2015 13:15:17 +0000 (13:15 +0000)
an established connection has been closed.

regress/usr.sbin/syslogd/Server.pm
regress/usr.sbin/syslogd/args-server-tcp-reconnect.pl [new file with mode: 0644]
regress/usr.sbin/syslogd/funcs.pl

index 6d4c46e..5782355 100644 (file)
@@ -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 <bluhm@openbsd.org>
+# Copyright (c) 2010-2015 Alexander Bluhm <bluhm@openbsd.org>
 #
 # 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 (file)
index 0000000..343f10e
--- /dev/null
@@ -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;
index 382ab1f..9344005 100644 (file)
@@ -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 <bluhm@openbsd.org>
 #
@@ -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($_ = <STDIN>)
+                           or last;
+               }
                chomp;
                print STDERR ">>> $_\n";
                last if /$regex/;