mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-08 01:14:19 +00:00
93_Log2Syslog: contrib 5.8.3
git-svn-id: https://svn.fhem.de/fhem/trunk@21556 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
c61a6571ff
commit
e90f0aad81
@ -1,9 +1,9 @@
|
|||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
# $Id: 93_Log2Syslog.pm 19029 2019-03-25 20:01:23Z DS_Starter $
|
# $Id: 93_Log2Syslog.pm 19905 2019-07-28 10:42:28Z DS_Starter $
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
# 93_Log2Syslog.pm
|
# 93_Log2Syslog.pm
|
||||||
#
|
#
|
||||||
# (c) 2017-2019 by Heiko Maaz
|
# (c) 2017-2020 by Heiko Maaz
|
||||||
# e-mail: Heiko dot Maaz at t-online dot de
|
# e-mail: Heiko dot Maaz at t-online dot de
|
||||||
#
|
#
|
||||||
# This script is part of fhem.
|
# This script is part of fhem.
|
||||||
@ -35,12 +35,14 @@ use warnings;
|
|||||||
use TcpServerUtils;
|
use TcpServerUtils;
|
||||||
use Scalar::Util qw(looks_like_number);
|
use Scalar::Util qw(looks_like_number);
|
||||||
use Encode qw(encode_utf8);
|
use Encode qw(encode_utf8);
|
||||||
eval "use IO::Socket::INET;1" or my $MissModulSocket = "IO::Socket::INET";
|
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";
|
eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $MissModulNDom = "Net::Domain";
|
||||||
eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
|
eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
|
||||||
|
|
||||||
# Versions History intern:
|
# Versions History intern:
|
||||||
our %Log2Syslog_vNotesIntern = (
|
our %Log2Syslog_vNotesIntern = (
|
||||||
|
"5.8.3" => "31.03.2020 fix warning uninitialized value \$pp in pattern match (m//) at line 465, Forum: topic,75426.msg1036553.html#msg1036553 ",
|
||||||
|
"5.8.2" => "28.07.2019 fix warning uninitialized value in numeric ge (>=) at line 662 ",
|
||||||
"5.8.1" => "23.07.2019 attribute waitForEOF rename to useEOF, useEOF also for type sender ",
|
"5.8.1" => "23.07.2019 attribute waitForEOF rename to useEOF, useEOF also for type sender ",
|
||||||
"5.8.0" => "20.07.2019 attribute waitForEOF, solution for Forum: https://forum.fhem.de/index.php/topic,75426.msg958836.html#msg958836 ",
|
"5.8.0" => "20.07.2019 attribute waitForEOF, solution for Forum: https://forum.fhem.de/index.php/topic,75426.msg958836.html#msg958836 ",
|
||||||
"5.7.0" => "20.07.2019 change logging and chomp received data, use raw parse format if automatic mode don't detect a valid format, ".
|
"5.7.0" => "20.07.2019 change logging and chomp received data, use raw parse format if automatic mode don't detect a valid format, ".
|
||||||
@ -441,36 +443,40 @@ return;
|
|||||||
sub Log2Syslog_Read($@) {
|
sub Log2Syslog_Read($@) {
|
||||||
my ($hash,$reread) = @_;
|
my ($hash,$reread) = @_;
|
||||||
my $socket = $hash->{SERVERSOCKET};
|
my $socket = $hash->{SERVERSOCKET};
|
||||||
my ($err,$sev,$data,$ts,$phost,$pl,$ignore,$st,$len,$mlen,$evt,$pen);
|
my ($err,$sev,$data,$ts,$phost,$pl,$ignore,$st,$len,$mlen,$evt,$pen,$rhash);
|
||||||
|
|
||||||
return if($init_done != 1);
|
return if($init_done != 1);
|
||||||
|
|
||||||
# maximale Länge des Syslog-Frames als Begrenzung falls kein EOF
|
# maximale Länge des (Syslog)-Frames als Begrenzung falls kein EOF
|
||||||
# vom Sender initiiert wird (Endlosschleife vermeiden)
|
# vom Sender initiiert wird (Endlosschleife vermeiden)
|
||||||
|
# Grundeinstellungen
|
||||||
$mlen = 16384;
|
$mlen = 16384;
|
||||||
$len = 8192;
|
$len = 8192;
|
||||||
|
|
||||||
|
if($hash->{TEMPORARY}) {
|
||||||
|
my $sname = $hash->{SNAME};
|
||||||
|
$rhash = $defs{$sname};
|
||||||
|
} else {
|
||||||
|
$rhash = $hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $pp = $rhash->{PROFILE};
|
||||||
|
if($pp =~ /BSD/) { # Framelänge BSD-Format
|
||||||
|
$len = $RFC3164len{DL};
|
||||||
|
} elsif ($pp =~ /IETF/) { # Framelänge IETF-Format
|
||||||
|
$len = $RFC5425len{DL};
|
||||||
|
}
|
||||||
|
|
||||||
if($hash->{TEMPORARY}) {
|
if($hash->{TEMPORARY}) {
|
||||||
# temporäre Instanz angelegt durch TcpServer_Accept
|
# temporäre Instanz angelegt durch TcpServer_Accept
|
||||||
($st,$data,$hash) = Log2Syslog_getifdata($hash,$len,$mlen,$reread);
|
($st,$data,$hash) = Log2Syslog_getifdata($hash,$len,$mlen,$reread);
|
||||||
}
|
}
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
return if(IsDisabled($name) || Log2Syslog_IsMemLock($hash));
|
return if(IsDisabled($name) || Log2Syslog_IsMemLock($hash));
|
||||||
my $pp = $hash->{PROFILE};
|
my $mevt = AttrVal($name, "makeEvent", "intern"); # wie soll Reading/Event erstellt werden
|
||||||
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 $sevevt = AttrVal($name, "respectSeverity", ""); # welcher Schweregrad soll berücksichtigt werden (default: alle)
|
|
||||||
|
|
||||||
if($pp =~ /BSD/) {
|
|
||||||
# BSD-Format
|
|
||||||
$len = $RFC3164len{DL};
|
|
||||||
|
|
||||||
} elsif ($pp =~ /IETF/) {
|
|
||||||
# IETF-Format
|
|
||||||
$len = $RFC5425len{DL};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if($socket) {
|
if($socket) {
|
||||||
($st,$data,$hash) = Log2Syslog_getifdata($hash,$len,$mlen,$reread);
|
($st,$data,$hash) = Log2Syslog_getifdata($hash,$len,$mlen,$reread);
|
||||||
}
|
}
|
||||||
@ -516,15 +522,12 @@ sub Log2Syslog_Read($@) {
|
|||||||
} else {
|
} else {
|
||||||
return if($sevevt && $sevevt !~ m/$sev/); # Message nicht berücksichtigen
|
return if($sevevt && $sevevt !~ m/$sev/); # Message nicht berücksichtigen
|
||||||
$st = "active";
|
$st = "active";
|
||||||
if($mevt =~ /intern/) {
|
if($mevt =~ /intern/) { # kein Reading, nur Event
|
||||||
# kein Reading, nur Event
|
|
||||||
$pl = "$phost: $pl";
|
$pl = "$phost: $pl";
|
||||||
Log2Syslog_Trigger($hash,$ts,$pl);
|
Log2Syslog_Trigger($hash,$ts,$pl);
|
||||||
} elsif ($mevt =~ /reading/) {
|
} elsif ($mevt =~ /reading/) { # Reading, Event abhängig von event-on-.*
|
||||||
# Reading, Event abhängig von event-on-.*
|
|
||||||
readingsSingleUpdate($hash, "MSG_$phost", $pl, 1);
|
readingsSingleUpdate($hash, "MSG_$phost", $pl, 1);
|
||||||
} else {
|
} else { # Reading ohne Event
|
||||||
# Reading ohne Event
|
|
||||||
readingsSingleUpdate($hash, "MSG_$phost", $pl, 0);
|
readingsSingleUpdate($hash, "MSG_$phost", $pl, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -581,7 +584,7 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
unless($socket->recv($data, $len)) {
|
unless($socket->recv($data, $len)) {
|
||||||
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Seq \"$hash->{SEQNO}\" invalid data: $data");
|
Log2Syslog_Log3slog ($hash, 3, "Log2Syslog $name - Seq \"$hash->{SEQNO}\" invalid data: $data");
|
||||||
$data = '' if(length($data) == 0);
|
$data = '' if(length($data) == 0);
|
||||||
$st = "receive error - see logfile";
|
$st = "receive error - see logfile";
|
||||||
} else {
|
} else {
|
||||||
my $dl = length($data);
|
my $dl = length($data);
|
||||||
chomp $data;
|
chomp $data;
|
||||||
@ -603,12 +606,12 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
return ($st,$data,$hash);
|
return ($st,$data,$hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Child, $hash ist Hash der temporären Instanz
|
# Child, $hash ist Hash der temporären Instanz, $shash und $sname von dem originalen Device
|
||||||
my $sname = $hash->{SNAME};
|
my $sname = $hash->{SNAME};
|
||||||
my $cname = $hash->{NAME};
|
my $cname = $hash->{NAME};
|
||||||
my $shash = $defs{$sname}; # Hash des Log2Syslog-Devices bei temporärer TCP-Serverinstanz
|
my $shash = $defs{$sname}; # Hash des Log2Syslog-Devices bei temporärer TCP-Serverinstanz
|
||||||
my $uef = AttrVal($sname, "useEOF", 0);
|
my $uef = AttrVal($sname, "useEOF", 0);
|
||||||
my $tlsv = ReadingsVal($sname,"SSL_Version",'');
|
my $tlsv = ReadingsVal($sname,"SSL_Version",'');
|
||||||
|
|
||||||
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - ####################################################### ");
|
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - ####################################################### ");
|
||||||
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - ######### new Syslog TCP Receive ######### ");
|
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - ######### new Syslog TCP Receive ######### ");
|
||||||
@ -616,31 +619,27 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - await EOF: $uef, SSL: $tlsv");
|
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - await EOF: $uef, SSL: $tlsv");
|
||||||
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - childname: $cname");
|
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - childname: $cname");
|
||||||
|
|
||||||
$st = ReadingsVal($sname,"state","active");
|
$st = ReadingsVal($sname,"state","active");
|
||||||
my $c = $hash->{CD};
|
my $c = $hash->{CD};
|
||||||
if($c) {
|
if($c) {
|
||||||
$shash->{HELPER}{TCPPADDR} = $hash->{PEER};
|
$shash->{HELPER}{TCPPADDR} = $hash->{PEER};
|
||||||
my $buf;
|
my $buf;
|
||||||
my $off = 0;
|
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){
|
if(!defined($ret) && $! == EWOULDBLOCK){ # error
|
||||||
# error
|
|
||||||
$hash->{wantWrite} = 1 if(TcpServer_WantWrite($hash));
|
$hash->{wantWrite} = 1 if(TcpServer_WantWrite($hash));
|
||||||
$hash = $shash;
|
$hash = $shash;
|
||||||
Log2Syslog_Log3slog ($hash, 2, "Log2Syslog $sname - ERROR - TCP stack error: $!");
|
Log2Syslog_Log3slog ($hash, 2, "Log2Syslog $sname - ERROR - TCP stack error: $!");
|
||||||
return ($st,undef,$hash);
|
return ($st,undef,$hash);
|
||||||
|
|
||||||
} elsif (!$ret) {
|
} elsif (!$ret) { # EOF or error
|
||||||
# EOF or error
|
|
||||||
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - Connection closed for $cname: ".(defined($ret) ? 'EOF' : $!));
|
Log2Syslog_Log3slog ($shash, 4, "Log2Syslog $sname - Connection closed for $cname: ".(defined($ret) ? 'EOF' : $!));
|
||||||
if(!defined($ret)) {
|
if(!defined($ret)) { # error
|
||||||
# error
|
|
||||||
CommandDelete(undef, $cname);
|
CommandDelete(undef, $cname);
|
||||||
$hash = $shash;
|
$hash = $shash;
|
||||||
return ($st,undef,$hash);
|
return ($st,undef,$hash);
|
||||||
} else {
|
} else { # EOF
|
||||||
# EOF
|
|
||||||
$eof = 1;
|
$eof = 1;
|
||||||
$data = $hash->{BUF};
|
$data = $hash->{BUF};
|
||||||
CommandDelete(undef, $cname);
|
CommandDelete(undef, $cname);
|
||||||
@ -659,7 +658,7 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$buforun = (length($hash->{BUF}) >= $mlen)?1:0;
|
$buforun = (length($hash->{BUF}) >= $mlen)?1:0 if($hash->{BUF});
|
||||||
|
|
||||||
if(!$uef || $hash->{SSL} || $buforun) {
|
if(!$uef || $hash->{SSL} || $buforun) {
|
||||||
$data = $hash->{BUF};
|
$data = $hash->{BUF};
|
||||||
@ -672,9 +671,10 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
Log2Syslog_Log3slog ($shash, 5, "Log2Syslog $sname - Buffer $dl chars ready to parse:\n$data");
|
Log2Syslog_Log3slog ($shash, 5, "Log2Syslog $sname - Buffer $dl chars ready to parse:\n$data");
|
||||||
}
|
}
|
||||||
return ($st,$data,$hash);
|
return ($st,$data,$hash);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if($eof) {
|
if($eof) {
|
||||||
$hash = $shash;
|
$hash = $shash;
|
||||||
my $dl = length($data);
|
my $dl = length($data);
|
||||||
chomp $data;
|
chomp $data;
|
||||||
Log2Syslog_Log3slog ($shash, 5, "Log2Syslog $sname - Buffer $dl chars after EOF ready to parse:\n$data") if($data);
|
Log2Syslog_Log3slog ($shash, 5, "Log2Syslog $sname - Buffer $dl chars after EOF ready to parse:\n$data") if($data);
|
||||||
@ -684,7 +684,7 @@ sub Log2Syslog_getifdata($$@) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$st = "error - no socket opened";
|
$st = "error - no socket opened";
|
||||||
$data = '';
|
$data = '';
|
||||||
return ($st,$data,$hash);
|
return ($st,$data,$hash);
|
||||||
}
|
}
|
||||||
@ -2142,20 +2142,19 @@ sub Log2Syslog_setVersionInfo($) {
|
|||||||
|
|
||||||
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
|
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
|
||||||
# META-Daten sind vorhanden
|
# META-Daten sind vorhanden
|
||||||
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
|
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
|
||||||
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_Log2Syslog.pm 19029 2019-03-25 20:01:23Z DS_Starter $ im Kopf komplett! vorhanden )
|
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_Log2Syslog.pm 19905 2019-07-28 10:42:28Z DS_Starter $ im Kopf komplett! vorhanden )
|
||||||
$modules{$type}{META}{x_version} =~ s/1.1.1/$v/g;
|
$modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/g;
|
||||||
} else {
|
} else {
|
||||||
$modules{$type}{META}{x_version} = $v;
|
$modules{$type}{META}{x_version} = $v;
|
||||||
}
|
}
|
||||||
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_Log2Syslog.pm 19029 2019-03-25 20:01:23Z DS_Starter $ im Kopf komplett! vorhanden )
|
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_Log2Syslog.pm 19905 2019-07-28 10:42:28Z DS_Starter $ im Kopf komplett! vorhanden )
|
||||||
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
|
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
|
||||||
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
|
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
|
||||||
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
|
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
|
||||||
use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' );
|
use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' );
|
||||||
}
|
}
|
||||||
} else {
|
} else { # herkömmliche Modulstruktur
|
||||||
# herkömmliche Modulstruktur
|
|
||||||
$hash->{VERSION} = $v;
|
$hash->{VERSION} = $v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user