diff --git a/contrib/93_Log2Syslog.pm b/contrib/93_Log2Syslog.pm index cce4e5985..bec9eb3fc 100644 --- a/contrib/93_Log2Syslog.pm +++ b/contrib/93_Log2Syslog.pm @@ -30,6 +30,7 @@ ###################################################################################################################### # Versions History: # +# 4.5.0 06.08.2018 Regex capture groups used in parsePayload to set variables, parsing of BSD changed # 4.4.0 04.08.2018 Attribute "outputFields" added # 4.3.0 03.08.2018 Attribute "parseFn" added # 4.2.0 03.08.2018 evaluate sender peer ip-address/hostname, use it as reading in event generation @@ -63,6 +64,7 @@ package main; use strict; use warnings; +use Scalar::Util qw(looks_like_number); use Encode qw(encode_utf8); eval "use IO::Socket::INET;1" or my $MissModulSocket = "IO::Socket::INET"; eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $MissModulNDom = "Net::Domain"; @@ -72,7 +74,7 @@ eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $Mis # sub Log2Syslog_Log3slog($$$); -my $Log2SyslogVn = "4.4.0"; +my $Log2SyslogVn = "4.5.0"; # Mappinghash BSD-Formatierung Monat my %Log2Syslog_BSDMonth = ( @@ -99,7 +101,7 @@ my %Log2Syslog_BSDMonth = ( "Sep" => "09", "Oct" => "10", "Nov" => "11", - "Dec" => "12", + "Dec" => "12" ); # Mappinghash Severity @@ -112,6 +114,14 @@ my %Log2Syslog_Severity = ( "5" => "Notice", "6" => "Informational", "7" => "Debug", + "Emergency" => "0", + "Alert" => "1", + "Critical" => "2", + "Error" => "3", + "Warning" => "4", + "Notice" => "5", + "Informational" => "6", + "Debug" => "7" ); # Mappinghash Facility @@ -139,7 +149,7 @@ my %Log2Syslog_Facility = ( "20" => "local4", "21" => "local5", "22" => "local6", - "23" => "local7", + "23" => "local7" ); # Längenvorgaben nach RFC3164 @@ -269,7 +279,6 @@ sub Log2Syslog_initServer($) { # Inititialisierung FHEM ist fertig -> Attribute geladen my $port = AttrVal($name, "TLS", 0)?AttrVal($name, "port", 6514):AttrVal($name, "port", 1514); my $protocol = lc(AttrVal($name, "protocol", "udp")); - my $lf = AttrVal($name, "logFormat", "IETF"); my $lh = $global ? ($global eq "global"? undef : $global) : ($hash->{IPV6} ? "::1" : "127.0.0.1"); Log3 $hash, 3, "Log2Syslog $name - Opening socket ..."; @@ -291,12 +300,11 @@ sub Log2Syslog_initServer($) { $hash->{FD} = $hash->{SERVERSOCKET}->fileno(); $hash->{PORT} = $hash->{SERVERSOCKET}->sockport(); $hash->{PROTOCOL} = $protocol; - $hash->{LOGFORMAT} = $lf; $hash->{SEQNO} = 1; # PROCID wird kontinuierlich pro empfangenen Datensatz hochgezählt $hash->{HELPER}{OLDSEQNO} = $hash->{SEQNO}; # Init Sequenznummer f. Ratenbestimmung $hash->{INTERFACE} = $lh?$lh:"global"; - Log3 ($hash, 3, "Log2Syslog $name - port $hash->{PORT}/$protocol opened for Syslog Collector ($lf) on interface \"$hash->{INTERFACE}\""); + Log3 ($hash, 3, "Log2Syslog $name - port $hash->{PORT}/$protocol opened for Syslog Collector on interface \"$hash->{INTERFACE}\""); ReadingsSingleUpdateValue ($hash, "state", "initialized", 1); delete($readyfnlist{"$name.$port"}); $selectlist{"$name.$port"} = $hash; @@ -315,7 +323,7 @@ sub Log2Syslog_Read($) { my $socket = $hash->{SERVERSOCKET}; my $st = ReadingsVal($name,"state","active"); my $pp = AttrVal($name, "parseProfile", "IETF"); - my ($err,$data,$facility,$severity,$ts,$host,$ident,$pl,$version,$pid,$mid,$sdfield); + my ($err,$data,$ts,$phost,$pl); return if(IsDisabled($name) || $hash->{MODEL} !~ /Collector/); @@ -329,12 +337,13 @@ sub Log2Syslog_Read($) { $st = "receive error - see logfile"; } else { # parse Payload - ($err,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); + ($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); $hash->{SEQNO}++; if($err) { $st = "parse error - see logfile"; } else { $st = "active"; + $pl = "$phost: $pl"; Log2Syslog_Trigger($hash,$ts,$pl); } } @@ -349,24 +358,26 @@ sub Log2Syslog_Read($) { $st = "receive error - see logfile"; } else { # parse Payload - ($err,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); + ($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); $hash->{SEQNO}++; if($err) { $st = "parse error - see logfile"; } else { $st = "active"; + $pl = "$phost: $pl"; Log2Syslog_Trigger($hash,$ts,$pl); } } } else { # raw oder User eigenes Format $socket->recv($data, 8192); - ($err,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); + ($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); $hash->{SEQNO}++; if($err) { $st = "parse error - see logfile"; } else { $st = "active"; + $pl = "$phost: $pl"; Log2Syslog_Trigger($hash,$ts,$pl); } @@ -425,32 +436,47 @@ sub Log2Syslog_parsePayload($$) { if ($pp =~ /raw/) { Log2Syslog_Log3slog($name, 4, "$name - $data"); $ts = TimeNow(); - $pl = "$phost: $data"; + $pl = $data; } elsif($pp eq "BSD") { # BSD Protokollformat https://tools.ietf.org/html/rfc3164 # Beispiel data "<$prival>$month $day $time $myhost $id: : $otp" - ($prival,$Mmm,$dd,$time,$host,$id,$delimiter,$cont) = ($data =~ /^<(?\d{1,3})>(?\w{3})\s{1,2}(?\d{1,2})\s(?