2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

93_Log2Syslog: some code changes and reviews

git-svn-id: https://svn.fhem.de/fhem/trunk@21635 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-04-10 21:08:23 +00:00
parent 4f8678b2bd
commit 2fc9c9b7ee
2 changed files with 128 additions and 91 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # 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. # Do not insert empty lines here, update check depends on it.
- change: 93_Log2Syslog: some code changes and reviews
- bugfix: 70_DENON_AVR: fixed HTTP 403 (thx justme1968) - bugfix: 70_DENON_AVR: fixed HTTP 403 (thx justme1968)
- bugfix : 73_AutoShuttersControl: fix shading drive if current position under - bugfix : 73_AutoShuttersControl: fix shading drive if current position under
shading position shading position

View File

@ -44,6 +44,7 @@ eval "use FHEM::Meta;1" or my $mod
# Versions History intern: # Versions History intern:
my %Log2Syslog_vNotesIntern = ( my %Log2Syslog_vNotesIntern = (
"5.10.2" => "08.04.2020 code changes to stabilize send process, minor fixes ",
"5.10.1" => "06.04.2020 support time-secfrac of RFC 3339, minor fix ", "5.10.1" => "06.04.2020 support time-secfrac of RFC 3339, minor fix ",
"5.10.0" => "04.04.2020 new attribute 'timeSpec', send and parse messages according to UTC or Local time, some minor fixes (e.g. for Octet Count) ", "5.10.0" => "04.04.2020 new attribute 'timeSpec', send and parse messages according to UTC or Local time, some minor fixes (e.g. for Octet Count) ",
"5.9.0" => "01.04.2020 Parser UniFi Controller Syslog (BSD Format) and Netconsole messages, more code review (e.g. remove prototypes) ", "5.9.0" => "01.04.2020 Parser UniFi Controller Syslog (BSD Format) and Netconsole messages, more code review (e.g. remove prototypes) ",
@ -531,10 +532,14 @@ sub Log2Syslog_Read {
$i++; $i++;
$ocount = $+{ocount}; $ocount = $+{ocount};
$tail = $+{tail}; $tail = $+{tail};
next if(!$tail);
$msg = substr($tail,0,$ocount); $msg = substr($tail,0,$ocount);
push @load, $msg; push @load, $msg;
next if(!$tail); if(length($tail) >= $ocount) {
$tail = substr($tail,$ocount); $tail = substr($tail,$ocount);
} else {
$tail = "";
}
Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name -> OCTETCOUNT$i: $ocount"); Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name -> OCTETCOUNT$i: $ocount");
Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name -> MSG$i : $msg"); Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name -> MSG$i : $msg");
@ -736,7 +741,7 @@ sub Log2Syslog_parsePayload {
my $pp = AttrVal($name, "parseProfile", $hash->{PROFILE}); my $pp = AttrVal($name, "parseProfile", $hash->{PROFILE});
my $severity = ""; my $severity = "";
my $facility = ""; my $facility = "";
my @evf = split(",",AttrVal($name, "outputFields", "FAC,SEV,ID,CONT")); # auszugebene Felder im Event/Reading my @evf = split q{,},AttrVal($name, "outputFields", "FAC,SEV,ID,CONT"); # auszugebene Felder im Event/Reading
my $ignore = 0; my $ignore = 0;
my ($to,$Mmm,$dd,$day,$ietf,$err,$pl,$tail); my ($to,$Mmm,$dd,$day,$ietf,$err,$pl,$tail);
@ -1381,7 +1386,7 @@ sub Log2Syslog_Get {
$ret .= "<tbody>"; $ret .= "<tbody>";
$ret .= "<tr class=\"even\">"; $ret .= "<tr class=\"even\">";
if($prop && $prop =~ /[\d]+/) { if($prop && $prop =~ /[\d]+/) {
my @hints = split(",",$prop); my @hints = split q{,},$prop;
foreach (@hints) { foreach (@hints) {
if(AttrVal("global","language","EN") eq "DE") { if(AttrVal("global","language","EN") eq "DE") {
$hs{$_} = $Log2Syslog_vHintsExt_de{$_}; $hs{$_} = $Log2Syslog_vHintsExt_de{$_};
@ -1423,12 +1428,11 @@ sub Log2Syslog_Get {
$ret .= "<tr class=\"even\">"; $ret .= "<tr class=\"even\">";
$i = 0; $i = 0;
for my $key (Log2Syslog_sortVersion("desc",keys %Log2Syslog_vNotesExtern)) { for my $key (Log2Syslog_sortVersion("desc",keys %Log2Syslog_vNotesExtern)) {
($val0,$val1) = split(/\s/,$Log2Syslog_vNotesExtern{$key},2); ($val0,$val1) = split q{\s+},$Log2Syslog_vNotesExtern{$key},2;
$ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0 </td><td>$val1</td>" ); $ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0 </td><td>$val1</td>" );
$ret .= "</tr>"; $ret .= "</tr>";
$i++; $i++;
if ($i & 1) { if ($i & 1) { # $i ist ungerade
# $i ist ungerade
$ret .= "<tr class=\"odd\">"; $ret .= "<tr class=\"odd\">";
} else { } else {
$ret .= "<tr class=\"even\">"; $ret .= "<tr class=\"even\">";
@ -1523,19 +1527,25 @@ sub Log2Syslog_Attr {
InternalTimer(gettimeofday()+5, "Log2Syslog_trate", $hash, 0); InternalTimer(gettimeofday()+5, "Log2Syslog_trate", $hash, 0);
} }
if ($cmd eq "set" && $aName =~ /port|timeout/) { if ($cmd eq "set") {
if($aVal !~ m/^\d+$/) { return " The Value of \"$aName\" is not valid. Use only figures !";} if($aName =~ /port/) {
if($aVal !~ m/^\d+$/) { return " The Value of \"$aName\" is not valid. Use only figures !";}
$hash->{HELPER}{MEMLOCK} = 1; $hash->{HELPER}{MEMLOCK} = 1;
InternalTimer(gettimeofday()+2, "Log2Syslog_deleteMemLock", $hash, 0); InternalTimer(gettimeofday()+2, "Log2Syslog_deleteMemLock", $hash, 0);
if($aName =~ /port/ && $hash->{MODEL} =~ /Collector/ && $init_done) { if($hash->{MODEL} =~ /Collector/ && $init_done) {
return qq{$aName "$aVal" is not valid because off privileged ports are only usable by super users. Use a port number grater than 1023.} if($aVal < 1024); return qq{$aName "$aVal" is not valid because off privileged ports are only usable by super users. Use a port number grater than 1023.} if($aVal < 1024);
Log2Syslog_downServer($hash,1); # Serversocket schließen Log2Syslog_downServer($hash,1); # Serversocket schließen
InternalTimer(gettimeofday()+0.5, "Log2Syslog_initServer", "$name,global", 0); InternalTimer(gettimeofday()+0.5, "Log2Syslog_initServer", "$name,global", 0);
readingsSingleUpdate ($hash, 'Parse_Err_No', 0, 1); # Fehlerzähler für Parse-Errors auf 0 readingsSingleUpdate ($hash, 'Parse_Err_No', 0, 1); # Fehlerzähler für Parse-Errors auf 0
} elsif ($aName =~ /port/ && $hash->{MODEL} !~ /Collector/) { } elsif ($hash->{MODEL} !~ /Collector/) {
Log2Syslog_closesock($hash,1); # Clientsocket schließen Log2Syslog_closesock($hash,1); # Clientsocket schließen
}
}
if($aName =~ /timeout/) {
if($aVal !~ m/^\d+(.\d+)?$/) { return qq{The value of "$aName" is not valid. Use only integer or fractions of numbers like "0.7".}; }
} }
} }
@ -1547,7 +1557,7 @@ sub Log2Syslog_Attr {
InternalTimer(gettimeofday()+2, "Log2Syslog_deleteMemLock", $hash, 0); InternalTimer(gettimeofday()+2, "Log2Syslog_deleteMemLock", $hash, 0);
if($hash->{MODEL} eq "Collector") { if($hash->{MODEL} eq "Collector") {
Log2Syslog_downServer($hash,1); # Serversocket schließen Log2Syslog_downServer($hash,1); # Serversocket schließen
InternalTimer(gettimeofday()+0.5, "Log2Syslog_initServer", "$name,global", 0); InternalTimer(gettimeofday()+0.5, "Log2Syslog_initServer", "$name,global", 0);
readingsSingleUpdate ($hash, 'Parse_Err_No', 0, 1); # Fehlerzähler für Parse-Errors auf 0 readingsSingleUpdate ($hash, 'Parse_Err_No', 0, 1); # Fehlerzähler für Parse-Errors auf 0
} else { } else {
@ -1627,6 +1637,7 @@ sub Log2Syslog_eventlog {
my $rex = $hash->{HELPER}{EVNTLOG}; my $rex = $hash->{HELPER}{EVNTLOG};
my $st = ReadingsVal($name,"state","active"); my $st = ReadingsVal($name,"state","active");
my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my $uef = AttrVal($name, "useEOF", 0);
my ($prival,$data,$sock,$pid,$sevAstxt); my ($prival,$data,$sock,$pid,$sevAstxt);
if(IsDisabled($name)) { if(IsDisabled($name)) {
@ -1648,42 +1659,34 @@ sub Log2Syslog_eventlog {
my $tn = $dev->{NTFY_TRIGGERTIME}; my $tn = $dev->{NTFY_TRIGGERTIME};
my $ct = $dev->{CHANGETIME}; my $ct = $dev->{CHANGETIME};
($sock,$st) = Log2Syslog_opensock($hash,0); for (my $i = 0; $i < $max; $i++) {
my $txt = $events->[$i];
$txt = "" if(!defined($txt));
$txt = Log2Syslog_charfilter($hash,$txt);
my $tim = (($ct && $ct->[$i]) ? $ct->[$i] : $tn);
my ($date,$time) = split q{ }, $tim;
if($sock) { if($n =~ m/^$rex$/ || "$n:$txt" =~ m/^$rex$/ || "$tim:$n:$txt" =~ m/^$rex$/) {
for (my $i = 0; $i < $max; $i++) { my $otp = "$n $txt";
my $txt = $events->[$i]; $otp = "$tim $otp" if AttrVal($name,'addTimestamp',0);
$txt = "" if(!defined($txt)); ($prival,$sevAstxt) = Log2Syslog_setprival($hash,$txt);
$txt = Log2Syslog_charfilter($hash,$txt); if($sendsev && $sendsev !~ m/$sevAstxt/) { # nicht senden wenn Severity nicht in "respectSeverity" enthalten
my $tim = (($ct && $ct->[$i]) ? $ct->[$i] : $tn); Log2Syslog_Log3slog($name, 5, "Log2Syslog $name - Warning - Payload NOT sent due to Message Severity not in attribute \"respectSeverity\"\n");
my ($date,$time) = split(" ",$tim); next;
}
if($n =~ m/^$rex$/ || "$n:$txt" =~ m/^$rex$/ || "$tim:$n:$txt" =~ m/^$rex$/) { ($data,$pid) = Log2Syslog_setpayload($hash,$prival,$date,$time,$otp,"event");
my $otp = "$n $txt"; next if(!$data);
$otp = "$tim $otp" if AttrVal($name,'addTimestamp',0);
($prival,$sevAstxt) = Log2Syslog_setprival($hash,$txt);
if($sendsev && $sendsev !~ m/$sevAstxt/) {
# nicht senden wenn Severity nicht in "respectSeverity" enthalten
Log2Syslog_Log3slog($name, 5, "Log2Syslog $name - Warning - Payload NOT sent due to Message Severity not in attribute \"respectSeverity\"\n");
next;
}
($data,$pid) = Log2Syslog_setpayload($hash,$prival,$date,$time,$otp,"event"); ($sock,$st) = Log2Syslog_opensock($hash,0);
next if(!$data);
my $ret = syswrite ($sock,$data); if ($sock) {
if($ret && $ret > 0) { my $err = Log2Syslog_writeToSocket ($name,$sock,$data,$pid);
Log2Syslog_Log3slog($name, 4, "Log2Syslog $name - Payload sequence $pid sent\n"); $st = $err if($err);
} else {
my $err = $!; Log2Syslog_closesock($hash) if($uef);
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - Warning - Payload sequence $pid NOT sent: $err\n");
$st = "write error: $err";
}
} }
} }
my $uef = AttrVal($name, "useEOF", 0);
Log2Syslog_closesock($hash) if($st =~ /^write error:.*/ || $uef);
} }
my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1; my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1;
@ -1702,6 +1705,7 @@ sub Log2Syslog_fhemlog {
my $rex = $hash->{HELPER}{FHEMLOG}; my $rex = $hash->{HELPER}{FHEMLOG};
my $st = ReadingsVal($name,"state","active"); my $st = ReadingsVal($name,"state","active");
my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my $uef = AttrVal($name, "useEOF", 0);
my ($prival,$sock,$err,$ret,$data,$pid,$sevAstxt); my ($prival,$sock,$err,$ret,$data,$pid,$sevAstxt);
if(IsDisabled($name)) { if(IsDisabled($name)) {
@ -1736,17 +1740,10 @@ sub Log2Syslog_fhemlog {
($sock,$st) = Log2Syslog_opensock($hash,0); ($sock,$st) = Log2Syslog_opensock($hash,0);
if ($sock) { if ($sock) {
$ret = syswrite($sock,$data) if($data); my $err = Log2Syslog_writeToSocket ($name,$sock,$data,$pid);
if($ret && $ret > 0) { $st = $err if($err);
Log2Syslog_Log3slog($name, 4, "Log2Syslog $name - Payload sequence $pid sent\n");
} else {
$err = $!;
$st = "write error: $err";
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - Warning - Payload sequence $pid NOT sent: $err\n");
}
my $uef = AttrVal($name, "useEOF", 0); Log2Syslog_closesock($hash) if($uef);
Log2Syslog_closesock($hash) if($st =~ /^write error:.*/ || $uef);
} }
} }
@ -1774,7 +1771,7 @@ sub Log2Syslog_sendTestMsg {
} else { } else {
$ts = TimeNow(); $ts = TimeNow();
($date,$time) = split(" ",$ts); ($date,$time) = split q{ }, $ts;
$date =~ s/\./-/g; $date =~ s/\./-/g;
$tim = $date." ".$time; $tim = $date." ".$time;
@ -1800,7 +1797,7 @@ sub Log2Syslog_sendTestMsg {
} }
my $uef = AttrVal($name, "useEOF", 0); my $uef = AttrVal($name, "useEOF", 0);
Log2Syslog_closesock($hash) if($st =~ /^write error:.*/ || $uef); Log2Syslog_closesock($hash) if($uef);
} }
my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1; my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1;
@ -1817,7 +1814,7 @@ sub Log2Syslog_setidrex {
my ($hash,$a) = @_; my ($hash,$a) = @_;
$hash->{HELPER}{EVNTLOG} = (split("event:",$a))[1] if(lc($a) =~ m/^event:.*/); $hash->{HELPER}{EVNTLOG} = (split("event:",$a))[1] if(lc($a) =~ m/^event:.*/);
$hash->{HELPER}{FHEMLOG} = (split("fhem:",$a))[1] if(lc($a) =~ m/^fhem:.*/); $hash->{HELPER}{FHEMLOG} = (split("fhem:", $a))[1] if(lc($a) =~ m/^fhem:.*/);
$hash->{HELPER}{IDENT} = (split("ident:",$a))[1] if(lc($a) =~ m/^ident:.*/); $hash->{HELPER}{IDENT} = (split("ident:",$a))[1] if(lc($a) =~ m/^ident:.*/);
return; return;
@ -1850,19 +1847,26 @@ return($txt);
sub Log2Syslog_opensock { sub Log2Syslog_opensock {
my ($hash,$supresslog) = @_; my ($hash,$supresslog) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $host = $hash->{PEERHOST};
my $port = AttrVal($name, "TLS", 0)?AttrVal($name, "port", 6514):AttrVal($name, "port", 514);
my $protocol = lc(AttrVal($name, "protocol", "udp")); my $protocol = lc(AttrVal($name, "protocol", "udp"));
my $port = AttrVal($name, "TLS", 0)?AttrVal($name, "port", 6514):AttrVal($name, "port", 514);
my $st = "active"; my $st = "active";
my $timeout = AttrVal($name, "timeout", 0.5);
my $ssldbg = AttrVal($name, "ssldebug", 0); if($hash->{CLIENTSOCKET}) {
my ($sock,$lo,$lof,$sslver,$sslalgo); if($protocol eq "tcp") {
my $sock = $hash->{CLIENTSOCKET};
return($hash->{CLIENTSOCKET},$st) if($sock->connected());
Log2Syslog_closesock ($hash);
} else {
return($hash->{CLIENTSOCKET},$st);
}
}
return if($init_done != 1 || $hash->{MODEL} !~ /Sender/); return if($init_done != 1 || $hash->{MODEL} !~ /Sender/);
if($hash->{CLIENTSOCKET}) { my $host = $hash->{PEERHOST};
return($hash->{CLIENTSOCKET},$st); my $timeout = AttrVal($name, "timeout", 0.5);
} my $ssldbg = AttrVal($name, "ssldebug", 0);
my ($sock,$lo,$lof,$sslver,$sslalgo);
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Opening client socket on port \"$port\" ...") if(!$supresslog); Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Opening client socket on port \"$port\" ...") if(!$supresslog);
@ -1934,7 +1938,7 @@ sub Log2Syslog_opensock {
$hash->{HELPER}{SSLALGO} = $sslalgo; $hash->{HELPER}{SSLALGO} = $sslalgo;
} }
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - $lo") if($lo); Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - $lo") if($lo);
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - $lof") if($lof && !$supresslog && !$hash->{CLIENTSOCKET}); Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - $lof") if($lof && !$supresslog && !$hash->{CLIENTSOCKET});
$hash->{CLIENTSOCKET} = $sock if($sock); $hash->{CLIENTSOCKET} = $sock if($sock);
@ -1942,6 +1946,32 @@ sub Log2Syslog_opensock {
return($sock,$st); return($sock,$st);
} }
################################################################
# schreibt Daten in geöffneten Socket
################################################################
sub Log2Syslog_writeToSocket {
my ($name,$sock,$data,$pid) = @_;
my $hash = $defs{$name};
use bytes;
my $err = "";
my $ld = length $data;
my $ret = syswrite ($sock,$data);
if(defined $ret && $ret == $ld) {
Log2Syslog_Log3slog($name, 4, "Log2Syslog $name - Payload sequence $pid sent. ($ret bytes)\n");
} elsif (defined $ret && $ret != $ld) {
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - Warning - Payload sequence $pid NOT completely sent: $ret of $ld bytes \n");
} else {
my $e = $!;
$err = "write error: $e";
Log2Syslog_Log3slog($name, 3, "Log2Syslog $name - Warning - Payload sequence $pid NOT sent: $e\n");
delete($hash->{CLIENTSOCKET});
}
return ($err);
}
############################################################################### ###############################################################################
# Socket schließen # Socket schließen
############################################################################### ###############################################################################
@ -1952,19 +1982,25 @@ sub Log2Syslog_closesock {
my $evt; my $evt;
my $sock = $hash->{CLIENTSOCKET}; my $sock = $hash->{CLIENTSOCKET};
if($sock) { if($sock) {
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Closing client socket ...") if($dolog); if (!$sock->connected()) {
shutdown($sock, 1);
if(AttrVal($hash->{NAME}, "TLS", 0) && ReadingsVal($name,"SSL_Algorithm", "n.a.") ne "n.a.") {
$sock->close(SSL_no_shutdown => 1);
$hash->{HELPER}{SSLVER} = "n.a.";
$hash->{HELPER}{SSLALGO} = "n.a.";
readingsSingleUpdate($hash, "SSL_Version", "n.a.", 1);
readingsSingleUpdate($hash, "SSL_Algorithm", "n.a.", 1);
} else {
$sock->close(); $sock->close();
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Client socket already disconnected ... closed.") if($dolog);
} else {
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Closing client socket ...") if($dolog);
shutdown($sock, 1);
if(AttrVal($hash->{NAME}, "TLS", 0) && ReadingsVal($name,"SSL_Algorithm", "n.a.") ne "n.a.") {
$sock->close(SSL_no_shutdown => 1);
$hash->{HELPER}{SSLVER} = "n.a.";
$hash->{HELPER}{SSLALGO} = "n.a.";
readingsSingleUpdate($hash, "SSL_Version", "n.a.", 1);
readingsSingleUpdate($hash, "SSL_Algorithm", "n.a.", 1);
} else {
$sock->close();
}
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Client socket closed ...") if($dolog);
} }
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Client socket closed ...") if($dolog);
delete($hash->{CLIENTSOCKET}); delete($hash->{CLIENTSOCKET});