diff --git a/fhem/CHANGED b/fhem/CHANGED index 01f0cdc5a..359f09304 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 93_Log2Syslog: don't use CRLF as end of data packet if EOF is used - feature: 49_IPCAM: added templates, improved logging - feature: 73_DoorBird: Maximum Size of files stored for Image, Video & Audio - bugfix: 49_SSCam: solve JS error, remove sscam_tooltip.js diff --git a/fhem/FHEM/93_Log2Syslog.pm b/fhem/FHEM/93_Log2Syslog.pm index e79765151..232d0f812 100644 --- a/fhem/FHEM/93_Log2Syslog.pm +++ b/fhem/FHEM/93_Log2Syslog.pm @@ -3,7 +3,7 @@ ########################################################################################################################## # 93_Log2Syslog.pm # -# (c) 2017-2020 by Heiko Maaz +# (c) 2017-2021 by Heiko Maaz # e-mail: Heiko dot Maaz at t-online dot de # # This script is part of fhem. @@ -106,6 +106,7 @@ BEGIN { # Versions History intern: my %vNotesIntern = ( + "5.12.4" => "27.02.2021 don't split data by CRLF if EOF is used (in getIfData) ", "5.12.3" => "02.11.2020 avoid do Logfile archiving which was executed in seldom (unknown) cases ", "5.12.2" => "15.05.2020 permit content of 'exclErrCond' to fhemLog strings ", "5.12.1" => "12.05.2020 add dev to check regex of 'exclErrCond' ", @@ -237,18 +238,18 @@ my %vNotesExtern = ( # Mappinghash BSD-Formatierung Monat my %Log2Syslog_BSDMonth = ( - "01" => "Jan", - "02" => "Feb", - "03" => "Mar", - "04" => "Apr", - "05" => "May", - "06" => "Jun", - "07" => "Jul", - "08" => "Aug", - "09" => "Sep", - "10" => "Oct", - "11" => "Nov", - "12" => "Dec", + "01" => "Jan", + "02" => "Feb", + "03" => "Mar", + "04" => "Apr", + "05" => "May", + "06" => "Jun", + "07" => "Jul", + "08" => "Aug", + "09" => "Sep", + "10" => "Oct", + "11" => "Nov", + "12" => "Dec", "Jan" => "01", "Feb" => "02", "Mar" => "03", @@ -545,14 +546,16 @@ sub Read { ## no critic 'comple if($hash->{TEMPORARY}) { my $sname = $hash->{SNAME}; $rhash = $defs{$sname}; - } else { + } + else { $rhash = $hash; } my $pp = $rhash->{PROFILE}; if($pp =~ /BSD/) { # Framelänge BSD-Format $len = $RFC3164len{DL}; - } elsif ($pp =~ /IETF/) { # Framelänge IETF-Format + } + elsif ($pp =~ /IETF/) { # Framelänge IETF-Format $len = $RFC5425len{DL}; } @@ -562,9 +565,11 @@ sub Read { ## no critic 'comple my $name = $hash->{NAME}; return if(IsDisabled($name) || isMemLock($hash)); - my $mevt = AttrVal($name, "makeEvent", "intern"); # wie soll Reading/Event erstellt werden - my $sevevt = AttrVal($name, "respectSeverity", ""); # welcher Schweregrad soll berücksichtigt werden (default: alle) - + + my $mevt = AttrVal($name, "makeEvent", "intern"); # wie soll Reading/Event erstellt werden + my $sevevt = AttrVal($name, "respectSeverity", "" ); # welcher Schweregrad soll berücksichtigt werden (default: alle) + my $uef = AttrVal($name, "useEOF", 0 ); # verwende EOF + if($socket) { ($st,$data,$hash) = getIfData($hash,$len,$mlen,$reread); } @@ -579,9 +584,11 @@ sub Read { ## no critic 'comple $tail = $+{tail}; $msg = substr($tail,0,$ocount); push @load, $msg; + if(length($tail) >= $ocount) { $tail = substr($tail,$ocount); - } else { + } + else { $tail = substr($tail,length($msg)); } @@ -597,9 +604,11 @@ sub Read { ## no critic 'comple next if(!$tail); $msg = substr($tail,0,$ocount); push @load, $msg; + if(length($tail) >= $ocount) { $tail = substr($tail,$ocount); - } else { + } + else { $tail = substr($tail,length($msg)); } @@ -607,10 +616,15 @@ sub Read { ## no critic 'comple Log3slog ($hash, 5, "Log2Syslog $name -> MSG$i : $msg"); Log3slog ($hash, 5, "Log2Syslog $name -> LENGTH_MSG$i: ".length($msg)); Log3slog ($hash, 5, "Log2Syslog $name -> TAIL$i : $tail"); - } - - } else { - @load = split("[\r\n]",$data); + } + } + else { + if($uef) { + push @load, $data; + } + else { + @load = split("[\r\n]",$data); + } } for my $line (@load) { @@ -622,17 +636,21 @@ sub Read { ## no critic 'comple $pen++; readingsSingleUpdate($hash, 'Parse_Err_No', $pen, 1); $st = "parse error - see logfile"; - } elsif ($ignore) { + } + elsif ($ignore) { Log3slog ($hash, 5, "Log2Syslog $name -> dataset was ignored by parseFn"); - } else { + } + else { return if($sevevt && $sevevt !~ m/$sev/x); # Message nicht berücksichtigen $st = "active"; if($mevt =~ /intern/) { # kein Reading, nur Event $pl = "$phost: $pl"; Trigger($hash,$ts,$pl); - } elsif ($mevt =~ /reading/x) { # Reading, Event abhängig von event-on-.* + } + elsif ($mevt =~ /reading/x) { # Reading, Event abhängig von event-on-.* readingsSingleUpdate($hash, "MSG_$phost", $pl, 1); - } else { # Reading ohne Event + } + else { # Reading ohne Event readingsSingleUpdate($hash, "MSG_$phost", $pl, 0); } } @@ -664,12 +682,15 @@ return; # (sSiehe auch "list TYPE=FHEMWEB", bzw. "man -s2 accept") # ############################################################################### -sub getIfData { ## no critic 'complexity' - my ($hash,$len,$mlen,$reread) = @_; - my $name = $hash->{NAME}; - my $socket = $hash->{SERVERSOCKET}; - my $protocol = lc(AttrVal($name, "protocol", "udp")); - my ($eof,$buforun) = (0,0); +sub getIfData { ## no critic 'complexity' + my $hash = shift; + my $len = shift; + my $mlen = shift; + my $reread = shift; + my $name = $hash->{NAME}; + my $socket = $hash->{SERVERSOCKET}; + my $protocol = lc(AttrVal($name, "protocol", "udp")); + my ($eof,$buforun) = (0,0); if($hash->{TEMPORARY}) { # temporäre Instanz abgelegt durch TcpServer_Accept @@ -689,7 +710,8 @@ sub getIfData { ## no critic Log3slog ($hash, 3, "Log2Syslog $name - Seq \"$hash->{SEQNO}\" invalid data: $data"); $data = '' if(length($data) == 0); $st = "receive error - see logfile"; - } else { + } + else { my $dl = length($data); Log3slog ($hash, 5, "Log2Syslog $name - Buffer ".$dl." chars ready to parse:\n$data"); } @@ -728,21 +750,22 @@ sub getIfData { ## no critic $shash->{HELPER}{TCPPADDR} = $hash->{PEER}; my $buf; my $off = 0; - $ret = sysread($c, $buf, $len); # returns undef on error, 0 at end of file and Integer, number of bytes read on success. + $ret = sysread($c, $buf, $len); # returns undef on error, 0 at end of file and Integer, number of bytes read on success. if(!defined($ret) && $! == EWOULDBLOCK()){ # error $hash->{wantWrite} = 1 if(TcpServer_WantWrite($hash)); $hash = $shash; Log3slog ($hash, 2, "Log2Syslog $sname - ERROR - TCP stack error: $!"); - return ($st,undef,$hash); - - } elsif (!$ret) { # EOF or error + return ($st,undef,$hash); + } + elsif (!$ret) { # EOF or error Log3slog ($shash, 4, "Log2Syslog $sname - Connection closed for $cname: ".(defined($ret) ? 'EOF' : $!)); if(!defined($ret)) { # error CommandDelete(undef, $cname); $hash = $shash; return ($st,undef,$hash); - } else { # EOF + } + else { # EOF $eof = 1; $data = $hash->{BUF}; CommandDelete(undef, $cname); @@ -3231,7 +3254,8 @@ $CONT = (split(">",$CONT))[1] if($CONT =~ /^<.*>.*$/); After every transmission the TCP-connection will be terminated with signal EOF.

Model Collector:
- No parsing until the sender has send an EOF signal. If TLS is used, this attribute has no effect. + No parsing until the sender has send an EOF signal. CRLF is not considered as data separator. + If not set, CRLF will be considered as a record separator.

@@ -4005,8 +4029,8 @@ $CONT = (split(">",$CONT))[1] if($CONT =~ /^<.*>.*$/); Nach jedem Sendevorgang wird eine TCP-Verbindung mit EOF beendet.

Model Collector:
- Es wird mit dem Parsing gewartet, bis der Sender ein EOF Signal gesendet hat. Wird TLS verwendet, hat dieses Attribut - keine Auswirkung. + Es wird mit dem Parsing gewartet, bis der Sender ein EOF Signal gesendet hat. CRLF wird nicht als Datentrenner + berücksichtigt. Wenn nicht gesetzt, wird CRLF als Trennung von Datensätzen gewertet.