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

Hacker Attack indication, bug fixing with action detector

git-svn-id: https://svn.fhem.de/fhem/trunk@4520 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2014-01-01 19:05:41 +00:00
parent ba67d0fa0a
commit 96a6bcc1d5
2 changed files with 76 additions and 41 deletions

View File

@ -32,7 +32,7 @@ my $culHmChanSets =\%HMConfig::culHmChanSets;
my $culHmFunctSets =\%HMConfig::culHmFunctSets;
my $culHmBits =\%HMConfig::culHmBits;
my $culHmCmdFlags =\@HMConfig::culHmCmdFlags;
my $K_actDetID =\$HMConfig::K_actDetID;
my $K_actDetID ="000000";
############################################################
@ -550,33 +550,47 @@ sub CUL_HM_Parse($$) {##############################
my $ioName = $iohash->{NAME};
my ($msg,$msgStat,$myRSSI,$msgIO) = split(":",$msgIn,4);
# Msg format: Allnnffttssssssddddddpp...
$msg =~ m/A(..)(..)(..)(..)(......)(......)(.*)/;
my ($len,$mNo,$mFlg,$mTp,$src,$dst,$p) = ($1,$2,$3,$4,$5,$6,$7);
my (undef,$len,$mNo,$mFlg,$mTp,$src,$dst,$p) = unpack 'A1A2A2A2A2A6A6A*',$msg;
$p = "" if(!defined($p));
my @mI = unpack '(A2)*',$p; # split message info to bytes
return "" if( ($msgStat && $msgStat eq 'NACK')# lowlevel error
||($src eq $id)); # mirrored messages
return "" if($msgStat && $msgStat eq 'NACK');# lowlevel error
# $shash will be replaced for multichannel commands
my $shash = $modules{CUL_HM}{defptr}{$src};
my $dhash = $modules{CUL_HM}{defptr}{$dst};
my $shash = CUL_HM_id2Hash($src);
my $dhash = CUL_HM_id2Hash($dst);
CUL_HM_statCnt($ioName,"r");
my $dname = ($dst eq "000000") ? "broadcast" :
($dhash ? $dhash->{NAME} :
($dst eq $id ? $ioName :
$dst));
if(!$shash && $mTp eq "00") { # generate device
my $md = substr($p, 2, 4);
$md = $culHmModel->{$md}{name} ?
$culHmModel->{$md}{name} :
"ID_".$md;
my $sname = "CUL_HM_".$md."_$src";
$sname =~ s/-/_/g;
Log3 undef, 3, "CUL_HM Unknown device $sname, please define it";
return "UNDEFINED $sname CUL_HM $src $msg";
}
#################### attack alarm detection#####################
if ( $dhash
&& !CUL_HM_getAttrInt($dname,"ignore")
&& ($mTp eq '01' || $mTp eq '11')){
my $ioId = AttrVal($dhash->{IODev}{NAME},"hmId","-");
CUL_HM_eventP($dhash,"ErrIoId_$src")if($ioId ne $src);
Log 1,"General ErrIoAttack ".$dhash->{NAME}.":$msg"
."\n ".$dhash->{helper}{cSnd}
if(defined $dhash->{helper}{cSnd} && $dhash->{helper}{cSnd} ne substr($msg,7));
CUL_HM_eventP($dhash,"ErrIoAttack")
if(defined $dhash->{helper}{cSnd} && $dhash->{helper}{cSnd} ne substr($msg,7));
}
###########
# return "" if($src eq $id);# mirrored messages - covered by !$shash
return "" if(!$shash); # Unknown source
$respRemoved = 0; #set to 'no response in this message' at start
if(!$shash) { # Unknown source
# Generate an UNKNOWN event for pairing requests, ignore everything else
if($mTp eq "00") {
my $md = substr($p, 2, 4);
$md = $culHmModel->{$md}{name} ?
$culHmModel->{$md}{name} :
"ID_".$md;
my $sname = "CUL_HM_".$md."_$src";
$sname =~ s/-/_/g;
Log3 undef, 3, "CUL_HM Unknown device $sname, please define it";
return "UNDEFINED $sname CUL_HM $src $msg";
}
return "";
}
my @event; #events to be posted for main entity
my @entities; #additional entities with events to be notifies
@ -592,10 +606,6 @@ sub CUL_HM_Parse($$) {##############################
}
CUL_HM_eventP($shash,"Evt_$msgStat")if ($msgStat);#log io-events
CUL_HM_eventP($shash,"Rcv");
my $dname = ($dst eq "000000") ? "broadcast" :
($dhash ? $dhash->{NAME} :
($dst eq $id ? $ioName :
$dst));
my $target = " (to $dname)";
my $st = AttrVal($name, "subType", "");
my $md = AttrVal($name, "model" , "");
@ -3718,6 +3728,7 @@ sub CUL_HM_responseSetup($$) {#store all we need to handle the response
else{
CUL_HM_respWaitSu ($hash,"cmd:=$cmd","mNo:=$mNo","reSent:=$rss");
}
$hash->{helper}{cSnd} = substr($cmd,8);
}
elsif($mTp eq '11' && $chn =~ m/^(02|81)$/){#!!! chn is subtype!!!
# CUL_HM_qStateUpdatIfEnab($dst.$subType);# subtype actually is channel
@ -3727,6 +3738,7 @@ sub CUL_HM_responseSetup($$) {#store all we need to handle the response
$to = "timedOn:=1";
}
CUL_HM_respWaitSu ($hash,"cmd:=$cmd","mNo:=$mNo","reSent:=$rss",$to);
$hash->{helper}{cSnd} = substr($cmd,8);
}
elsif($mTp eq '12' && $mFlg & 0x10){#wakeup with burst
# response setup - do not repeat, set counter to 250
@ -4305,7 +4317,8 @@ sub CUL_HM_id2Name($) { #in: name or HMid out: name
sub CUL_HM_id2Hash($) {#in: id, out:hash
my ($id) = @_;
return $modules{CUL_HM}{defptr}{$id} if ($modules{CUL_HM}{defptr}{$id});
return $modules{CUL_HM}{defptr}{substr($id,0,6)}; # could be chn 01 of dev
$id = substr($id,0,6);
return $modules{CUL_HM}{defptr}{$id}?($modules{CUL_HM}{defptr}{$id}):undef;
}
sub CUL_HM_getDeviceHash($) {#in: hash out: devicehash
my ($hash) = @_;

View File

@ -205,7 +205,8 @@ sub HMinfo_peerCheck(@) { #####################################################
}
sub HMinfo_burstCheck(@) { ####################################################
my @entities = @_;
my @peerIDsNeed;
my @needBurstMiss;
my @needBurstFail;
my @peerIDsCond;
foreach my $eName (@entities){
next if (!$defs{$eName}{helper}{role}{chn});#device has no channels
@ -223,7 +224,10 @@ sub HMinfo_burstCheck(@) { ####################################################
my $prxt = CUL_HM_getRxType($defs{$pn});
next if (!($prxt & 0x82)); # not a burst peer
push @peerIDsNeed," $eName for peer $pn" if (ReadingsVal($eName,"R-$pn-peerNeedsBurst","") !~ m /on/);
my $pnb = ReadingsVal($eName,"R-$pn-peerNeedsBurst",undef);
if (!$pnb) {push @needBurstMiss, $eName;}
elsif($pnb !~ m /on/){push @needBurstFail, $eName;}
if ($prxt & 0x80){# conditional burst - is it on?
my $pDevN = CUL_HM_getDeviceName($pn);
push @peerIDsCond," $pDevN for remote $eName" if (ReadingsVal($pDevN,"R-burstRx","") !~ m /on/);
@ -231,8 +235,9 @@ sub HMinfo_burstCheck(@) { ####################################################
}
}
my $ret = "";
$ret .="\n\n peerNeedsBurst not set" ."\n ".(join "\n ",sort @peerIDsNeed) if(@peerIDsNeed);
$ret .="\n\n conditionalBurst not set"."\n ".(join "\n ",sort @peerIDsCond) if(@peerIDsCond);
$ret .="\n\n peerNeedsBurst cannot be determined" ."\n ".(join "\n ",sort @needBurstMiss) if(@needBurstMiss);
$ret .="\n\n peerNeedsBurst not set" ."\n ".(join "\n ",sort @needBurstFail) if(@needBurstFail);
$ret .="\n\n conditionalBurst not set" ."\n ".(join "\n ",sort @peerIDsCond) if(@peerIDsCond);
return $ret;
}
sub HMinfo_paramCheck(@) { ####################################################
@ -778,10 +783,13 @@ sub HMinfo_status($){##########################################################
}
#--- used for IO, protocol and communication (e.g. rssi)
my @IOdev;
my %protE = (NACK =>0,IOerr =>0,ResndFail =>0,CmdDel =>0);
my %protC = (ErrIoId_ =>0,ErrIoAttack =>0);
my %protE = (NACK =>0,IOerr =>0,ResndFail =>0,CmdDel =>0);
my %protW = (Resnd =>0,CmdPend =>0);
my @protNamesE; # devices with current protocol events
my @protNamesW; # devices with current protocol events
my @protNamesC; # devices with current protocol Critical
my @protNamesE; # devices with current protocol Errors
my @protNamesW; # devices with current protocol Warnings
my @Anames; # devices with ActionDetector events
my %rssiMin;
my %rssiMinCnt = ("99>"=>0,"80>"=>0,"60>"=>0,"59<"=>0);
@ -811,7 +819,17 @@ sub HMinfo_status($){##########################################################
$nbrD++;
push @IOdev,$ehash->{IODev}{NAME} if($ehash->{IODev} && $ehash->{IODev}{NAME});
push @Anames,$eName if ($attr{$eName}{actStatus} && $attr{$eName}{actStatus} ne "alive");
foreach (grep {$ehash->{"prot".$_}} keys %protE){#protocol events reported
foreach (grep /ErrIoId_/, keys %{$ehash}){# detect addtional critical entries
my $k = $_;
$k =~ s/^prot//;
$protC{$k} = 0 if(!defined $protC{$_});
}
foreach (grep {$ehash->{"prot".$_}} keys %protC){#protocol critical alarms
$protC{$_}++;
push @protNamesC,$eName;
}
foreach (grep {$ehash->{"prot".$_}} keys %protE){#protocol errors
$protE{$_}++;
push @protNamesE,$eName;
}
@ -861,16 +879,20 @@ sub HMinfo_status($){##########################################################
# ------- what about protocol events ------
# Current Events are Rcv,NACK,IOerr,Resend,ResendFail,Snd
# additional variables are protCmdDel,protCmdPend,protState,protLastRcv
my @tp;
push @tp,"$_:$protE{$_}" foreach (grep {$protE{$_}} keys(%protE));
push @updates,"ERR__protocol:".join",",@tp if(@tp);
my @tpc;
push @tpc,"$_:$protC{$_}" foreach (grep {$protC{$_}} keys(%protC));
if(@tpc){push @updates,"CRIT__protocol:".join",",@tpc;} else{delete $hash->{READINGS}{CRIT__protocol} };
my @tpe;
push @tpe,"$_:$protE{$_}" foreach (grep {$protE{$_}} keys(%protE));
if(@tpe){push @updates,"ERR__protocol:".join",",@tpe;} else{ delete $hash->{READINGS}{ERR__protocol} };
my @tpw;
push @tpw,"$_:$protW{$_}" foreach (grep {$protW{$_}} keys(%protW));
push @updates,"W__protocol:".join",",@tpw if(@tpw);
if(@tpw){push @updates,"W__protocol:".join",",@tpw ;} else{ delete $hash->{READINGS}{W__protocol} };
@protNamesE = grep !/^$/,HMinfo_noDup(@protNamesE);;
@protNamesC = grep !/^$/,HMinfo_noDup(@protNamesC);
$hash->{CRI__protoNames} = join",",@protNamesC if(@protNamesC);
@protNamesE = grep !/^$/,HMinfo_noDup(@protNamesE);
$hash->{ERR__protoNames} = join",",@protNamesE if(@protNamesE);
@protNamesW = grep !/^$/,HMinfo_noDup(@protNamesW);
$hash->{W__protoNames} = join",",@protNamesW if(@protNamesW);