[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [OSSTEST PATCH 03/15] ts-syslog-server: New test script



This is a "complete implementation of the UDP syslog protocol".

In fact, the UDP syslog protocol is trivial: the UDP packets contain
newline-terminated unix text strings.  We can simply chomp them and
log them (along with the sending address and port).

This script is designed to be run with the new "|" spawn-ts mode: it
will keep running until it is reaped.

Currently it is not part of any jobs.

Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 ts-syslog-server | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)
 create mode 100755 ts-syslog-server

diff --git a/ts-syslog-server b/ts-syslog-server
new file mode 100755
index 0000000..b17c531
--- /dev/null
+++ b/ts-syslog-server
@@ -0,0 +1,85 @@
+#!/usr/bin/perl -w
+# This is part of "osstest", an automated testing framework for Xen.
+# Copyright (C) 2009-2013 Citrix Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+
+unshift @INC, qw(.);
+use Osstest;
+use Osstest::TestSupport;
+
+use POSIX;
+use Fcntl;
+use Socket qw(PF_INET SOCK_DGRAM INADDR_ANY
+              pack_sockaddr_in unpack_sockaddr_in inet_aton inet_ntoa);
+
+tsreadconfig();
+
+die if @ARGV && $ARGV[0] =~ m/^-/;
+
+logm("starting syslog server ...");
+
+socket S, PF_INET, SOCK_DGRAM, 0 or die $!;
+
+my $sockname = pack_sockaddr_in(0, inet_aton(controller_ipaddr()));
+bind S, $sockname or die $!;
+$sockname = getsockname S or die $!;
+my ($port,$myaddr) = unpack_sockaddr_in($sockname) or die $!;
+$myaddr = inet_ntoa($myaddr);
+
+store_runvar('syslog_server',"$myaddr:$port");
+
+my @fhs = qw(S STDIN);
+
+foreach my $fh (@fhs) {
+    my $fl = fcntl($fh, F_GETFL, 0) // die $!;
+    fcntl($fh, F_SETFL, $fl | O_NONBLOCK) // die $!;
+}
+
+logm("syslog server running on $myaddr:$port");
+
+for (;;) {
+    my $rfds = '';
+    foreach my $fh (@fhs) {
+       vec($rfds, fileno($fh), 1) = 1;
+    }
+    my $efds = $rfds;
+    select($rfds, undef, $efds, undef);
+    if (vec($rfds, fileno(STDIN), 1)) {
+       my $d;
+       my $r = sysread STDIN, $d, 1;
+       if (defined $r) {
+           die "read something from stdin!" if $r>0;
+           last;
+       } else {
+           die $! unless $!==EAGAIN || $!==EWOULDBLOCK;
+       }
+    }
+    if (vec($rfds, fileno(S), 1)) {
+       my $d;
+       my $sender = recv S, $d, 1024, 0;
+       if (defined $sender) {
+           my ($sport,$saddr) = unpack_sockaddr_in($sender) or die $!;
+           $saddr = inet_ntoa($saddr) // die $!;
+           chomp $d;
+           logm("$saddr:$sport $d");
+       } else {
+           die $! unless $!==EAGAIN || $!==EWOULDBLOCK;
+       }
+    }
+}      
+
+logm("stopping.");
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.