diff --git a/fhem/contrib/93_Log2Syslog.pm b/fhem/contrib/93_Log2Syslog.pm index 9c97fd2a4..91d100466 100644 --- a/fhem/contrib/93_Log2Syslog.pm +++ b/fhem/contrib/93_Log2Syslog.pm @@ -22,11 +22,14 @@ # along with fhem. If not, see . # # The module based on idea and input from betateilchen 92_rsyslog.pm -# Implements the Syslog Protocol of RFC 5424 (https://tools.ietf.org/html/rfc5424) +# Implements the Syslog Protocol of RFC 5424 https://tools.ietf.org/html/rfc5424 +# and RFC 3164 https://tools.ietf.org/html/rfc3164 # ####################################################################################################### # Versions History: # +# 2.2.0 17.08.2017 set BSD data length, set only acceptable characters (USASCII) in payload +# commandref revised # 2.1.0 17.08.2017 sub setsock created # 2.0.0 16.08.2017 create syslog without SYS::SYSLOG # 1.1.1 13.08.2017 registrate fhemlog_log to %loginform in case of sending fhem-log @@ -41,7 +44,7 @@ use warnings; eval "use IO::Socket::INET;1" or my $MissModulSocket = "IO::Socket::INET"; eval "use Net::Domain qw(hostfqdn);1" or my $MissModulNDom = "Net::Domain"; -my $Log2SyslogVn = "2.0.0"; +my $Log2SyslogVn = "2.2.0"; # Mappinghash BSD-Formatierung Monat my %Log2Syslog_BSDMonth = ( @@ -59,6 +62,11 @@ my %Log2Syslog_BSDMonth = ( "12" => "Dec" ); +# Längenvorgaben nach RFC3164 +my %RFC3164len = ("TAG" => 32, # max. Länge TAG-Feld + "DL" => 1024 # max. Lange Message insgesamt + ); + ##################################### sub Log2Syslog_Initialize($) { my ($hash) = @_; @@ -172,7 +180,6 @@ sub event_Log($$) { my ($hash,$dev) = @_; my $name = $hash->{NAME}; my $rex = $hash->{HELPER}{EVNTLOG}; - my $sock = $hash->{HELPER}{SOCK}; my ($prival,$sock); return if(IsDisabled($name) || !$rex); @@ -187,12 +194,13 @@ sub event_Log($$) { for (my $i = 0; $i < $max; $i++) { my $s = $events->[$i]; $s = "" if(!defined($s)); - + $s =~ tr/ A-Za-z0-9!"#$%&'()*+,-.\/:;<=>?@[\]^_`{|}~//cd; # nur erlaubte Zeichen in payload, ASCII %d32-126 + my $tim = (($ct && $ct->[$i]) ? $ct->[$i] : $tn); my ($date,$time) = split(" ",$tim); if($n =~ m/^$rex$/ || "$n:$s" =~ m/^$rex$/ || "$tim:$n:$s" =~ m/^$rex$/) { - my $otp = "$n -> $s"; + my $otp = "$n $s"; $otp = "$tim $otp" if AttrVal($name,'addTimestamp',0); $prival = setprival($s); @@ -216,14 +224,15 @@ sub fhemlog_Log($$) { my ($name,$raw) = @_; my $hash = $defs{$name}; my $rex = $hash->{HELPER}{FHEMLOG}; - my $sock = $hash->{HELPER}{SOCK}; my ($prival,$sock); return if(IsDisabled($name) || !$rex); my ($date,$time,$vbose,undef,$text) = split(" ",$raw,5); + $text =~ tr/ A-Za-z0-9!"#$%&'()*+,-.\/:;<=>?@[\]^_`{|}~//cd; # nur erlaubte Zeichen in payload, ASCII %d32-126 $date =~ s/\./-/g; my $tim = $date." ".$time; + if($text =~ m/^$rex$/ || "$vbose: $text" =~ m/^$rex$/) { my $otp = "$vbose: $text"; $otp = "$tim $otp" if AttrVal($name,'addTimestamp',0); @@ -237,8 +246,7 @@ sub fhemlog_Log($$) { $sock->close(); } } - -return undef; +return; } ############################################################################### @@ -319,19 +327,21 @@ sub setpayload ($$$$$$) { if ($lf eq "BSD") { # BSD Protokollformat https://tools.ietf.org/html/rfc3164 - $time = (split(".",$time))[0]; # msec ist nicht erlaubt - $month = $Log2Syslog_BSDMonth{$month}; # Monatsmapping z.B. 01 -> Jan - $day =~ s/0/ /; # in Tagen < 10 muss 0 durch Space ersetzt werden + $time = (split(".",$time))[0]; # msec ist nicht erlaubt + $month = $Log2Syslog_BSDMonth{$month}; # Monatsmapping z.B. 01 -> Jan + $day =~ s/0/ /; # in Tagen < 10 muss 0 durch Space ersetzt werden + $ident = substr($ident,0, $RFC3164len{TAG}); # Länge TAG Feld begrenzen no warnings 'uninitialized'; - $data = "<$prival>$month $day $time $myhost $ident :$otp"; + $data = "<$prival>$month $day $time $myhost TAG$ident: $otp"; use warnings; + $data = substr($data,0, $RFC3164len{DL}); # Länge Total begrenzen } if ($lf eq "IETF") { # IETF Protokollformat https://tools.ietf.org/html/rfc5424 my $pid = $hash->{HELPER}{PID}; my $mid = "FHEM"; # message ID, identify type of message, e.g. for firewalls - my $tim = $date."T".$time."Z"; + my $tim = $date."T".$time; no warnings 'uninitialized'; $data = "<$prival>1 $tim $myhost $ident $pid $mid - :$otp"; use warnings; @@ -378,8 +388,6 @@ return($data); After definition the new device sends all new appearing fhem systemlog entries and events to the destination host, port=514/UDP format:IETF, immediately without further settings if the regex for fhem or event were set.
Without setting regex no fhem system log or event log will be forwarded.
- The module uses functions of Perls SYS::SYSLOG module. If you want know more, see for detailed descriptions - on perldoc.

