diff --git a/fhem/contrib/93_Log2Syslog.pm b/fhem/contrib/93_Log2Syslog.pm index f6377e8b6..cce4e5985 100644 --- a/fhem/contrib/93_Log2Syslog.pm +++ b/fhem/contrib/93_Log2Syslog.pm @@ -30,6 +30,8 @@ ###################################################################################################################### # Versions History: # +# 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 # 4.1.0 02.08.2018 state event generation changed # 4.0.0 30.07.2018 server mode (Collector) @@ -70,7 +72,7 @@ eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $Mis # sub Log2Syslog_Log3slog($$$); -my $Log2SyslogVn = "4.2.0"; +my $Log2SyslogVn = "4.4.0"; # Mappinghash BSD-Formatierung Monat my %Log2Syslog_BSDMonth = ( @@ -168,8 +170,10 @@ sub Log2Syslog_Initialize($) { $hash->{AttrList} = "addStateEvent:1,0 ". "disable:1,0 ". "addTimestamp:0,1 ". + "outputFields:sortable,PRIVAL,FAC,SEV,TS,HOST,DATE,TIME,ID,PID,MID,SDFIELD,CONT ". "logFormat:BSD,IETF ". - "parseProfile:BSD,IETF,raw ". + "parseProfile:BSD,IETF,raw,ParseFn ". + "parseFn:textField-long ". "ssldebug:0,1,2,3 ". "TLS:1,0 ". "timeout ". @@ -309,13 +313,13 @@ sub Log2Syslog_Read($) { my ($hash) = @_; my $name = $hash->{NAME}; my $socket = $hash->{SERVERSOCKET}; - my $st = "active"; - my $lf = AttrVal($name, "logFormat", "IETF"); - my ($err,$data,$facility,$severity,$ts,$host,$ident,$content,$pl,$version,$pid,$mid,$sdfield); + 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); return if(IsDisabled($name) || $hash->{MODEL} !~ /Collector/); - if($lf =~ /BSD/) { + if($pp =~ /BSD/) { # BSD-Format unless($socket->recv($data, $RFC3164len{DL})) { # ungültige BSD-Payload @@ -330,16 +334,17 @@ sub Log2Syslog_Read($) { if($err) { $st = "parse error - see logfile"; } else { + $st = "active"; Log2Syslog_Trigger($hash,$ts,$pl); } } - } else { + } elsif($pp =~ /IETF/) { # IETF-Format unless($socket->recv($data, $RFC5425len{DL})) { # ungültige IETF-Payload return if(length($data) == 0); - Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - received ".length($data)." bytes, but a BSD-message has to be 1024 bytes or less."); + Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - received ".length($data)." bytes, but a IETF-message has to be 8192 bytes or less."); Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Seq \"$hash->{SEQNO}\" invalid data: $data"); $st = "receive error - see logfile"; } else { @@ -349,9 +354,22 @@ sub Log2Syslog_Read($) { if($err) { $st = "parse error - see logfile"; } else { + $st = "active"; Log2Syslog_Trigger($hash,$ts,$pl); } } + } else { + # raw oder User eigenes Format + $socket->recv($data, 8192); + ($err,$ts,$pl) = Log2Syslog_parsePayload($hash,$data); + $hash->{SEQNO}++; + if($err) { + $st = "parse error - see logfile"; + } else { + $st = "active"; + Log2Syslog_Trigger($hash,$ts,$pl); + } + } # readingsSingleUpdate($hash, "state", $st, 1) if($st ne OldValue($name)); my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1; @@ -368,9 +386,30 @@ return; sub Log2Syslog_parsePayload($$) { my ($hash,$data) = @_; my $name = $hash->{NAME}; - my $pp = AttrVal($name, "parseProfile", "IETF"); - my ($prival,$Mmm,$dd,$time,$host,$ident,$delimiter,$content,$day,$date,$ts); - my ($severity,$sev,$facility,$fac,$version,$pid,$mid,$sdfield,$err,$pl); + my $pp = AttrVal($name, "parseProfile", "IETF"); + my $severity = ""; + my $facility = ""; + my @evf = split(",",AttrVal($name, "outputFields", "FAC,SEV,ID,CONT")); # auszugebene Felder im Event/Reading + my ($Mmm,$dd,$delimiter,$day,$ietf,$err,$pl); + + # Hash zur Umwandlung Felder in deren Variablen + my ($prival,$ts,$host,$date,$time,$id,$pid,$mid,$sdfield,$cont); + my $fac = ""; + my $sev = ""; + my %fh = (PRIVAL => \$prival, + FAC => \$fac, + SEV => \$sev, + TS => \$ts, + HOST => \$host, + DATE => \$date, + TIME => \$time, + ID => \$id, + PID => \$pid, + MID => \$mid, + SDFIELD => \$sdfield, + CONT => \$cont, + DATA => \$data + ); Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name - ### new Syslog message Parsing ### "); @@ -385,14 +424,14 @@ sub Log2Syslog_parsePayload($$) { if ($pp =~ /raw/) { Log2Syslog_Log3slog($name, 4, "$name - $data"); + $ts = TimeNow(); $pl = "$phost: $data"; - $ts = TimeNow(); } elsif($pp eq "BSD") { # BSD Protokollformat https://tools.ietf.org/html/rfc3164 - # Beispiel data "<$prival>$month $day $time $myhost $ident: : $otp" - ($prival,$Mmm,$dd,$time,$host,$ident,$delimiter,$content) = ($data =~ /^<(?\d{1,3})>(?\w{3})\s{1,2}(?\d{1,2})\s(?