an established connection has been closed.
-# $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
$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";
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;
--- /dev/null
+# 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;
-# $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>
#
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/;