mirror of
https://github.com/eworm-de/routeros-scripts.git
synced 2026-03-04 21:19:36 +00:00
Compare commits
50 commits
f1af3e1dbc
...
b88c2a14cc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b88c2a14cc | ||
|
|
d7628f0310 | ||
|
|
9f24bb0a26 | ||
|
|
950a4b94ba | ||
|
|
8644a7f4a3 | ||
|
|
8b2ae87892 | ||
|
|
8da55ba82d | ||
|
|
e75d986fe7 | ||
|
|
8019d6b788 | ||
|
|
6e0f9c26cc | ||
|
|
2d4316da3f | ||
|
|
93aef0f6d5 | ||
|
|
07551cd562 | ||
|
|
fee36452b9 | ||
|
|
4222d11f11 | ||
|
|
f095b581e7 | ||
|
|
3d10fd82c8 | ||
|
|
661aad522b | ||
|
|
414870f051 | ||
|
|
4561b17dbf | ||
|
|
f18930688e | ||
|
|
6ccc37334c | ||
|
|
4b4346d0b4 | ||
|
|
937ac0aaba | ||
|
|
fdcd5f8b01 | ||
|
|
954bee9949 | ||
|
|
5caf54b26e | ||
|
|
29c6151d1e | ||
|
|
0acb501ff5 | ||
|
|
9b9233a013 | ||
|
|
8c7cd61892 | ||
|
|
ee9d61e28a | ||
|
|
48eca31f3c | ||
|
|
55e568414c | ||
|
|
912061b624 | ||
|
|
172ca2c709 | ||
|
|
c0ea72ec7a | ||
|
|
4cdcd081e5 | ||
|
|
9b46c36641 | ||
|
|
efd259f868 | ||
|
|
d419e58abd | ||
|
|
0e891b0963 | ||
|
|
c36e303e01 | ||
|
|
fc742edc58 | ||
|
|
cefc9d7e4b | ||
|
|
72a7f20a64 | ||
|
|
5cc8b7281a | ||
|
|
89f569c7c0 | ||
|
|
3422783191 | ||
|
|
48336ac82c |
25 changed files with 275 additions and 235 deletions
|
|
@ -32,12 +32,13 @@
|
|||
|
||||
:global LogPrint;
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/partitions/copy-to $FallbackTo;
|
||||
$LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackToName . "'.");
|
||||
:return true;
|
||||
} on-error={
|
||||
$LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackToName . "'!");
|
||||
} do={
|
||||
$LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . \
|
||||
$FallbackToName . "': " . $Err);
|
||||
:return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -107,16 +108,17 @@
|
|||
}
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/scheduler/add start-time=startup name="running-from-backup-partition" \
|
||||
on-event=(":log warning (\"Running from partition '\" . " . \
|
||||
"[ /partitions/get [ find where running ] name ] . \"'!\")");
|
||||
/partitions/save-config-to $FallbackTo;
|
||||
/system/scheduler/remove "running-from-backup-partition";
|
||||
$LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'.");
|
||||
} on-error={
|
||||
} do={
|
||||
/system/scheduler/remove [ find where name="running-from-backup-partition" ];
|
||||
$LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!");
|
||||
$LogPrint error $ScriptName ("Failed saving configuration to partition '" . \
|
||||
$FallbackToName . "': " . $Err);
|
||||
:set PackagesUpdateBackupFailure true;
|
||||
:set ExitOK true;
|
||||
:error false;
|
||||
|
|
|
|||
|
|
@ -90,13 +90,13 @@
|
|||
/system/backup/save encryption=aes-sha256 name=$FilePath password=$BackupPassword;
|
||||
$WaitForFile ($FilePath . ".backup");
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".backup") \
|
||||
user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".backup");
|
||||
:set BackupFile [ /file/get ($FilePath . ".backup") ];
|
||||
:set ($BackupFile->"name") ($FileName . ".backup");
|
||||
} on-error={
|
||||
$LogPrint error $ScriptName ("Uploading backup file failed!");
|
||||
} do={
|
||||
$LogPrint error $ScriptName ("Uploading backup file failed: " . $Err);
|
||||
:set BackupFile "failed";
|
||||
:set Failed 1;
|
||||
}
|
||||
|
|
@ -109,13 +109,13 @@
|
|||
/export terse show-sensitive file=$FilePath;
|
||||
$WaitForFile ($FilePath . ".rsc");
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".rsc") \
|
||||
user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".rsc");
|
||||
:set ExportFile [ /file/get ($FilePath . ".rsc") ];
|
||||
:set ($ExportFile->"name") ($FileName . ".rsc");
|
||||
} on-error={
|
||||
$LogPrint error $ScriptName ("Uploading configuration export failed!");
|
||||
} do={
|
||||
$LogPrint error $ScriptName ("Uploading configuration export failed: " . $Err);
|
||||
:set ExportFile "failed";
|
||||
:set Failed 1;
|
||||
}
|
||||
|
|
@ -130,13 +130,13 @@
|
|||
file=($FilePath . ".conf\00");
|
||||
$WaitForFile ($FilePath . ".conf");
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".conf") \
|
||||
user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".conf");
|
||||
:set ConfigFile [ /file/get ($FilePath . ".conf") ];
|
||||
:set ($ConfigFile->"name") ($FileName . ".conf");
|
||||
} on-error={
|
||||
$LogPrint error $ScriptName ("Uploading global-config-overlay failed!");
|
||||
} do={
|
||||
$LogPrint error $ScriptName ("Uploading global-config-overlay failed: " . $Err);
|
||||
:set ConfigFile "failed";
|
||||
:set Failed 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,10 +89,10 @@
|
|||
:foreach Plugin in=$Plugins do={
|
||||
:local PluginVal [ /system/script/get $Plugin ];
|
||||
:if ([ $ValidateSyntax ($PluginVal->"source") ] = true) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/script/run $Plugin;
|
||||
} on-error={
|
||||
$LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run.");
|
||||
} do={
|
||||
$LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping.");
|
||||
|
|
|
|||
|
|
@ -45,12 +45,12 @@
|
|||
:local IntName [ /interface/lte/get $Interface name ];
|
||||
:local Firmware;
|
||||
:local Info;
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ];
|
||||
:set Info [ /interface/lte/monitor $Interface once as-value ];
|
||||
} on-error={
|
||||
} do={
|
||||
$LogPrint debug $ScriptName ("Could not get latest LTE firmware version for interface " . \
|
||||
$IntName . ".");
|
||||
$IntName . ": " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -141,13 +141,13 @@
|
|||
|
||||
:if ([ :len $SafeUpdateUrl ] > 0) do={
|
||||
:local Result;
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Result [ /tool/fetch check-certificate=yes-without-crl \
|
||||
($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \
|
||||
"&latest=" . $Update->"latest-version") http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \
|
||||
output=user as-value ];
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . ".");
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . ": " . $Err);
|
||||
}
|
||||
:if ($Result->"status" = "finished" && $Result->"data" = $Update->"latest-version") do={
|
||||
$LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is considered safe, updating...");
|
||||
|
|
|
|||
|
|
@ -114,8 +114,8 @@
|
|||
:error true;
|
||||
}
|
||||
:if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={
|
||||
:if ($Address ~ "/128\$") do={
|
||||
:set Address [ :pick $Address 0 ([ :len $Address ] - 4) ];
|
||||
:if ([ :typeof [ :find $Address "/" ] ] = "nil") do={
|
||||
:set Address ($Address . "/128");
|
||||
}
|
||||
:set ($IPv6Addresses->$Branch->$Address) $TimeOut;
|
||||
:error true;
|
||||
|
|
@ -135,15 +135,15 @@
|
|||
:local Branch [ $GetBranch $Address ];
|
||||
:local TimeOut ($IPv4Addresses->$Branch->$Address);
|
||||
:if ([ :typeof $TimeOut ] = "time") do={
|
||||
$LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \
|
||||
"' with " . $TimeOut . ": " . $Address);
|
||||
$LogPrintVerbose debug $ScriptName ("Renewing IPv4 address " . $Address . \
|
||||
" in list '" . $FwListName . "' with " . $TimeOut . ".");
|
||||
/ip/firewall/address-list/set $Entry timeout=$TimeOut;
|
||||
:set ($IPv4Addresses->$Branch->$Address);
|
||||
:set CntRenew ($CntRenew + 1);
|
||||
} else={
|
||||
:if ($Failure = false) do={
|
||||
$LogPrintVerbose debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \
|
||||
"': " . $Address);
|
||||
$LogPrintVerbose debug $ScriptName ("Removing IPv4 address " . $Address . \
|
||||
" from list '" . $FwListName . ".");
|
||||
/ip/firewall/address-list/remove $Entry;
|
||||
:set CntRemove ($CntRemove + 1);
|
||||
}
|
||||
|
|
@ -156,15 +156,15 @@
|
|||
:local Branch [ $GetBranch $Address ];
|
||||
:local TimeOut ($IPv6Addresses->$Branch->$Address);
|
||||
:if ([ :typeof $TimeOut ] = "time") do={
|
||||
$LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \
|
||||
"' with " . $TimeOut . ": " . $Address);
|
||||
$LogPrintVerbose debug $ScriptName ("Renewing IPv6 address " . $Address . \
|
||||
" in list '" . $FwListName . "' with " . $TimeOut . ".");
|
||||
/ipv6/firewall/address-list/set $Entry timeout=$TimeOut;
|
||||
:set ($IPv6Addresses->$Branch->$Address);
|
||||
:set CntRenew ($CntRenew + 1);
|
||||
} else={
|
||||
:if ($Failure = false) do={
|
||||
$LogPrintVerbose debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \
|
||||
"': " . $Address);
|
||||
$LogPrintVerbose debug $ScriptName ("Removing IPv6 address " . $Address . \
|
||||
" from list '" . $FwListName .".");
|
||||
/ipv6/firewall/address-list/remove $Entry;
|
||||
:set CntRemove ($CntRemove + 1);
|
||||
}
|
||||
|
|
@ -174,15 +174,15 @@
|
|||
:foreach BranchName,Branch in=$IPv4Addresses do={
|
||||
$LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName);
|
||||
:foreach Address,Timeout in=$Branch do={
|
||||
$LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \
|
||||
"' with " . $Timeout . ": " . $Address);
|
||||
:do {
|
||||
$LogPrintVerbose debug $ScriptName ("Adding IPv4 address " . $Address . \
|
||||
" to list '" . $FwListName . "' with " . $Timeout . ".");
|
||||
:onerror Err {
|
||||
/ip/firewall/address-list/add list=$FwListName comment=$ListComment \
|
||||
address=$Address timeout=$Timeout;
|
||||
:set CntAdd ($CntAdd + 1);
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \
|
||||
"': " . $Address);
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed to add IPv4 address " . $Address . \
|
||||
" to list '" . $FwListName . "': " . $Err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -190,15 +190,15 @@
|
|||
:foreach BranchName,Branch in=$IPv6Addresses do={
|
||||
$LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName);
|
||||
:foreach Address,Timeout in=$Branch do={
|
||||
$LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \
|
||||
"' with " . $Timeout . ": " . $Address);
|
||||
:do {
|
||||
$LogPrintVerbose debug $ScriptName ("Adding IPv6 address " . $Address . \
|
||||
" to list '" . $FwListName . "' with " . $Timeout . ".");
|
||||
:onerror Err {
|
||||
/ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \
|
||||
address=$Address timeout=$Timeout;
|
||||
:set CntAdd ($CntAdd + 1);
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \
|
||||
"': " . $Address);
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed to add IPv6 address " . $Address . \
|
||||
" to list '" . $FwListName . "': " . $Err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@
|
|||
|
||||
# Warning: Do *NOT* copy this line to overlay!
|
||||
:global GlobalConfigReady false;
|
||||
# || ... but
|
||||
# \||/ start
|
||||
# \/ here!
|
||||
|
||||
# Set this to 'true' to disable news and change notifications.
|
||||
:global NoNewsAndChangesNotification false;
|
||||
|
|
@ -267,15 +270,18 @@
|
|||
"cert2-cn"="4n0th3r-s3cr3t";
|
||||
};
|
||||
|
||||
# /\ Warning: Do *NOT* copy
|
||||
# /\7\ the code below to overlay!
|
||||
# /_()_\ Things *will* break!
|
||||
#
|
||||
# load custom settings from overlay and snippets
|
||||
# Warning: Do *NOT* copy this code to overlay!
|
||||
:foreach Script in=([ /system/script/find where name="global-config-overlay" ], \
|
||||
[ /system/script/find where name~"^global-config-overlay.d/" ]) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/script/run $Script;
|
||||
} on-error={
|
||||
} do={
|
||||
:log error ("Loading configuration from overlay or snippet " . \
|
||||
[ /system/script/get $Script name ] . " failed!");
|
||||
[ /system/script/get $Script name ] . " failed: " . $Err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -393,15 +393,15 @@
|
|||
$LogPrint debug $0 ("... from url: " . $Url);
|
||||
:local Retry 3;
|
||||
:while ($Retry > 0) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest;
|
||||
$WaitForFile $PkgDest;
|
||||
|
||||
:if ([ /file/get [ find where name=$PkgDest ] type ] = "package") do={
|
||||
:return true;
|
||||
}
|
||||
} on-error={
|
||||
$LogPrint debug $0 ("Downloading package file failed.");
|
||||
} do={
|
||||
$LogPrint debug $0 ("Downloading package file failed: " . $Err);
|
||||
}
|
||||
|
||||
$RmFile $PkgDest;
|
||||
|
|
@ -489,14 +489,14 @@
|
|||
}
|
||||
|
||||
:local FileName ($DirName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]);
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \
|
||||
http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value;
|
||||
} on-error={
|
||||
} do={
|
||||
:if ([ $WaitForFile $FileName 500ms ] = true) do={
|
||||
$RmFile $FileName;
|
||||
}
|
||||
$LogPrint debug $0 ("Failed downloading from: " . $Url);
|
||||
$LogPrint debug $0 ("Failed downloading from " . $Url . " - " . $Err);
|
||||
$RmDir $DirName;
|
||||
:return false;
|
||||
}
|
||||
|
|
@ -589,12 +589,12 @@
|
|||
("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data");
|
||||
:return $Vendor;
|
||||
} on-error={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl ("https://api.macvendors.com/") \
|
||||
output=none as-value;
|
||||
$LogPrint debug $0 ("The mac vendor is not known in database.");
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Failed getting mac vendor.");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Failed getting mac vendor: " . $Err);
|
||||
}
|
||||
:return "unknown vendor";
|
||||
}
|
||||
|
|
@ -897,11 +897,11 @@
|
|||
|
||||
$LogPrint info $0 ("Creating disk of type tmpfs.");
|
||||
$RmDir "tmpfs";
|
||||
:do {
|
||||
:onerror Err {
|
||||
/disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/get total-memory ] / 3);
|
||||
$WaitForFile "tmpfs";
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Creating disk of type tmpfs failed!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Creating disk of type tmpfs failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
:return true;
|
||||
|
|
@ -926,11 +926,11 @@
|
|||
}
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/file/add type="directory" name=$Path;
|
||||
$WaitForFile $Path;
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Making directory '" . $Path . "' failed!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Making directory '" . $Path . "' failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
|
|
@ -1055,10 +1055,10 @@
|
|||
:return true;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/file/remove $Dir;
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed.");
|
||||
} do={
|
||||
$LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
:return true;
|
||||
|
|
@ -1083,10 +1083,10 @@
|
|||
:return true;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/file/remove $File;
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed.");
|
||||
} do={
|
||||
$LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
:return true;
|
||||
|
|
@ -1126,6 +1126,8 @@
|
|||
:global CommitId;
|
||||
:global CommitInfo;
|
||||
:global ExpectedConfigVersion;
|
||||
:global GlobalConfigReady;
|
||||
:global GlobalFunctionsReady;
|
||||
:global Identity;
|
||||
:global IDonate;
|
||||
:global NoNewsAndChangesNotification;
|
||||
|
|
@ -1159,8 +1161,7 @@
|
|||
|
||||
:local CommitIdBefore $CommitId;
|
||||
:local ExpectedConfigVersionBefore $ExpectedConfigVersion;
|
||||
:local ReloadGlobalFunctions false;
|
||||
:local ReloadGlobalConfig false;
|
||||
:local ReloadGlobal false;
|
||||
:local DeviceMode [ /system/device-mode/get ];
|
||||
|
||||
:local CheckSums ({});
|
||||
|
|
@ -1203,7 +1204,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ];
|
||||
:local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ];
|
||||
:local Url ($BaseUrl . $ScriptVal->"name" . ".rsc" . $UrlSuffix);
|
||||
|
|
@ -1213,13 +1214,11 @@
|
|||
:if ($Result->"status" = "finished") do={
|
||||
:set SourceNew [ :tolf ($Result->"data") ];
|
||||
}
|
||||
} on-error={
|
||||
} do={
|
||||
$LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . . "': " . $Err);
|
||||
:if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={
|
||||
$LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . \
|
||||
"', removing dummy. Typo on installation?");
|
||||
$LogPrint warning $0 ("Removing dummy. Typo on installation?");
|
||||
/system/script/remove $Script;
|
||||
} else={
|
||||
$LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!");
|
||||
}
|
||||
:error false;
|
||||
}
|
||||
|
|
@ -1269,31 +1268,25 @@
|
|||
$LogPrint info $0 ("Updating script: " . $ScriptVal->"name");
|
||||
/system/script/set owner=($ScriptVal->"name") \
|
||||
source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script;
|
||||
:if ($ScriptVal->"name" = "global-config") do={
|
||||
:set ReloadGlobalConfig true;
|
||||
}
|
||||
:if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={
|
||||
:set ReloadGlobalFunctions true;
|
||||
:if ($ScriptVal->"name" = "global-config" || \
|
||||
$ScriptVal->"name" = "global-functions" || \
|
||||
$ScriptVal->"name" ~ ("^mod/.")) do={
|
||||
:set ReloadGlobal true;
|
||||
}
|
||||
} on-error={ }
|
||||
}
|
||||
|
||||
:if ($ReloadGlobalFunctions = true) do={
|
||||
$LogPrint info $0 ("Reloading global functions.");
|
||||
:do {
|
||||
/system/script/run global-functions;
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Reloading global functions failed!");
|
||||
}
|
||||
}
|
||||
:if ($ReloadGlobal = true) do={
|
||||
$LogPrint info $0 ("Reloading global configuration and functions.");
|
||||
:set GlobalConfigReady false;
|
||||
:set GlobalFunctionsReady false;
|
||||
:delay 1s;
|
||||
|
||||
:if ($ReloadGlobalConfig = true) do={
|
||||
$LogPrint info $0 ("Reloading global configuration.");
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/script/run global-config;
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Reloading global configuration failed!" . \
|
||||
" Syntax error or missing overlay?");
|
||||
/system/script/run global-functions;
|
||||
} do={
|
||||
$LogPrint error $0 ("Reloading global configuration and functions failed! " . $Err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1312,7 +1305,7 @@
|
|||
:global GlobalConfigMigration;
|
||||
:local ChangeLogCode;
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Url ($ScriptUpdatesBaseUrl . "news-and-changes.rsc" . $ScriptUpdatesUrlSuffix);
|
||||
$LogPrint debug $0 ("Fetching news, changes and migration: " . $Url);
|
||||
:local Result [ /tool/fetch check-certificate=yes-without-crl \
|
||||
|
|
@ -1320,16 +1313,16 @@
|
|||
:if ($Result->"status" = "finished") do={
|
||||
:set ChangeLogCode ($Result->"data");
|
||||
}
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Failed fetching news, changes and migration!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Failed fetching news, changes and migration: " . $Err);
|
||||
}
|
||||
|
||||
:if ([ :len $ChangeLogCode ] > 0) do={
|
||||
:if ([ $ValidateSyntax $ChangeLogCode ] = true) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
[ :parse $ChangeLogCode ];
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("The changelog failed to run!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("The changelog failed to run: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint warning $0 ("The changelog failed syntax validation!");
|
||||
|
|
@ -1351,10 +1344,10 @@
|
|||
}
|
||||
|
||||
$LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration);
|
||||
:do {
|
||||
:onerror Err {
|
||||
[ :parse $Migration ];
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Migration code for change " . $I . " failed to run!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Migration code for change " . $I . " failed to run: " . $Err);
|
||||
}
|
||||
} on-error={ }
|
||||
}
|
||||
|
|
@ -1662,9 +1655,12 @@
|
|||
:set ValidateSyntax do={
|
||||
:local Code [ :tostr $1 ];
|
||||
|
||||
:do {
|
||||
:global LogPrint;
|
||||
|
||||
:onerror Err {
|
||||
[ :parse (":local Validate do={\n" . $Code . "\n}") ];
|
||||
} on-error={
|
||||
} do={
|
||||
$LogPrint debug $0 ("Valdation failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
:return true;
|
||||
|
|
@ -1778,10 +1774,10 @@
|
|||
:foreach Script in=[ /system/script/find where name ~ "^mod/." ] do={
|
||||
:local ScriptVal [ /system/script/get $Script ];
|
||||
:if ([ $ValidateSyntax ($ScriptVal->"source") ] = true) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/script/run $Script;
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed to run.");
|
||||
} do={
|
||||
$LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed to run: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed syntax validation, skipping.");
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
:local Gps [ /system/gps/monitor once as-value ];
|
||||
|
||||
:if ($Gps->"valid" = true) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||
http-header-field=({ [ $FetchUserAgentStr $ScriptName ]; "Content-Type: application/json" }) \
|
||||
http-data=[ :serialize to=json { "identity"=$Identity; \
|
||||
|
|
@ -42,8 +42,8 @@
|
|||
$LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \
|
||||
"lat: " . ($Gps->"latitude") . " " . \
|
||||
"lon: " . ($Gps->"longitude"));
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Failed sending GPS data!");
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed sending GPS data: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint debug $ScriptName ("GPS data not valid.");
|
||||
|
|
|
|||
|
|
@ -53,11 +53,11 @@
|
|||
}
|
||||
|
||||
:foreach Order,Script in=$RunOrder do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
$LogPrint debug $ScriptName ("Running script with order " . $Order . ": " . $Script);
|
||||
/system/script/run $Script;
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!");
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Running script '" . $Script . "' failed: " . $Err);
|
||||
}
|
||||
}
|
||||
} do={
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
:local Input $1;
|
||||
:local Level (0 + [ :tonum $2 ]);
|
||||
|
||||
:global CharacterReplace;
|
||||
:global IfThenElse;
|
||||
:global InspectVarReturn;
|
||||
|
||||
|
|
@ -33,14 +34,13 @@
|
|||
:local Value [ :tostr $2 ];
|
||||
:local Level [ :tonum $3 ];
|
||||
|
||||
:local Indent "";
|
||||
:for I from=1 to=$Level step=1 do={
|
||||
:set Indent ($Indent . " ");
|
||||
}
|
||||
:return ($Indent . "-" . $Prefix . "-> " . $Value);
|
||||
:global CharacterMultiply;
|
||||
|
||||
:return ([ $CharacterMultiply " " $Level ] . "-" . $Prefix . "-> " . $Value);
|
||||
}
|
||||
|
||||
:local TypeOf [ :typeof $Input ];
|
||||
:local Len [ :len $Input ];
|
||||
:local Return [ $IndentReturn "type" $TypeOf $Level ];
|
||||
|
||||
:if ($TypeOf = "array") do={
|
||||
|
|
@ -50,6 +50,16 @@
|
|||
[ $InspectVarReturn $Value ($Level + 2) ]);
|
||||
}
|
||||
} else={
|
||||
:if ($TypeOf = "str") do={
|
||||
:set $Return ($Return . "\n" . \
|
||||
[ $IndentReturn "len" $Len $Level ]);
|
||||
:if ([ :typeof [ :find $Input ("\r") ] ] = "num") do={
|
||||
:set Input [ $CharacterReplace $Input ("\r") "" ];
|
||||
}
|
||||
:if ([ :typeof [ :find $Input ("\n") ] ] = "num") do={
|
||||
:set Input [ $CharacterReplace $Input ("\n") " " ];
|
||||
}
|
||||
}
|
||||
:if ($TypeOf != "nothing") do={
|
||||
:set $Return ($Return . "\n" . \
|
||||
[ $IndentReturn "value" [ $IfThenElse ([ :len $Input ] > 80) \
|
||||
|
|
|
|||
|
|
@ -89,35 +89,40 @@
|
|||
|
||||
:foreach Id,Message in=$EmailQueue do={
|
||||
:if ([ :typeof $Message ] = "array" ) do={
|
||||
:local Attach ({});
|
||||
:while ([ /tool/e-mail/get last-status ] = "in-progress") do={ :delay 1s; }
|
||||
:foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={
|
||||
:if ([ :len [ /file/find where name=$File ] ] = 1) do={
|
||||
:set Attach ($Attach, $File);
|
||||
} else={
|
||||
$LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach.");
|
||||
}
|
||||
}
|
||||
/tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") cc=($Message->"cc") \
|
||||
subject=($Message->"subject") body=($Message->"body") file=$Attach;
|
||||
:local Wait true;
|
||||
:do {
|
||||
:delay 1s;
|
||||
:local Status [ /tool/e-mail/get last-status ];
|
||||
:if ($Status = "succeeded") do={
|
||||
:set ($EmailQueue->$Id);
|
||||
:set Wait false;
|
||||
:if (($Message->"remove-attach") = true) do={
|
||||
:foreach File in=$Attach do={
|
||||
/file/remove $File;
|
||||
}
|
||||
:onerror Err {
|
||||
:local Attach ({});
|
||||
:foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={
|
||||
:if ([ :len [ /file/find where name=$File ] ] = 1) do={
|
||||
:set Attach ($Attach, $File);
|
||||
} else={
|
||||
$LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach.");
|
||||
}
|
||||
}
|
||||
:if ($Status = "failed") do={
|
||||
:set AllDone false;
|
||||
:set Wait false;
|
||||
}
|
||||
} while=($Wait = true);
|
||||
/tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") cc=($Message->"cc") \
|
||||
subject=($Message->"subject") body=($Message->"body") file=$Attach;
|
||||
:local Wait true;
|
||||
:do {
|
||||
:delay 1s;
|
||||
:local Status [ /tool/e-mail/get last-status ];
|
||||
:if ($Status = "succeeded") do={
|
||||
:set ($EmailQueue->$Id);
|
||||
:set Wait false;
|
||||
:if (($Message->"remove-attach") = true) do={
|
||||
:foreach File in=$Attach do={
|
||||
/file/remove $File;
|
||||
}
|
||||
}
|
||||
}
|
||||
:if ($Status = "failed") do={
|
||||
:set AllDone false;
|
||||
:set Wait false;
|
||||
}
|
||||
} while=($Wait = true);
|
||||
} do={
|
||||
$LogPrint warning $0 ("Sending queued mail failed: " . $Err);
|
||||
:set AllDone false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -176,6 +181,7 @@
|
|||
:global IfThenElse;
|
||||
:global NotificationEMailSignature;
|
||||
:global NotificationEMailSubject;
|
||||
:global SymbolForNotification;
|
||||
|
||||
:local To [ $EitherOr ($EmailGeneralToOverride->($Notification->"origin")) $EmailGeneralTo ];
|
||||
:local Cc [ $EitherOr ($EmailGeneralCcOverride->($Notification->"origin")) $EmailGeneralCc ];
|
||||
|
|
@ -188,13 +194,23 @@
|
|||
:if ([ :typeof $EmailQueue ] = "nothing") do={
|
||||
:set EmailQueue ({});
|
||||
}
|
||||
:local Truncated false;
|
||||
:local Body ($Notification->"message");
|
||||
:if ([ :len $Body ] > 62000) do={
|
||||
:set Body ([ :pick $Body 0 62000 ] . "...");
|
||||
:set Truncated true;
|
||||
}
|
||||
:local Signature [ $EitherOr [ $NotificationEMailSignature ] [ /system/note/get note ] ];
|
||||
:set Body ($Body . "\n" . \
|
||||
[ $IfThenElse ([ :len ($Notification->"link") ] > 0) \
|
||||
("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ] . \
|
||||
[ $IfThenElse ($Truncated = true) ("\n" . [ $SymbolForNotification "scissors" ] . \
|
||||
"The message was too long and has been truncated!") ] . \
|
||||
[ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]);
|
||||
:set ($EmailQueue->[ :len $EmailQueue ]) {
|
||||
to=$To; cc=$Cc;
|
||||
subject=[ $NotificationEMailSubject ($Notification->"subject") ];
|
||||
body=(($Notification->"message") . \
|
||||
[ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n\n" . ($Notification->"link")) "" ] . \
|
||||
[ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]); \
|
||||
body=$Body; \
|
||||
attach=($Notification->"attach"); remove-attach=($Notification->"remove-attach") };
|
||||
:if ([ :len [ /system/scheduler/find where name="_FlushEmailQueue" ] ] = 0) do={
|
||||
/system/scheduler/add name="_FlushEmailQueue" interval=1s start-time=startup \
|
||||
|
|
|
|||
|
|
@ -37,13 +37,13 @@
|
|||
|
||||
:foreach Id,Message in=$GotifyQueue do={
|
||||
:if ([ :typeof $Message ] = "array" ) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||
http-header-field=($Message->"headers") http-data=[ :serialize to=json ($Message->"message") ] \
|
||||
($Message->"url") as-value;
|
||||
:set ($GotifyQueue->$Id);
|
||||
} on-error={
|
||||
$LogPrint debug $0 ("Sending queued Gotify message failed.");
|
||||
} do={
|
||||
$LogPrint debug $0 ("Sending queued Gotify message failed: " . $Err);
|
||||
:set AllDone false;
|
||||
}
|
||||
}
|
||||
|
|
@ -91,11 +91,11 @@
|
|||
("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ]); \
|
||||
"priority"=[ :tonum [ $IfThenElse ($Notification->"silent") 2 5 ] ] });
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||
http-header-field=$Headers http-data=[ :serialize to=json $Message ] $Url as-value;
|
||||
} on-error={
|
||||
$LogPrint info $0 ("Failed sending Gotify notification! Queuing...");
|
||||
} do={
|
||||
$LogPrint info $0 ("Failed sending Gotify notification: " . $Err . " - Queuing...");
|
||||
|
||||
:if ([ :typeof $GotifyQueue ] = "nothing") do={
|
||||
:set GotifyQueue ({});
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
:foreach Id,Message in=$MatrixQueue do={
|
||||
:if ([ :typeof $Message ] = "array" ) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none \
|
||||
http-header-field=($Message->"headers") http-method=post \
|
||||
http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=($Message->"plain");
|
||||
|
|
@ -47,8 +47,8 @@
|
|||
("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \
|
||||
"/send/m.room.message?access_token=" . $Message->"accesstoken") as-value;
|
||||
:set ($MatrixQueue->$Id);
|
||||
} on-error={
|
||||
$LogPrint debug $0 ("Sending queued Matrix message failed.");
|
||||
} do={
|
||||
$LogPrint debug $0 ("Sending queued Matrix message failed: " . $Err);
|
||||
:set AllDone false;
|
||||
}
|
||||
}
|
||||
|
|
@ -129,15 +129,15 @@
|
|||
[ $PrepareText $Label ] . "</a>");
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none \
|
||||
http-header-field=$Headers http-method=post \
|
||||
http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=$Plain;
|
||||
"format"="org.matrix.custom.html"; "formatted_body"=$Formatted } ] \
|
||||
("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \
|
||||
"/send/m.room.message?access_token=" . $AccessToken) as-value;
|
||||
} on-error={
|
||||
$LogPrint info $0 ("Failed sending Matrix notification! Queuing...");
|
||||
} do={
|
||||
$LogPrint info $0 ("Failed sending Matrix notification: " . $Err . " - Queuing...");
|
||||
|
||||
:if ([ :typeof $MatrixQueue ] = "nothing") do={
|
||||
:set MatrixQueue ({});
|
||||
|
|
@ -196,14 +196,14 @@
|
|||
:global MatrixHomeServer;
|
||||
|
||||
:local Domain [ :pick $User ([ :find $User ":" ] + 1) [ :len $User] ];
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
|
||||
http-header-field=({ [ $FetchUserAgentStr $0 ] }) \
|
||||
("https://" . $Domain . "/.well-known/matrix/client") as-value ]->"data");
|
||||
:set MatrixHomeServer ([ :deserialize from=json value=$Data ]->"m.homeserver"->"base_url");
|
||||
$LogPrint debug $0 ("Home server is: " . $MatrixHomeServer);
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Failed getting home server!");
|
||||
} do={
|
||||
$LogPrint error $0 ("Failed getting home server: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
|
|
@ -211,27 +211,27 @@
|
|||
:set MatrixHomeServer [ :pick $MatrixHomeServer 8 [ :len $MatrixHomeServer ] ];
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
|
||||
http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \
|
||||
http-data=[ :serialize to=json { "type"="m.login.password"; "user"=$User; "password"=$Pass } ] \
|
||||
("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data");
|
||||
:set MatrixAccessToken ([ :deserialize from=json value=$Data ]->"access_token");
|
||||
$LogPrint debug $0 ("Access token is: " . $MatrixAccessToken);
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Failed logging in (and getting access token)!");
|
||||
} do={
|
||||
$LogPrint error $0 ("Failed logging in (and getting access token): " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/system/script/remove [ find where name="global-config-overlay.d/mod/notification-matrix" ];
|
||||
/system/script/add name="global-config-overlay.d/mod/notification-matrix" source=( \
|
||||
"# configuration snippet: mod/notification-matrix\n\n" . \
|
||||
":global MatrixHomeServer \"" . $MatrixHomeServer . "\";\n" . \
|
||||
":global MatrixAccessToken \"" . $MatrixAccessToken . "\";\n");
|
||||
$LogPrint info $0 ("Added configuration snippet. Now create and join a room, please!");
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Failed adding configuration snippet!");
|
||||
} do={
|
||||
$LogPrint error $0 ("Failed adding configuration snippet: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -248,24 +248,24 @@
|
|||
:global MatrixHomeServer;
|
||||
:global MatrixRoom;
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none \
|
||||
http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post http-data="" \
|
||||
("https://" . $MatrixHomeServer . "/_matrix/client/r0/rooms/" . [ $UrlEncode $MatrixRoom ] . \
|
||||
"/join?access_token=" . [ $UrlEncode $MatrixAccessToken ]) as-value;
|
||||
$LogPrint debug $0 ("Joined the room.");
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Failed joining the room!");
|
||||
} do={
|
||||
$LogPrint error $0 ("Failed joining the room: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Snippet [ /system/script/find where name="global-config-overlay.d/mod/notification-matrix" ];
|
||||
/system/script/set $Snippet source=([ get $Snippet source ] . \
|
||||
":global MatrixRoom \"" . $MatrixRoom . "\";\n");
|
||||
$LogPrint info $0 ("Appended configuration to configuration snippet. Please review!");
|
||||
} on-error={
|
||||
$LogPrint error $0 ("Failed appending configuration to snippet!");
|
||||
} do={
|
||||
$LogPrint error $0 ("Failed appending configuration to snippet: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,13 +36,13 @@
|
|||
|
||||
:foreach Id,Message in=$NtfyQueue do={
|
||||
:if ([ :typeof $Message ] = "array" ) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
/tool/fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||
http-header-field=($Message->"headers") http-data=($Message->"text") \
|
||||
($Message->"url") as-value;
|
||||
:set ($NtfyQueue->$Id);
|
||||
} on-error={
|
||||
$LogPrint debug $0 ("Sending queued Ntfy message failed.");
|
||||
} do={
|
||||
$LogPrint debug $0 ("Sending queued Ntfy message failed: " . $Err);
|
||||
:set AllDone false;
|
||||
}
|
||||
}
|
||||
|
|
@ -107,7 +107,7 @@
|
|||
:set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . ($Notification->"link"));
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
:if ($Server = "ntfy.sh") do={
|
||||
:if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={
|
||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||
|
|
@ -116,8 +116,8 @@
|
|||
}
|
||||
/tool/fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||
http-header-field=$Headers http-data=$Text $Url as-value;
|
||||
} on-error={
|
||||
$LogPrint info $0 ("Failed sending ntfy notification! Queuing...");
|
||||
} do={
|
||||
$LogPrint info $0 ("Failed sending ntfy notification: " . $Err . " - Queuing...");
|
||||
|
||||
:if ([ :typeof $NtfyQueue ] = "nothing") do={
|
||||
:set NtfyQueue ({});
|
||||
|
|
|
|||
|
|
@ -38,14 +38,14 @@
|
|||
|
||||
:foreach Id,Message in=$TelegramQueue do={
|
||||
:if ([ :typeof $Message ] = "array" ) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \
|
||||
("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \
|
||||
http-data=($Message->"http-data") as-value ]->"data");
|
||||
:set ($TelegramQueue->$Id);
|
||||
:set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1;
|
||||
} on-error={
|
||||
$LogPrint debug $0 ("Sending queued Telegram message failed.");
|
||||
} do={
|
||||
$LogPrint debug $0 ("Sending queued Telegram message failed: " . $Err);
|
||||
:set AllDone false;
|
||||
}
|
||||
}
|
||||
|
|
@ -72,12 +72,12 @@
|
|||
}
|
||||
|
||||
:local Data;
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
|
||||
("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=0" . \
|
||||
"&allowed_updates=%5B%22message%22%5D") as-value ]->"data");
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Fetching data failed!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Fetching data failed: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
|
|
@ -189,8 +189,8 @@
|
|||
|
||||
:local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \
|
||||
"&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \
|
||||
"&disable_web_page_preview=true&parse_mode=MarkdownV2");
|
||||
:do {
|
||||
"&disable_web_page_preview=true&parse_mode=MarkdownV2");
|
||||
:onerror Err {
|
||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||
:error false;
|
||||
|
|
@ -199,8 +199,8 @@
|
|||
("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \
|
||||
http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) as-value ]->"data");
|
||||
:set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1;
|
||||
} on-error={
|
||||
$LogPrint info $0 ("Failed sending Telegram notification! Queuing...");
|
||||
} do={
|
||||
$LogPrint info $0 ("Failed sending Telegram notification: " . $Err . " - Queuing...");
|
||||
|
||||
:if ([ :typeof $TelegramQueue ] = "nothing") do={
|
||||
:set TelegramQueue ({});
|
||||
|
|
|
|||
|
|
@ -41,11 +41,11 @@
|
|||
:return false;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
$LogPrint info $0 ("Running script '" . $Script . "' now.");
|
||||
[ :parse $Source ];
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("The script '" . $Script . "' failed to run!");
|
||||
} do={
|
||||
$LogPrint warning $0 ("The script '" . $Script . "' failed to run: " . $Err);
|
||||
:return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,13 +55,13 @@
|
|||
/file/add name=$FileName contents=($Key . ", md5=" . $FingerPrintMD5);
|
||||
$WaitForFile $FileName;
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
/user/ssh-keys/import public-key-file=$FileName user=$User;
|
||||
$LogPrint info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \
|
||||
"MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'.");
|
||||
$RmDir "tmpfs/ssh-keys-import";
|
||||
} on-error={
|
||||
$LogPrint warning $0 ("Failed importing key.");
|
||||
} do={
|
||||
$LogPrint warning $0 ("Failed importing key: " . $Err);
|
||||
$RmDir "tmpfs/ssh-keys-import";
|
||||
:return false;
|
||||
}
|
||||
|
|
@ -94,9 +94,7 @@
|
|||
:foreach KeyVal in=[ :deserialize $Keys delimiter=" " from=dsv options=dsv.plain ] do={
|
||||
:local Continue false;
|
||||
:if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={
|
||||
:do {
|
||||
$SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User;
|
||||
} on-error={
|
||||
:if ([ $SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User ] = false) do={
|
||||
$LogPrint warning $0 ("Failed importing key for user '" . $User . "'.");
|
||||
}
|
||||
:set Continue true;
|
||||
|
|
|
|||
|
|
@ -69,11 +69,11 @@
|
|||
:delay 200ms;
|
||||
}
|
||||
|
||||
:do {
|
||||
:onerror Err {
|
||||
[ :parse $Code ];
|
||||
} on-error={
|
||||
} do={
|
||||
$LogPrint warning $FuncName \
|
||||
("The code for " . $Count . " mode-button presses failed with runtime error!");
|
||||
("The code for " . $Count . " mode-button presses failed with runtime error: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint warning $FuncName \
|
||||
|
|
|
|||
|
|
@ -118,15 +118,15 @@
|
|||
}
|
||||
|
||||
:local Data false;
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
|
||||
http-header-field=({ "accept: application/dns-message" }) \
|
||||
url=(($DohServer->"doh-url") . "?dns=" . [ :convert to=base64 ([ :rndstr length=2 ] . \
|
||||
"\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \
|
||||
"\00\10" . "\00\01") ]) as-value ]->"data");
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("Request to DoH server failed (network or certificate issue): " . \
|
||||
($DohServer->"doh-url"));
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \
|
||||
" failed: " . $Err);
|
||||
}
|
||||
|
||||
:if ($Data != false) do={
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@
|
|||
:global ValidateSyntax;
|
||||
|
||||
:if ([ $ValidateSyntax $Hook ] = true) do={
|
||||
:do {
|
||||
onerror Err {
|
||||
[ :parse $Hook ];
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run.");
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run: " . $Err);
|
||||
:return ("The hook failed to run.");
|
||||
}
|
||||
} else={
|
||||
|
|
@ -107,7 +107,7 @@
|
|||
|
||||
:if ([ :typeof ($HostInfo->"resolve") ] = "str") do={
|
||||
:if ([ $IsDNSResolving ] = true) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Resolve [ :resolve type=[ $IfThenElse ([ :typeof ($HostVal->"host") ] = "ip") \
|
||||
"ipv4" "ipv6" ] ($HostInfo->"resolve") ];
|
||||
:if ($Resolve != $HostVal->"host") do={
|
||||
|
|
@ -121,13 +121,13 @@
|
|||
:set ($HostVal->"status") "unknown";
|
||||
}
|
||||
}
|
||||
} on-error={
|
||||
} do={
|
||||
:set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1);
|
||||
:if ($Metric->"resolve-failcnt" = 3) do={
|
||||
$LogPrint [ $IfThenElse ($HostInfo->"no-resolve-fail" != true) warning debug ] \
|
||||
$ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \
|
||||
($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \
|
||||
$HostInfo->"name") "" ] . "' failed.");
|
||||
$HostInfo->"name") "" ] . "' failed: " . $Err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,12 @@
|
|||
:if ($Phone = $Settings->"allowed-number" && \
|
||||
($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={
|
||||
$LogPrint debug $ScriptName ("Removing SMS, which started a script.");
|
||||
/tool/sms/inbox/remove $Sms;
|
||||
:onerror Err {
|
||||
/tool/sms/inbox/remove $Sms;
|
||||
:delay 300ms;
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed to remove message: " . $Err);
|
||||
}
|
||||
} else={
|
||||
:set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \
|
||||
" type " . $SmsVal->"type" . ":\n" . $SmsVal->"message");
|
||||
|
|
@ -69,12 +74,12 @@
|
|||
:if ($Phone~($Hook->"allowed-number") && ($SmsVal->"message")~($Hook->"match")) do={
|
||||
:if ([ $ValidateSyntax ($Hook->"command") ] = true) do={
|
||||
$LogPrint info $ScriptName ("Running hook '" . $Hook->"match" . "': " . $Hook->"command");
|
||||
:do {
|
||||
:onerror Err {
|
||||
:local Command [ :parse ($Hook->"command") ];
|
||||
$Command Phone=$Phone Message=($SmsVal->"message");
|
||||
:set Messages ($Messages . "\n\nRan hook '" . $Hook->"match" . "':\n" . $Hook->"command");
|
||||
} on-error={
|
||||
$LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed to run!");
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed to run: " . $Err);
|
||||
}
|
||||
} else={
|
||||
$LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed syntax validation!");
|
||||
|
|
@ -92,7 +97,12 @@
|
|||
message=("Received " . [ $IfThenElse ($Count = 1) "this message" ("these " . $Count . " messages") ] . \
|
||||
" by " . $Identity . " from " . $Phone . ":" . $Messages) });
|
||||
:foreach Sms in=$Delete do={
|
||||
/tool/sms/inbox/remove $Sms;
|
||||
:onerror Err {
|
||||
/tool/sms/inbox/remove $Sms;
|
||||
:delay 300ms;
|
||||
} do={
|
||||
$LogPrint warning $ScriptName ("Failed to remove message: " . $Err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,14 +70,14 @@
|
|||
:local Data false;
|
||||
:for I from=1 to=4 do={
|
||||
:if ($Data = false) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \
|
||||
("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=" . \
|
||||
$TelegramChatOffset->0 . "&allowed_updates=%5B%22message%22%5D") as-value ]->"data");
|
||||
:set TelegramRandomDelay [ $MAX 0 ($TelegramRandomDelay - 1) ];
|
||||
} on-error={
|
||||
} do={
|
||||
:if ($I < 4) do={
|
||||
$LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try.");
|
||||
$LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try: " . $Err);
|
||||
:set TelegramRandomDelay [ $MIN 15 ($TelegramRandomDelay + 5) ];
|
||||
:delay (($I * $I) . "s");
|
||||
}
|
||||
|
|
@ -107,7 +107,9 @@
|
|||
:local ThreadId [ $IfThenElse ($Message->"is_topic_message") ($Message->"message_thread_id") "" ];
|
||||
|
||||
:foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={
|
||||
:if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={
|
||||
:if ($From->"id" = $IdsTrusted || \
|
||||
$From->"username" = $IdsTrusted || \
|
||||
$Chat->"id" = $IdsTrusted) do={
|
||||
:set Trusted true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,10 +12,10 @@
|
|||
:foreach Interface in=[ /interface/lte/find where running ] do={
|
||||
:local Firmware;
|
||||
:local IntName [ /interface/lte/get $Interface name ];
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ];
|
||||
} on-error={
|
||||
:log debug ("Could not get latest LTE firmware version for interface " . $IntName . ".");
|
||||
} do={
|
||||
:log debug ("Could not get latest LTE firmware version for interface " . $IntName . ": " . $Err);
|
||||
}
|
||||
|
||||
:if ([ :typeof $Firmware ] = "array") do={
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
:set LTEFirmwareUpgrade;
|
||||
|
||||
/system/scheduler/remove ($1 . "-firmware-upgrade");
|
||||
:do {
|
||||
:onerror Err {
|
||||
/interface/lte/firmware-upgrade $1 upgrade=yes;
|
||||
:log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset.");
|
||||
:delay 240s;
|
||||
|
|
@ -36,8 +36,8 @@
|
|||
($Firmware->"installed") != ($Firmware->"latest")) do={
|
||||
:log warning ("LTE firmware versions still differ. Upgrade failed anyway?");
|
||||
}
|
||||
} on-error={
|
||||
:log error ("LTE firmware upgrade on '" . $1 . "' failed.");
|
||||
} do={
|
||||
:log error ("LTE firmware upgrade on '" . $1 . "' failed: " . $Err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,12 +41,12 @@
|
|||
|
||||
:for I from=2 to=0 do={
|
||||
:if ($Data = false) do={
|
||||
:do {
|
||||
:onerror Err {
|
||||
:set Data ([ /tool/fetch check-certificate=yes-without-crl \
|
||||
("https://ipv4.tunnelbroker.net/nic/update?hostname=" . $Comment->"id") \
|
||||
user=($Comment->"user") password=($Comment->"pass") output=user as-value ]->"data");
|
||||
} on-error={
|
||||
$LogPrint debug $ScriptName ("Failed downloading, " . $I . " retries pending.");
|
||||
} do={
|
||||
$LogPrint debug $ScriptName ("Failed downloading: " . $Err . " - " . $I . " retries pending.");
|
||||
:delay 2s;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue