2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-08 13:24:56 +00:00

93_Log2Syslog: V4.6.0

git-svn-id: https://svn.fhem.de/fhem/trunk@17104 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2018-08-08 06:36:04 +00:00
parent 4b68f2dbb9
commit 526a0c9b3f

View File

@ -30,6 +30,7 @@
######################################################################################################################
# Versions History:
#
# 4.6.0 08.08.2018 set sendTestMessage added
# 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
@ -76,7 +77,7 @@ eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1" or my $Mis
#
sub Log2Syslog_Log3slog($$$);
my $Log2SyslogVn = "4.5.1";
my $Log2SyslogVn = "4.6.0";
# Mappinghash BSD-Formatierung Monat
my %Log2Syslog_BSDMonth = (
@ -174,13 +175,14 @@ sub Log2Syslog_Initialize($) {
$hash->{DefFn} = "Log2Syslog_Define";
$hash->{UndefFn} = "Log2Syslog_Undef";
$hash->{DeleteFn} = "Log2Syslog_Delete";
$hash->{SetFn} = "Log2Syslog_Set";
$hash->{GetFn} = "Log2Syslog_Get";
$hash->{AttrFn} = "Log2Syslog_Attr";
$hash->{NotifyFn} = "Log2Syslog_eventlog";
$hash->{ReadFn} = "Log2Syslog_Read";
$hash->{AttrList} = "addStateEvent:1,0 ".
"disable:1,0 ".
"disable:1,0,maintenance ".
"addTimestamp:0,1 ".
"outputFields:sortable,PRIVAL,FAC,SEV,TS,HOST,DATE,TIME,ID,PID,MID,SDFIELD,CONT ".
"logFormat:BSD,IETF ".
@ -432,7 +434,7 @@ sub Log2Syslog_parsePayload($$) {
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,$tail);
my ($Mmm,$dd,$delimiter,$day,$ietf,$err,$pl,$tail,$tail2);
# Hash zur Umwandlung Felder in deren Variablen
my ($prival,$ts,$host,$date,$time,$id,$pid,$mid,$sdfield,$cont);
@ -473,8 +475,8 @@ sub Log2Syslog_parsePayload($$) {
# BSD Protokollformat https://tools.ietf.org/html/rfc3164
# Beispiel data "<$prival>$month $day $time $myhost $id: : $otp"
$data =~ /^<(?<prival>\d{1,3})>(?<tail>.*)$/;
$prival = $+{prival}; # must
$tail = $+{tail};
$prival = $+{prival}; # must
$tail = $+{tail};
$tail =~ /^((?<month>\w{3})\s+(?<day>\d{1,2})\s+(?<time>\d{2}:\d{2}:\d{2}))?\s+(?<tail>.*)$/;
$Mmm = $+{month}; # should
$dd = $+{day}; # should
@ -490,7 +492,7 @@ sub Log2Syslog_parsePayload($$) {
$tail =~ /^(?<host>[^\s]*)?\s(?<tail>.*)$/;
$host = $+{host}; # should
$tail = $+{tail};
$tail =~ /^(?<id>\w{1,32}\W:?)?(?<cont>.*)$/;
$tail =~ /^(?<id>\w{1,32}\W?)?:?(?<cont>.*)$/;
$id = $+{id}; # should
$cont = $+{cont}; # should
} else {
@ -741,6 +743,38 @@ sub Log2Syslog_Delete($$) {
return undef;
}
###############################################################################
# Set
###############################################################################
sub Log2Syslog_Set($@) {
my ($hash, @a) = @_;
return "\"set X\" needs at least an argument" if ( @a < 2 );
my $name = $a[0];
my $opt = $a[1];
my $prop = $a[2];
my $setlist = "Unknown argument $opt, choose one of ".
"sendTestMessage "
;
return if(AttrVal($name, "disable", "") eq "1" || $hash->{MODEL} !~ /Sender/);
if($opt =~ /sendTestMessage/) {
my $own;
if ($prop) {
shift @a;
shift @a;
$own = join(" ",@a);
}
Log2Syslog_sendTestMsg($hash,$own);
} else {
return "$setlist";
}
return undef;
}
###############################################################################
# Get
###############################################################################
@ -796,10 +830,11 @@ sub Log2Syslog_Attr ($$$$) {
if ($aName eq "disable") {
if($cmd eq "set") {
return "Mode \"$aVal\" is only valid for model \"Sender\"" if($aVal eq "maintenance" && $hash->{MODEL} !~ /Sender/);
$do = $aVal?1:0;
}
$do = 0 if($cmd eq "del");
my $val = $do?"disabled":"active";
my $val = ($do&&$aVal==2)?"maintenance":($do&&$aVal==1)?"disabled":"active";
readingsSingleUpdate($hash, "state", $val, 1);
}
@ -977,6 +1012,53 @@ sub Log2Syslog_fhemlog($$) {
return;
}
#################################################################################
# Test Message senden
#################################################################################
sub Log2Syslog_sendTestMsg($$) {
my ($hash,$own) = @_;
my $name = $hash->{NAME};
my ($prival,$ts,$tim,$date,$time,$sock,$err,$ret,$data,$pid,$otp);
if($own) {
# eigene Testmessage ohne Formatanpassung raw senden
$data = $own;
} else {
$ts = TimeNow();
($date,$time) = split(" ",$ts);
$date =~ s/\./-/g;
$tim = $date." ".$time;
$otp = "Test message from FHEM Syslog Client from ($hash->{MYHOST})";
$otp = "$tim $otp" if AttrVal($name,'addTimestamp',0);
$prival = "14";
($data,$pid) = Log2Syslog_setpayload($hash,$prival,$date,$time,$otp,"fhem");
return if(!$data);
}
$sock = Log2Syslog_setsock($hash);
if (defined($sock)) {
$ret = syswrite $sock, $data."\n" if($data);
if($ret && $ret > 0) {
Log2Syslog_Log3slog($name, 4, "$name - Payload sequence $pid sent\n");
} else {
my $err = $!;
Log2Syslog_Log3slog($name, 4, "$name - Warning - Payload sequence $pid NOT sent: $err\n");
my $st = "write error: $err";
my $evt = ($st eq $hash->{HELPER}{OLDSTATE})?0:1;
readingsSingleUpdate($hash, "state", $st, $evt);
$hash->{HELPER}{OLDSTATE} = $st;
}
Log2Syslog_closesock($hash,$sock);
}
return;
}
###############################################################################
# Helper für ident & Regex setzen
###############################################################################
@ -1759,6 +1841,25 @@ Aug 18 21:08:27 fhemtest.myds.me 1 2017-08-18T21:08:27.095 fhemtest.myds.me Test
</ul>
<br><br>
<a name="Log2SyslogSet"></a>
<b>Set</b>
<ul>
<br>
<ul>
<li><b>sendTestMessage [&lt;Message&gt;] </b><br>
<br>
Mit einem Devicetyp "Sender" kann abhängig vom Attribut "logFormat" eine Testnachricht im BSD- bzw. IETF-Format
gesendet werden. Wird eine optionale eigene &lt;Message&gt; angegeben, wird diese Nachricht im raw-Format ohne
Formatanpassung (BSD/IETF) gesendet. Das Attribut "disable = maintenance" legt fest, dass keine Daten ausser eine
Testnachricht an den Empfänger gesendet wird.
</li>
</ul>
<br>
</ul>
<br>
<a name="Log2SyslogGet"></a>
<b>Get</b>
<ul>
@ -1774,7 +1875,7 @@ Aug 18 21:08:27 fhemtest.myds.me 1 2017-08-18T21:08:27.095 fhemtest.myds.me Test
</ul>
<br>
<a name="Log2Syslogattr"></a>
<b>Attribute</b>
@ -1812,9 +1913,10 @@ Aug 18 21:26:54 fhemtest.myds.me 1 2017-08-18T21:26:54 fhemtest.myds.me Test_eve
<br>
<ul>
<li><b>disable </b><br>
<li><b>disable [1 | 0 | maintenance] </b><br>
<br>
Das Device wird aktiviert | aktiviert.
Das Device wird aktiviert, deaktiviert bzw. in den Maintenance-Mode geschaltet. Im Maintenance-Mode kann mit dem "Sender"
eine Testnachricht gesendet werden (siehe "set &lt;name&gt; sendTestMessage").
</li>
</ul>
<br>