Merge branch 'netwatch-notify' into next

This commit is contained in:
Christian Hesse 2024-02-29 14:21:46 +01:00
commit b9e0ffac1d
2 changed files with 38 additions and 10 deletions

View file

@ -83,9 +83,9 @@ with a resolvable name:
/tool/netwatch/add comment="notify, name=example.com, resolve=example.com";
But be warned: Dynamic updates will probably cause issues if the name has
more than one record in dns - a high rate of configuration changes (and flash
writes) at least.
This supports multiple A or AAAA records for a name just fine, even a CNAME
to those. But be warned: CNAME chains to multiple records will cause a high
rate of configuration changes (and flash writes)!
### No notification on host down

View file

@ -52,6 +52,28 @@
:return ("Ran hook:\n" . $Hook);
}
:local ResolveExpected do={
:local Name [ :tostr $1 ];
:local Expected [ :tostr $2 ];
:delay 100ms;
:if ([ :len [ /ip/dns/cache/find where name=$Name data=$Expected ] ] > 0) do={
:return true;
}
:local Cname [ /ip/dns/cache/find where name=$Name type="CNAME" ];
:if ([ :len $Cname ] > 0) do={
:set Cname [ /ip/dns/cache/get $Cname data ];
:set Cname [ :pick $Cname 0 ([ :len $Cname ] - 1) ];
:if ([ :len [ /ip/dns/cache/find where name=$Cname data=$Expected ] ] > 0) do={
:return true;
}
}
:return false;
}
$ScriptLock $0;
:local ScriptFromTerminalCached [ $ScriptFromTerminal $0 ];
@ -80,12 +102,15 @@ $ScriptLock $0;
:do {
:local Resolve [ :resolve ($HostInfo->"resolve") ];
:if ($Resolve != $HostVal->"host") do={
$LogPrintExit2 info $0 ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \
($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \
$HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \
", updating.") false;
/tool/netwatch/set host=$Resolve $Host;
:set ($Metric->"resolve-failcnt") 0;
:if ([ $ResolveExpected ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={
$LogPrintExit2 info $0 ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \
($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \
$HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \
", updating.") false;
/tool/netwatch/set host=$Resolve $Host;
:set ($Metric->"resolve-failcnt") 0;
:set ($HostVal->"status") "unknown";
}
}
} on-error={
:set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1);
@ -124,7 +149,9 @@ $ScriptLock $0;
:set ($Metric->"notified") false;
:set ($Metric->"parent") ($HostInfo->"parent");
:set ($Metric->"since");
} else={
}
:if ($HostVal->"status" = "down") do={
:set ($Metric->"count-down") ($Metric->"count-down" + 1);
:set ($Metric->"count-up") 0;
:set ($Metric->"parent") ($HostInfo->"parent");
@ -177,6 +204,7 @@ $ScriptLock $0;
:set ($Metric->"notified") true;
}
}
:set ($NetwatchNotify->$Name) {
"count-down"=($Metric->"count-down");
"count-up"=($Metric->"count-up");