Example to log anything:
@@ -422,8 +430,10 @@ Mar 20 15:47:53 fhem-vm-8 fhem: 2016-03-20_15:47:53 global: INITIALIZED
  • logFormat [BSD|IETF]

    Set the syslog protocol format.
    - Default value is "IETF" if not specified. -

  • + Default value is "IETF" if not specified. + The implemented BSD protocol is defined in RFC3164 and the + IETF protocol can be found in RFC5424 +
  • type [TCP|UDP]

    @@ -476,8 +486,6 @@ Mar 20 15:47:53 fhem-vm-8 fhem: 2016-03-20_15:47:53 global: INITIALIZED Direkt nach der Definition sendet das neue Device alle neu auftretenden FHEM Systemlog Einträge und Events ohne weitere Einstellungen an den Zielhost, Port=514/UDP Format:IETF, wenn reguläre Ausdrücke für Events/FHEM angegeben wurden.
    Wurde kein Regex gesetzt, erfolgt keine Weiterleitung von Events oder FHEM Systemlogs.
    - Das Modul verwendet Funktionen des Perl-Moduls SYS::SYSLOG. Weitere Informationen dazu sind auf - perldoc zu finden.

    Beispiel:
    @@ -522,7 +530,9 @@ Mar 20 15:47:53 fhem-vm-8 fhem: 2016-03-20_15:47:53 global: INITIALIZED
  • logFormat [BSD|IETF]

    Stellt das Protokollformat ein.
    - Der Standardwert ist "IETF". + Der Standardwert ist "IETF".
    + Das implementierte BSD Protokoll ist definiert in RFC3164 . Das + weiterentwickelte IETF-Protokoll kann hier RFC5424 nachgelesen werden.

  • type [TCP|UDP]