xref: /openbsd/regress/usr.sbin/syslogd/Server.pm (revision dbe795f4)
1*dbe795f4Sbluhm#	$OpenBSD: Server.pm,v 1.6 2015/01/28 22:58:38 bluhm Exp $
21f53c19fSbluhm
36d1e9c8eSbluhm# Copyright (c) 2010-2015 Alexander Bluhm <bluhm@openbsd.org>
41f53c19fSbluhm#
51f53c19fSbluhm# Permission to use, copy, modify, and distribute this software for any
61f53c19fSbluhm# purpose with or without fee is hereby granted, provided that the above
71f53c19fSbluhm# copyright notice and this permission notice appear in all copies.
81f53c19fSbluhm#
91f53c19fSbluhm# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
101f53c19fSbluhm# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
111f53c19fSbluhm# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
121f53c19fSbluhm# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
131f53c19fSbluhm# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
141f53c19fSbluhm# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
151f53c19fSbluhm# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
161f53c19fSbluhm
171f53c19fSbluhmuse strict;
181f53c19fSbluhmuse warnings;
191f53c19fSbluhm
201f53c19fSbluhmpackage Server;
211f53c19fSbluhmuse parent 'Proc';
221f53c19fSbluhmuse Carp;
231f53c19fSbluhmuse Socket;
241f53c19fSbluhmuse Socket6;
251f53c19fSbluhmuse IO::Socket;
261f53c19fSbluhmuse IO::Socket::INET6;
271f53c19fSbluhmuse IO::Socket::SSL;
281f53c19fSbluhm
291f53c19fSbluhmsub new {
301f53c19fSbluhm	my $class = shift;
311f53c19fSbluhm	my %args = @_;
321f53c19fSbluhm	$args{ktracefile} ||= "server.ktrace";
331f53c19fSbluhm	$args{logfile} ||= "server.log";
341f53c19fSbluhm	$args{up} ||= "Accepted";
351f53c19fSbluhm	my $self = Proc::new($class, %args);
36a0156d40Sbluhm	$self->{listenproto} ||= "udp";
3773e391cdSbluhm	defined($self->{listendomain})
381f53c19fSbluhm	    or croak "$class listen domain not given";
396d1e9c8eSbluhm	return $self->listen();
406d1e9c8eSbluhm}
416d1e9c8eSbluhm
426d1e9c8eSbluhmsub listen {
436d1e9c8eSbluhm	my $self = shift;
441f53c19fSbluhm	$SSL_ERROR = "";
45a0156d40Sbluhm	my $iosocket = $self->{listenproto} eq "tls" ?
461f53c19fSbluhm	    "IO::Socket::SSL" : "IO::Socket::INET6";
47a0156d40Sbluhm	my $proto = $self->{listenproto};
481f53c19fSbluhm	$proto = "tcp" if $proto eq "tls";
491f53c19fSbluhm	my $ls = $iosocket->new(
501f53c19fSbluhm	    Proto		=> $proto,
511f53c19fSbluhm	    ReuseAddr		=> 1,
521f53c19fSbluhm	    Domain		=> $self->{listendomain},
531f53c19fSbluhm	    $self->{listenaddr} ? (LocalAddr => $self->{listenaddr}) : (),
541f53c19fSbluhm	    $self->{listenport} ? (LocalPort => $self->{listenport}) : (),
552bccb94aSbluhm	    SSL_key_file	=> "server.key",
562bccb94aSbluhm	    SSL_cert_file	=> "server.crt",
571f53c19fSbluhm	    SSL_verify_mode	=> SSL_VERIFY_NONE,
58*dbe795f4Sbluhm	    $self->{sslversion} ? (SSL_version => $self->{sslversion}) : (),
59*dbe795f4Sbluhm	    $self->{sslciphers} ? (SSL_cipher_list => $self->{sslciphers}) : (),
601f53c19fSbluhm	) or die ref($self), " $iosocket socket listen failed: $!,$SSL_ERROR";
612bccb94aSbluhm	if ($self->{listenproto} ne "udp") {
621f53c19fSbluhm		listen($ls, 1)
631f53c19fSbluhm		    or die ref($self), " socket failed: $!";
641f53c19fSbluhm	}
651f53c19fSbluhm	my $log = $self->{log};
661f53c19fSbluhm	print $log "listen sock: ",$ls->sockhost()," ",$ls->sockport(),"\n";
671f53c19fSbluhm	$self->{listenaddr} = $ls->sockhost() unless $self->{listenaddr};
681f53c19fSbluhm	$self->{listenport} = $ls->sockport() unless $self->{listenport};
691f53c19fSbluhm	$self->{ls} = $ls;
701f53c19fSbluhm	return $self;
711f53c19fSbluhm}
721f53c19fSbluhm
736d1e9c8eSbluhmsub close {
746d1e9c8eSbluhm	my $self = shift;
756d1e9c8eSbluhm	$self->{ls}->close()
766d1e9c8eSbluhm	    or die ref($self)," ",ref($self->{ls}),
776d1e9c8eSbluhm	    " socket close failed: $!,$SSL_ERROR";
786d1e9c8eSbluhm	delete $self->{ls};
796d1e9c8eSbluhm	return $self;
806d1e9c8eSbluhm}
816d1e9c8eSbluhm
826d1e9c8eSbluhmsub run {
836d1e9c8eSbluhm	my $self = shift;
846d1e9c8eSbluhm	Proc::run($self, @_);
856d1e9c8eSbluhm	return $self->close();
866d1e9c8eSbluhm}
876d1e9c8eSbluhm
881f53c19fSbluhmsub child {
891f53c19fSbluhm	my $self = shift;
901f53c19fSbluhm
911f53c19fSbluhm	my $as = $self->{ls};
92a0156d40Sbluhm	if ($self->{listenproto} ne "udp") {
931f53c19fSbluhm		$as = $self->{ls}->accept()
942bccb94aSbluhm		    or die ref($self)," ",ref($self->{ls}),
952bccb94aSbluhm		    " socket accept failed: $!,$SSL_ERROR";
961f53c19fSbluhm		print STDERR "accept sock: ",$as->sockhost()," ",
971f53c19fSbluhm		    $as->sockport(),"\n";
981f53c19fSbluhm		print STDERR "accept peer: ",$as->peerhost()," ",
991f53c19fSbluhm		    $as->peerport(),"\n";
1001f53c19fSbluhm	}
101*dbe795f4Sbluhm	if ($self->{listenproto} eq "tls") {
102*dbe795f4Sbluhm		print STDERR "ssl version: ",$as->get_sslversion(),"\n";
103*dbe795f4Sbluhm		print STDERR "ssl cipher: ",$as->get_cipher(),"\n";
104*dbe795f4Sbluhm	}
1051f53c19fSbluhm
1061f53c19fSbluhm	*STDIN = *STDOUT = $self->{as} = $as;
1071f53c19fSbluhm}
1081f53c19fSbluhm
1091f53c19fSbluhm1;
110