93_Log2Syslog: contrib V4.8.2

git-svn-id: https://svn.fhem.de/fhem/trunk@17134 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
DS_Starter
2018-08-13 21:55:35 +00:00
parent 8cedecb52e
commit 740e2fedd3

View File

@@ -30,11 +30,12 @@
######################################################################################################################
# Versions History:
#
# 4.8.2 13.08.2018 rename makeMsgEvent to makeEvent, use hostname instead of fqdn
# 4.8.1 12.08.2018 IETF-Syslog without VERSION changed, Log verbose 1 to 2 changed in parsePayload
# 4.8.0 12.08.2018 enhanced IETF Parser to match logs without version
# 4.7.0 10.08.2018 Parser for TPLink
# 4.6.1 10.08.2018 some perl warnings, changed IETF Parser
# 4.6.0 08.08.2018 set sendTestMessage added, Attribute "contDelimiter", "sendSeverity"
# 4.6.0 08.08.2018 set sendTestMessage added, Attribute "contDelimiter", "respectSeverity"
# 4.5.1 07.08.2018 BSD Regex changed, setpayload of BSD changed
# 4.5.0 06.08.2018 Regex capture groups used in parsePayload to set variables, parsing of BSD changed,
# Attribute "makeMsgEvent" added
@@ -73,6 +74,7 @@ use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
use Encode qw(encode_utf8);
use Net::Domain qw(hostname hostfqdn hostdomain);
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";
@@ -81,7 +83,7 @@ eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $Mis
#
sub Log2Syslog_Log3slog($$$);
my $Log2SyslogVn = "4.8.1";
my $Log2SyslogVn = "4.8.2";
# Mappinghash BSD-Formatierung Monat
my %Log2Syslog_BSDMonth = (
@@ -190,11 +192,11 @@ sub Log2Syslog_Initialize($) {
"addTimestamp:0,1 ".
"contDelimiter ".
"logFormat:BSD,IETF ".
"makeMsgEvent:no,intern,reading ".
"makeEvent:no,intern,reading ".
"outputFields:sortable-strict,PRIVAL,FAC,SEV,TS,HOST,DATE,TIME,ID,PID,MID,SDFIELD,CONT ".
"parseProfile:BSD,IETF,TPLink-Switch,raw,ParseFn ".
"parseFn:textField-long ".
"sendSeverity:multiple-strict,Emergency,Alert,Critical,Error,Warning,Notice,Informational,Debug ".
"respectSeverity:multiple-strict,Emergency,Alert,Critical,Error,Warning,Notice,Informational,Debug ".
"ssldebug:0,1,2,3 ".
"TLS:1,0 ".
"timeout ".
@@ -222,7 +224,8 @@ sub Log2Syslog_Define($@) {
delete($hash->{HELPER}{FHEMLOG});
delete($hash->{HELPER}{IDENT});
$hash->{MYHOST} = hostfqdn(); # FQDN eigener Host
# $hash->{MYHOST} = hostfqdn(); # FQDN eigener Host
$hash->{MYHOST} = hostname(); # eigener Host (lt. RFC nur Hostname nicht FQDN)
if(int(@a)-3 < 0){
# Einrichtung Servermode (Collector)
@@ -334,8 +337,9 @@ sub Log2Syslog_Read($) {
my $socket = $hash->{SERVERSOCKET};
my $st = ReadingsVal($name,"state","active");
my $pp = AttrVal($name, "parseProfile", "IETF");
my $mevt = AttrVal($name, "makeMsgEvent", "intern"); # wie soll Reading/Eventerstellt werden
my ($err,$data,$ts,$phost,$pl);
my $mevt = AttrVal($name, "makeEvent", "intern"); # wie soll Reading/Eventerstellt werden
my $sevevt = AttrVal($name, "respectSeverity", ""); # welcher Schweregrad soll berücksichtigt werden (default: alle)
my ($err,$sev,$data,$ts,$phost,$pl);
return if(IsDisabled($name) || $hash->{MODEL} !~ /Collector/);
@@ -349,11 +353,12 @@ sub Log2Syslog_Read($) {
$st = "receive error - see logfile";
} else {
# parse Payload
($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
($err,$sev,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
$hash->{SEQNO}++;
if($err) {
$st = "parse error - see logfile";
} else {
return if($sevevt && $sevevt !~ m/$sev/); # Message nicht berücksichtigen
$st = "active";
if($mevt =~ /intern/) {
# kein Reading, nur Event
@@ -379,11 +384,12 @@ sub Log2Syslog_Read($) {
$st = "receive error - see logfile";
} else {
# parse Payload
($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
($err,$sev,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
$hash->{SEQNO}++;
if($err) {
$st = "parse error - see logfile";
} else {
return if($sevevt && $sevevt !~ m/$sev/); # Message nicht berücksichtigen
$st = "active";
if($mevt =~ /intern/) {
# kein Reading, nur Event
@@ -401,23 +407,24 @@ sub Log2Syslog_Read($) {
} else {
# raw oder User eigenes Format
$socket->recv($data, 8192);
($err,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
($err,$sev,$phost,$ts,$pl) = Log2Syslog_parsePayload($hash,$data);
$hash->{SEQNO}++;
if($err) {
$st = "parse error - see logfile";
} else {
return if($sevevt && $sevevt !~ m/$sev/); # Message nicht berücksichtigen
$st = "active";
if($mevt =~ /intern/) {
# kein Reading, nur Event
$pl = "$phost: $pl";
Log2Syslog_Trigger($hash,$ts,$pl);
} elsif ($mevt =~ /reading/) {
# Reading, Event abhängig von event-on-.*
readingsSingleUpdate($hash, "MSG_$phost", $pl, 1);
} else {
# Reading ohne Event
readingsSingleUpdate($hash, "MSG_$phost", $pl, 0);
}
if($mevt =~ /intern/) {
# kein Reading, nur Event
$pl = "$phost: $pl";
Log2Syslog_Trigger($hash,$ts,$pl);
} elsif ($mevt =~ /reading/) {
# Reading, Event abhängig von event-on-.*
readingsSingleUpdate($hash, "MSG_$phost", $pl, 1);
} else {
# Reading ohne Event
readingsSingleUpdate($hash, "MSG_$phost", $pl, 0);
}
}
}
@@ -751,7 +758,7 @@ sub Log2Syslog_parsePayload($$) {
}
return ($err,$phost,$ts,$pl);
return ($err,$sev,$phost,$ts,$pl);
}
#################################################################################################
@@ -903,11 +910,11 @@ sub Log2Syslog_Attr ($$$$) {
# $name is device name
# aName and aVal are Attribute name and value
if ($cmd eq "set" && $hash->{MODEL} !~ /Collector/ && $aName =~ /parseProfile|parseFn|outputFields|makeMsgEvent/) {
if ($cmd eq "set" && $hash->{MODEL} !~ /Collector/ && $aName =~ /parseProfile|parseFn|outputFields|makeEvent/) {
return "\"$aName\" is only valid for model \"Collector\"";
}
if ($cmd eq "set" && $hash->{MODEL} =~ /Collector/ && $aName =~ /addTimestamp|contDelimiter|addStateEvent|protocol|logFormat|sendSeverity|timeout|TLS/) {
if ($cmd eq "set" && $hash->{MODEL} =~ /Collector/ && $aName =~ /addTimestamp|contDelimiter|addStateEvent|protocol|logFormat|timeout|TLS/) {
return "\"$aName\" is only valid for model \"Sender\"";
}
@@ -982,7 +989,7 @@ sub Log2Syslog_Attr ($$$$) {
return "You use a parse-function via attribute \"parseProfile\". Please change/delete attribute \"parseProfile\" first !";
}
if ($aName =~ /makeMsgEvent/) {
if ($aName =~ /makeEvent/) {
if($aVal =~ /intern/ || $cmd eq "del") {
foreach my $reading (grep { /MSG_/ } keys %{$defs{$name}{READINGS}}) {
readingsDelete($defs{$name}, $reading);
@@ -1002,7 +1009,7 @@ sub Log2Syslog_eventlog($$) {
my $name = $hash->{NAME};
my $rex = $hash->{HELPER}{EVNTLOG};
my $st = ReadingsVal($name,"state","active");
my $sendsev = AttrVal($name, "sendSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my ($prival,$sock,$data,$pid,$sevAstxt);
return if(IsDisabled($name) || !$rex || $hash->{MODEL} !~ /Sender/);
@@ -1030,8 +1037,8 @@ sub Log2Syslog_eventlog($$) {
$otp = "$tim $otp" if AttrVal($name,'addTimestamp',0);
($prival,$sevAstxt) = Log2Syslog_setprival($txt);
if($sendsev && $sendsev !~ m/$sevAstxt/) {
# nicht senden wenn Severity nicht in "sendSeverity" enthalten
Log2Syslog_Log3slog($name, 5, "$name - Warning - Payload NOT sent due to Message Severity not in attribute \"sendSeverity\"\n");
# nicht senden wenn Severity nicht in "respectSeverity" enthalten
Log2Syslog_Log3slog($name, 5, "$name - Warning - Payload NOT sent due to Message Severity not in attribute \"respectSeverity\"\n");
next;
}
@@ -1066,7 +1073,7 @@ sub Log2Syslog_fhemlog($$) {
my $hash = $defs{$name};
my $rex = $hash->{HELPER}{FHEMLOG};
my $st = ReadingsVal($name,"state","active");
my $sendsev = AttrVal($name, "sendSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my $sendsev = AttrVal($name, "respectSeverity", ""); # Nachrichten welcher Schweregrade sollen gesendet werden
my ($prival,$sock,$err,$ret,$data,$pid,$sevAstxt);
return if(IsDisabled($name) || !$rex || $hash->{MODEL} !~ /Sender/);
@@ -1081,8 +1088,8 @@ sub Log2Syslog_fhemlog($$) {
$otp = "$tim $otp" if AttrVal($name,'addTimestamp',0);
($prival,$sevAstxt) = Log2Syslog_setprival($txt,$vbose);
if($sendsev && $sendsev !~ m/$sevAstxt/) {
# nicht senden wenn Severity nicht in "sendSeverity" enthalten
Log2Syslog_Log3slog($name, 5, "$name - Warning - Payload NOT sent due to Message Severity not in attribute \"sendSeverity\"\n");
# nicht senden wenn Severity nicht in "respectSeverity" enthalten
Log2Syslog_Log3slog($name, 5, "$name - Warning - Payload NOT sent due to Message Severity not in attribute \"respectSeverity\"\n");
return;
}
@@ -1491,7 +1498,9 @@ sub Log2Syslog_evalPeer($) {
my($pport, $pipaddr) = sockaddr_in($socket->peername);
$phost = gethostbyaddr($pipaddr, AF_INET);
$paddr = inet_ntoa($pipaddr);
no warnings 'uninitialized';
Log2Syslog_Log3slog ($hash, 5, "Log2Syslog $name - message peerhost: $phost,$paddr");
use warnings;
return ($phost,$paddr);
}
@@ -1835,7 +1844,7 @@ Aug 18 21:26:54 fhemtest.myds.me 1 2017-08-18T21:26:54 fhemtest.myds.me Test_eve
<a href="#Log2Syslogattr">Attribut</a> "outputFields" bestimmt werden. Je nach verwendeten Parsingprofil können alle oder
nur eine Untermenge der verfügbaren Felder verwendet werden. Näheres dazu in der Beschreibung des Attributes "parseProfile". <br>
<br>
Das Verhalten der Eventgenerierung kann mit dem <a href="#Log2Syslogattr">Attribut</a> "makeMsgEvent" angepasst werden. <br>
Das Verhalten der Eventgenerierung kann mit dem <a href="#Log2Syslogattr">Attribut</a> "makeEvent" angepasst werden. <br>
</ul>
<br>
@@ -2048,7 +2057,7 @@ Aug 18 21:26:54 fhemtest.myds.me 1 2017-08-18T21:26:54 fhemtest.myds.me Test_eve
<br>
<ul>
<li><b>makeMsgEvent [ intern | no | reading ]</b><br>
<li><b>makeEvent [ intern | no | reading ]</b><br>
<br>
Das Attribut ist nur für "Collector" verwendbar. Mit dem Attribut wird das Verhalten der Event- bzw.
Readinggenerierung festgelegt.
@@ -2227,10 +2236,11 @@ $CONT = (split(">",$CONT))[1] if($CONT =~ /^<.*>.*$/);
<br>
<ul>
<li><b>sendSeverity </b><br>
<li><b>respectSeverity </b><br>
<br>
Es werden nur Nachrichten übermittelt, deren Schweregrad im Attribut enthalten ist.
Ist "sendSeverity" nicht gesetzt, werden Nachrichten aller Schwierigkeitsgrade gesendet.
Es werden nur Nachrichten übermittelt (Sender) bzw. beim Empfang berücksichtigt (Collector), deren Schweregrad im
Attribut enthalten ist.
Ist "respectSeverity" nicht gesetzt, werden Nachrichten aller Schweregrade verarbeitet.
</li>
</ul>
<br>