From ffa31c7ad797eb63a896d241651773423c7126aa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 10:14:26 +0100 Subject: [PATCH 001/988] packages-update: increate log severity on canceled non-interactive update --- packages-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index abcbfd86..e0e1f6de 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -109,7 +109,7 @@ $LogPrintExit2 info $ScriptName ("Canceled update...") true; } } else={ - $LogPrintExit2 info $ScriptName ("Canceled non-interactive update.") true; + $LogPrintExit2 warning $ScriptName ("Canceled non-interactive update.") true; } } } From 3fcdd395fe93a501de297f7678d57b5c1064b05d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:19:43 +0100 Subject: [PATCH 002/988] packages-update: support passing backup failure --- packages-update.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index e0e1f6de..634b7bb4 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -23,6 +23,7 @@ :global VersionToNum; :global PackagesUpdateDeferReboot; + :global PackagesUpdateBackupFailure; :local Schedule do={ :local ScriptName [ :tostr $1 ]; @@ -96,10 +97,15 @@ } :foreach Order,Script in=$RunOrder do={ + :set PackagesUpdateBackupFailure false; :do { $LogPrintExit2 info $ScriptName ("Running backup script " . $Script . " before update.") false; /system/script/run $Script; } on-error={ + :set PackagesUpdateBackupFailure true; + } + + :if ($PackagesUpdateBackupFailure = true) do={ $LogPrintExit2 warning $ScriptName ("Running backup script " . $Script . " before update failed!") false; :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Do you want to continue anyway? [y/N]"; From c82f7766326f5e24ea81c2fe4a2a745075c86984 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:25:56 +0100 Subject: [PATCH 003/988] backup-cloud: pass failure to packages-update --- backup-cloud.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index a3dfe0c7..14af7762 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -17,6 +17,7 @@ :global BackupRandomDelay; :global Identity; + :global PackagesUpdateBackupFailure; :global DeviceInfo; :global FormatLine; @@ -32,6 +33,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set PackagesUpdateBackupFailure true; :error false; } $WaitFullyConnected; @@ -74,7 +76,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "floppy-disk,warning-sign" ] . "Cloud backup failed"); \ message=("Failed uploading backup for " . $Identity . " to cloud!\n\n" . [ $DeviceInfo ]) }); - $LogPrintExit2 error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!") true; + $LogPrintExit2 error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!") false; + :set PackagesUpdateBackupFailure true; + :error false; } /file/remove "tmpfs/backup-cloud"; } on-error={ } From 5f41bd1c1ec98bea8d7cc1760ff740ded20aa4d1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:26:24 +0100 Subject: [PATCH 004/988] backup-email: pass failure to packages-update --- backup-email.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backup-email.rsc b/backup-email.rsc index 9f6e31a9..e4dec3b8 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -22,6 +22,7 @@ :global BackupSendGlobalConfig; :global Domain; :global Identity; + :global PackagesUpdateBackupFailure; :global CleanName; :global DeviceInfo; @@ -46,6 +47,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set PackagesUpdateBackupFailure true; :error false; } $WaitFullyConnected; @@ -109,7 +111,9 @@ :local I 0; :while ([ :len [ /file/find where name ~ ($FilePath . "\\.(backup|rsc)\$") ] ] > 0) do={ :if ($I >= 120) do={ - $LogPrintExit2 warning $ScriptName ("Files are still available, sending e-mail failed.") true; + $LogPrintExit2 warning $ScriptName ("Files are still available, sending e-mail failed.") false; + :set PackagesUpdateBackupFailure true; + :error false; } :delay 1s; :set I ($I + 1); From 51b00181cf6524f173f0464a237bdb63c3f0734a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:26:39 +0100 Subject: [PATCH 005/988] backup-partition: pass failure to packages-update --- backup-partition.rsc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 1238fab0..13ed8b97 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -15,21 +15,28 @@ :do { :local ScriptName [ :jobname ]; + :global PackagesUpdateBackupFailure; + :global LogPrintExit2; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set PackagesUpdateBackupFailure true; :error false; } :if ([ :len [ /partitions/find ] ] < 2) do={ - $LogPrintExit2 error $ScriptName ("Device does not have a fallback partition.") true; + $LogPrintExit2 error $ScriptName ("Device does not have a fallback partition.") false; + :set PackagesUpdateBackupFailure true; + :error false; } :local ActiveRunning [ /partitions/find where active running ]; :if ([ :len $ActiveRunning ] < 1) do={ - $LogPrintExit2 error $ScriptName ("Device is not running from active partition.") true; + $LogPrintExit2 error $ScriptName ("Device is not running from active partition.") false; + :set PackagesUpdateBackupFailure true; + :error false; } :local FallbackTo [ /partitions/get $ActiveRunning fallback-to ]; @@ -45,6 +52,8 @@ } on-error={ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; $LogPrintExit2 error $ScriptName ("Failed saving configuration to partition '" . \ - $FallbackTo . "'!") true; + $FallbackTo . "'!") false; + :set PackagesUpdateBackupFailure true; + :error false; } } on-error={ } From e39e8a00834192211999b89f5f163a35c2214707 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:26:53 +0100 Subject: [PATCH 006/988] backup-upload: pass failure to packages-update --- backup-upload.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 2b427307..769972b2 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -25,6 +25,7 @@ :global BackupUploadUser; :global Domain; :global Identity; + :global PackagesUpdateBackupFailure; :global CleanName; :global DeviceInfo; @@ -45,6 +46,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set PackagesUpdateBackupFailure true; :error false; } $WaitFullyConnected; @@ -151,6 +153,7 @@ [ $FileInfo "Config file" $ConfigFile ]); silent=true }); :if ($Failed = 1) do={ - :error "An error occured!"; + :set PackagesUpdateBackupFailure true; + :error false; } } on-error={ } From a7cb3e520a86b44cb6e1bdfdf6df24856274e0e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 09:33:17 +0100 Subject: [PATCH 007/988] global-config: support loading snippets This adds support for loading snippets, which need a name starting with "global-config-overlay.d/". This allows to split off configuration if desired. --- README.md | 5 +++++ global-config.rsc | 10 ++++++++++ global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1af718ca..61b17256 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,11 @@ Save changes and exit with `Ctrl-o`. ![screenshot: edit global-config-overlay](README.d/07-edit-global-config-overlay.avif) +Additionally creating configuration snippets is supported. The script name +of these snippets has to start with `global-config-overlay.d/` to make them +being loaded automatically. This allows to split off parts of the +configuration. + To apply your changes run `global-config`, which will automatically load the overlay as well: diff --git a/global-config.rsc b/global-config.rsc index 983eedba..85731c32 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -250,3 +250,13 @@ } on-error={ :log error ("Loading configuration from overlay failed!"); } + +# configuration overlay snippets +:foreach Script in=[ /system/script/find where name ~ "^global-config-overlay.d/" ] do={ + :do { + /system/script/run $Script; + } on-error={ + :log error ("Loading configuration from overlay snippet " . \ + [ /system/script/get $Script name ] . " failed!"); + } +} diff --git a/global-functions.rsc b/global-functions.rsc index 7f5ba9fc..d2386f49 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 121; +:global ExpectedConfigVersion 122; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index c5117cab..46b777a9 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -46,6 +46,7 @@ 119="Added support for IPv6 to script 'fw-addr-lists'."; 120="Implemented a workaround in 'backup-cloud'. Now script should no longer just crash, but send notification with error."; 121="The 'wifiwave2' scripts are finally gone. Development continues with 'wifi' in RouterOS 7.13 and later."; + 122="The global configuration was enhanced to support loading snippets. Configuration can be split off to scripts where name starts with 'global-config-overlay.d/'."; }; # Migration steps to be applied on script updates From 1feeed145d6b63ef60fc3c0abbe0703b7bd73837 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 10:38:09 +0100 Subject: [PATCH 008/988] global-functions: introduce $LogPrint, deprecate $LogPrintExit2 --- global-functions.rsc | 21 +++++++++++++++++---- news-and-changes.rsc | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index aca4cd82..1220ecaf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 122; +:global ExpectedConfigVersion 123; # global variables not to be changed by user :global GlobalFunctionsReady false; @@ -53,6 +53,7 @@ :global IsFullyConnected; :global IsMacLocallyAdministered; :global IsTimeSync; +:global LogPrint; :global LogPrintExit2; :global LogPrintOnce; :global MAX; @@ -654,12 +655,11 @@ :return true; } -# log and print with same text, optionally exit -:set LogPrintExit2 do={ +# log and print with same text +:set LogPrint do={ :local Severity [ :tostr $1 ]; :local Name [ :tostr $2 ]; :local Message [ :tostr $3 ]; - :local Exit [ :tostr $4 ]; :global PrintDebug; :global PrintDebugOverride; @@ -692,6 +692,19 @@ :if ($Severity != "debug" || $Debug = true) do={ :put ([ $PrintSeverity $Severity ] . ": " . $Message); } +} + +# log and print with same text, optionally exit +# Deprectated! - TODO: remove later +:set LogPrintExit2 do={ + :local Severity [ :tostr $1 ]; + :local Name [ :tostr $2 ]; + :local Message [ :tostr $3 ]; + :local Exit [ :tostr $4 ]; + + :global LogPrint; + + $LogPrint $1 $2 $3; :if ($Exit = "true") do={ :error ("Hard error to exit."); diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 46b777a9..6b0a538f 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -47,6 +47,7 @@ 120="Implemented a workaround in 'backup-cloud'. Now script should no longer just crash, but send notification with error."; 121="The 'wifiwave2' scripts are finally gone. Development continues with 'wifi' in RouterOS 7.13 and later."; 122="The global configuration was enhanced to support loading snippets. Configuration can be split off to scripts where name starts with 'global-config-overlay.d/'."; + 123="Introduced new function '\$LogPrint', and deprecated '\$LogPrintExit2'. Please update custom scripts if you use it."; }; # Migration steps to be applied on script updates From ac3b755fdc630d4daa40a9ba5254d92f8a91b03f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 009/988] backup-cloud: switch to $LogPrint --- backup-cloud.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 14af7762..cccb41b6 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -22,7 +22,7 @@ :global DeviceInfo; :global FormatLine; :global HumanReadableNum; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global RandomDelay; :global ScriptFromTerminal; @@ -43,7 +43,8 @@ } :if ([ $MkDir ("tmpfs/backup-cloud") ] = false) do={ - $LogPrintExit2 error $ScriptName ("Failed creating directory!") true; + $LogPrint error $ScriptName ("Failed creating directory!"); + :error false; } :execute { @@ -76,7 +77,7 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "floppy-disk,warning-sign" ] . "Cloud backup failed"); \ message=("Failed uploading backup for " . $Identity . " to cloud!\n\n" . [ $DeviceInfo ]) }); - $LogPrintExit2 error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!") false; + $LogPrint error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!"); :set PackagesUpdateBackupFailure true; :error false; } From 4b69144ee476ada47c640f1e5a65952bce7241ec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 010/988] backup-email: switch to $LogPrint --- backup-email.rsc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index e4dec3b8..64ca69ca 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -27,7 +27,7 @@ :global CleanName; :global DeviceInfo; :global FormatLine; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global RandomDelay; :global ScriptFromTerminal; @@ -38,12 +38,14 @@ :global WaitFullyConnected; :if ([ :typeof $SendEMail2 ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("The module for sending notifications via e-mail is not installed.") true; + $LogPrint error $ScriptName ("The module for sending notifications via e-mail is not installed."); + :error false; } :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ - $LogPrintExit2 error $ScriptName ("Configured to send neither backup nor config export.") true; + $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -66,7 +68,8 @@ :local Attach ({}); :if ([ $MkDir $DirName ] = false) do={ - $LogPrintExit2 error $ScriptName ("Failed creating directory!") true; + $LogPrint error $ScriptName ("Failed creating directory!"); + :error false; } # binary backup @@ -111,7 +114,7 @@ :local I 0; :while ([ :len [ /file/find where name ~ ($FilePath . "\\.(backup|rsc)\$") ] ] > 0) do={ :if ($I >= 120) do={ - $LogPrintExit2 warning $ScriptName ("Files are still available, sending e-mail failed.") false; + $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); :set PackagesUpdateBackupFailure true; :error false; } From b879f8fef2fac123d3929f2964c9528465ce7a42 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 011/988] backup-partition: switch to $LogPrint --- backup-partition.rsc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 13ed8b97..503d3824 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -17,7 +17,7 @@ :global PackagesUpdateBackupFailure; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -26,7 +26,7 @@ } :if ([ :len [ /partitions/find ] ] < 2) do={ - $LogPrintExit2 error $ScriptName ("Device does not have a fallback partition.") false; + $LogPrint error $ScriptName ("Device does not have a fallback partition."); :set PackagesUpdateBackupFailure true; :error false; } @@ -34,7 +34,7 @@ :local ActiveRunning [ /partitions/find where active running ]; :if ([ :len $ActiveRunning ] < 1) do={ - $LogPrintExit2 error $ScriptName ("Device is not running from active partition.") false; + $LogPrint error $ScriptName ("Device is not running from active partition."); :set PackagesUpdateBackupFailure true; :error false; } @@ -47,12 +47,10 @@ "[ /partitions/get [ find where running ] name ] . \"'!\")"); /partitions/save-config-to $FallbackTo; /system/scheduler/remove "running-from-backup-partition"; - $LogPrintExit2 info $ScriptName ("Saved configuration to partition '" . \ - $FallbackTo . "'.") false; + $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackTo . "'."); } on-error={ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; - $LogPrintExit2 error $ScriptName ("Failed saving configuration to partition '" . \ - $FallbackTo . "'!") false; + $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackTo . "'!"); :set PackagesUpdateBackupFailure true; :error false; } From ca822e1358d59f43d2ef359e2ec3cde44c589f46 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 012/988] backup-upload: switch to $LogPrint --- backup-upload.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 769972b2..ef5b7c72 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -30,7 +30,7 @@ :global CleanName; :global DeviceInfo; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global RandomDelay; :global ScriptFromTerminal; @@ -42,7 +42,8 @@ :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ - $LogPrintExit2 error $ScriptName ("Configured to send neither backup nor config export.") true; + $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -65,7 +66,8 @@ :local Failed 0; :if ([ $MkDir $DirName ] = false) do={ - $LogPrintExit2 error $ScriptName ("Failed creating directory!") true; + $LogPrint error $ScriptName ("Failed creating directory!"); + :error false; } # binary backup @@ -79,7 +81,7 @@ :set BackupFile [ /file/get ($FilePath . ".backup") ]; :set ($BackupFile->"name") ($FileName . ".backup"); } on-error={ - $LogPrintExit2 error $ScriptName ("Uploading backup file failed!") false; + $LogPrint error $ScriptName ("Uploading backup file failed!"); :set BackupFile "failed"; :set Failed 1; } @@ -98,7 +100,7 @@ :set ExportFile [ /file/get ($FilePath . ".rsc") ]; :set ($ExportFile->"name") ($FileName . ".rsc"); } on-error={ - $LogPrintExit2 error $ScriptName ("Uploading configuration export failed!") false; + $LogPrint error $ScriptName ("Uploading configuration export failed!"); :set ExportFile "failed"; :set Failed 1; } @@ -119,7 +121,7 @@ :set ConfigFile [ /file/get ($FilePath . ".conf") ]; :set ($ConfigFile->"name") ($FileName . ".conf"); } on-error={ - $LogPrintExit2 error $ScriptName ("Uploading global-config-overlay failed!") false; + $LogPrint error $ScriptName ("Uploading global-config-overlay failed!"); :set ConfigFile "failed"; :set Failed 1; } From e40da1e7e483a07592477ef82c4a665f6b2a7bde Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 013/988] capsman-download-packages: switch to $LogPrint --- capsman-download-packages.capsman.rsc | 16 +++++++++------- capsman-download-packages.template.rsc | 16 +++++++++------- capsman-download-packages.wifi.rsc | 16 +++++++++------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index d4e900de..a3bd4a59 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -19,7 +19,7 @@ :global CleanFilePath; :global DownloadPackage; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global ScriptLock; :global WaitFullyConnected; @@ -34,16 +34,18 @@ :local Updated false; :if ([ :len $PackagePath ] = 0) do={ - $LogPrintExit2 warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages.") true; + $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :error false; } :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ :if ([ $MkDir $PackagePath ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ - $PackagePath . ") failed!") true; + $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ + $PackagePath . ") failed!"); + :error false; } - $LogPrintExit2 info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ - "). Please place your packages!") false; + $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ + "). Please place your packages!"); } :foreach Package in=[ /file/find where type=package \ @@ -60,7 +62,7 @@ } :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("No packages available, downloading default set.") false; + $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ :if ([ $DownloadPackage $Package $InstalledVersion $Arch $PackagePath ] = true) do={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index cd4a83b3..cad3bcb5 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -20,7 +20,7 @@ :global CleanFilePath; :global DownloadPackage; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global ScriptLock; :global WaitFullyConnected; @@ -36,16 +36,18 @@ :local Updated false; :if ([ :len $PackagePath ] = 0) do={ - $LogPrintExit2 warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages.") true; + $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :error false; } :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ :if ([ $MkDir $PackagePath ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ - $PackagePath . ") failed!") true; + $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ + $PackagePath . ") failed!"); + :error false; } - $LogPrintExit2 info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ - "). Please place your packages!") false; + $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ + "). Please place your packages!"); } :foreach Package in=[ /file/find where type=package \ @@ -62,7 +64,7 @@ } :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("No packages available, downloading default set.") false; + $LogPrint info $ScriptName ("No packages available, downloading default set."); # NOT /interface/wifi/ # :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 633830a9..909688f9 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -19,7 +19,7 @@ :global CleanFilePath; :global DownloadPackage; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global ScriptLock; :global WaitFullyConnected; @@ -34,16 +34,18 @@ :local Updated false; :if ([ :len $PackagePath ] = 0) do={ - $LogPrintExit2 warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages.") true; + $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :error false; } :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ :if ([ $MkDir $PackagePath ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ - $PackagePath . ") failed!") true; + $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ + $PackagePath . ") failed!"); + :error false; } - $LogPrintExit2 info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ - "). Please place your packages!") false; + $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ + "). Please place your packages!"); } :foreach Package in=[ /file/find where type=package \ @@ -60,7 +62,7 @@ } :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("No packages available, downloading default set.") false; + $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "arm64" } do={ :local Packages { "arm"={ "routeros"; "wifi-qcom"; "wifi-qcom-ac" }; "arm64"={ "routeros"; "wifi-qcom" } }; From 12435ff1c53e7ef3b8b63b28860a3f35f8146184 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 014/988] capsman-rolling-upgrade: switch to $LogPrint --- capsman-rolling-upgrade.capsman.rsc | 8 ++++---- capsman-rolling-upgrade.template.rsc | 8 ++++---- capsman-rolling-upgrade.wifi.rsc | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 16a34983..11bfd698 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -18,7 +18,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -34,11 +34,11 @@ :foreach RemoteCap in=[ /caps-man/remote-cap/find where version!=$InstalledVersion ] do={ :local RemoteCapVal [ /caps-man/remote-cap/get $RemoteCap ]; :if ([ :len $RemoteCapVal ] > 1) do={ - $LogPrintExit2 info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ - " (" . $RemoteCapVal->"identity" . ")...") false; + $LogPrint info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ + " (" . $RemoteCapVal->"identity" . ")..."); /caps-man/remote-cap/upgrade $RemoteCap; } else={ - $LogPrintExit2 warning $ScriptName ("Remote CAP vanished, skipping upgrade.") false; + $LogPrint warning $ScriptName ("Remote CAP vanished, skipping upgrade."); } :delay ($Delay . "s"); } diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 45a5f8e8..e0effd48 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -19,7 +19,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -41,12 +41,12 @@ # NOT /caps-man/ # :set ($RemoteCapVal->"name") ($RemoteCapVal->"common-name"); # NOT /caps-man/ # - $LogPrintExit2 info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ - " (" . $RemoteCapVal->"identity" . ")...") false; + $LogPrint info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ + " (" . $RemoteCapVal->"identity" . ")..."); /caps-man/remote-cap/upgrade $RemoteCap; /interface/wifi/capsman/remote-cap/upgrade $RemoteCap; } else={ - $LogPrintExit2 warning $ScriptName ("Remote CAP vanished, skipping upgrade.") false; + $LogPrint warning $ScriptName ("Remote CAP vanished, skipping upgrade."); } :delay ($Delay . "s"); } diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 63245dc2..8ec6f26b 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -18,7 +18,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -35,11 +35,11 @@ :local RemoteCapVal [ /interface/wifi/capsman/remote-cap/get $RemoteCap ]; :if ([ :len $RemoteCapVal ] > 1) do={ :set ($RemoteCapVal->"name") ($RemoteCapVal->"common-name"); - $LogPrintExit2 info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ - " (" . $RemoteCapVal->"identity" . ")...") false; + $LogPrint info $ScriptName ("Starting upgrade for " . $RemoteCapVal->"name" . \ + " (" . $RemoteCapVal->"identity" . ")..."); /interface/wifi/capsman/remote-cap/upgrade $RemoteCap; } else={ - $LogPrintExit2 warning $ScriptName ("Remote CAP vanished, skipping upgrade.") false; + $LogPrint warning $ScriptName ("Remote CAP vanished, skipping upgrade."); } :delay ($Delay . "s"); } From 7c38b9a35c972a9b65c16c581c8da1b4d456b0fe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 015/988] certificate-renew-issued: switch to $LogPrint --- certificate-renew-issued.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index a360a3f9..45805c54 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -16,7 +16,7 @@ :global CertIssuedExportPass; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global ScriptLock; @@ -36,13 +36,13 @@ /certificate/export-certificate ($CertVal->"name") type=pkcs12 \ file-name=("cert-issued/" . $CertVal->"common-name") \ export-passphrase=($CertIssuedExportPass->($CertVal->"common-name")); - $LogPrintExit2 info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . \ - "\", exported to \"cert-issued/" . $CertVal->"common-name" . ".p12\".") false; + $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . \ + "\", exported to \"cert-issued/" . $CertVal->"common-name" . ".p12\"."); } else={ - $LogPrintExit2 warning $ScriptName ("Failed creating directory, not exporting certificate.") false; + $LogPrint warning $ScriptName ("Failed creating directory, not exporting certificate."); } } else={ - $LogPrintExit2 info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . "\".") false; + $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . "\"."); } } } on-error={ } From 36258087497df000a69cd9544595ba87d216077f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 016/988] check-certificates: switch to $LogPrint --- check-certificates.rsc | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index edde7f36..75049552 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -22,7 +22,7 @@ :global CertificateAvailable :global EscapeForRegEx; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; :global SendNotification2; @@ -39,7 +39,7 @@ :global CertificateNameByCN; :global EscapeForRegEx; :global FetchUserAgent; - :global LogPrintExit2; + :global LogPrint; :global UrlEncode; :global WaitForFile; @@ -62,7 +62,7 @@ /file/remove [ find where name=$CertFileName ]; :if ($DecryptionFailed = true) do={ - $LogPrintExit2 warning $0 ("Decryption failed for certificate file '" . $CertFileName . "'.") false; + $LogPrint warning $0 ("Decryption failed for certificate file '" . $CertFileName . "'."); } :foreach CertInChain in=[ /certificate/find where name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ @@ -72,7 +72,7 @@ :set Return true; } on-error={ - $LogPrintExit2 debug $0 ("Could not download certificate file '" . $CertFileName . "'.") false; + $LogPrint debug $0 ("Could not download certificate file '" . $CertFileName . "'."); } } @@ -143,9 +143,10 @@ :do { :if ([ :len $CertRenewUrl ] = 0) do={ - $LogPrintExit2 info $ScriptName ("No CertRenewUrl given.") true; + $LogPrint info $ScriptName ("No CertRenewUrl given."); + :error false; } - $LogPrintExit2 info $ScriptName ("Attempting to renew certificate '" . ($CertVal->"name") . "'.") false; + $LogPrint info $ScriptName ("Attempting to renew certificate '" . ($CertVal->"name") . "'."); :local ImportSuccess false; :set LastName ($CertVal->"common-name"); @@ -159,10 +160,10 @@ :if ($ImportSuccess = false) do={ :error false; } :if ([ :len ($CertVal->"fingerprint") ] > 0 && $CertVal->"fingerprint" != [ /certificate/get $Cert fingerprint ]) do={ - $LogPrintExit2 debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was updated in place.") false; + $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was updated in place."); :set CertVal [ /certificate/get $Cert ]; } else={ - $LogPrintExit2 debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced.") false; + $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced."); :set CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ (common-name=($CertVal->"common-name") or subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $LastName ] . "(\\W|\$)")) \ @@ -170,12 +171,13 @@ :local CertNewVal [ /certificate/get $CertNew ]; :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") ] = false) do={ - $LogPrintExit2 warning $ScriptName ("The certificate chain is not available!") false; + $LogPrint warning $ScriptName ("The certificate chain is not available!"); } :if (($CertVal->"private-key") = true && ($CertVal->"private-key") != ($CertNewVal->"private-key")) do={ /certificate/remove $CertNew; - $LogPrintExit2 warning $ScriptName ("Old certificate '" . ($CertVal->"name") . "' has a private key, new certificate does not. Aborting renew.") true; + $LogPrint warning $ScriptName ("Old certificate '" . ($CertVal->"name") . "' has a private key, new certificate does not. Aborting renew."); + :error false; } /ip/service/set certificate=($CertNewVal->"name") [ find where certificate=($CertVal->"name") ]; @@ -194,9 +196,9 @@ $SendNotification2 ({ origin=$ScriptName; silent=true; \ subject=([ $SymbolForNotification "lock-with-ink-pen" ] . "Certificate renewed: " . ($CertVal->"name")); \ message=("A certificate on " . $Identity . " has been renewed.\n\n" . [ $FormatInfo $CertNew ]) }); - $LogPrintExit2 info $ScriptName ("The certificate '" . ($CertVal->"name") . "' has been renewed.") false; + $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' has been renewed."); } on-error={ - $LogPrintExit2 debug $ScriptName ("Could not renew certificate '" . ($CertVal->"name") . "'.") false; + $LogPrint debug $ScriptName ("Could not renew certificate '" . ($CertVal->"name") . "'."); } } @@ -205,15 +207,15 @@ :local CertVal [ /certificate/get $Cert ]; :if ([ :len [ /certificate/scep-server/find where ca-cert=($CertVal->"ca") ] ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("Certificate '" . ($CertVal->"name") . "' is handled by SCEP, skipping.") false; + $LogPrint debug $ScriptName ("Certificate '" . ($CertVal->"name") . "' is handled by SCEP, skipping."); } else={ :local State [ $IfThenElse (($CertVal->"expired") = true) "expired" "is about to expire" ]; $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "warning-sign" ] . "Certificate warning: " . ($CertVal->"name")); \ message=("A certificate on " . $Identity . " " . $State . ".\n\n" . [ $FormatInfo $Cert ]) }); - $LogPrintExit2 info $ScriptName ("The certificate '" . ($CertVal->"name") . "' " . $State . \ - ", it is invalid after " . ($CertVal->"invalid-after") . ".") false; + $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' " . $State . \ + ", it is invalid after " . ($CertVal->"invalid-after") . "."); } } } on-error={ } From 463393647fc5c28faad5e9c671af8e9b441478c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 017/988] check-health: switch to $LogPrint --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 91330fc5..2a97ad6e 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -28,7 +28,7 @@ :global FormatLine; :global HumanReadableNum; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -77,7 +77,7 @@ } :if ([ :len [ /system/health/find ] ] = 0) do={ - $LogPrintExit2 debug $ScriptName ("Your device does not provide any health values.") false; + $LogPrint debug $ScriptName ("Your device does not provide any health values."); :error true; } @@ -148,7 +148,7 @@ :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ :if ([ :typeof ($CheckHealthTemperature->$Name) ] != "num" ) do={ - $LogPrintExit2 info $ScriptName ("No threshold given for " . $Name . ", assuming 50C.") false; + $LogPrint info $ScriptName ("No threshold given for " . $Name . ", assuming 50C."); :set ($CheckHealthTemperature->$Name) 50; } :local Validate [ /system/health/get [ find where name=$Name ] value ]; From 7f154a178bf41a6d053cd86e339d8533c0028a51 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 018/988] check-lte-firmware-upgrade: switch to $LogPrint --- check-lte-firmware-upgrade.rsc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index f2a6e37f..e7f06f35 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -35,7 +35,7 @@ :global FormatLine; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ScriptFromTerminal; :global SendNotification2; :global SymbolForNotification; @@ -47,19 +47,19 @@ :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; :set Info [ /interface/lte/monitor $Interface once as-value ]; } on-error={ - $LogPrintExit2 debug $ScriptName ("Could not get latest LTE firmware version for interface " . \ - $IntName . ".") false; + $LogPrint debug $ScriptName ("Could not get latest LTE firmware version for interface " . \ + $IntName . "."); :return false; } :if ([ :len ($Firmware->"latest") ] = 0) do={ - $LogPrintExit2 info $ScriptName ("An empty string is not a valid version.") false; + $LogPrint info $ScriptName ("An empty string is not a valid version."); :return false; } :if (($Firmware->"installed") = ($Firmware->"latest")) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - $LogPrintExit2 info $ScriptName ("No firmware upgrade available for LTE interface " . $IntName . ".") false; + $LogPrint info $ScriptName ("No firmware upgrade available for LTE interface " . $IntName . "."); } :return true; } @@ -69,7 +69,7 @@ :put ("Do you want to start unattended lte firmware upgrade for interface " . $IntName . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ /system/script/run unattended-lte-firmware-upgrade; - $LogPrintExit2 info $ScriptName ("Scheduled lte firmware upgrade for interface " . $IntName . "...") false; + $LogPrint info $ScriptName ("Scheduled lte firmware upgrade for interface " . $IntName . "..."); :return true; } else={ :put "Canceled..."; @@ -77,13 +77,13 @@ } :if (($SentLteFirmwareUpgradeNotification->$IntName) = ($Firmware->"latest")) do={ - $LogPrintExit2 debug $ScriptName ("Already sent the LTE firmware upgrade notification for version " . \ - ($Firmware->"latest") . ".") false; + $LogPrint debug $ScriptName ("Already sent the LTE firmware upgrade notification for version " . \ + ($Firmware->"latest") . "."); :return false; } - $LogPrintExit2 info $ScriptName ("A new firmware version " . ($Firmware->"latest") . " is available for " . \ - "LTE interface " . $IntName . ".") false; + $LogPrint info $ScriptName ("A new firmware version " . ($Firmware->"latest") . " is available for " . \ + "LTE interface " . $IntName . "."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "LTE firmware upgrade"); \ message=("A new firmware version " . ($Firmware->"latest") . " is available for " . \ From a996bdac2aa42728676fe2acc1f0b589aae6673c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 019/988] check-routeros-update: switch to $LogPrint --- check-routeros-update.rsc | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index a68762b0..e209610a 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -24,7 +24,7 @@ :global DeviceInfo; :global EscapeForRegEx; - :global LogPrintExit2; + :global LogPrint; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -50,12 +50,12 @@ :error "A reboot for update is already scheduled."; } - $LogPrintExit2 debug $ScriptName ("Checking for updates...") false; + $LogPrint debug $ScriptName ("Checking for updates..."); /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; :if ([ $ScriptFromTerminal $ScriptName ] = true && ($Update->"installed-version") = ($Update->"latest-version")) do={ - $LogPrintExit2 info $ScriptName ("System is already up to date.") false; + $LogPrint info $ScriptName ("System is already up to date."); :error true; } @@ -64,13 +64,14 @@ :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); :if ($NumLatest < 117505792) do={ - $LogPrintExit2 info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version.") true; + $LogPrint info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); + :error false; } :if ($NumInstalled < $NumLatest) do={ :if ($SafeUpdateAll ~ "^YES,? ?PLEASE!?\$") do={ - $LogPrintExit2 info $ScriptName ("Installing ALL versions automatically, including " . \ - $Update->"latest-version" . "...") false; + $LogPrint info $ScriptName ("Installing ALL versions automatically, including " . \ + $Update->"latest-version" . "..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Installing ALL versions automatically, including " . $Update->"latest-version" . \ @@ -79,7 +80,7 @@ } :if ($SafeUpdatePatch = true && ($NumInstalled & 0xffff0000) = ($NumLatest & 0xffff0000)) do={ - $LogPrintExit2 info $ScriptName ("Version " . $Update->"latest-version" . " is a patch release, updating...") false; + $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is a patch release, updating..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is a patch update for " . $Update->"channel" . \ @@ -92,8 +93,8 @@ version~("^" . [ $EscapeForRegEx ($Update->"latest-version") ] . "\\b") ]; :if ([ :len $Neighbors ] > 0) do={ :local Neighbor [ /ip/neighbor/get ($Neighbors->0) identity ]; - $LogPrintExit2 info $ScriptName ("Seen a neighbor (" . $Neighbor . ") running version " . \ - $Update->"latest-version" . " from " . $Update->"channel" . ", updating...") false; + $LogPrint info $ScriptName ("Seen a neighbor (" . $Neighbor . ") running version " . \ + $Update->"latest-version" . " from " . $Update->"channel" . ", updating..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Seen a neighbor (" . $Neighbor . ") running version " . $Update->"latest-version" . \ @@ -109,10 +110,10 @@ ($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \ "&latest=" . $Update->"latest-version") output=user as-value ]; } on-error={ - $LogPrintExit2 warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . ".") false; + $LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . "."); } :if ($Result->"status" = "finished" && $Result->"data" = $Update->"latest-version") do={ - $LogPrintExit2 info $ScriptName ("Version " . $Update->"latest-version" . " is considered safe, updating...") false; + $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is considered safe, updating..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is considered safe for " . $Update->"channel" . \ @@ -131,8 +132,8 @@ } :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ - $LogPrintExit2 info $ScriptName ("Already sent the RouterOS update notification for version " . \ - $Update->"latest-version" . ".") false; + $LogPrint info $ScriptName ("Already sent the RouterOS update notification for version " . \ + $Update->"latest-version" . "."); :error true; } @@ -146,8 +147,8 @@ :if ($NumInstalled > $NumLatest) do={ :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ - $LogPrintExit2 info $ScriptName ("Already sent the RouterOS downgrade notification for version " . \ - $Update->"latest-version" . ".") false; + $LogPrint info $ScriptName ("Already sent the RouterOS downgrade notification for version " . \ + $Update->"latest-version" . "."); :error true; } @@ -156,8 +157,8 @@ message=("A different RouterOS version " . ($Update->"latest-version") . \ " is available for " . $Identity . ", but it is a downgrade.\n\n" . \ [ $DeviceInfo ]); link=$Link; silent=true }); - $LogPrintExit2 info $ScriptName ("A different RouterOS version " . ($Update->"latest-version") . \ - " is available for downgrade.") false; + $LogPrint info $ScriptName ("A different RouterOS version " . ($Update->"latest-version") . \ + " is available for downgrade."); :set SentRouterosUpdateNotification ($Update->"latest-version"); } } on-error={ } From 5016f4d28ccef4d3b0b1ab55cacb8cf3ee9d0cea Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:37 +0100 Subject: [PATCH 020/988] collect-wireless-mac: switch to $LogPrint --- collect-wireless-mac.capsman.rsc | 14 +++++++------- collect-wireless-mac.local.rsc | 14 +++++++------- collect-wireless-mac.template.rsc | 18 +++++++++--------- collect-wireless-mac.wifi.rsc | 14 +++++++------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 54236241..dcb303c0 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -23,7 +23,7 @@ :global FormatLine; :global FormatMultiLines; :global GetMacVendor; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -34,7 +34,7 @@ :if ([ :len [ /caps-man/access-list/find where comment="--- collected above ---" disabled ] ] = 0) do={ /caps-man/access-list/add comment="--- collected above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'."); } :local PlaceBefore ([ /caps-man/access-list/find where comment="--- collected above ---" disabled ]->0); @@ -43,14 +43,14 @@ :do { :set RegVal [ /caps-man/registration-table/get $Reg ]; } on-error={ - $LogPrintExit2 debug $ScriptName ("Device already gone... Ignoring.") false; + $LogPrint debug $ScriptName ("Device already gone... Ignoring."); } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ :local AccessList ([ /caps-man/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ /caps-man/access-list/get $AccessList comment ]) false; + $LogPrint debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ + [ /caps-man/access-list/get $AccessList comment ]); } :if ([ :len $AccessList ] = 0) do={ @@ -74,7 +74,7 @@ :local Vendor [ $GetMacVendor ($RegVal->"mac-address") ]; :local Message ("MAC address " . $RegVal->"mac-address" . " (" . $Vendor . ", " . $HostName . ") " . \ "first seen on " . $DateTime . " connected to SSID " . $RegVal->"ssid" . ", interface " . $RegVal->"interface"); - $LogPrintExit2 info $ScriptName $Message false; + $LogPrint info $ScriptName $Message; /caps-man/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ @@ -90,7 +90,7 @@ [ $FormatLine "Date" $DateTime ]) }); } } else={ - $LogPrintExit2 debug $ScriptName ("No mac address available... Ignoring.") false; + $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } } on-error={ } diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index a4e81a3e..7c1122ce 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -23,7 +23,7 @@ :global FormatLine; :global FormatMultiLines; :global GetMacVendor; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -34,7 +34,7 @@ :if ([ :len [ /interface/wireless/access-list/find where comment="--- collected above ---" disabled ] ] = 0) do={ /interface/wireless/access-list/add comment="--- collected above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'."); } :local PlaceBefore ([ /interface/wireless/access-list/find where comment="--- collected above ---" disabled ]->0); @@ -43,14 +43,14 @@ :do { :set RegVal [ /interface/wireless/registration-table/get $Reg ]; } on-error={ - $LogPrintExit2 debug $ScriptName ("Device already gone... Ignoring.") false; + $LogPrint debug $ScriptName ("Device already gone... Ignoring."); } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ :local AccessList ([ /interface/wireless/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ /interface/wireless/access-list/get $AccessList comment ]) false; + $LogPrint debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ + [ /interface/wireless/access-list/get $AccessList comment ]); } :if ([ :len $AccessList ] = 0) do={ @@ -75,7 +75,7 @@ :local Vendor [ $GetMacVendor ($RegVal->"mac-address") ]; :local Message ("MAC address " . $RegVal->"mac-address" . " (" . $Vendor . ", " . $HostName . ") " . \ "first seen on " . $DateTime . " connected to SSID " . $RegVal->"ssid" . ", interface " . $RegVal->"interface"); - $LogPrintExit2 info $ScriptName $Message false; + $LogPrint info $ScriptName $Message; /interface/wireless/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ @@ -91,7 +91,7 @@ [ $FormatLine "Date" $DateTime ]) }); } } else={ - $LogPrintExit2 debug $ScriptName ("No mac address available... Ignoring.") false; + $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } } on-error={ } diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index f647eb3b..b8c5ff87 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -24,7 +24,7 @@ :global FormatLine; :global FormatMultiLines; :global GetMacVendor; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -39,7 +39,7 @@ /caps-man/access-list/add comment="--- collected above ---" disabled=yes; /interface/wifi/access-list/add comment="--- collected above ---" disabled=yes; /interface/wireless/access-list/add comment="--- collected above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'."); } :local PlaceBefore ([ /caps-man/access-list/find where comment="--- collected above ---" disabled ]->0); :local PlaceBefore ([ /interface/wifi/access-list/find where comment="--- collected above ---" disabled ]->0); @@ -54,7 +54,7 @@ :set RegVal [ /interface/wifi/registration-table/get $Reg ]; :set RegVal [ /interface/wireless/registration-table/get $Reg ]; } on-error={ - $LogPrintExit2 debug $ScriptName ("Device already gone... Ignoring.") false; + $LogPrint debug $ScriptName ("Device already gone... Ignoring."); } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ @@ -62,10 +62,10 @@ :local AccessList ([ /interface/wifi/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :local AccessList ([ /interface/wireless/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ /caps-man/access-list/get $AccessList comment ]) false; - [ /interface/wifi/access-list/get $AccessList comment ]) false; - [ /interface/wireless/access-list/get $AccessList comment ]) false; + $LogPrint debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ + [ /caps-man/access-list/get $AccessList comment ]); + [ /interface/wifi/access-list/get $AccessList comment ]); + [ /interface/wireless/access-list/get $AccessList comment ]); } :if ([ :len $AccessList ] = 0) do={ @@ -90,7 +90,7 @@ :local Vendor [ $GetMacVendor ($RegVal->"mac-address") ]; :local Message ("MAC address " . $RegVal->"mac-address" . " (" . $Vendor . ", " . $HostName . ") " . \ "first seen on " . $DateTime . " connected to SSID " . $RegVal->"ssid" . ", interface " . $RegVal->"interface"); - $LogPrintExit2 info $ScriptName $Message false; + $LogPrint info $ScriptName $Message; /caps-man/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; /interface/wifi/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; /interface/wireless/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; @@ -108,7 +108,7 @@ [ $FormatLine "Date" $DateTime ]) }); } } else={ - $LogPrintExit2 debug $ScriptName ("No mac address available... Ignoring.") false; + $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } } on-error={ } diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 063d6dc9..b8ad9396 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -23,7 +23,7 @@ :global FormatLine; :global FormatMultiLines; :global GetMacVendor; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -34,7 +34,7 @@ :if ([ :len [ /interface/wifi/access-list/find where comment="--- collected above ---" disabled ] ] = 0) do={ /interface/wifi/access-list/add comment="--- collected above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- collected above ---'."); } :local PlaceBefore ([ /interface/wifi/access-list/find where comment="--- collected above ---" disabled ]->0); @@ -43,14 +43,14 @@ :do { :set RegVal [ /interface/wifi/registration-table/get $Reg ]; } on-error={ - $LogPrintExit2 debug $ScriptName ("Device already gone... Ignoring.") false; + $LogPrint debug $ScriptName ("Device already gone... Ignoring."); } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ :local AccessList ([ /interface/wifi/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ /interface/wifi/access-list/get $AccessList comment ]) false; + $LogPrint debug $ScriptName ("MAC address " . $RegVal->"mac-address" . " already known: " . \ + [ /interface/wifi/access-list/get $AccessList comment ]); } :if ([ :len $AccessList ] = 0) do={ @@ -74,7 +74,7 @@ :local Vendor [ $GetMacVendor ($RegVal->"mac-address") ]; :local Message ("MAC address " . $RegVal->"mac-address" . " (" . $Vendor . ", " . $HostName . ") " . \ "first seen on " . $DateTime . " connected to SSID " . $RegVal->"ssid" . ", interface " . $RegVal->"interface"); - $LogPrintExit2 info $ScriptName $Message false; + $LogPrint info $ScriptName $Message; /interface/wifi/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ @@ -90,7 +90,7 @@ [ $FormatLine "Date" $DateTime ]) }); } } else={ - $LogPrintExit2 debug $ScriptName ("No mac address available... Ignoring.") false; + $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } } on-error={ } From 4ab8dbd774f6d024db493359a7cb345f3bd76c8b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 021/988] daily-psk: switch to $LogPrint --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index c9c0186c..43651d07 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -22,7 +22,7 @@ :global Identity; :global FormatLine; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -68,12 +68,12 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrintExit2 info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; + $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ - $LogPrintExit2 debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; + $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ :local Link ($DailyPskQrCodeUrl . \ "?scale=8&level=1&ssid=" . [ $UrlEncode $Ssid ] . "&pass=" . [ $UrlEncode $NewPsk ]); diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 228efc87..2dbc61bf 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -22,7 +22,7 @@ :global Identity; :global FormatLine; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -67,12 +67,12 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrintExit2 info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; + $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ - $LogPrintExit2 debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; + $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ :local Link ($DailyPskQrCodeUrl . \ "?scale=8&level=1&ssid=" . [ $UrlEncode $Ssid ] . "&pass=" . [ $UrlEncode $NewPsk ]); diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 4403fe6f..e190ffb7 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -23,7 +23,7 @@ :global Identity; :global FormatLine; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -79,7 +79,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrintExit2 info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; + $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; /interface/wifi/access-list/set $AccList passphrase=$NewPsk; /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; @@ -88,7 +88,7 @@ :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ - $LogPrintExit2 debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; + $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ :local Link ($DailyPskQrCodeUrl . \ "?scale=8&level=1&ssid=" . [ $UrlEncode $Ssid ] . "&pass=" . [ $UrlEncode $NewPsk ]); diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index e9b51990..ee3e1b05 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -22,7 +22,7 @@ :global Identity; :global FormatLine; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -68,12 +68,12 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrintExit2 info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; + $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ - $LogPrintExit2 debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; + $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ :local Link ($DailyPskQrCodeUrl . \ "?scale=8&level=1&ssid=" . [ $UrlEncode $Ssid ] . "&pass=" . [ $UrlEncode $NewPsk ]); From 5638bdcc2d6a6c333c5a11df4946ff88cb3ecb43 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 022/988] dhcp-lease-comment: switch to $LogPrint --- dhcp-lease-comment.capsman.rsc | 4 ++-- dhcp-lease-comment.local.rsc | 4 ++-- dhcp-lease-comment.template.rsc | 4 ++-- dhcp-lease-comment.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 1b61167a..4ac228b9 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -17,7 +17,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -32,7 +32,7 @@ :set NewComment [ /caps-man/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ - $LogPrintExit2 info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment) false; + $LogPrint info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment); /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 5401a77f..a49f74f4 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -17,7 +17,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -32,7 +32,7 @@ :set NewComment [ /interface/wireless/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ - $LogPrintExit2 info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment) false; + $LogPrint info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment); /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 6ed8fc3b..0f0975bb 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -18,7 +18,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -37,7 +37,7 @@ :set NewComment [ /interface/wireless/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ - $LogPrintExit2 info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment) false; + $LogPrint info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment); /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 62ed03da..c9c091b1 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -17,7 +17,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -32,7 +32,7 @@ :set NewComment [ /interface/wifi/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ - $LogPrintExit2 info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment) false; + $LogPrint info $ScriptName ("Updating comment for DHCP lease " . $LeaseVal->"active-mac-address" . ": " . $NewComment); /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } From 5c775fdb3f28aaa2f354db3dca8ae3abd29c3d9d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 023/988] dhcp-to-dns: switch to $LogPrint --- dhcp-to-dns.rsc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index d0638c7b..5b6e64a7 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -21,7 +21,7 @@ :global CleanName; :global EitherOr; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global LogPrintOnce; :global ParseKeyValueStore; :global ScriptLock; @@ -36,7 +36,7 @@ :if ([ :len [ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ] ] = 0) do={ /ip/dns/static/add name=$CommentString type=NXDOMAIN disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled static dns record with name '" . $CommentString . "'.") false; + $LogPrint warning $ScriptName ("Added disabled static dns record with name '" . $CommentString . "'."); } :local PlaceBefore ([ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ]->0); @@ -47,10 +47,10 @@ :if ([ :len [ /ip/dhcp-server/lease/find where active-mac-address=($DnsRecordInfo->"macaddress") \ active-address=($DnsRecordVal->"address") server=($DnsRecordInfo->"server") status=bound ] ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("Lease for " . $MacInServer . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting record.") false; + $LogPrint debug $ScriptName ("Lease for " . $MacInServer . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting record."); } else={ :local Found false; - $LogPrintExit2 info $ScriptName ("Lease expired for " . $MacInServer . ", deleting record (" . $DnsRecordVal->"name" . ").") false; + $LogPrint info $ScriptName ("Lease expired for " . $MacInServer . ", deleting record (" . $DnsRecordVal->"name" . ")."); /ip/dns/static/remove $DnsRecord; /ip/dns/static/remove [ find where type=CNAME comment=($DnsRecordVal->"comment") ]; } @@ -64,7 +64,7 @@ $LogPrintOnce info $ScriptName ("Multiple bound leases found for mac-address " . ($LeaseVal->"active-mac-address") . "!"); } } on-error={ - $LogPrintExit2 debug $ScriptName ("A lease just vanished, ignoring.") false; + $LogPrint debug $ScriptName ("A lease just vanished, ignoring."); } :if ([ :len ($LeaseVal->"active-address") ] > 0) do={ @@ -88,9 +88,9 @@ :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; :if ($DnsRecordVal->"address" = $LeaseVal->"active-address" && $DnsRecordVal->"name" = $FullA) do={ - $LogPrintExit2 debug $ScriptName ("The A record for " . $MacInServer . " (" . $FullA . ") does not need updating.") false; + $LogPrint debug $ScriptName ("The A record for " . $MacInServer . " (" . $FullA . ") does not need updating."); } else={ - $LogPrintExit2 info $ScriptName ("Updating A record for " . $MacInServer . " (" . $FullA . " -> " . $LeaseVal->"active-address" . ").") false; + $LogPrint info $ScriptName ("Updating A record for " . $MacInServer . " (" . $FullA . " -> " . $LeaseVal->"active-address" . ")."); /ip/dns/static/set address=($LeaseVal->"active-address") name=$FullA $DnsRecord; } @@ -98,20 +98,20 @@ :if ([ :len $CName ] > 0) do={ :local CNameVal [ /ip/dns/static/get $CName ]; :if ($CNameVal->"name" != $FullCN || $CNameVal->"cname" != $FullA) do={ - $LogPrintExit2 info $ScriptName ("Deleting CNAME record with wrong data for " . $MacInServer . ".") false; + $LogPrint info $ScriptName ("Deleting CNAME record with wrong data for " . $MacInServer . "."); /ip/dns/static/remove $CName; } } :if ([ :len $HostName ] > 0 && [ :len [ /ip/dns/static/find where name=$FullCN type=CNAME ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Adding CNAME record for " . $MacInServer . " (" . $FullCN . " -> " . $FullA . ").") false; + $LogPrint info $ScriptName ("Adding CNAME record for " . $MacInServer . " (" . $FullCN . " -> " . $FullA . ")."); /ip/dns/static/add name=$FullCN type=CNAME cname=$FullA ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } else={ - $LogPrintExit2 info $ScriptName ("Adding A record for " . $MacInServer . " (" . $FullA . " -> " . $LeaseVal->"active-address" . ").") false; + $LogPrint info $ScriptName ("Adding A record for " . $MacInServer . " (" . $FullA . " -> " . $LeaseVal->"active-address" . ")."); /ip/dns/static/add name=$FullA type=A address=($LeaseVal->"active-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; :if ([ :len $HostName ] > 0 && [ :len [ /ip/dns/static/find where name=$FullCN type=CNAME ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Adding CNAME record for " . $MacInServer . " (" . $FullCN . " -> " . $FullA . ").") false; + $LogPrint info $ScriptName ("Adding CNAME record for " . $MacInServer . " (" . $FullCN . " -> " . $FullA . ")."); /ip/dns/static/add name=$FullCN type=CNAME cname=$FullA ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } @@ -120,7 +120,7 @@ $LogPrintOnce warning $ScriptName ("The name '" . $FullA . "' appeared in more than one A record!"); } } else={ - $LogPrintExit2 debug $ScriptName ("No address available... Ignoring.") false; + $LogPrint debug $ScriptName ("No address available... Ignoring."); } } } on-error={ } From c8e4cb05267f50ebc06d5cebc30186f0a5618252 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 024/988] firmware-upgrade-reboot: switch to $LogPrint --- firmware-upgrade-reboot.rsc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 6499d274..038f74ea 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -14,7 +14,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global VersionToNum; @@ -24,18 +24,18 @@ :local RouterBoard [ /system/routerboard/get ]; :if ($RouterBoard->"current-firmware" = $RouterBoard->"upgrade-firmware") do={ - $LogPrintExit2 info $ScriptName ("Current and upgrade firmware match with version " . \ - $RouterBoard->"current-firmware" . ".") false; + $LogPrint info $ScriptName ("Current and upgrade firmware match with version " . \ + $RouterBoard->"current-firmware" . "."); :error true; } :if ([ $VersionToNum ($RouterBoard->"current-firmware") ] > [ $VersionToNum ($RouterBoard->"upgrade-firmware") ]) do={ - $LogPrintExit2 info $ScriptName ("Different firmware version is available, but it is a downgrade. Ignoring.") false; + $LogPrint info $ScriptName ("Different firmware version is available, but it is a downgrade. Ignoring."); :error true; } :if ([ /system/routerboard/settings/get auto-upgrade ] = false) do={ - $LogPrintExit2 info $ScriptName ("Firmware version " . $RouterBoard->"upgrade-firmware" . \ - " is available, upgrading.") false; + $LogPrint info $ScriptName ("Firmware version " . $RouterBoard->"upgrade-firmware" . \ + " is available, upgrading."); /system/routerboard/upgrade; } @@ -49,6 +49,6 @@ :delay $Uptime; } - $LogPrintExit2 info $ScriptName ("Firmware upgrade successful, rebooting.") false; + $LogPrint info $ScriptName ("Firmware upgrade successful, rebooting."); /system/reboot; } on-error={ } From 6715696ba1a4239b626e19a466cafae9e698c807 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 025/988] fw-addr-lists: switch to $LogPrint --- fw-addr-lists.rsc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4ec41051..64233ac1 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -20,7 +20,7 @@ :global CertificateAvailable; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global LogPrintOnce; :global ScriptLock; :global WaitFullyConnected; @@ -57,7 +57,7 @@ :if ([ :len ($List->"cert") ] > 0) do={ :set CheckCertificate "yes-without-crl"; :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Downloading required certificate failed, trying anyway.") false; + $LogPrint warning $ScriptName ("Downloading required certificate failed, trying anyway."); } } @@ -68,7 +68,7 @@ http-header-field=({ $FetchUserAgent }) ($List->"url") as-value ]->"data"); } on-error={ :if ($I < 4) do={ - $LogPrintExit2 debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url") false; + $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); :delay (($I * $I) . "s"); } } @@ -78,7 +78,7 @@ :if ($Data = false) do={ :set Data ""; :set Failure true; - $LogPrintExit2 warning $ScriptName ("Failed downloading list from: " . $List->"url") false; + $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); } :if ([ :len $Data ] > 63000) do={ @@ -103,13 +103,13 @@ :foreach Entry in=[ /ip/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ - $LogPrintExit2 debug $ScriptName ("Renewing IPv4 address for " . ($IPv4Addresses->$Address) . ": " . $Address) false; + $LogPrint debug $ScriptName ("Renewing IPv4 address for " . ($IPv4Addresses->$Address) . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrintExit2 debug $ScriptName ("Removing IPv4 address: " . $Address) false; + $LogPrint debug $ScriptName ("Removing IPv4 address: " . $Address); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -119,13 +119,13 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ - $LogPrintExit2 debug $ScriptName ("Renewing IPv6 address for " . ($IPv6Addresses->$Address) . ": " . $Address) false; + $LogPrint debug $ScriptName ("Renewing IPv6 address for " . ($IPv6Addresses->$Address) . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrintExit2 debug $ScriptName ("Removing: " . $Address) false; + $LogPrint debug $ScriptName ("Removing: " . $Address); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -133,27 +133,27 @@ } :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrintExit2 debug $ScriptName ("Adding IPv4 address for " . $Timeout . ": " . $Address) false; + $LogPrint debug $ScriptName ("Adding IPv4 address for " . $Timeout . ": " . $Address); :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrintExit2 warning $ScriptName ("Failed to add IPv4 address " . $Address . " to list '" . $FwListName . "'.") false; + $LogPrint warning $ScriptName ("Failed to add IPv4 address " . $Address . " to list '" . $FwListName . "'."); } } :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrintExit2 debug $ScriptName ("Adding IPv6 address for " . $Timeout . ": " . $Address) false; + $LogPrint debug $ScriptName ("Adding IPv6 address for " . $Timeout . ": " . $Address); :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrintExit2 warning $ScriptName ("Failed to add IPv6 address " . $Address . " to list '" . $FwListName . "'.") false; + $LogPrint warning $ScriptName ("Failed to add IPv6 address " . $Address . " to list '" . $FwListName . "'."); } } - $LogPrintExit2 info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . " - renewed: " . $CntRenew . " - removed: " . $CntRemove) false; + $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . " - renewed: " . $CntRenew . " - removed: " . $CntRemove); } } on-error={ } From 9dd1b768ee533545042b6e46fc9710bd39cc48d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 026/988] global-functions: switch to $LogPrint --- global-functions.rsc | 162 ++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 80 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1220ecaf..d33e3e27 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -102,18 +102,18 @@ :local CommonName [ :tostr $1 ]; :global CertificateDownload; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :if ([ /system/resource/get free-hdd-space ] < 8388608 && \ [ /certificate/settings/get crl-download ] = true && \ [ /certificate/settings/get crl-store ] = "system") do={ - $LogPrintExit2 warning $0 ("This system has low free flash space but " . \ - "is configured to download certificate CRLs to system!") false; + $LogPrint warning $0 ("This system has low free flash space but " . \ + "is configured to download certificate CRLs to system!"); } :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ - $LogPrintExit2 info $0 ("Certificate with CommonName \"" . $CommonName . "\" not available.") false; + $LogPrint info $0 ("Certificate with CommonName \"" . $CommonName . "\" not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } @@ -122,8 +122,8 @@ :local CertVal [ /certificate/get [ find where common-name=$CommonName ] ]; :while (($CertVal->"akid") != "" && ($CertVal->"akid") != ($CertVal->"skid")) do={ :if ([ :len [ /certificate/find where skid=($CertVal->"akid") ] ] = 0) do={ - $LogPrintExit2 info $0 ("Certificate chain for \"" . $CommonName . \ - "\" is incomplete, missing \"" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "\".") false; + $LogPrint info $0 ("Certificate chain for \"" . $CommonName . \ + "\" is incomplete, missing \"" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "\"."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } @@ -142,12 +142,12 @@ :global ScriptUpdatesUrlSuffix; :global CertificateNameByCN; - :global LogPrintExit2; + :global LogPrint; :global UrlEncode; :global WaitForFile; - $LogPrintExit2 info $0 ("Downloading and importing certificate with " . \ - "CommonName \"" . $CommonName . "\".") false; + $LogPrint info $0 ("Downloading and importing certificate with " . \ + "CommonName \"" . $CommonName . "\"."); :do { :local LocalFileName ($CommonName . ".pem"); :local UrlFileName ([ $UrlEncode $CommonName ] . ".pem"); @@ -163,8 +163,7 @@ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } } on-error={ - $LogPrintExit2 warning $0 ("Failed importing certificate with " . \ - "CommonName \"" . $CommonName . "\"!") false; + $LogPrint warning $0 ("Failed importing certificate with CommonName \"" . $CommonName . "\"!"); :return false; } :return true; @@ -309,7 +308,7 @@ :global CertificateAvailable; :global CleanFilePath; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global WaitForFile; @@ -324,23 +323,23 @@ :local PkgDest [ $CleanFilePath ($PkgDir . "/" . $PkgFile) ]; :if ([ $MkDir $PkgDir ] = false) do={ - $LogPrintExit2 warning $0 ("Failed creating directory, not downloading package.") false; + $LogPrint warning $0 ("Failed creating directory, not downloading package."); :return false; } :if ([ :len [ /file/find where name=$PkgDest type="package" ] ] > 0) do={ - $LogPrintExit2 info $0 ("Package file " . $PkgName . " already exists.") false; + $LogPrint info $0 ("Package file " . $PkgName . " already exists."); :return true; } :if ([ $CertificateAvailable "R3" ] = false) do={ - $LogPrintExit2 error $0 ("Downloading required certificate failed.") false; + $LogPrint error $0 ("Downloading required certificate failed."); :return false; } :local Url ("https://upgrade.mikrotik.com/routeros/" . $PkgVer . "/" . $PkgFile); - $LogPrintExit2 info $0 ("Downloading package file '" . $PkgName . "'...") false; - $LogPrintExit2 debug $0 ("... from url: " . $Url) false; + $LogPrint info $0 ("Downloading package file '" . $PkgName . "'..."); + $LogPrint debug $0 ("... from url: " . $Url); :local Retry 3; :while ($Retry > 0) do={ :do { @@ -351,14 +350,14 @@ :return true; } } on-error={ - $LogPrintExit2 debug $0 ("Downloading package file failed.") false; + $LogPrint debug $0 ("Downloading package file failed."); } /file/remove [ find where name=$PkgDest ]; :set Retry ($Retry - 1); } - $LogPrintExit2 warning $0 ("Downloading package file '" . $PkgName . "' failed.") false; + $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); :return false; } @@ -444,7 +443,7 @@ :global CertificateAvailable; :global IsMacLocallyAdministered; - :global LogPrintExit2; + :global LogPrint; :if ([ $IsMacLocallyAdministered $Mac ] = true) do={ :return "locally administered"; @@ -452,7 +451,8 @@ :do { :if ([ $CertificateAvailable "GTS CA 1P5" ] = false) do={ - $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; + $LogPrint warning $0 ("Downloading required certificate failed."); + :error false; } :local Vendor ([ /tool/fetch check-certificate=yes-without-crl \ ("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data"); @@ -461,9 +461,9 @@ :do { /tool/fetch check-certificate=yes-without-crl ("https://api.macvendors.com/") \ output=none as-value; - $LogPrintExit2 debug $0 ("The mac vendor is not known in database.") false; + $LogPrint debug $0 ("The mac vendor is not known in database."); } on-error={ - $LogPrintExit2 warning $0 ("Failed getting mac vendor.") false; + $LogPrint warning $0 ("Failed getting mac vendor."); } :return "unknown vendor"; } @@ -610,7 +610,7 @@ :global IsTimeSyncCached; :global IsTimeSyncResetNtp; - :global LogPrintExit2; + :global LogPrint; :if ($IsTimeSyncCached = true) do={ :return true; @@ -639,7 +639,7 @@ :if ([ /system/license/get ]->"level" = "free" || \ [ /system/resource/get ]->"board-name" = "x86") do={ - $LogPrintExit2 debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86.") false; + $LogPrint debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86."); :return true; } @@ -651,7 +651,7 @@ :return false; } - $LogPrintExit2 debug $0 ("No time source configured! Returning gracefully...") false; + $LogPrint debug $0 ("No time source configured! Returning gracefully..."); :return true; } @@ -717,7 +717,7 @@ :local Name [ :tostr $2 ]; :local Message [ :tostr $3 ]; - :global LogPrintExit2; + :global LogPrint; :global LogPrintOnceMessages; @@ -730,7 +730,7 @@ } :set ($LogPrintOnceMessages->$Message) 1; - $LogPrintExit2 $Severity $Name $Message false; + $LogPrint $Severity $Name $Message; } # get max value @@ -750,24 +750,24 @@ :local Path [ :tostr $1 ]; :global CleanFilePath; - :global LogPrintExit2; + :global LogPrint; :global WaitForFile; :local MkTmpfs do={ - :global LogPrintExit2; + :global LogPrint; :global WaitForFile; :if ([ :len [ /disk/find where slot=tmpfs type=tmpfs ] ] = 1) do={ :return true; } - $LogPrintExit2 info $0 ("Creating disk of type tmpfs.") false; + $LogPrint info $0 ("Creating disk of type tmpfs."); /file/remove [ find where name="tmpfs" type="directory" ]; :do { /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/get total-memory ] / 3); $WaitForFile "tmpfs"; } on-error={ - $LogPrintExit2 warning $0 ("Creating disk of type tmpfs failed!") false; + $LogPrint warning $0 ("Creating disk of type tmpfs failed!"); :return false; } :return true; @@ -795,7 +795,7 @@ $WaitForFile $File; /file/remove $File; } on-error={ - $LogPrintExit2 warning $0 ("Making directory '" . $Path . "' failed!") false; + $LogPrint warning $0 ("Making directory '" . $Path . "' failed!"); :return false; } @@ -926,18 +926,18 @@ :local Warn [ :tostr $3 ]; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global VersionToNum; :if (!($Required ~ "^\\d+\\.\\d+((alpha|beta|rc|\\.)\\d+|)\$")) do={ - $LogPrintExit2 error $0 ("No valid RouterOS version: " . $Required) false; + $LogPrint error $0 ("No valid RouterOS version: " . $Required); :return false; } :if ([ $VersionToNum $Required ] > [ $VersionToNum [ /system/package/update/get installed-version ] ]) do={ :if ($Warn = "true") do={ - $LogPrintExit2 warning $0 ("This " . [ $IfThenElse ([ :pick $Caller 0 ] = ("\$")) "function" "script" ] . \ - " '" . $Caller . "' (at least specific functionality) requires RouterOS " . $Required . ". Please update!") false; + $LogPrint warning $0 ("This " . [ $IfThenElse ([ :pick $Caller 0 ] = ("\$")) "function" "script" ] . \ + " '" . $Caller . "' (at least specific functionality) requires RouterOS " . $Required . ". Please update!"); } :return false; } @@ -948,7 +948,7 @@ :set ScriptFromTerminal do={ :local Script [ :tostr $1 ]; - :global LogPrintExit2; + :global LogPrint; :foreach Job in=[ /system/script/job/find where script=$Script ] do={ :set Job [ /system/script/job/get $Job ]; @@ -956,11 +956,11 @@ :set Job [ /system/script/job/get [ find where .id=($Job->"parent") ] ]; } :if (($Job->"type") = "login") do={ - $LogPrintExit2 debug $0 ("Script " . $Script . " started from terminal.") false; + $LogPrint debug $0 ("Script " . $Script . " started from terminal."); :return true; } } - $LogPrintExit2 debug $0 ("Script " . $Script . " NOT started from terminal.") false; + $LogPrint debug $0 ("Script " . $Script . " NOT started from terminal."); :return false; } @@ -982,7 +982,7 @@ :global EitherOr; :global Grep; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global LogPrintOnce; :global ParseKeyValueStore; :global RequiredRouterOS; @@ -991,12 +991,12 @@ :global ValidateSyntax; :if ([ $CertificateAvailable "E1" ] = false) do={ - $LogPrintExit2 warning $0 ("Downloading certificate failed, trying without.") false; + $LogPrint warning $0 ("Downloading certificate failed, trying without."); } :foreach Script in=$Scripts do={ :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ - $LogPrintExit2 info $0 ("Adding new script: " . $Script) false; + $LogPrint info $0 ("Adding new script: " . $Script); /system/script/add name=$Script owner=$Script source="#!rsc by RouterOS\n" comment=$NewComment; } } @@ -1013,8 +1013,8 @@ :foreach Scheduler in=[ /system/scheduler/find where on-event~("\\b" . $ScriptVal->"name" . "\\b") ] do={ :local SchedulerVal [ /system/scheduler/get $Scheduler ]; :if ($ScriptVal->"policy" != $SchedulerVal->"policy") do={ - $LogPrintExit2 warning $0 ("Policies differ for script '" . $ScriptVal->"name" . \ - "' and its scheduler '" . $SchedulerVal->"name" . "'!") false; + $LogPrint warning $0 ("Policies differ for script '" . $ScriptVal->"name" . \ + "' and its scheduler '" . $SchedulerVal->"name" . "'!"); } } @@ -1023,7 +1023,7 @@ :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; :local Url ($BaseUrl . $ScriptVal->"name" . ".rsc" . $UrlSuffix); - $LogPrintExit2 debug $0 ("Fetching script '" . $ScriptVal->"name" . "' from url: " . $Url) false; + $LogPrint debug $0 ("Fetching script '" . $ScriptVal->"name" . "' from url: " . $Url); :local Result [ /tool/fetch check-certificate=yes-without-crl \ http-header-field=({ $FetchUserAgent }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ @@ -1031,11 +1031,11 @@ } } on-error={ :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ - $LogPrintExit2 warning $0 ("Failed fetching script '" . $ScriptVal->"name" . \ - "', removing dummy. Typo on installation?") false; + $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . \ + "', removing dummy. Typo on installation?"); /system/script/remove $Script; } else={ - $LogPrintExit2 warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!") false; + $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!"); } } } @@ -1046,7 +1046,7 @@ :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ :if ([ $ValidateSyntax $SourceNew ] = true) do={ - $LogPrintExit2 info $0 ("Updating script: " . $ScriptVal->"name") false; + $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); /system/script/set owner=($ScriptVal->"name") source=$SourceNew $Script; :if ($ScriptVal->"name" = "global-config") do={ :set ReloadGlobalConfig true; @@ -1055,48 +1055,48 @@ :set ReloadGlobalFunctions true; } } else={ - $LogPrintExit2 warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ - "' failed! Ignoring!") false; + $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ + "' failed! Ignoring!"); } } else={ $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ $Required . ", which is not met by your installation. Ignoring!"); } } else={ - $LogPrintExit2 warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ - "' is not valid (missing shebang). Ignoring!") false; + $LogPrint warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ + "' is not valid (missing shebang). Ignoring!"); } } else={ - $LogPrintExit2 debug $0 ("Script '" . $ScriptVal->"name" . "' did not change.") false; + $LogPrint debug $0 ("Script '" . $ScriptVal->"name" . "' did not change."); } } else={ - $LogPrintExit2 debug $0 ("No update for script '" . $ScriptVal->"name" . "'.") false; + $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); } } :if ($ReloadGlobalFunctions = true) do={ - $LogPrintExit2 info $0 ("Reloading global functions.") false; + $LogPrint info $0 ("Reloading global functions."); :do { /system/script/run global-functions; } on-error={ - $LogPrintExit2 error $0 ("Reloading global functions failed!") false; + $LogPrint error $0 ("Reloading global functions failed!"); } } :if ($ReloadGlobalConfig = true) do={ - $LogPrintExit2 info $0 ("Reloading global configuration.") false; + $LogPrint info $0 ("Reloading global configuration."); :do { /system/script/run global-config; } on-error={ - $LogPrintExit2 error $0 ("Reloading global configuration failed!" . \ - " Syntax error or missing overlay?") false; + $LogPrint error $0 ("Reloading global configuration failed!" . \ + " Syntax error or missing overlay?"); } } :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ - $LogPrintExit2 warning $0 ("The configuration version decreased from " . \ + $LogPrint warning $0 ("The configuration version decreased from " . \ $ExpectedConfigVersionBefore . " to " . $ExpectedConfigVersion . \ - ". Installed an older version?") false; + ". Installed an older version?"); } :if ($ExpectedConfigVersionBefore < $ExpectedConfigVersion) do={ @@ -1106,14 +1106,14 @@ :do { :local Url ($ScriptUpdatesBaseUrl . "news-and-changes.rsc" . $ScriptUpdatesUrlSuffix); - $LogPrintExit2 debug $0 ("Fetching news, changes and migration: " . $Url) false; + $LogPrint debug $0 ("Fetching news, changes and migration: " . $Url); :local Result [ /tool/fetch check-certificate=yes-without-crl \ http-header-field=({ $FetchUserAgent }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set ChangeLogCode ($Result->"data"); } } on-error={ - $LogPrintExit2 warning $0 ("Failed fetching news, changes and migration!") false; + $LogPrint warning $0 ("Failed fetching news, changes and migration!"); } :if ([ :len $ChangeLogCode ] > 0) do={ @@ -1121,10 +1121,10 @@ :do { [ :parse $ChangeLogCode ]; } on-error={ - $LogPrintExit2 warning $0 ("The changelog failed to run!") false; + $LogPrint warning $0 ("The changelog failed to run!"); } } else={ - $LogPrintExit2 warning $0 ("The changelog failed syntax validation!") false; + $LogPrint warning $0 ("The changelog failed syntax validation!"); } } @@ -1133,14 +1133,14 @@ :local Migration ($GlobalConfigMigration->[ :tostr $I ]); :if ([ :typeof $Migration ] = "str") do={ :if ([ $ValidateSyntax $Migration ] = true) do={ - $LogPrintExit2 info $0 ("Applying migration for change " . $I . ": " . $Migration) false; + $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); :do { [ :parse $Migration ]; } on-error={ - $LogPrintExit2 warning $0 ("Migration code for change " . $I . " failed to run!") false; + $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); } } else={ - $LogPrintExit2 warning $0 ("Migration code for change " . $I . " failed syntax validation!") false; + $LogPrint warning $0 ("Migration code for change " . $I . " failed syntax validation!"); } } } @@ -1149,7 +1149,7 @@ :local NotificationMessage ("The configuration version on " . $Identity . " increased " . \ "to " . $ExpectedConfigVersion . ", current configuration may need modification. " . \ "Please review and update global-config-overlay, then re-run global-config."); - $LogPrintExit2 info $0 ($NotificationMessage) false; + $LogPrint info $0 ($NotificationMessage); :if ([ :len $GlobalConfigChanges ] > 0) do={ :set NotificationMessage ($NotificationMessage . "\n\nChanges:"); @@ -1157,7 +1157,7 @@ :local Change ($GlobalConfigChanges->[ :tostr $I ]); :set NotificationMessage ($NotificationMessage . "\n " . \ [ $SymbolForNotification "pushpin" "*" ] . $Change); - $LogPrintExit2 info $0 ("Change " . $I . ": " . $Change) false; + $LogPrint info $0 ("Change " . $I . ": " . $Change); } } else={ :set NotificationMessage ($NotificationMessage . "\n\nNews and changes are not available."); @@ -1191,7 +1191,7 @@ :global GetRandom20CharAlNum; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ScriptLockOrder; :if ([ :typeof $ScriptLockOrder ] = "nothing") do={ @@ -1277,15 +1277,17 @@ } :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ - $LogPrintExit2 error $0 ("A script named '" . $Script . "' does not exist!") true; + $LogPrint error $0 ("A script named '" . $Script . "' does not exist!"); + :error false; } :if ([ $JobCount $Script ] = 0) do={ - $LogPrintExit2 error $0 ("No script '" . $Script . "' is running!") true; + $LogPrint error $0 ("No script '" . $Script . "' is running!"); + :error false; } :if ([ $TicketCount $Script ] >= [ $JobCount $Script ]) do={ - $LogPrintExit2 error $0 ("More tickets than running scripts '" . $Script . "', resetting!") false; + $LogPrint error $0 ("More tickets than running scripts '" . $Script . "', resetting!"); :set ($ScriptLockOrder->$Script) ({}); /system/script/job/remove [ find where script=$Script ]; } @@ -1306,8 +1308,8 @@ } $RemoveTicket $Script $MyTicket; - $LogPrintExit2 info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \ - " and timed out waiting for lock" "" ] . "...") false; + $LogPrint info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \ + " and timed out waiting for lock" "" ] . "..."); :return false; } @@ -1542,10 +1544,10 @@ :do { /system/script/run $Script; } on-error={ - $LogPrintExit2 error $0 ("Module '" . $ScriptVal->"name" . "' failed to run.") false; + $LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed to run."); } } else={ - $LogPrintExit2 error $0 ("Module '" . $ScriptVal->"name" . "' failed syntax validation, skipping.") false; + $LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); } } From 5c567604ff14700ee90701e2b21af07fde4bd0ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 027/988] gps-track: switch to $LogPrint --- gps-track.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index c40e2e02..1aeab843 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -17,7 +17,7 @@ :global GpsTrackUrl; :global Identity; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :global WaitFullyConnected; @@ -38,13 +38,13 @@ "\"lon\":\"" . ($Gps->"longitude") . "\"," . \ "\"identity\":\"" . $Identity . "\"" . \ "}") as-value; - $LogPrintExit2 debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ + $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ - "lon: " . ($Gps->"longitude")) false; + "lon: " . ($Gps->"longitude")); } on-error={ - $LogPrintExit2 warning $ScriptName ("Failed sending GPS data!") false; + $LogPrint warning $ScriptName ("Failed sending GPS data!"); } } else={ - $LogPrintExit2 debug $ScriptName ("GPS data not valid.") false; + $LogPrint debug $ScriptName ("GPS data not valid."); } } on-error={ } From d93ffb9cb28843f95a970fdaae0d8296546cbb9d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 028/988] hotspot-to-wpa-cleanup: switch to $LogPrint --- hotspot-to-wpa-cleanup.capsman.rsc | 14 +++++++------- hotspot-to-wpa-cleanup.template.rsc | 14 +++++++------- hotspot-to-wpa-cleanup.wifi.rsc | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index ba74260f..0540ad5c 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -18,7 +18,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -41,8 +41,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic \ mac-address=($ClientVal->"mac-address") ] do={ :if (($DHCPServers->[ /ip/dhcp-server/lease/get $Lease server ]) > 0s) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " connected to WPA, making lease static.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " connected to WPA, making lease static."); /ip/dhcp-server/lease/make-static $Lease; /ip/dhcp-server/lease/set comment=($ClientVal->"comment") $Lease; } @@ -54,8 +54,8 @@ :local ClientVal [ /caps-man/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " did not connect to WPA, removing from access list.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " did not connect to WPA, removing from access list."); /caps-man/access-list/remove $Client; } } @@ -64,8 +64,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index c46d75d5..6f3b3e1e 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -19,7 +19,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -44,8 +44,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic \ mac-address=($ClientVal->"mac-address") ] do={ :if (($DHCPServers->[ /ip/dhcp-server/lease/get $Lease server ]) > 0s) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " connected to WPA, making lease static.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " connected to WPA, making lease static."); /ip/dhcp-server/lease/make-static $Lease; /ip/dhcp-server/lease/set comment=($ClientVal->"comment") $Lease; } @@ -59,8 +59,8 @@ :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " did not connect to WPA, removing from access list.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " did not connect to WPA, removing from access list."); /caps-man/access-list/remove $Client; /interface/wifi/access-list/remove $Client; } @@ -70,8 +70,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 3e5799a4..9c796287 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -18,7 +18,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -41,8 +41,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic \ mac-address=($ClientVal->"mac-address") ] do={ :if (($DHCPServers->[ /ip/dhcp-server/lease/get $Lease server ]) > 0s) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " connected to WPA, making lease static.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " connected to WPA, making lease static."); /ip/dhcp-server/lease/make-static $Lease; /ip/dhcp-server/lease/set comment=($ClientVal->"comment") $Lease; } @@ -54,8 +54,8 @@ :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ - " did not connect to WPA, removing from access list.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($ClientVal->"mac-address") . \ + " did not connect to WPA, removing from access list."); /interface/wifi/access-list/remove $Client; } } @@ -64,8 +64,8 @@ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; - $LogPrintExit2 info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing.") false; + $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; From 369af473743623fd89685cdfd8bf31b3430ed489 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 029/988] hotspot-to-wpa: switch to $LogPrint --- hotspot-to-wpa.capsman.rsc | 15 ++++++++------- hotspot-to-wpa.template.rsc | 15 ++++++++------- hotspot-to-wpa.wifi.rsc | 15 ++++++++------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index a6ad2a16..37c84644 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -17,7 +17,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -29,7 +29,8 @@ } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from hotspot on login.") true; + $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :error false; } :local Date [ /system/clock/get date ]; @@ -42,28 +43,28 @@ :if ([ :len [ /caps-man/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ] ] = 0) do={ /caps-man/access-list/add comment="--- hotspot-to-wpa above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'."); } :local PlaceBefore ([ /caps-man/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ]->0); :if ([ :len [ /caps-man/access-list/find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ] ] = 0) do={ /caps-man/access-list/add comment=("hotspot-to-wpa template " . $Hotspot) disabled=yes place-before=$PlaceBefore; - $LogPrintExit2 warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'.") false; + $LogPrint warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'."); } :local Template [ /caps-man/access-list/get ([ find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ]->0) ]; :if ($Template->"action" = "reject") do={ - $LogPrintExit2 info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'.") false; + $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); :error true; } # allow login page to load :delay 1s; - $LogPrintExit2 info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ - " (user " . $UserName . ").") false; + $LogPrint info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ + " (user " . $UserName . ")."); /caps-man/access-list/remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; /caps-man/access-list/add private-passphrase=($UserVal->"password") ssid-regexp="-wpa\$" \ mac-address=$MacAddress comment=("hotspot-to-wpa: " . $UserName . ", " . $MacAddress . ", " . $Date) \ diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index b7869c47..cbce42a5 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -18,7 +18,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -30,7 +30,8 @@ } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from hotspot on login.") true; + $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :error false; } :local Date [ /system/clock/get date ]; @@ -45,7 +46,7 @@ :if ([ :len [ /interface/wifi/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ] ] = 0) do={ /caps-man/access-list/add comment="--- hotspot-to-wpa above ---" disabled=yes; /interface/wifi/access-list/add comment="--- hotspot-to-wpa above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'."); } :local PlaceBefore ([ /caps-man/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ]->0); :local PlaceBefore ([ /interface/wifi/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ]->0); @@ -55,22 +56,22 @@ comment=("hotspot-to-wpa template " . $Hotspot) disabled ] ] = 0) do={ /caps-man/access-list/add comment=("hotspot-to-wpa template " . $Hotspot) disabled=yes place-before=$PlaceBefore; /interface/wifi/access-list/add comment=("hotspot-to-wpa template " . $Hotspot) disabled=yes place-before=$PlaceBefore; - $LogPrintExit2 warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'.") false; + $LogPrint warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'."); } :local Template [ /caps-man/access-list/get ([ find where \ :local Template [ /interface/wifi/access-list/get ([ find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ]->0) ]; :if ($Template->"action" = "reject") do={ - $LogPrintExit2 info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'.") false; + $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); :error true; } # allow login page to load :delay 1s; - $LogPrintExit2 info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ - " (user " . $UserName . ").") false; + $LogPrint info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ + " (user " . $UserName . ")."); /caps-man/access-list/remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; /interface/wifi/access-list/remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; /caps-man/access-list/add private-passphrase=($UserVal->"password") ssid-regexp="-wpa\$" \ diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index e728d7f8..86aeed78 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -17,7 +17,7 @@ :local ScriptName [ :jobname ]; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -29,7 +29,8 @@ } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from hotspot on login.") true; + $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :error false; } :local Date [ /system/clock/get date ]; @@ -42,28 +43,28 @@ :if ([ :len [ /interface/wifi/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ] ] = 0) do={ /interface/wifi/access-list/add comment="--- hotspot-to-wpa above ---" disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'.") false; + $LogPrint warning $ScriptName ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'."); } :local PlaceBefore ([ /interface/wifi/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ]->0); :if ([ :len [ /interface/wifi/access-list/find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ] ] = 0) do={ /interface/wifi/access-list/add comment=("hotspot-to-wpa template " . $Hotspot) disabled=yes place-before=$PlaceBefore; - $LogPrintExit2 warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'.") false; + $LogPrint warning $ScriptName ("Added template in access-list for hotspot '" . $Hotspot . "'."); } :local Template [ /interface/wifi/access-list/get ([ find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ]->0) ]; :if ($Template->"action" = "reject") do={ - $LogPrintExit2 info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'.") false; + $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); :error true; } # allow login page to load :delay 1s; - $LogPrintExit2 info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ - " (user " . $UserName . ").") false; + $LogPrint info $ScriptName ("Adding/updating access-list entry for mac address " . $MacAddress . \ + " (user " . $UserName . ")."); /interface/wifi/access-list/remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; /interface/wifi/access-list/add passphrase=($UserVal->"password") ssid-regexp="-wpa\$" \ mac-address=$MacAddress comment=("hotspot-to-wpa: " . $UserName . ", " . $MacAddress . ", " . $Date) \ From 56e39123b92fa0c6f20ed47bcc870db6ab1a4cd1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 030/988] ipsec-to-dns: switch to $LogPrint --- ipsec-to-dns.rsc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 03abf59e..dd40ca23 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -22,7 +22,7 @@ :global CharacterReplace; :global EscapeForRegEx; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -38,7 +38,7 @@ :if ([ :len [ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ] ] = 0) do={ /ip/dns/static/add name=$CommentString type=NXDOMAIN disabled=yes; - $LogPrintExit2 warning $ScriptName ("Added disabled static dns record with name '" . $CommentString . "'.") false; + $LogPrint warning $ScriptName ("Added disabled static dns record with name '" . $CommentString . "'."); } :local PlaceBefore ([ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ]->0); @@ -47,10 +47,10 @@ :local PeerId [ $CharacterReplace ($DnsRecordVal->"comment") $CommentPrefix "" ]; :if ([ :len [ /ip/ipsec/active-peers/find where id~("^(CN=)?" . [ $EscapeForRegEx $PeerId ] . "\$") \ dynamic-address=($DnsRecordVal->"address") ] ] > 0) do={ - $LogPrintExit2 debug $ScriptName ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting DNS entry.") false; + $LogPrint debug $ScriptName ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting DNS entry."); } else={ :local Found false; - $LogPrintExit2 info $ScriptName ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") has gone, deleting DNS entry.") false; + $LogPrint info $ScriptName ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") has gone, deleting DNS entry."); /ip/dns/static/remove $DnsRecord; } } @@ -66,13 +66,13 @@ :if ([ :len $DnsRecord ] > 0) do={ :local DnsIp [ /ip/dns/static/get $DnsRecord address ]; :if ($DnsIp = $PeerVal->"dynamic-address") do={ - $LogPrintExit2 debug $ScriptName ("DNS entry for " . $Fqdn . " does not need updating.") false; + $LogPrint debug $ScriptName ("DNS entry for " . $Fqdn . " does not need updating."); } else={ - $LogPrintExit2 info $ScriptName ("Replacing DNS entry for " . $Fqdn . ", new address is " . $PeerVal->"dynamic-address" . ".") false; + $LogPrint info $ScriptName ("Replacing DNS entry for " . $Fqdn . ", new address is " . $PeerVal->"dynamic-address" . "."); /ip/dns/static/set name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment $DnsRecord; } } else={ - $LogPrintExit2 info $ScriptName ("Adding new DNS entry for " . $Fqdn . ", address is " . $PeerVal->"dynamic-address" . ".") false; + $LogPrint info $ScriptName ("Adding new DNS entry for " . $Fqdn . ", address is " . $PeerVal->"dynamic-address" . "."); /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } From 1f938efcaff3e4c67b5be25762c97dce75fa104c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 031/988] ipv6-update: switch to $LogPrint --- ipv6-update.rsc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 8ce1e4df..65bb9595 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -14,7 +14,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -25,19 +25,20 @@ } :if ([ :typeof $PdPrefix ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from ipv6 dhcp-client.") true; + $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); + :error false; } :local Pool [ /ipv6/pool/get [ find where prefix=$PdPrefix ] name ]; :if ([ :len [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ] ] = 0) do={ /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool); - $LogPrintExit2 warning $ScriptName ("Added ipv6 address list entry for ipv6-pool-" . $Pool) false; + $LogPrint warning $ScriptName ("Added ipv6 address list entry for ipv6-pool-" . $Pool); } :local AddrList [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ]; :local OldPrefix [ /ipv6/firewall/address-list/get ($AddrList->0) address ]; :if ($OldPrefix != $PdPrefix) do={ - $LogPrintExit2 info $ScriptName ("Updating IPv6 address list with new IPv6 prefix " . $PdPrefix) false; + $LogPrint info $ScriptName ("Updating IPv6 address list with new IPv6 prefix " . $PdPrefix); /ipv6/firewall/address-list/set address=$PdPrefix $AddrList; # give the interfaces a moment to receive their addresses @@ -56,12 +57,12 @@ :local Address ($ListEntryVal->"address"); :local Address ($Prefix | ([ :toip6 [ :pick $Address 0 [ :find $Address "/128" ] ] ] & ::ffff:ffff:ffff:ffff)); - $LogPrintExit2 info $ScriptName ("Updating IPv6 address list with new IPv6 host address " . $Address . \ - " from interface " . ($Comment->"interface")) false; + $LogPrint info $ScriptName ("Updating IPv6 address list with new IPv6 host address " . $Address . \ + " from interface " . ($Comment->"interface")); /ipv6/firewall/address-list/set address=$Address $ListEntry; } else={ - $LogPrintExit2 info $ScriptName ("Updating IPv6 address list with new IPv6 prefix " . $Prefix . \ - " from interface " . ($Comment->"interface")) false; + $LogPrint info $ScriptName ("Updating IPv6 address list with new IPv6 prefix " . $Prefix . \ + " from interface " . ($Comment->"interface")); /ipv6/firewall/address-list/set address=$Prefix $ListEntry; } } @@ -77,8 +78,8 @@ :set Prefix ([ :toip6 [ :pick $Prefix 0 [ :find $Prefix "/64" ] ] ] & ffff:ffff:ffff:ffff::); :local Address ($Prefix | ([ :toip6 ($RecordVal->"address") ] & ::ffff:ffff:ffff:ffff)); - $LogPrintExit2 info $ScriptName ("Updating DNS record for " . ($RecordVal->"name") . \ - ($RecordVal->"regexp") . " to " . $Address) false; + $LogPrint info $ScriptName ("Updating DNS record for " . ($RecordVal->"name") . \ + ($RecordVal->"regexp") . " to " . $Address); /ip/dns/static/set address=$Address $Record; } } From 29a72e54dce7ad5a65b46d5b403db1ccec3c9c3e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 032/988] lease-script: switch to $LogPrint --- lease-script.rsc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 0f6b7f88..8e1e8f64 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -16,7 +16,7 @@ :global Grep; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -24,18 +24,19 @@ [ :typeof $leaseActMAC ] = "nothing" || \ [ :typeof $leaseServerName ] = "nothing" || \ [ :typeof $leaseBound ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from ip dhcp-server.") true; + $LogPrint error $ScriptName ("This script is supposed to run from ip dhcp-server."); + :error false; } - $LogPrintExit2 debug $ScriptName ("DHCP Server " . $leaseServerName . " " . [ $IfThenElse ($leaseBound = 0) \ - "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC) false; + $LogPrint debug $ScriptName ("DHCP Server " . $leaseServerName . " " . [ $IfThenElse ($leaseBound = 0) \ + "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC); :if ([ $ScriptLock $ScriptName 10 ] = false) do={ :error false; } :if ([ :len [ /system/script/job/find where script=$ScriptName ] ] > 1) do={ - $LogPrintExit2 debug $ScriptName ("More invocations are waiting, exiting early.") false; + $LogPrint debug $ScriptName ("More invocations are waiting, exiting early."); :error true; } @@ -49,10 +50,10 @@ :foreach Order,Script in=$RunOrder do={ :do { - $LogPrintExit2 debug $ScriptName ("Running script with order " . $Order . ": " . $Script) false; + $LogPrint debug $ScriptName ("Running script with order " . $Order . ": " . $Script); /system/script/run $Script; } on-error={ - $LogPrintExit2 warning $ScriptName ("Running script '" . $Script . "' failed!") false; + $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); } } } on-error={ } From f8c79abd382a3859297f87071a0836d6d9480bdc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 033/988] log-forward: switch to $LogPrint --- log-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 09e3b842..a919d8f2 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -26,7 +26,7 @@ :global HexToNum; :global IfThenElse; :global LogForwardFilterLogForwarding; - :global LogPrintExit2; + :global LogPrint; :global MAX; :global ScriptLock; :global SendNotification2; @@ -42,7 +42,7 @@ :if ($LogForwardRateLimit > 30) do={ :set LogForwardRateLimit ($LogForwardRateLimit - 1); - $LogPrintExit2 info $ScriptName ("Rate limit in action, not forwarding logs, if any!") false; + $LogPrint info $ScriptName ("Rate limit in action, not forwarding logs, if any!"); :error false; } From b7983d18c41d61746671a55ec2b9795eba8477bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 034/988] mod/bridge-port-to: switch to $LogPrint --- mod/bridge-port-to.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index a78f31ba..441094f1 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -12,7 +12,7 @@ :local BridgePortTo [ :tostr $1 ]; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :local InterfaceReEnable ({}); @@ -24,21 +24,22 @@ :if ($BridgeDefault = "dhcp-client") do={ :if ([ :len $DHCPClient ] != 1) do={ - $LogPrintExit2 warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ - " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!") true; + $LogPrint warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ + " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!"); + :error false; } :local DHCPClientDisabled [ /ip/dhcp-client/get $DHCPClient disabled ]; :if ($BridgePortVal->"disabled" = false || $DHCPClientDisabled = true) do={ - $LogPrintExit2 info $0 ("Disabling bridge port for interface " . $BridgePortVal->"interface" . ", enabling dhcp client.") false; + $LogPrint info $0 ("Disabling bridge port for interface " . $BridgePortVal->"interface" . ", enabling dhcp client."); /interface/bridge/port/disable $BridgePort; :delay 200ms; /ip/dhcp-client/enable $DHCPClient; } } else={ :if ($BridgePortVal->"disabled" = true || $BridgeDefault != $BridgePortVal->"bridge") do={ - $LogPrintExit2 info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $BridgePortTo . \ - " bridge " . $BridgeDefault . ", disabling dhcp client.") false; + $LogPrint info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $BridgePortTo . \ + " bridge " . $BridgeDefault . ", disabling dhcp client."); :if ([ :len $DHCPClient ] = 1) do={ /ip/dhcp-client/disable $DHCPClient; :delay 200ms; @@ -50,8 +51,8 @@ } /interface/bridge/port/set disabled=no bridge=$BridgeDefault $BridgePort; } else={ - $LogPrintExit2 debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $BridgePortTo . \ - " bridge " . $BridgeDefault . ".") false; + $LogPrint debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $BridgePortTo . \ + " bridge " . $BridgeDefault . "."); } } } @@ -59,7 +60,7 @@ } :if ([ :len $InterfaceReEnable ] > 0) do={ :delay 5s; - $LogPrintExit2 info $0 ("Re-enabling interfaces...") false; + $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } } From bdcf43a6f6644d0f88a1d38e4b28e90566d77d23 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 035/988] mod/bridge-port-vlan: switch to $LogPrint --- mod/bridge-port-vlan.rsc | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 72cf772b..522e9a6d 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -12,7 +12,7 @@ :local ConfigTo [ :tostr $1 ]; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :local InterfaceReEnable ({}); @@ -24,13 +24,14 @@ :if ($Vlan = "dhcp-client") do={ :if ([ :len $DHCPClient ] != 1) do={ - $LogPrintExit2 warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ - " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!") true; + $LogPrint warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ + " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!"); + :error false; } :local DHCPClientDisabled [ /ip/dhcp-client/get $DHCPClient disabled ]; :if ($BridgePortVal->"disabled" = false || $DHCPClientDisabled = true) do={ - $LogPrintExit2 info $0 ("Disabling bridge port for interface " . $BridgePortVal->"interface" . ", enabling dhcp client.") false; + $LogPrint info $0 ("Disabling bridge port for interface " . $BridgePortVal->"interface" . ", enabling dhcp client."); /interface/bridge/port/disable $BridgePort; :delay 200ms; /ip/dhcp-client/enable $DHCPClient; @@ -41,12 +42,13 @@ :do { :set $Vlan ([ /interface/bridge/vlan/get [ find where comment=$Vlan ] vlan-ids ]->0); } on-error={ - $LogPrintExit2 warning $0 ("Could not find VLAN '" . $Vlan . "' for interface " . $BridgePortVal->"interface" . "!") true; + $LogPrint warning $0 ("Could not find VLAN '" . $Vlan . "' for interface " . $BridgePortVal->"interface" . "!"); + :error false; } } :if ($BridgePortVal->"disabled" = true || $Vlan != $BridgePortVal->"pvid") do={ - $LogPrintExit2 info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $ConfigTo . \ - " vlan " . $Vlan . [ $IfThenElse ($Vlan != $VlanName) (" (" . $VlanName . ")") ] . ", disabling dhcp client.") false; + $LogPrint info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $ConfigTo . \ + " vlan " . $Vlan . [ $IfThenElse ($Vlan != $VlanName) (" (" . $VlanName . ")") ] . ", disabling dhcp client."); :if ([ :len $DHCPClient ] = 1) do={ /ip/dhcp-client/disable $DHCPClient; :delay 200ms; @@ -58,8 +60,8 @@ } /interface/bridge/port/set disabled=no pvid=$Vlan $BridgePort; } else={ - $LogPrintExit2 debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $ConfigTo . \ - " vlan " . $Vlan . ".") false; + $LogPrint debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $ConfigTo . \ + " vlan " . $Vlan . "."); } } } @@ -67,7 +69,7 @@ } :if ([ :len $InterfaceReEnable ] > 0) do={ :delay 5s; - $LogPrintExit2 info $0 ("Re-enabling interfaces...") false; + $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } } From 9b8d3f7970dbdddeb2a51db06f8358d8a195526d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 036/988] mod/notification-email: switch to $LogPrint --- mod/notification-email.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 88bfdac4..78192f36 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -24,7 +24,7 @@ :global EitherOr; :global IsDNSResolving; :global IsTimeSync; - :global LogPrintExit2; + :global LogPrint; :local AllDone true; :local QueueLen [ :len $EmailQueue ]; @@ -35,23 +35,23 @@ } :if ([ /tool/e-mail/get last-status ] = "in-progress") do={ - $LogPrintExit2 debug $0 ("Sending mail is currently in progress, not flushing.") false; + $LogPrint debug $0 ("Sending mail is currently in progress, not flushing."); :return false; } :if ([ $IsTimeSync ] = false) do={ - $LogPrintExit2 debug $0 ("Time is not synced, not flushing.") false; + $LogPrint debug $0 ("Time is not synced, not flushing."); :return false; } :local EMailSettings [ /tool/e-mail/get ]; :if ([ :typeof [ :toip ($EMailSettings->"server") ] ] != "ip" && [ $IsDNSResolving ] = false) do={ - $LogPrintExit2 debug $0 ("Server address is a DNS name and resolving fails, not flushing.") false; + $LogPrint debug $0 ("Server address is a DNS name and resolving fails, not flushing."); :return false; } :if ([ :len $Scheduler ] > 0 && $QueueLen = 0) do={ - $LogPrintExit2 warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty.") false; + $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); } /system/scheduler/set interval=([ $EitherOr $QueueLen 1 ] . "m") comment="Sending..." $Scheduler; @@ -64,7 +64,7 @@ :if ([ :len [ /file/find where name=$File ] ] = 1) do={ :set Attach ($Attach, $File); } else={ - $LogPrintExit2 warning $0 ("File '" . $File . "' does not exist, can not attach.") false; + $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); } } /tool/e-mail/send to=($Message->"to") cc=($Message->"cc") subject=($Message->"subject") \ From 279993e965a934c6f4c2f30f4c97aa09ab03158e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 037/988] mod/notification-matrix: switch to $LogPrint --- mod/notification-matrix.rsc | 41 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 8884b08b..c4fe100b 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -20,10 +20,10 @@ :global MatrixQueue; :global IsFullyConnected; - :global LogPrintExit2; + :global LogPrint; :if ([ $IsFullyConnected ] = false) do={ - $LogPrintExit2 debug $0 ("System is not fully connected, not flushing.") false; + $LogPrint debug $0 ("System is not fully connected, not flushing."); :return false; } @@ -31,7 +31,7 @@ :local QueueLen [ :len $MatrixQueue ]; :if ([ :len [ /system/scheduler/find where name="_FlushMatrixQueue" ] ] > 0 && $QueueLen = 0) do={ - $LogPrintExit2 warning $0 ("Flushing Matrix messages from scheduler, but queue is empty.") false; + $LogPrint warning $0 ("Flushing Matrix messages from scheduler, but queue is empty."); } :foreach Id,Message in=$MatrixQueue do={ @@ -45,7 +45,7 @@ $Message->"formatted" . "\" }") as-value; :set ($MatrixQueue->$Id); } on-error={ - $LogPrintExit2 debug $0 ("Sending queued Matrix message failed.") false; + $LogPrint debug $0 ("Sending queued Matrix message failed."); :set AllDone false; } } @@ -72,7 +72,7 @@ :global MatrixRoomOverride; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global SymbolForNotification; :local PrepareText do={ @@ -134,7 +134,7 @@ "\"format\": \"org.matrix.custom.html\", \"formatted_body\": \"" . \ $Formatted . "\" }") as-value; } on-error={ - $LogPrintExit2 info $0 ("Failed sending Matrix notification! Queuing...") false; + $LogPrint info $0 ("Failed sending Matrix notification! Queuing..."); :if ([ :typeof $MatrixQueue ] = "nothing") do={ :set MatrixQueue ({}); @@ -184,7 +184,7 @@ :local Pass [ :tostr $2 ]; :global CharacterReplace; - :global LogPrintExit2; + :global LogPrint; :global ParseJson; :global MatrixAccessToken; @@ -195,9 +195,10 @@ :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ ("https://" . $Domain . "/.well-known/matrix/client") as-value ]->"data"); :set MatrixHomeServer ([ $ParseJson ([ $ParseJson [ $CharacterReplace $Data " " "" ] ]->"m.homeserver") ]->"base_url"); - $LogPrintExit2 debug $0 ("Home server is: " . $MatrixHomeServer) false; + $LogPrint debug $0 ("Home server is: " . $MatrixHomeServer); } on-error={ - $LogPrintExit2 error $0 ("Failed getting home server!") true; + $LogPrint error $0 ("Failed getting home server!"); + :error false; } :if ([ :pick $MatrixHomeServer 0 8 ] = "https://") do={ @@ -209,18 +210,20 @@ http-method=post http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data"); :set MatrixAccessToken ([ $ParseJson $Data ]->"access_token"); - $LogPrintExit2 debug $0 ("Access token is: " . $MatrixAccessToken) false; + $LogPrint debug $0 ("Access token is: " . $MatrixAccessToken); } on-error={ - $LogPrintExit2 error $0 ("Failed logging in (and getting access token)!") true; + $LogPrint error $0 ("Failed logging in (and getting access token)!"); + :error false; } :do { /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ ":global MatrixHomeServer \"" . $MatrixHomeServer . "\";\n" . \ ":global MatrixAccessToken \"" . $MatrixAccessToken . "\";\n"); - $LogPrintExit2 info $0 ("Appended configuration to global-config-overlay. Now create and join a room, please!") false; + $LogPrint info $0 ("Appended configuration to global-config-overlay. Now create and join a room, please!"); } on-error={ - $LogPrintExit2 error $0 ("Failed appending configuration to global-config-overlay!") true; + $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + :error false; } } @@ -228,7 +231,7 @@ :set SetupMatrixJoinRoom do={ :global MatrixRoom [ :tostr $1 ]; - :global LogPrintExit2; + :global LogPrint; :global UrlEncode; :global MatrixAccessToken; @@ -240,16 +243,18 @@ http-method=post http-data="" \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/rooms/" . [ $UrlEncode $MatrixRoom ] . \ "/join?access_token=" . [ $UrlEncode $MatrixAccessToken ]) as-value; - $LogPrintExit2 debug $0 ("Joined the room.") false; + $LogPrint debug $0 ("Joined the room."); } on-error={ - $LogPrintExit2 error $0 ("Failed joining the room!") true; + $LogPrint error $0 ("Failed joining the room!"); + :error false; } :do { /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ ":global MatrixRoom \"" . $MatrixRoom . "\";\n"); - $LogPrintExit2 info $0 ("Appended configuration to global-config-overlay. Please review and cleanup!") false; + $LogPrint info $0 ("Appended configuration to global-config-overlay. Please review and cleanup!"); } on-error={ - $LogPrintExit2 error $0 ("Failed appending configuration to global-config-overlay!") true; + $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + :error false; } } From fb88521ed5ba5012cec11824f19c92ded44c4ce1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 038/988] mod/notification-ntfy: switch to $LogPrint --- mod/notification-ntfy.rsc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 4dc6d84d..6d48a59a 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -18,10 +18,10 @@ :global NtfyMessageIDs; :global IsFullyConnected; - :global LogPrintExit2; + :global LogPrint; :if ([ $IsFullyConnected ] = false) do={ - $LogPrintExit2 debug $0 ("System is not fully connected, not flushing.") false; + $LogPrint debug $0 ("System is not fully connected, not flushing."); :return false; } @@ -29,7 +29,7 @@ :local QueueLen [ :len $NtfyQueue ]; :if ([ :len [ /system/scheduler/find where name="_FlushNtfyQueue" ] ] > 0 && $QueueLen = 0) do={ - $LogPrintExit2 warning $0 ("Flushing Ntfy messages from scheduler, but queue is empty.") false; + $LogPrint warning $0 ("Flushing Ntfy messages from scheduler, but queue is empty."); } :foreach Id,Message in=$NtfyQueue do={ @@ -39,7 +39,7 @@ ($Message->"url") http-header-field=($Message->"headers") http-data=($Message->"text") as-value; :set ($NtfyQueue->$Id); } on-error={ - $LogPrintExit2 debug $0 ("Sending queued Ntfy message failed.") false; + $LogPrint debug $0 ("Sending queued Ntfy message failed."); :set AllDone false; } } @@ -66,7 +66,7 @@ :global CertificateAvailable; :global EitherOr; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global SymbolForNotification; :global UrlEncode; @@ -88,13 +88,14 @@ :do { :if ($NtfyServer = "ntfy.sh") do={ :if ([ $CertificateAvailable "R3" ] = false) do={ - $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; + $LogPrint warning $0 ("Downloading required certificate failed."); + :error false; } } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ $Url http-header-field=$Headers http-data=$Text as-value; } on-error={ - $LogPrintExit2 info $0 ("Failed sending ntfy notification! Queuing...") false; + $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); :if ([ :typeof $NtfyQueue ] = "nothing") do={ :set NtfyQueue ({}); From 699f09c2820abb156cf6ca4f45fe3a8285b11a81 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 039/988] mod/notification-telegram: switch to $LogPrint --- mod/notification-telegram.rsc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 5b79135d..506ec802 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -18,12 +18,12 @@ :global TelegramMessageIDs; :global IsFullyConnected; - :global LogPrintExit2; + :global LogPrint; :global ParseJson; :global UrlEncode; :if ([ $IsFullyConnected ] = false) do={ - $LogPrintExit2 debug $0 ("System is not fully connected, not flushing.") false; + $LogPrint debug $0 ("System is not fully connected, not flushing."); :return false; } @@ -31,7 +31,7 @@ :local QueueLen [ :len $TelegramQueue ]; :if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] > 0 && $QueueLen = 0) do={ - $LogPrintExit2 warning $0 ("Flushing Telegram messages from scheduler, but queue is empty.") false; + $LogPrint warning $0 ("Flushing Telegram messages from scheduler, but queue is empty."); } :foreach Id,Message in=$TelegramQueue do={ @@ -45,7 +45,7 @@ :set ($TelegramQueue->$Id); :set ($TelegramMessageIDs->([ $ParseJson ([ $ParseJson $Data ]->"result") ]->"message_id")) 1; } on-error={ - $LogPrintExit2 debug $0 ("Sending queued Telegram message failed.") false; + $LogPrint debug $0 ("Sending queued Telegram message failed."); :set AllDone false; } } @@ -74,7 +74,7 @@ :global CharacterReplace; :global EitherOr; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global ParseJson; :global SymbolForNotification; :global UrlEncode; @@ -136,7 +136,8 @@ :do { :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ - $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; + $LogPrint warning $0 ("Downloading required certificate failed."); + :error false; } :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \ @@ -145,7 +146,7 @@ "&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); :set ($TelegramMessageIDs->([ $ParseJson ([ $ParseJson $Data ]->"result") ]->"message_id")) 1; } on-error={ - $LogPrintExit2 info $0 ("Failed sending telegram notification! Queuing...") false; + $LogPrint info $0 ("Failed sending telegram notification! Queuing..."); :if ([ :typeof $TelegramQueue ] = "nothing") do={ :set TelegramQueue ({}); From 8c62c31604d00bc12ddd548da4c8cbd46c0de383 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 040/988] mod/scriptrunonce: switch to $LogPrint --- mod/scriptrunonce.rsc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 38348a0d..ffb1aff4 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -15,13 +15,14 @@ :global ScriptRunOnceBaseUrl; :global ScriptRunOnceUrlSuffix; - :global LogPrintExit2; + :global LogPrint; :global ValidateSyntax; :foreach Script in=$Scripts do={ :if (!($Script ~ "^(ftp|https?|sftp)://")) do={ :if ([ :len $ScriptRunOnceBaseUrl ] = 0) do={ - $LogPrintExit2 warning $0 ("Script '" . $Script . "' is not an url and base url is not available.") true; + $LogPrint warning $0 ("Script '" . $Script . "' is not an url and base url is not available."); + :error false; } :set Script ($ScriptRunOnceBaseUrl . $Script . ".rsc" . $ScriptRunOnceUrlSuffix); } @@ -30,19 +31,19 @@ :do { :set Source ([ /tool/fetch check-certificate=yes-without-crl $Script output=user as-value ]->"data"); } on-error={ - $LogPrintExit2 warning $0 ("Failed fetching script '" . $Script . "'!") false; + $LogPrint warning $0 ("Failed fetching script '" . $Script . "'!"); } :if ([ :len $Source ] > 0) do={ :if ([ $ValidateSyntax $Source ] = true) do={ :do { - $LogPrintExit2 info $0 ("Running script '" . $Script . "' now.") false; + $LogPrint info $0 ("Running script '" . $Script . "' now."); [ :parse $Source ]; } on-error={ - $LogPrintExit2 warning $0 ("The script '" . $Script . "' failed to run!") false; + $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); } } else={ - $LogPrintExit2 warning $0 ("The script '" . $Script . "' failed syntax validation!") false; + $LogPrint warning $0 ("The script '" . $Script . "' failed syntax validation!"); } } } From eedf092930992281700b591371cd2e960f1d9f0e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 041/988] mod/ssh-keys-import: switch to $LogPrint --- mod/ssh-keys-import.rsc | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index b88ef9a4..fbc667ec 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -18,32 +18,36 @@ :global CharacterReplace; :global GetRandom20CharAlNum; - :global LogPrintExit2; + :global LogPrint; :global MkDir; :global WaitForFile; :if ([ :len $Key ] = 0 || [ :len $User ] = 0) do={ - $LogPrintExit2 warning $0 ("Missing argument(s), please pass key and user!") true; + $LogPrint warning $0 ("Missing argument(s), please pass key and user!"); + :error false; } :if ([ :len [ /user/find where name=$User ] ] = 0) do={ - $LogPrintExit2 warning $0 ("User '" . $User . "' does not exist.") true; + $LogPrint warning $0 ("User '" . $User . "' does not exist."); + :error false; } :local KeyVal [ :toarray [ $CharacterReplace $Key " " "," ] ]; :if (!($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa")) do={ - $LogPrintExit2 warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported.") true; + $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); + :error false; } :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ - $LogPrintExit2 warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!") true; + $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); + :error false; } :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; :if ([ :len [ /user/ssh-keys/find where user=$User key-owner~("\\bmd5=" . $FingerPrintMD5 . "\\b") ] ] > 0) do={ - $LogPrintExit2 warning $0 ("The ssh public key (MD5:" . $FingerPrintMD5 . \ - ") is already available for user '" . $User . "'.") false; + $LogPrint warning $0 ("The ssh public key (MD5:" . $FingerPrintMD5 . \ + ") is already available for user '" . $User . "'."); :return false; } @@ -53,10 +57,11 @@ :do { /user/ssh-keys/import public-key-file=$FileName user=$User; - $LogPrintExit2 info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \ - "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'.") false; + $LogPrint info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \ + "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'."); } on-error={ - $LogPrintExit2 warning $0 ("Failed importing key.") true; + $LogPrint warning $0 ("Failed importing key."); + :error false; } } @@ -67,17 +72,19 @@ :global CharacterReplace; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global SSHKeysImport; :if ([ :len $FileName ] = 0 || [ :len $User ] = 0) do={ - $LogPrintExit2 warning $0 ("Missing argument(s), please pass file name and user!") true; + $LogPrint warning $0 ("Missing argument(s), please pass file name and user!"); + :error false; } :local File [ /file/find where name=$FileName ]; :if ([ :len $File ] = 0) do={ - $LogPrintExit2 warning $0 ("File '" . $FileName . "' does not exist.") true; + $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); + :error false; } :local Keys ([ /file/get $FileName contents ] . "\n"); @@ -90,7 +97,7 @@ :do { $SSHKeysImport $Line $User; } on-error={ - $LogPrintExit2 warning $0 ("Failed importing key for user '" . $User . "'.") false; + $LogPrint warning $0 ("Failed importing key for user '" . $User . "'."); } :set Continue true; } @@ -99,7 +106,7 @@ :set Continue true; } :if ($Continue = false && [ :len ($KeyVal->0) ] > 0) do={ - $LogPrintExit2 warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported.") false; + $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } } while=([ :len $Keys ] > 0); } From e3d55819eebfbdf1f752ec474adf28dc199ae989 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 042/988] mode-button: switch to $LogPrint --- mode-button.rsc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 07788cb4..f453f11f 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -16,18 +16,18 @@ :global ModeButton; - :global LogPrintExit2; + :global LogPrint; :set ($ModeButton->"count") ($ModeButton->"count" + 1); :local Scheduler [ /system/scheduler/find where name="_ModeButtonScheduler" ]; :if ([ :len $Scheduler ] = 0) do={ - $LogPrintExit2 info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses...") false; + $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); :global ModeButtonScheduler do={ :global ModeButton; - :global LogPrintExit2; + :global LogPrint; :global ModeButtonScheduler; :global ValidateSyntax; @@ -52,7 +52,7 @@ :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ - $LogPrintExit2 info $ScriptName ("Acting on " . $Count . " mode-button presses: " . $Code) false; + $LogPrint info $ScriptName ("Acting on " . $Count . " mode-button presses: " . $Code); :for I from=1 to=$Count do={ $LEDInvert; @@ -66,16 +66,16 @@ [ :parse $Code ]; } else={ - $LogPrintExit2 warning $ScriptName ("The code for " . $Count . " mode-button presses failed syntax validation!") false; + $LogPrint warning $ScriptName ("The code for " . $Count . " mode-button presses failed syntax validation!"); } } else={ - $LogPrintExit2 info $ScriptName ("No action defined for " . $Count . " mode-button presses.") false; + $LogPrint info $ScriptName ("No action defined for " . $Count . " mode-button presses."); } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; } else={ - $LogPrintExit2 debug $ScriptName ("Updating scheduler _ModeButtonScheduler...") false; + $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } } on-error={ } From 8ea24540c4bd910717b33f93d07b1b60d3cd8bb6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 043/988] netwatch-dns: switch to $LogPrint --- netwatch-dns.rsc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 76f26859..50c2b4c0 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -16,7 +16,7 @@ :global CertificateAvailable; :global EitherOr; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -26,7 +26,7 @@ :local SettleTime (5m30s - [ /system/resource/get uptime ]); :if ($SettleTime > 0s) do={ - $LogPrintExit2 info $ScriptName ("System just booted, giving netwatch " . $SettleTime . " to settle.") false; + $LogPrint info $ScriptName ("System just booted, giving netwatch " . $SettleTime . " to settle."); :error true; } @@ -50,15 +50,14 @@ :if ([ :len $DnsServers ] > 0) do={ :if ($DnsServers != $DnsCurrent) do={ - $LogPrintExit2 info $ScriptName ("Updating DNS servers: " . [ :tostr $DnsServers ]) false; + $LogPrint info $ScriptName ("Updating DNS servers: " . [ :tostr $DnsServers ]); /ip/dns/set servers=$DnsServers; /ip/dns/cache/flush; } } else={ :if ([ :len $DnsFallback ] > 0) do={ :if ($DnsFallback != $DnsCurrent) do={ - $LogPrintExit2 info $ScriptName ("Updating DNS servers to fallback: " . \ - [ :tostr $DnsFallback ]) false; + $LogPrint info $ScriptName ("Updating DNS servers to fallback: " . [ :tostr $DnsFallback ]); /ip/dns/set servers=$DnsFallback; /ip/dns/cache/flush; } @@ -83,7 +82,7 @@ } :if ($DohCurrent = $HostInfo->"doh-url") do={ - $LogPrintExit2 debug $ScriptName ("Current DoH server is still up: " . $DohCurrent) false; + $LogPrint debug $ScriptName ("Current DoH server is still up: " . $DohCurrent); :error true; } @@ -92,7 +91,7 @@ } :if ([ :len $DohCurrent ] > 0) do={ - $LogPrintExit2 info $ScriptName ("Current DoH server is down, disabling: " . $DohCurrent) false; + $LogPrint info $ScriptName ("Current DoH server is down, disabling: " . $DohCurrent); /ip/dns/set use-doh-server=""; /ip/dns/cache/flush; } @@ -100,7 +99,7 @@ :foreach DohServer in=$DohServers do={ :if ([ :len ($DohServer->"doh-cert") ] > 0) do={ :if ([ $CertificateAvailable ($DohServer->"doh-cert") ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Downloading certificate failed, trying without.") false; + $LogPrint warning $ScriptName ("Downloading certificate failed, trying without."); } } @@ -112,19 +111,19 @@ "\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \ "\00\10" . "\00\01") ]) as-value ]->"data"); } on-error={ - $LogPrintExit2 warning $ScriptName ("Request to DoH server failed (network or certificate issue): " . \ - ($DohServer->"doh-url")) false; + $LogPrint warning $ScriptName ("Request to DoH server failed (network or certificate issue): " . \ + ($DohServer->"doh-url")); } :if ($Data != false) do={ :if ([ :typeof [ :find $Data "doh-check-OK" ] ] = "num") do={ /ip/dns/set use-doh-server=($DohServer->"doh-url") verify-doh-cert=yes; /ip/dns/cache/flush; - $LogPrintExit2 info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")) false; + $LogPrint info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")); :error true; } else={ - $LogPrintExit2 warning $ScriptName ("Received unexpected response from DoH server: " . \ - ($DohServer->"doh-url")) false; + $LogPrint warning $ScriptName ("Received unexpected response from DoH server: " . \ + ($DohServer->"doh-url")); } } } From 030105cc2ed46623b4628496cbd5665da245b0c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 044/988] netwatch-notify: switch to $LogPrint --- netwatch-notify.rsc | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 90d26f1f..9536dd75 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -19,7 +19,7 @@ :global EitherOr; :global IfThenElse; :global IsDNSResolving; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptFromTerminal; :global ScriptLock; @@ -32,25 +32,22 @@ :local State [ :tostr $3 ]; :local Hook [ :tostr $4 ]; - :global LogPrintExit2; + :global LogPrint; :global ValidateSyntax; :if ([ $ValidateSyntax $Hook ] = true) do={ :do { [ :parse $Hook ]; } on-error={ - $LogPrintExit2 warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . \ - "' failed to run.") false; + $LogPrint warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run."); :return ("The hook failed to run."); } } else={ - $LogPrintExit2 warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . \ - "' failed syntax validation.") false; + $LogPrint warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed syntax validation."); :return ("The hook failed syntax validation."); } - $LogPrintExit2 info $0 ("Ran hook on " . $Type . " '" . $Name . "' " . $State . ": " . \ - $Hook) false; + $LogPrint info $0 ("Ran hook on " . $Type . " '" . $Name . "' " . $State . ": " . $Hook); :return ("Ran hook:\n" . $Hook); } @@ -106,10 +103,10 @@ :local Resolve [ :resolve ($HostInfo->"resolve") ]; :if ($Resolve != $HostVal->"host") do={ :if ([ $ResolveExpected ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={ - $LogPrintExit2 info $ScriptName ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ + $LogPrint info $ScriptName ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ $HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \ - ", updating.") false; + ", updating."); /tool/netwatch/set host=$Resolve $Host; :set ($Metric->"resolve-failcnt") 0; :set ($HostVal->"status") "unknown"; @@ -118,9 +115,9 @@ } on-error={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); :if ($Metric->"resolve-failcnt" = 3) do={ - $LogPrintExit2 warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ + $LogPrint warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ - $HostInfo->"name") "" ] . "' failed.") false; + $HostInfo->"name") "" ] . "' failed."); } } } @@ -129,8 +126,8 @@ :if ($HostVal->"status" = "up") do={ :local CountDown ($Metric->"count-down"); :if ($CountDown > 0) do={ - $LogPrintExit2 info $ScriptName \ - ("The " . $Type . " '" . $Name . "' (" . $HostDetails . ") is up.") false; + $LogPrint info $ScriptName \ + ("The " . $Type . " '" . $Name . "' (" . $HostDetails . ") is up."); :set ($Metric->"count-down") 0; } :set ($Metric->"count-up") ($Metric->"count-up" + 1); @@ -178,11 +175,11 @@ } :if ($Metric->"notified" = false || $Metric->"count-down" % 120 = 0 || \ $ScriptFromTerminalCached = true) do={ - $LogPrintExit2 [ $IfThenElse ($HostInfo->"no-down-notification" != true) info debug ] $ScriptName \ + $LogPrint [ $IfThenElse ($HostInfo->"no-down-notification" != true) info debug ] $ScriptName \ ("The " . $Type . " '" . $Name . "' (" . $HostDetails . ") is down for " . \ $Metric->"count-down" . " checks, " . [ $IfThenElse ($ParentNotified = false) [ $IfThenElse \ ($Metric->"notified" = true) ("already notified.") ($CountDown - $Metric->"count-down" . \ - " to go.") ] ("parent " . $Type . " " . $Parent . " is down.") ]) false; + " to go.") ] ("parent " . $Type . " " . $Parent . " is down.") ]); } :if ((($CountDown * 2) - ($Metric->"count-down" * 3)) / 2 = 0 && \ [ :typeof ($HostInfo->"pre-down-hook") ] = "str") do={ From ad65b62c1c0751fc3efee6221f4c32232f3302b9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 045/988] ospf-to-leds: switch to $LogPrint --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 73c9922d..a22e5a5f 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -14,7 +14,7 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -34,11 +34,11 @@ } :if ($NeighborCount > 0 && $LEDType = "off") do={ - $LogPrintExit2 info $ScriptName ("OSPF instance " . $InstanceVal->"name" . " has " . $NeighborCount . " neighbors, led on!") false; + $LogPrint info $ScriptName ("OSPF instance " . $InstanceVal->"name" . " has " . $NeighborCount . " neighbors, led on!"); /system/leds/set type=on [ find where leds=$LED ]; } :if ($NeighborCount = 0 && $LEDType = "on") do={ - $LogPrintExit2 info $ScriptName ("OSPF instance " . $InstanceVal->"name" . " has no neighbors, led off!") false; + $LogPrint info $ScriptName ("OSPF instance " . $InstanceVal->"name" . " has no neighbors, led off!"); /system/leds/set type=off [ find where leds=$LED ]; } } From 8444e5f2703a90ae0441281239505a670c24c152 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 046/988] packages-update: switch to $LogPrint --- packages-update.rsc | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 634b7bb4..22ea5013 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -16,7 +16,7 @@ :global DownloadPackage; :global Grep; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptFromTerminal; :global ScriptLock; @@ -29,7 +29,7 @@ :local ScriptName [ :tostr $1 ]; :global GetRandomNumber; - :global LogPrintExit2; + :global LogPrint; :global RebootForUpdate do={ /system/reboot; @@ -39,8 +39,8 @@ /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=1d \ on-event=("/system/scheduler/remove \"_RebootForUpdate\"; " . \ ":global RebootForUpdate; \$RebootForUpdate;"); - $LogPrintExit2 info $ScriptName ("Scheduled reboot for update at " . $StartTime . \ - " local time (" . [ /system/clock/get time-zone-name ] . ").") false; + $LogPrint info $ScriptName ("Scheduled reboot for update at " . $StartTime . \ + " local time (" . [ /system/clock/get time-zone-name ] . ")."); :return true; } @@ -51,11 +51,12 @@ :local Update [ /system/package/update/get ]; :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ - $LogPrintExit2 warning $ScriptName ("Latest version is not known.") true; + $LogPrint warning $ScriptName ("Latest version is not known."); + :error false; } :if ($Update->"installed-version" = $Update->"latest-version") do={ - $LogPrintExit2 info $ScriptName ("Version " . $Update->"latest-version" . " is already installed.") false; + $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is already installed."); :error true; } @@ -63,8 +64,9 @@ :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :if ($NumInstalled < 0x070d0000 && $NumLatest > 0x070d0000) do={ - $LogPrintExit2 error $ScriptName ("Migration to wireless/wifi package in RouterOS " . \ - ($Update->"latest-version") . " is pending. Please update manually!") true; + $LogPrint error $ScriptName ("Migration to wireless/wifi package in RouterOS " . \ + ($Update->"latest-version") . " is pending. Please update manually!"); + :error false; } :local DoDowngrade false; @@ -77,14 +79,16 @@ :put "Canceled..."; } } else={ - $LogPrintExit2 warning $ScriptName ("Not installing downgrade automatically.") true; + $LogPrint warning $ScriptName ("Not installing downgrade automatically."); + :error false; } } :foreach Package in=[ /system/package/find where !bundle ] do={ :local PkgName [ /system/package/get $Package name ]; :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ - $LogPrintExit2 error $ScriptName ("Download for package " . $PkgName . " failed, update aborted.") true; + $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); + :error false; } } @@ -99,29 +103,31 @@ :foreach Order,Script in=$RunOrder do={ :set PackagesUpdateBackupFailure false; :do { - $LogPrintExit2 info $ScriptName ("Running backup script " . $Script . " before update.") false; + $LogPrint info $ScriptName ("Running backup script " . $Script . " before update."); /system/script/run $Script; } on-error={ :set PackagesUpdateBackupFailure true; } :if ($PackagesUpdateBackupFailure = true) do={ - $LogPrintExit2 warning $ScriptName ("Running backup script " . $Script . " before update failed!") false; + $LogPrint warning $ScriptName ("Running backup script " . $Script . " before update failed!"); :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Do you want to continue anyway? [y/N]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - $LogPrintExit2 info $ScriptName ("User requested to continue anyway.") false; + $LogPrint info $ScriptName ("User requested to continue anyway."); } else={ - $LogPrintExit2 info $ScriptName ("Canceled update...") true; + $LogPrint info $ScriptName ("Canceled update..."); + :error false; } } else={ - $LogPrintExit2 warning $ScriptName ("Canceled non-interactive update.") true; + $LogPrint warning $ScriptName ("Canceled non-interactive update."); + :error false; } } } :if ($DoDowngrade = true) do={ - $LogPrintExit2 info $ScriptName ("Rebooting for downgrade.") false; + $LogPrint info $ScriptName ("Rebooting for downgrade."); :delay 1s; /system/package/downgrade; } @@ -137,7 +143,7 @@ } } - $LogPrintExit2 info $ScriptName ("Rebooting for update.") false; + $LogPrint info $ScriptName ("Rebooting for update."); :delay 1s; /system/reboot; } on-error={ } From 88d4c0aff83fffad0952a44a6afbe888d1332c14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 047/988] ppp-on-up: switch to $LogPrint --- ppp-on-up.rsc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 0cc2405c..61766c08 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -14,26 +14,27 @@ :do { :local ScriptName [ :jobname ]; - :global LogPrintExit2; + :global LogPrint; :local Interface $interface; :if ([ :typeof $Interface ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from ppp on-up script hook.") true; + $LogPrint error $ScriptName ("This script is supposed to run from ppp on-up script hook."); + :error false; } :local IntName [ /interface/get $Interface name ]; - $LogPrintExit2 info $ScriptName ("PPP interface " . $IntName . " is up.") false; + $LogPrint info $ScriptName ("PPP interface " . $IntName . " is up."); /ipv6/dhcp-client/release [ find where interface=$IntName !disabled ]; :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\n") ] do={ :local ScriptName [ /system/script/get $Script name ]; :do { - $LogPrintExit2 debug $ScriptName ("Running script: " . $ScriptName) false; + $LogPrint debug $ScriptName ("Running script: " . $ScriptName); /system/script/run $Script; } on-error={ - $LogPrintExit2 warning $ScriptName ("Running script '" . $ScriptName . "' failed!") false; + $LogPrint warning $ScriptName ("Running script '" . $ScriptName . "' failed!"); } } } on-error={ } From 5a487d15c2ba464df46b82eceffac622d1f21604 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 048/988] sms-action: switch to $LogPrint --- sms-action.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index 11d35230..4c37565b 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -16,13 +16,14 @@ :global SmsAction; - :global LogPrintExit2; + :global LogPrint; :global ValidateSyntax; :local Action $action; :if ([ :typeof $Action ] = "nothing") do={ - $LogPrintExit2 error $ScriptName ("This script is supposed to run from SMS hook with action=...") true; + $LogPrint error $ScriptName ("This script is supposed to run from SMS hook with action=..."); + :error false; } :local Code ($SmsAction->$Action); @@ -31,6 +32,6 @@ :delay 1s; [ :parse $Code ]; } else={ - $LogPrintExit2 warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!") false; + $LogPrint warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!"); } } on-error={ } From be1aeccbe520be193906e24de7c2fa82af5970dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 049/988] sms-forward: switch to $LogPrint --- sms-forward.rsc | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index c745b813..b0966c3b 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -19,7 +19,7 @@ :global SmsForwardHooks; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global LogPrintOnce; :global ScriptLock; :global SendNotification2; @@ -41,7 +41,7 @@ :local Settings [ /tool/sms/get ]; :if ([ /interface/lte/get ($Settings->"port") running ] != true) do={ - $LogPrintExit2 info $ScriptName ("The LTE interface is not in running state, skipping.") false; + $LogPrint info $ScriptName ("The LTE interface is not in running state, skipping."); :error true; } @@ -56,7 +56,7 @@ :if ($Phone = $Settings->"allowed-number" && \ ($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={ - $LogPrintExit2 debug $ScriptName ("Removing SMS, which started a script.") false; + $LogPrint debug $ScriptName ("Removing SMS, which started a script."); /tool/sms/inbox/remove $Sms; } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ @@ -64,20 +64,16 @@ :foreach Hook in=$SmsForwardHooks do={ :if ($Phone~($Hook->"allowed-number") && ($SmsVal->"message")~($Hook->"match")) do={ :if ([ $ValidateSyntax ($Hook->"command") ] = true) do={ - $LogPrintExit2 info $ScriptName ("Running hook '" . $Hook->"match" . "': " . \ - $Hook->"command") false; + $LogPrint info $ScriptName ("Running hook '" . $Hook->"match" . "': " . $Hook->"command"); :do { :local Command [ :parse ($Hook->"command") ]; $Command Phone=$Phone Message=($SmsVal->"message"); - :set Messages ($Messages . "\n\nRan hook '" . $Hook->"match" . "':\n" . \ - $Hook->"command"); + :set Messages ($Messages . "\n\nRan hook '" . $Hook->"match" . "':\n" . $Hook->"command"); } on-error={ - $LogPrintExit2 warning $ScriptName ("The code for hook '" . $Hook->"match" . \ - "' failed to run!") false; + $LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed to run!"); } } else={ - $LogPrintExit2 warning $ScriptName ("The code for hook '" . $Hook->"match" . \ - "' failed syntax validation!") false; + $LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed syntax validation!"); } } } From 19fb5c5801a0769e3b94123b8b28aca14f0e73d9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 050/988] telegram-chat: switch to $LogPrint --- telegram-chat.rsc | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 799569fc..c81b7141 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -30,7 +30,7 @@ :global EscapeForRegEx; :global GetRandom20CharAlNum; :global IfThenElse; - :global LogPrintExit2; + :global LogPrint; :global MAX; :global MIN; :global MkDir; @@ -57,7 +57,8 @@ } :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ - $LogPrintExit2 warning $ScriptName ("Downloading required certificate failed.") true; + $LogPrint warning $ScriptName ("Downloading required certificate failed."); + :error false; } $RandomDelay $TelegramRandomDelay; @@ -72,7 +73,7 @@ :set TelegramRandomDelay [ $MAX 0 ($TelegramRandomDelay - 1) ]; } on-error={ :if ($I < 4) do={ - $LogPrintExit2 debug $ScriptName ("Fetch failed, " . $I . ". try.") false; + $LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try."); :set TelegramRandomDelay [ $MIN 15 ($TelegramRandomDelay + 5) ]; :delay (($I * $I) . "s"); } @@ -81,7 +82,8 @@ } :if ($Data = false) do={ - $LogPrintExit2 warning $ScriptName ("Failed getting updates from Telegram.") true; + $LogPrint warning $ScriptName ("Failed getting updates from Telegram."); + :error false; } :local UpdateID 0; @@ -106,7 +108,7 @@ :if ($Trusted = true) do={ :local Done false; :if ($Message->"text" = "?") do={ - $LogPrintExit2 info $ScriptName ("Sending notice for update " . $UpdateID . ".") false; + $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Online, awaiting your commands!") }); @@ -118,8 +120,8 @@ } else={ :set TelegramChatActive false; } - $LogPrintExit2 info $ScriptName ("Now " . [ $IfThenElse $TelegramChatActive "active" "passive" ] . \ - " from update " . $UpdateID . "!") false; + $LogPrint info $ScriptName ("Now " . [ $IfThenElse $TelegramChatActive "active" "passive" ] . \ + " from update " . $UpdateID . "!"); :set Done true; } :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Message->"text") ] > 0) do={ @@ -127,9 +129,10 @@ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ - $LogPrintExit2 error $ScriptName ("Failed creating directory!") true; + $LogPrint error $ScriptName ("Failed creating directory!"); + :error false; } - $LogPrintExit2 info $ScriptName ("Running command from update " . $UpdateID . ": " . $Message->"text") false; + $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Message->"text"); :execute script=(":do {\n" . $Message->"text" . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ "/file/add name=\"" . $File . ".done\"") file=($File . "\00"); :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ @@ -146,7 +149,7 @@ ("Output exceeds file read size.") ("No output.") ] ]) }); /file/remove "tmpfs/telegram-chat"; } else={ - $LogPrintExit2 info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!") false; + $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Command:\n" . $Message->"text" . "\n\nThe command failed syntax validation!") }); @@ -157,16 +160,16 @@ [ $IfThenElse ([ :len ($From->"username") ] = 0) "without username" ("'" . $From->"username" . "'") ] . \ " (ID " . $From->"id" . ") in update " . $UpdateID . "!"); :if ($Message->"text" ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ - $LogPrintExit2 warning $ScriptName $MessageText false; + $LogPrint warning $ScriptName $MessageText; $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("You are not trusted.") }); } else={ - $LogPrintExit2 info $ScriptName $MessageText false; + $LogPrint info $ScriptName $MessageText; } } } else={ - $LogPrintExit2 debug $ScriptName ("Already handled update " . $UpdateID . ".") false; + $LogPrint debug $ScriptName ("Already handled update " . $UpdateID . "."); } } :set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \ From 1c6154728411e206d651ad05fce093a80168f64f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Mar 2024 10:34:26 +0100 Subject: [PATCH 051/988] global-config: merge loading overlay and snippets --- global-config.rsc | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 85731c32..2b688bc2 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -243,20 +243,14 @@ "cert2-cn"="4n0th3r-s3cr3t"; }; -# load custom settings from overlay +# load custom settings from overlay and snippets # Warning: Do *NOT* copy this code to overlay! -:do { - /system/script/run global-config-overlay; -} on-error={ - :log error ("Loading configuration from overlay failed!"); -} - -# configuration overlay snippets -:foreach Script in=[ /system/script/find where name ~ "^global-config-overlay.d/" ] do={ +:foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ + [ /system/script/find where name~"^global-config-overlay.d/" ]) do={ :do { /system/script/run $Script; } on-error={ - :log error ("Loading configuration from overlay snippet " . \ + :log error ("Loading configuration from overlay or snippet " . \ [ /system/script/get $Script name ] . " failed!"); } } From 9a21f4d3e3bf1ba0abe565058f7f8688024b68a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 052/988] update-gre-address: switch to $LogPrint --- update-gre-address.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 78705c56..74967cdf 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -16,7 +16,7 @@ :local ScriptName [ :jobname ]; :global CharacterReplace; - :global LogPrintExit2; + :global LogPrint; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -33,7 +33,7 @@ :if ([ :typeof ($PeerVal->"dynamic-address") ] = "str" && \ ($PeerVal->"dynamic-address" != $GreIntVal->"remote-address" || \ $GreIntVal->"disabled" = true)) do={ - $LogPrintExit2 info $ScriptName ("Updating remote address for interface " . $GreIntVal->"name" . " to " . $PeerVal->"dynamic-address") false; + $LogPrint info $ScriptName ("Updating remote address for interface " . $GreIntVal->"name" . " to " . $PeerVal->"dynamic-address"); /interface/gre/set remote-address=0.0.0.0 disabled=yes [ find where remote-address=$PeerVal->"dynamic-address" name!=$GreIntVal->"name" ]; /interface/gre/set $GreInt remote-address=($PeerVal->"dynamic-address") disabled=no; } From 76f65c13d77759321f128035bd1ce4aa9b2cec46 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Mar 2024 15:59:41 +0100 Subject: [PATCH 053/988] global-functions: add architecture in user-agent string --- global-functions.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index d2386f49..1c2523a5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -16,7 +16,12 @@ # global variables not to be changed by user :global GlobalFunctionsReady false; -:global FetchUserAgent ("User-Agent: Mikrotik/" . [ /system/resource/get version ] . " Fetch"); +:global FetchUserAgent; +{ + :local Resource [ /system/resource/get ]; + :set FetchUserAgent ("User-Agent: Mikrotik/" . $Resource->"version" . \ + " " . $Resource->"architecture-name" . " Fetch"); +} :global Identity [ /system/identity/get name ]; # global functions From 242ecef012f5208b6fa088a1222d0d5477e5b2ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 12:45:38 +0100 Subject: [PATCH 054/988] update-tunnelbroker: switch to $LogPrint --- update-tunnelbroker.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 9f316e34..c76b7eca 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -17,7 +17,7 @@ :local ScriptName [ :jobname ]; :global CertificateAvailable; - :global LogPrintExit2; + :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -26,7 +26,8 @@ } :if ([ $CertificateAvailable "Starfield Secure Certificate Authority - G2" ] = false) do={ - $LogPrintExit2 error $ScriptName ("Downloading required certificate failed.") true; + $LogPrint error $ScriptName ("Downloading required certificate failed."); + :error false; } :foreach Interface in=[ /interface/6to4/find where comment~"^tunnelbroker" !disabled ] do={ @@ -41,24 +42,25 @@ ("https://ipv4.tunnelbroker.net/nic/update?hostname=" . $Comment->"id") \ user=($Comment->"user") password=($Comment->"pass") output=user as-value ]->"data"); } on-error={ - $LogPrintExit2 debug $ScriptName ("Failed downloading, " . $I . " retries pending.") false; + $LogPrint debug $ScriptName ("Failed downloading, " . $I . " retries pending."); :delay 2s; } } } :if (!($Data ~ "^(good|nochg) ")) do={ - $LogPrintExit2 error $ScriptName ("Failed sending the local address to tunnelbroker or unexpected response!") true; + $LogPrint error $ScriptName ("Failed sending the local address to tunnelbroker or unexpected response!"); + :error false; } :local PublicAddress [ :pick $Data ([ :find $Data " " ] + 1) [ :find $Data "\n" ] ]; :if ($PublicAddress != $InterfaceVal->"local-address") do={ :if ([ :len [ /ip/address find where address~("^" . $PublicAddress . "/") ] ] < 1) do={ - $LogPrintExit2 warning $ScriptName ("The address " . $PublicAddress . " is not configured on your device. NAT by ISP?") false; + $LogPrint warning $ScriptName ("The address " . $PublicAddress . " is not configured on your device. NAT by ISP?"); } - $LogPrintExit2 info $ScriptName ("Local address changed, updating tunnel configuration with address: " . $PublicAddress) false; + $LogPrint info $ScriptName ("Local address changed, updating tunnel configuration with address: " . $PublicAddress); /interface/6to4/set $Interface local-address=$PublicAddress; } } From 19802c0b6977f9467fada4ace3cab017dd98964b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 11:09:22 +0100 Subject: [PATCH 055/988] global-functions: $LogPrintOnce: drop support for exit This is not widely adopted or used, so let's just drop it - no compatibility. --- dhcp-to-dns.rsc | 4 ++-- fw-addr-lists.rsc | 2 +- global-functions.rsc | 9 ++++----- sms-forward.rsc | 3 ++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 84a1e84e..d0638c7b 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -61,7 +61,7 @@ :do { :set LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; :if ([ :len [ /ip/dhcp-server/lease/find where active-mac-address=($LeaseVal->"active-mac-address") status=bound ] ] > 1) do={ - $LogPrintOnce info $ScriptName ("Multiple bound leases found for mac-address " . ($LeaseVal->"active-mac-address") . "!") false; + $LogPrintOnce info $ScriptName ("Multiple bound leases found for mac-address " . ($LeaseVal->"active-mac-address") . "!"); } } on-error={ $LogPrintExit2 debug $ScriptName ("A lease just vanished, ignoring.") false; @@ -117,7 +117,7 @@ } :if ([ :len [ /ip/dns/static/find where name=$FullA (!type or type=A) ] ] > 1) do={ - $LogPrintOnce warning $ScriptName ("The name '" . $FullA . "' appeared in more than one A record!") false; + $LogPrintOnce warning $ScriptName ("The name '" . $FullA . "' appeared in more than one A record!"); } } else={ $LogPrintExit2 debug $ScriptName ("No address available... Ignoring.") false; diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 6071f7bb..4ec41051 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -82,7 +82,7 @@ } :if ([ :len $Data ] > 63000) do={ - $LogPrintOnce warning $ScriptName ("The list is huge and may be truncated: " . $List->"url") false; + $LogPrintOnce warning $ScriptName ("The list is huge and may be truncated: " . $List->"url"); } :while ([ :len $Data ] != 0) do={ diff --git a/global-functions.rsc b/global-functions.rsc index 1c2523a5..aca4cd82 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -703,7 +703,6 @@ :local Severity [ :tostr $1 ]; :local Name [ :tostr $2 ]; :local Message [ :tostr $3 ]; - :local Exit [ :tostr $4 ]; :global LogPrintExit2; @@ -718,7 +717,7 @@ } :set ($LogPrintOnceMessages->$Message) 1; - $LogPrintExit2 $Severity $Name $Message $Exit; + $LogPrintExit2 $Severity $Name $Message false; } # get max value @@ -1048,7 +1047,7 @@ } } else={ $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ - $Required . ", which is not met by your installation. Ignoring!") false; + $Required . ", which is not met by your installation. Ignoring!"); } } else={ $LogPrintExit2 warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ @@ -1359,7 +1358,7 @@ } :if ([ :len ($Symbols->$Name) ] = 0) do={ - $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!") false; + $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!"); :return ""; } @@ -1540,7 +1539,7 @@ # Log success :local Resource [ /system/resource/get ]; $LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \ - " with RouterOS " . $Resource->"version" . ".") false; + " with RouterOS " . $Resource->"version" . "."); # signal we are ready :set GlobalFunctionsReady true; diff --git a/sms-forward.rsc b/sms-forward.rsc index 2f549b1b..c745b813 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -32,7 +32,8 @@ } :if ([ /tool/sms/get receive-enabled ] = false) do={ - $LogPrintOnce warning $ScriptName ("Receiving of SMS is not enabled.") true; + $LogPrintOnce warning $ScriptName ("Receiving of SMS is not enabled."); + :error false; } $WaitFullyConnected; From 39dd1f2a63bc8477bf444111189a7ecead77a667 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 17:50:28 +0100 Subject: [PATCH 056/988] mod/bridge-port-to: do not exit with error --- mod/bridge-port-to.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 441094f1..567a7623 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -26,7 +26,7 @@ :if ([ :len $DHCPClient ] != 1) do={ $LogPrint warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!"); - :error false; + :return false; } :local DHCPClientDisabled [ /ip/dhcp-client/get $DHCPClient disabled ]; From 525e4325daadb94757c8632c1c07391d986c9e0e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 17:51:22 +0100 Subject: [PATCH 057/988] mod/bridge-port-vlan: do not exit with error --- mod/bridge-port-vlan.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 522e9a6d..aee5ef9b 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -26,7 +26,7 @@ :if ([ :len $DHCPClient ] != 1) do={ $LogPrint warning $0 ([ $IfThenElse ([ :len $DHCPClient ] = 0) "Missing" "Duplicate" ] . \ " dhcp client configuration for interface " . $BridgePortVal->"interface" . "!"); - :error false; + :return false; } :local DHCPClientDisabled [ /ip/dhcp-client/get $DHCPClient disabled ]; @@ -43,7 +43,7 @@ :set $Vlan ([ /interface/bridge/vlan/get [ find where comment=$Vlan ] vlan-ids ]->0); } on-error={ $LogPrint warning $0 ("Could not find VLAN '" . $Vlan . "' for interface " . $BridgePortVal->"interface" . "!"); - :error false; + :return false; } } :if ($BridgePortVal->"disabled" = true || $Vlan != $BridgePortVal->"pvid") do={ From c2dc8a0837cd848512a8587f406f9dadd31b957c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 17:53:48 +0100 Subject: [PATCH 058/988] mod/notification-matrix: do not exit with error --- mod/notification-matrix.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index c4fe100b..aa958419 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -198,7 +198,7 @@ $LogPrint debug $0 ("Home server is: " . $MatrixHomeServer); } on-error={ $LogPrint error $0 ("Failed getting home server!"); - :error false; + :return false; } :if ([ :pick $MatrixHomeServer 0 8 ] = "https://") do={ @@ -213,7 +213,7 @@ $LogPrint debug $0 ("Access token is: " . $MatrixAccessToken); } on-error={ $LogPrint error $0 ("Failed logging in (and getting access token)!"); - :error false; + :return false; } :do { @@ -223,7 +223,7 @@ $LogPrint info $0 ("Appended configuration to global-config-overlay. Now create and join a room, please!"); } on-error={ $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); - :error false; + :return false; } } @@ -246,7 +246,7 @@ $LogPrint debug $0 ("Joined the room."); } on-error={ $LogPrint error $0 ("Failed joining the room!"); - :error false; + :return false; } :do { @@ -255,6 +255,6 @@ $LogPrint info $0 ("Appended configuration to global-config-overlay. Please review and cleanup!"); } on-error={ $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); - :error false; + :return false; } } From 0e2e7efdb223baa10d06b9f0d917fbe507264307 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 17:52:07 +0100 Subject: [PATCH 059/988] mod/scriptrunonce: do not exit with error --- mod/scriptrunonce.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index ffb1aff4..85d465a7 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -22,7 +22,7 @@ :if (!($Script ~ "^(ftp|https?|sftp)://")) do={ :if ([ :len $ScriptRunOnceBaseUrl ] = 0) do={ $LogPrint warning $0 ("Script '" . $Script . "' is not an url and base url is not available."); - :error false; + :return false; } :set Script ($ScriptRunOnceBaseUrl . $Script . ".rsc" . $ScriptRunOnceUrlSuffix); } From b829ec1fc9091fe8add28d56c81da64c7aa9be3a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Mar 2024 17:47:56 +0100 Subject: [PATCH 060/988] mod/ssh-keys-import: do not exit with error --- mod/ssh-keys-import.rsc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index fbc667ec..6716958a 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -24,23 +24,23 @@ :if ([ :len $Key ] = 0 || [ :len $User ] = 0) do={ $LogPrint warning $0 ("Missing argument(s), please pass key and user!"); - :error false; + :return false; } :if ([ :len [ /user/find where name=$User ] ] = 0) do={ $LogPrint warning $0 ("User '" . $User . "' does not exist."); - :error false; + :return false; } :local KeyVal [ :toarray [ $CharacterReplace $Key " " "," ] ]; :if (!($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa")) do={ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); - :error false; + :return false; } :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); - :error false; + :return false; } :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; @@ -61,7 +61,7 @@ "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'."); } on-error={ $LogPrint warning $0 ("Failed importing key."); - :error false; + :return false; } } @@ -78,13 +78,13 @@ :if ([ :len $FileName ] = 0 || [ :len $User ] = 0) do={ $LogPrint warning $0 ("Missing argument(s), please pass file name and user!"); - :error false; + :return false; } :local File [ /file/find where name=$FileName ]; :if ([ :len $File ] = 0) do={ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); - :error false; + :return false; } :local Keys ([ /file/get $FileName contents ] . "\n"); From 44fc69e82d1a612ad276998377b1c3f34310422e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 6 Dec 2023 23:43:23 +0100 Subject: [PATCH 061/988] packages-update: drop RouterOS version check... ... and allow all updates again. This requires RouterOS 7.13. --- doc/packages-update.md | 2 +- packages-update.rsc | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/doc/packages-update.md b/doc/packages-update.md index 86eae0dd..fae38962 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -4,7 +4,7 @@ Manage system update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/packages-update.rsc b/packages-update.rsc index 22ea5013..2723b3b7 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download packages and reboot for installation # https://git.eworm.de/cgit/routeros-scripts/about/doc/packages-update.md @@ -63,12 +63,6 @@ :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; - :if ($NumInstalled < 0x070d0000 && $NumLatest > 0x070d0000) do={ - $LogPrint error $ScriptName ("Migration to wireless/wifi package in RouterOS " . \ - ($Update->"latest-version") . " is pending. Please update manually!"); - :error false; - } - :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ From c016a6ef47eb08ad0f1f72968348af7bfa0acad0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Mar 2024 21:52:18 +0100 Subject: [PATCH 062/988] mod/notification-email: add display name with identity (if not given) --- mod/notification-email.rsc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 78192f36..d801d788 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -8,6 +8,7 @@ # send notifications via e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md +:global EMailGenerateFrom; :global FlushEmailQueue; :global LogForwardFilterLogForwarding; :global NotificationEMailSubject; @@ -17,11 +18,25 @@ :global SendEMail; :global SendEMail2; +# generate from-property with display name +:set EMailGenerateFrom do={ + :global Identity; + + :local From [ /tool/e-mail/get from ]; + + :if ($From ~ "<.*>\$") do={ + :return $From; + } + + :return ("\"" . $Identity . " via routeros-scripts\" <" . $From . ">"); +} + # flush e-mail queue :set FlushEmailQueue do={ :global EmailQueue; :global EitherOr; + :global EMailGenerateFrom; :global IsDNSResolving; :global IsTimeSync; :global LogPrint; @@ -67,8 +82,8 @@ $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); } } - /tool/e-mail/send to=($Message->"to") cc=($Message->"cc") subject=($Message->"subject") \ - body=($Message->"body") file=$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; From ccfbabde5eed08a021b2d47f34bc4498940fda1d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Mar 2024 22:03:04 +0100 Subject: [PATCH 063/988] mod/notification-email: clean name for display name --- mod/notification-email.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index d801d788..0d83d698 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -22,13 +22,15 @@ :set EMailGenerateFrom do={ :global Identity; + :global CleanName; + :local From [ /tool/e-mail/get from ]; :if ($From ~ "<.*>\$") do={ :return $From; } - :return ("\"" . $Identity . " via routeros-scripts\" <" . $From . ">"); + :return ([ $CleanName $Identity ] . " via routeros-scripts <" . $From . ">"); } # flush e-mail queue From 3d4a14d44935fff6777a97afb4b598238c57b47e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Mar 2024 08:37:11 +0100 Subject: [PATCH 064/988] netwatch-notify: pass link to notification This is pass verbatim below the notification text. --- doc/netwatch-notify.md | 7 +++++++ global-functions.rsc | 2 +- netwatch-notify.rsc | 4 ++-- news-and-changes.rsc | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 6f3e1ce4..806bb3af 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -111,6 +111,13 @@ included verbatim into the notification. /tool/netwatch/add comment="notify, name=example, note=Do not touch!" host=10.0.0.31; +### Add a link in notification + +It is possible to add a link in notification, that is added below the +formatted notification text. + + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com, link=https://example.com/"; + Tips & Tricks ------------- diff --git a/global-functions.rsc b/global-functions.rsc index d33e3e27..e4d0fd23 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 123; +:global ExpectedConfigVersion 124; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 9536dd75..adcfc372 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -144,7 +144,7 @@ } $SendNotification2 ({ origin=[ $EitherOr ($HostInfo->"origin") $ScriptName ]; silent=($HostInfo->"silent"); \ subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Netwatch Notify: " . $Name . " up"); \ - message=$Message }); + message=$Message; link=($HostInfo->"link") }); } :set ($Metric->"notified") false; :set ($Metric->"parent") ($HostInfo->"parent"); @@ -199,7 +199,7 @@ :if ($HostInfo->"no-down-notification" != true) do={ $SendNotification2 ({ origin=[ $EitherOr ($HostInfo->"origin") $ScriptName ]; silent=($HostInfo->"silent"); \ subject=([ $SymbolForNotification "cross-mark" ] . "Netwatch Notify: " . $Name . " down"); \ - message=$Message }); + message=$Message; link=($HostInfo->"link") }); } :set ($Metric->"notified") true; } diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 6b0a538f..1f1094df 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -48,6 +48,7 @@ 121="The 'wifiwave2' scripts are finally gone. Development continues with 'wifi' in RouterOS 7.13 and later."; 122="The global configuration was enhanced to support loading snippets. Configuration can be split off to scripts where name starts with 'global-config-overlay.d/'."; 123="Introduced new function '\$LogPrint', and deprecated '\$LogPrintExit2'. Please update custom scripts if you use it."; + 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; }; # Migration steps to be applied on script updates From 9b4e5ce369b4061f0d4b02f7cbcf9898cf86d0f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Mar 2024 22:12:03 +0100 Subject: [PATCH 065/988] global-functions: $SymbolByUnicodeName: add these for later use --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index e4d0fd23..2a3c0dd3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1365,6 +1365,9 @@ "mobile-phone"="\F0\9F\93\B1"; "pushpin"="\F0\9F\93\8C"; "scissors"="\E2\9C\82"; + "smiley-partying-face"="\F0\9F\A5\B3"; + "smiley-smiling-face"="\E2\98\BA"; + "smiley-winking-face-with-tongue"="\F0\9F\98\9C"; "sparkles"="\E2\9C\A8"; "speech-balloon"="\F0\9F\92\AC"; "star"="\E2\AD\90"; From eb03a4608bdff08dcbb8ef5776931485625e26f4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Mar 2024 10:05:32 +0100 Subject: [PATCH 066/988] global-functions: $ScriptInstallUpdate: use shorter url --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2a3c0dd3..206c345e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1171,7 +1171,7 @@ "This project is developed in private spare time and usage is " . \ "free of charge for you. If you like the scripts and think this is " . \ "of value for you or your business please consider a donation."); - :set Link "https://git.eworm.de/cgit/routeros-scripts/about/#donate"; + :set Link "https://rsc.eworm.de/#donate"; } $SendNotification2 ({ origin=$0; \ From 2cf4f333d4ab3a0db2742965a430a5d5836c588b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Mar 2024 11:26:44 +0100 Subject: [PATCH 067/988] README: add QR code with (shortened) upstream url --- README.d/upstream.png | Bin 0 -> 207 bytes README.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 README.d/upstream.png diff --git a/README.d/upstream.png b/README.d/upstream.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5e877c7ba42c3475e2ccb0bcacb0d71748b968 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^F(Ayy3?y$VI!FU4&H|6fVg?3oArNM~bhqvgP>?Oa zC&cyt|NlT{=%LGXKq}wU#WAGf*4!(Gj4X}kj|hKN)Y?_<3AZsk#ibn!(f6&t;ucLK6VSvPZ)J literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 61b17256..614095a8 100644 --- a/README.md +++ b/README.md @@ -366,6 +366,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Upstream -------- +![upstream](README.d/upstream.png) + URL: [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) From 576a2c97cf88b7d1b36907469fb6fd34618523b3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Mar 2024 14:42:50 +0100 Subject: [PATCH 068/988] global-functions: $LogPrintExit2: add deprecation warning --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 206c345e..c6167240 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -703,6 +703,10 @@ :local Exit [ :tostr $4 ]; :global LogPrint; + :global LogPrintOnce; + + $LogPrintOnce warning $0 \ + ("This function is deprecated and will be removed. Please make your adjustments!"); $LogPrint $1 $2 $3; From eb7919c1d8b4ad5c77e0d120136c4f54e1e157e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 16 Mar 2024 23:10:47 +0100 Subject: [PATCH 069/988] global-functions: generate user agent string in function... ... and add the caller and my shortened url. --- check-certificates.rsc | 2 +- fw-addr-lists.rsc | 4 ++-- global-functions.rsc | 27 ++++++++++++++++----------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 75049552..9aa24fd3 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -48,7 +48,7 @@ :foreach Type in={ ".pem"; ".p12" } do={ :local CertFileName ([ $UrlEncode $Name ] . $Type); :do { - /tool/fetch check-certificate=yes-without-crl http-header-field=({ $FetchUserAgent }) \ + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $0 ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; $WaitForFile $CertFileName; diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 64233ac1..3a422e8f 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -14,12 +14,12 @@ :do { :local ScriptName [ :jobname ]; - :global FetchUserAgent; :global FwAddrLists; :global FwAddrListTimeOut; :global CertificateAvailable; :global EitherOr; + :global FetchUserAgent; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -65,7 +65,7 @@ :if ($Data = false) do={ :do { :set Data ([ /tool/fetch check-certificate=$CheckCertificate output=user \ - http-header-field=({ $FetchUserAgent }) ($List->"url") as-value ]->"data"); + http-header-field=({ [ $FetchUserAgent $ScriptName ] }) ($List->"url") as-value ]->"data"); } on-error={ :if ($I < 4) do={ $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); diff --git a/global-functions.rsc b/global-functions.rsc index c6167240..8df70f1a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -16,12 +16,6 @@ # global variables not to be changed by user :global GlobalFunctionsReady false; -:global FetchUserAgent; -{ - :local Resource [ /system/resource/get ]; - :set FetchUserAgent ("User-Agent: Mikrotik/" . $Resource->"version" . \ - " " . $Resource->"architecture-name" . " Fetch"); -} :global Identity [ /system/identity/get name ]; # global functions @@ -38,6 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; +:global FetchUserAgent; :global FormatLine; :global FormatMultiLines; :global GetMacVendor; @@ -137,11 +132,11 @@ :set CertificateDownload do={ :local CommonName [ :tostr $1 ]; - :global FetchUserAgent; :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; :global CertificateNameByCN; + :global FetchUserAgent; :global LogPrint; :global UrlEncode; :global WaitForFile; @@ -151,7 +146,7 @@ :do { :local LocalFileName ($CommonName . ".pem"); :local UrlFileName ([ $UrlEncode $CommonName ] . ".pem"); - /tool/fetch check-certificate=yes-without-crl http-header-field=({ $FetchUserAgent }) \ + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $0 ] }) \ ($ScriptUpdatesBaseUrl . "certs/" . $UrlFileName . $ScriptUpdatesUrlSuffix) \ dst-path=$LocalFileName as-value; $WaitForFile $LocalFileName; @@ -396,6 +391,16 @@ :return $Return; } +# generate user agent string for fetch +:global FetchUserAgent do={ + :local Caller [ :tostr $1 ]; + + :local Resource [ /system/resource/get ]; + + :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . \ + $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); +} + # format a line for output :set FormatLine do={ :local Key [ :tostr $1 ]; @@ -975,7 +980,6 @@ :local NewComment [ :tostr $2 ]; :global ExpectedConfigVersion; - :global FetchUserAgent; :global Identity; :global IDonate; :global NoNewsAndChangesNotification; @@ -984,6 +988,7 @@ :global CertificateAvailable; :global EitherOr; + :global FetchUserAgent; :global Grep; :global IfThenElse; :global LogPrint; @@ -1029,7 +1034,7 @@ :local Url ($BaseUrl . $ScriptVal->"name" . ".rsc" . $UrlSuffix); $LogPrint debug $0 ("Fetching script '" . $ScriptVal->"name" . "' from url: " . $Url); :local Result [ /tool/fetch check-certificate=yes-without-crl \ - http-header-field=({ $FetchUserAgent }) $Url output=user as-value ]; + http-header-field=({ [ $FetchUserAgent $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set SourceNew ($Result->"data"); } @@ -1112,7 +1117,7 @@ :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 \ - http-header-field=({ $FetchUserAgent }) $Url output=user as-value ]; + http-header-field=({ [ $FetchUserAgent $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set ChangeLogCode ($Result->"data"); } From cd371b69a642d9e3a0bc32795e959c7feef42522 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 16 Mar 2024 23:27:45 +0100 Subject: [PATCH 070/988] global-functions: $CertificateDownload: download via clean name... ... and rename certificates in repository. --- ...ECC CA-3.pem => Cloudflare-Inc-ECC-CA-3.pem} | 0 ...iCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem} | 0 ...DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem} | 0 certs/{GTS CA 1C3.pem => GTS-CA-1C3.pem} | 0 certs/{GTS CA 1P5.pem => GTS-CA-1P5.pem} | 0 ...> GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem} | 0 ...o-Daddy-Secure-Certificate-Authority-G2.pem} | 0 ...arfield-Secure-Certificate-Authority-G2.pem} | 0 global-functions.rsc | 17 ++++++++--------- 9 files changed, 8 insertions(+), 9 deletions(-) rename certs/{Cloudflare Inc ECC CA-3.pem => Cloudflare-Inc-ECC-CA-3.pem} (100%) rename certs/{DigiCert Global G2 TLS RSA SHA256 2020 CA1.pem => DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem} (100%) rename certs/{DigiCert TLS Hybrid ECC SHA384 2020 CA1.pem => DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem} (100%) rename certs/{GTS CA 1C3.pem => GTS-CA-1C3.pem} (100%) rename certs/{GTS CA 1P5.pem => GTS-CA-1P5.pem} (100%) rename certs/{GlobalSign Atlas R3 DV TLS CA 2022 Q3.pem => GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem} (100%) rename certs/{Go Daddy Secure Certificate Authority - G2.pem => Go-Daddy-Secure-Certificate-Authority-G2.pem} (100%) rename certs/{Starfield Secure Certificate Authority - G2.pem => Starfield-Secure-Certificate-Authority-G2.pem} (100%) diff --git a/certs/Cloudflare Inc ECC CA-3.pem b/certs/Cloudflare-Inc-ECC-CA-3.pem similarity index 100% rename from certs/Cloudflare Inc ECC CA-3.pem rename to certs/Cloudflare-Inc-ECC-CA-3.pem diff --git a/certs/DigiCert Global G2 TLS RSA SHA256 2020 CA1.pem b/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem similarity index 100% rename from certs/DigiCert Global G2 TLS RSA SHA256 2020 CA1.pem rename to certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem diff --git a/certs/DigiCert TLS Hybrid ECC SHA384 2020 CA1.pem b/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem similarity index 100% rename from certs/DigiCert TLS Hybrid ECC SHA384 2020 CA1.pem rename to certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem diff --git a/certs/GTS CA 1C3.pem b/certs/GTS-CA-1C3.pem similarity index 100% rename from certs/GTS CA 1C3.pem rename to certs/GTS-CA-1C3.pem diff --git a/certs/GTS CA 1P5.pem b/certs/GTS-CA-1P5.pem similarity index 100% rename from certs/GTS CA 1P5.pem rename to certs/GTS-CA-1P5.pem diff --git a/certs/GlobalSign Atlas R3 DV TLS CA 2022 Q3.pem b/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem similarity index 100% rename from certs/GlobalSign Atlas R3 DV TLS CA 2022 Q3.pem rename to certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem diff --git a/certs/Go Daddy Secure Certificate Authority - G2.pem b/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem similarity index 100% rename from certs/Go Daddy Secure Certificate Authority - G2.pem rename to certs/Go-Daddy-Secure-Certificate-Authority-G2.pem diff --git a/certs/Starfield Secure Certificate Authority - G2.pem b/certs/Starfield-Secure-Certificate-Authority-G2.pem similarity index 100% rename from certs/Starfield Secure Certificate Authority - G2.pem rename to certs/Starfield-Secure-Certificate-Authority-G2.pem diff --git a/global-functions.rsc b/global-functions.rsc index 8df70f1a..ca238ba0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -136,25 +136,24 @@ :global ScriptUpdatesUrlSuffix; :global CertificateNameByCN; + :global CleanName; :global FetchUserAgent; :global LogPrint; - :global UrlEncode; :global WaitForFile; $LogPrint info $0 ("Downloading and importing certificate with " . \ "CommonName \"" . $CommonName . "\"."); :do { - :local LocalFileName ($CommonName . ".pem"); - :local UrlFileName ([ $UrlEncode $CommonName ] . ".pem"); + :local FileName ([ $CleanName $CommonName ] . ".pem"); /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $0 ] }) \ - ($ScriptUpdatesBaseUrl . "certs/" . $UrlFileName . $ScriptUpdatesUrlSuffix) \ - dst-path=$LocalFileName as-value; - $WaitForFile $LocalFileName; - /certificate/import file-name=$LocalFileName passphrase="" as-value; + ($ScriptUpdatesBaseUrl . "certs/" . $FileName . $ScriptUpdatesUrlSuffix) \ + dst-path=$FileName as-value; + $WaitForFile $FileName; + /certificate/import file-name=$FileName passphrase="" as-value; :delay 1s; - /file/remove $LocalFileName; + /file/remove $FileName; - :foreach Cert in=[ /certificate/find where name~("^" . $LocalFileName . "_[0-9]+\$") ] do={ + :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } } on-error={ From 079249f3d7a1c4c11aa2b4d93b3cf239b0f5da0d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 18 Mar 2024 09:31:40 +0100 Subject: [PATCH 071/988] check-routeros-update: use custom user agent string --- check-routeros-update.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index e209610a..fde7cb51 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -24,6 +24,7 @@ :global DeviceInfo; :global EscapeForRegEx; + :global FetchUserAgent; :global LogPrint; :global ScriptFromTerminal; :global ScriptLock; @@ -108,7 +109,8 @@ :do { :set Result [ /tool/fetch check-certificate=yes-without-crl \ ($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \ - "&latest=" . $Update->"latest-version") output=user as-value ]; + "&latest=" . $Update->"latest-version") http-header-field=({ [ $FetchUserAgent $ScriptName ] }) \ + output=user as-value ]; } on-error={ $LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . "."); } From be231ce4f3a3d829e7892b6f17751d04991ccd42 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 18 Mar 2024 13:46:46 +0100 Subject: [PATCH 072/988] global-config: prepare a (commented) address-list for Mikrotik This is AS51894: https://bgp.he.net/AS51894 --- global-config.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-config.rsc b/global-config.rsc index 2b688bc2..63a4a3f7 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -104,6 +104,10 @@ # { url="https://www.spamhaus.org/drop/edrop.txt"; # cert="Cloudflare Inc ECC CA-3" }; }; +# "mikrotik"={ +# { url="https://eworm.de/ros/fw-addr-lists/mikrotik"; +# cert="E1"; timeout=1w }; +# }; }; :global FwAddrListTimeOut 1d; From 6845eb69b3fb47038bb3d69ba239fd8678447409 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 20 Mar 2024 13:34:37 +0100 Subject: [PATCH 073/988] global-config: put example fw-addr-lists into repository --- fw-addr-lists.d/allow | 3 +++ fw-addr-lists.d/block | 5 +++++ fw-addr-lists.d/mikrotik | 5 +++++ global-config.rsc | 6 +++--- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 fw-addr-lists.d/allow create mode 100644 fw-addr-lists.d/block create mode 100644 fw-addr-lists.d/mikrotik diff --git a/fw-addr-lists.d/allow b/fw-addr-lists.d/allow new file mode 100644 index 00000000..8b59ed7c --- /dev/null +++ b/fw-addr-lists.d/allow @@ -0,0 +1,3 @@ +# an ip address list for use with fw-addr-lists script +# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +git.eworm.de diff --git a/fw-addr-lists.d/block b/fw-addr-lists.d/block new file mode 100644 index 00000000..5e9fef29 --- /dev/null +++ b/fw-addr-lists.d/block @@ -0,0 +1,5 @@ +# an ip address list for use with fw-addr-lists script +# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md + +# example.net +93.184.216.34 diff --git a/fw-addr-lists.d/mikrotik b/fw-addr-lists.d/mikrotik new file mode 100644 index 00000000..3b31a94f --- /dev/null +++ b/fw-addr-lists.d/mikrotik @@ -0,0 +1,5 @@ +# AS51894 Mikrotikls SIA +# https://bgp.he.net/AS51894 +159.148.147.0/24 +159.148.172.0/24 +2a02:610:7501::/48 diff --git a/global-config.rsc b/global-config.rsc index 63a4a3f7..f393abb4 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -87,11 +87,11 @@ # This defines the settings for firewall address-lists (fw-addr-lists). :global FwAddrLists { # "allow"={ -# { url="https://eworm.de/ros/fw-addr-lists/allow"; +# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/allow"; # cert="E1"; timeout=1w }; # }; "block"={ -# { url="https://eworm.de/ros/fw-addr-lists/block"; +# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; # cert="E1" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; @@ -105,7 +105,7 @@ # cert="Cloudflare Inc ECC CA-3" }; }; # "mikrotik"={ -# { url="https://eworm.de/ros/fw-addr-lists/mikrotik"; +# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; # cert="E1"; timeout=1w }; # }; }; From 81f1d9aa99b928fea43612a9e2e58e4c17eee7d6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 20 Mar 2024 13:55:55 +0100 Subject: [PATCH 074/988] check-certificates: pass script name into local function --- check-certificates.rsc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 9aa24fd3..ab78e226 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -31,7 +31,8 @@ :global WaitFullyConnected; :local CheckCertificatesDownloadImport do={ - :local Name [ :tostr $1 ]; + :local ScriptName [ :tostr $1 ]; + :local Name [ :tostr $2 ]; :global CertRenewUrl; :global CertRenewPass; @@ -48,7 +49,7 @@ :foreach Type in={ ".pem"; ".p12" } do={ :local CertFileName ([ $UrlEncode $Name ] . $Type); :do { - /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $0 ] }) \ + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; $WaitForFile $CertFileName; @@ -62,7 +63,7 @@ /file/remove [ find where name=$CertFileName ]; :if ($DecryptionFailed = true) do={ - $LogPrint warning $0 ("Decryption failed for certificate file '" . $CertFileName . "'."); + $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); } :foreach CertInChain in=[ /certificate/find where name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ @@ -72,7 +73,7 @@ :set Return true; } on-error={ - $LogPrint debug $0 ("Could not download certificate file '" . $CertFileName . "'."); + $LogPrint debug $ScriptName ("Could not download certificate file '" . $CertFileName . "'."); } } @@ -150,11 +151,11 @@ :local ImportSuccess false; :set LastName ($CertVal->"common-name"); - :set ImportSuccess [ $CheckCertificatesDownloadImport $LastName ]; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; :foreach SAN in=($CertVal->"subject-alt-name") do={ :if ($ImportSuccess = false) do={ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; - :set ImportSuccess [ $CheckCertificatesDownloadImport $LastName ]; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; } } :if ($ImportSuccess = false) do={ :error false; } From 6628d9f9665cc224423c904ef65d84a25c8de817 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 20 Mar 2024 13:59:44 +0100 Subject: [PATCH 075/988] netwatch-notify: pass script name into local functions --- netwatch-notify.rsc | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index adcfc372..bdabe2ec 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -27,10 +27,11 @@ :global SymbolForNotification; :local NetwatchNotifyHook do={ - :local Name [ :tostr $1 ]; - :local Type [ :tostr $2 ]; - :local State [ :tostr $3 ]; - :local Hook [ :tostr $4 ]; + :local ScriptName [ :tostr $1 ]; + :local Name [ :tostr $2 ]; + :local Type [ :tostr $3 ]; + :local State [ :tostr $4 ]; + :local Hook [ :tostr $5 ]; :global LogPrint; :global ValidateSyntax; @@ -39,25 +40,26 @@ :do { [ :parse $Hook ]; } on-error={ - $LogPrint warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run."); + $LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run."); :return ("The hook failed to run."); } } else={ - $LogPrint warning $0 ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed syntax validation."); + $LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed syntax validation."); :return ("The hook failed syntax validation."); } - $LogPrint info $0 ("Ran hook on " . $Type . " '" . $Name . "' " . $State . ": " . $Hook); + $LogPrint info $ScriptName ("Ran hook on " . $Type . " '" . $Name . "' " . $State . ": " . $Hook); :return ("Ran hook:\n" . $Hook); } :local ResolveExpected do={ - :local Name [ :tostr $1 ]; - :local Expected [ :tostr $2 ]; + :local ScriptName [ :tostr $1 ]; + :local Name [ :tostr $2 ]; + :local Expected [ :tostr $3 ]; :global GetRandom20CharAlNum; - :local FwAddrList ($0 . "-" . [ $GetRandom20CharAlNum ]); + :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=1s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ @@ -102,7 +104,7 @@ :do { :local Resolve [ :resolve ($HostInfo->"resolve") ]; :if ($Resolve != $HostVal->"host") do={ - :if ([ $ResolveExpected ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={ + :if ([ $ResolveExpected $ScriptName ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={ $LogPrint info $ScriptName ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ $HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \ @@ -139,7 +141,7 @@ :set Message ($Message . "\n\nNote:\n" . ($HostInfo->"note")); } :if ([ :typeof ($HostInfo->"up-hook") ] = "str") do={ - :set Message ($Message . "\n\n" . [ $NetwatchNotifyHook $Name $Type "up" \ + :set Message ($Message . "\n\n" . [ $NetwatchNotifyHook $ScriptName $Name $Type "up" \ ($HostInfo->"up-hook") ]); } $SendNotification2 ({ origin=[ $EitherOr ($HostInfo->"origin") $ScriptName ]; silent=($HostInfo->"silent"); \ @@ -183,7 +185,7 @@ } :if ((($CountDown * 2) - ($Metric->"count-down" * 3)) / 2 = 0 && \ [ :typeof ($HostInfo->"pre-down-hook") ] = "str") do={ - $NetwatchNotifyHook $Name $Type "pre-down" ($HostInfo->"pre-down-hook"); + $NetwatchNotifyHook $ScriptName $Name $Type "pre-down" ($HostInfo->"pre-down-hook"); } :if ($ParentNotified = false && $Metric->"count-down" >= $CountDown && \ ($ParentUp = false || $ParentUp > 2) && $Metric->"notified" != true) do={ @@ -193,7 +195,7 @@ :set Message ($Message . "\n\nNote:\n" . ($HostInfo->"note")); } :if ([ :typeof ($HostInfo->"down-hook") ] = "str") do={ - :set Message ($Message . "\n\n" . [ $NetwatchNotifyHook $Name $Type "down" \ + :set Message ($Message . "\n\n" . [ $NetwatchNotifyHook $ScriptName $Name $Type "down" \ ($HostInfo->"down-hook") ]); } :if ($HostInfo->"no-down-notification" != true) do={ From cc81e556491c40d9b2a0d164eda16e196ac72aa6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 21 Mar 2024 13:39:56 +0100 Subject: [PATCH 076/988] telegram-chat: improve readability with symbols --- global-functions.rsc | 1 + telegram-chat.rsc | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ca238ba0..1b1a8c87 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1361,6 +1361,7 @@ "earth"="\F0\9F\8C\8D"; "fire"="\F0\9F\94\A5"; "floppy-disk"="\F0\9F\92\BE"; + "gear"="\E2\9A\99"; "heart"="\E2\99\A5"; "high-voltage-sign"="\E2\9A\A1"; "incoming-envelope"="\F0\9F\93\A8"; diff --git a/telegram-chat.rsc b/telegram-chat.rsc index c81b7141..4245cfde 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -136,23 +136,26 @@ :execute script=(":do {\n" . $Message->"text" . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ "/file/add name=\"" . $File . ".done\"") file=($File . "\00"); :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ - :set State "The command did not finish, still running in background.\n\n"; + :set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n"); } :if ([ :len [ /file/find where name=($File . ".failed") ] ] > 0) do={ - :set State "The command failed with an error!\n\n"; + :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } :local Content [ /file/get $File contents ]; $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=("Command:\n" . $Message->"text" . "\n\n" . $State . [ $IfThenElse ([ :len $Content ] > 0) \ - ("Output:\n" . $Content) [ $IfThenElse ([ /file/get $File size ] > 0) \ - ("Output exceeds file read size.") ("No output.") ] ]) }); + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + $State . [ $IfThenElse ([ :len $Content ] > 0) \ + ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) [ $IfThenElse ([ /file/get $File size ] > 0) \ + ([ $SymbolForNotification "warning-sign" ] . "Output exceeds file read size.") \ + ([ $SymbolForNotification "memo" ] . "No output.") ] ]) }); /file/remove "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=("Command:\n" . $Message->"text" . "\n\nThe command failed syntax validation!") }); + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + [ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") }); } } } else={ From f72aadfc591ece4c79522256e5b6a4d71fb18467 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 21 Mar 2024 21:10:51 +0100 Subject: [PATCH 077/988] telegram-chat: note active state when answering broadcast --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 4245cfde..9ae59670 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -111,7 +111,7 @@ $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=("Online, awaiting your commands!") }); + message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } :if ($Done = false && [ :pick ($Message->"text") 0 1 ] = "!") do={ From 9ec8b9c03fbd5529eee0d62417d5de8ffc72abd4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 26 Mar 2024 08:37:07 +0100 Subject: [PATCH 078/988] fw-addr-lists: one more interation on download failure... ... with even more delay. This script is called with long interval from scheduler, so should not be an issue. --- fw-addr-lists.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 3a422e8f..887263eb 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -61,13 +61,13 @@ } } - :for I from=1 to=4 do={ + :for I from=1 to=5 do={ :if ($Data = false) do={ :do { :set Data ([ /tool/fetch check-certificate=$CheckCertificate output=user \ http-header-field=({ [ $FetchUserAgent $ScriptName ] }) ($List->"url") as-value ]->"data"); } on-error={ - :if ($I < 4) do={ + :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); :delay (($I * $I) . "s"); } From bd2301a28cf34bb0302487719a82a40cd64fa4ef Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 26 Mar 2024 13:51:44 +0100 Subject: [PATCH 079/988] global-functions: $LogPrintOnce: indicate action via return --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1b1a8c87..59ba0399 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -734,11 +734,12 @@ } :if ($LogPrintOnceMessages->$Message = 1) do={ - :return true; + :return false; } :set ($LogPrintOnceMessages->$Message) 1; $LogPrint $Severity $Name $Message; + :return true; } # get max value From 43ecec854fccb27bdf4424d684f72519f75e0484 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 07:43:32 +0100 Subject: [PATCH 080/988] global-functions: $LogPrintOnce: detect and warn on possible crash --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 59ba0399..b3d8719e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -737,6 +737,11 @@ :return false; } + :if ([ :len [ /log/find where message=($Name . ": " . $Message) ] ] > 0) do={ + $LogPrint warning $0 \ + ("The message is already in log, scripting subsystem may have crashed before!"); + } + :set ($LogPrintOnceMessages->$Message) 1; $LogPrint $Severity $Name $Message; :return true; From 7212d8bd23c555970e22fa43edb56dabfe14b820 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 22:17:06 +0100 Subject: [PATCH 081/988] packages-update: do not reboot when scheduled --- packages-update.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index 2723b3b7..0208b1e6 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -130,10 +130,12 @@ :put "Do you want to (s)chedule reboot or (r)eboot now? [s/R]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 19) do={ $Schedule $ScriptName; + :error true; } } else={ :if ($PackagesUpdateDeferReboot = true) do={ $Schedule $ScriptName; + :error true; } } From 1d816d94f60ed953e67760bf2f567442002c0a6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 22:58:33 +0100 Subject: [PATCH 082/988] global-functions: $FetchUserAgent: set declared function only --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index b3d8719e..35eeca9a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -391,7 +391,7 @@ } # generate user agent string for fetch -:global FetchUserAgent do={ +:set FetchUserAgent do={ :local Caller [ :tostr $1 ]; :local Resource [ /system/resource/get ]; From acf8e88db2c3a96b1d196d29e19f3f65be9c21eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:00:27 +0100 Subject: [PATCH 083/988] global-functions: $AlignRight: set declared function only --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 35eeca9a..919ffbed 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -79,7 +79,7 @@ :global WaitTimeSync; # align string to the right -:global AlignRight do={ +:set AlignRight do={ :local Input [ :tostr $1 ]; :local Len [ :tonum $2 ]; From bbdc9c65f50d2d290e4cd15a8c49ec0cb36a347d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:01:07 +0100 Subject: [PATCH 084/988] global-functions: $HumanReadableNum: set declared function only --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 919ffbed..17ccda82 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -528,7 +528,7 @@ } # return human readable number -:global HumanReadableNum do={ +:set HumanReadableNum do={ :local Input [ :tonum $1 ]; :local Base [ :tonum $2 ]; From 4df1468e2569dfc1603876e24a9be933dc8cf8f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 29 Mar 2024 11:09:22 +0100 Subject: [PATCH 085/988] global-functions: rename $FetchUserAgent -> $FetchUserAgentStr ... to make sure the function does not clash with the variable we had before, as this causes issue with news and changes notification. --- check-certificates.rsc | 4 ++-- check-routeros-update.rsc | 4 ++-- fw-addr-lists.rsc | 4 ++-- global-functions.rsc | 14 +++++++------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index ab78e226..20e2902f 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -39,7 +39,7 @@ :global CertificateNameByCN; :global EscapeForRegEx; - :global FetchUserAgent; + :global FetchUserAgentStr; :global LogPrint; :global UrlEncode; :global WaitForFile; @@ -49,7 +49,7 @@ :foreach Type in={ ".pem"; ".p12" } do={ :local CertFileName ([ $UrlEncode $Name ] . $Type); :do { - /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $ScriptName ] }) \ + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; $WaitForFile $CertFileName; diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index fde7cb51..c9ab93b3 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -24,7 +24,7 @@ :global DeviceInfo; :global EscapeForRegEx; - :global FetchUserAgent; + :global FetchUserAgentStr; :global LogPrint; :global ScriptFromTerminal; :global ScriptLock; @@ -109,7 +109,7 @@ :do { :set Result [ /tool/fetch check-certificate=yes-without-crl \ ($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \ - "&latest=" . $Update->"latest-version") http-header-field=({ [ $FetchUserAgent $ScriptName ] }) \ + "&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" . "."); diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 887263eb..68775b41 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -19,7 +19,7 @@ :global CertificateAvailable; :global EitherOr; - :global FetchUserAgent; + :global FetchUserAgentStr; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -65,7 +65,7 @@ :if ($Data = false) do={ :do { :set Data ([ /tool/fetch check-certificate=$CheckCertificate output=user \ - http-header-field=({ [ $FetchUserAgent $ScriptName ] }) ($List->"url") as-value ]->"data"); + http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) ($List->"url") as-value ]->"data"); } on-error={ :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); diff --git a/global-functions.rsc b/global-functions.rsc index 17ccda82..1e98019c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -32,7 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; -:global FetchUserAgent; +:global FetchUserAgentStr; :global FormatLine; :global FormatMultiLines; :global GetMacVendor; @@ -137,7 +137,7 @@ :global CertificateNameByCN; :global CleanName; - :global FetchUserAgent; + :global FetchUserAgentStr; :global LogPrint; :global WaitForFile; @@ -145,7 +145,7 @@ "CommonName \"" . $CommonName . "\"."); :do { :local FileName ([ $CleanName $CommonName ] . ".pem"); - /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgent $0 ] }) \ + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ ($ScriptUpdatesBaseUrl . "certs/" . $FileName . $ScriptUpdatesUrlSuffix) \ dst-path=$FileName as-value; $WaitForFile $FileName; @@ -391,7 +391,7 @@ } # generate user agent string for fetch -:set FetchUserAgent do={ +:set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; :local Resource [ /system/resource/get ]; @@ -993,7 +993,7 @@ :global CertificateAvailable; :global EitherOr; - :global FetchUserAgent; + :global FetchUserAgentStr; :global Grep; :global IfThenElse; :global LogPrint; @@ -1039,7 +1039,7 @@ :local Url ($BaseUrl . $ScriptVal->"name" . ".rsc" . $UrlSuffix); $LogPrint debug $0 ("Fetching script '" . $ScriptVal->"name" . "' from url: " . $Url); :local Result [ /tool/fetch check-certificate=yes-without-crl \ - http-header-field=({ [ $FetchUserAgent $0 ] }) $Url output=user as-value ]; + http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set SourceNew ($Result->"data"); } @@ -1122,7 +1122,7 @@ :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 \ - http-header-field=({ [ $FetchUserAgent $0 ] }) $Url output=user as-value ]; + http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set ChangeLogCode ($Result->"data"); } From bdcf5b327518e5c8806bdb9a1896f86523ec2925 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Mar 2024 22:32:15 +0100 Subject: [PATCH 086/988] news on charge and fees --- global-functions.rsc | 2 +- news-and-changes.rsc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1e98019c..bd723139 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 124; +:global ExpectedConfigVersion 125; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 1f1094df..e66ad2e5 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -49,6 +49,7 @@ 122="The global configuration was enhanced to support loading snippets. Configuration can be split off to scripts where name starts with 'global-config-overlay.d/'."; 123="Introduced new function '\$LogPrint', and deprecated '\$LogPrintExit2'. Please update custom scripts if you use it."; 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; + 125=("Donations do not pay off, thus I will start charging fees soon: 5\C2\A2 each notification, 20\C2\A2 each backup, 50\C2\A2 for script updates. Please add credit card information and mail address for invoice."); }; # Migration steps to be applied on script updates @@ -57,4 +58,5 @@ 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; + 125="/system/scheduler/add interval=20h name=_AprilsFool on-event=\"/system/scheduler/remove _AprilsFool; :global SendNotification; :global SymbolForNotification; \\\$SendNotification ([ \\\$SymbolForNotification \\\"smiley-partying-face\\\" ] . \\\"April's Fool!\\\") (\\\"Just played an April's Fool... Of course this project is and remains open source, free of charge and fees.\\\\n\\\\n(Anyway... Donations are much appreciated, \\\" . [ \\\$SymbolForNotification \\\"smiley-smiling-face\\\" ] . \\\"thanks!)\\\") \\\"https://rsc.eworm.de/#donate\\\";\";"; }; From 1e47c909f08a71d850f252bf5ccec7330e436d05 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Mar 2024 22:36:27 +0100 Subject: [PATCH 087/988] =?UTF-8?q?news=20on=20April's=20Fool!=20?= =?UTF-8?q?=F0=9F=A5=B3=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- news-and-changes.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/news-and-changes.rsc b/news-and-changes.rsc index e66ad2e5..5523c73d 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -49,7 +49,7 @@ 122="The global configuration was enhanced to support loading snippets. Configuration can be split off to scripts where name starts with 'global-config-overlay.d/'."; 123="Introduced new function '\$LogPrint', and deprecated '\$LogPrintExit2'. Please update custom scripts if you use it."; 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; - 125=("Donations do not pay off, thus I will start charging fees soon: 5\C2\A2 each notification, 20\C2\A2 each backup, 50\C2\A2 for script updates. Please add credit card information and mail address for invoice."); + 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); }; # Migration steps to be applied on script updates @@ -58,5 +58,4 @@ 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; - 125="/system/scheduler/add interval=20h name=_AprilsFool on-event=\"/system/scheduler/remove _AprilsFool; :global SendNotification; :global SymbolForNotification; \\\$SendNotification ([ \\\$SymbolForNotification \\\"smiley-partying-face\\\" ] . \\\"April's Fool!\\\") (\\\"Just played an April's Fool... Of course this project is and remains open source, free of charge and fees.\\\\n\\\\n(Anyway... Donations are much appreciated, \\\" . [ \\\$SymbolForNotification \\\"smiley-smiling-face\\\" ] . \\\"thanks!)\\\") \\\"https://rsc.eworm.de/#donate\\\";\";"; }; From 7e5010a60853c946e6e73406031fe0e937bee8df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 28 Mar 2024 22:33:49 +0100 Subject: [PATCH 088/988] telegram-chat: use :deserialize ... ... instead of $ParseJson. This requires RouterOS 7.13. --- telegram-chat.rsc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 3d0f3976..c1a1cbcc 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -34,7 +34,6 @@ :global MAX; :global MIN; :global MkDir; - :global ParseJson; :global RandomDelay; :global ScriptLock; :global SendTelegram2; @@ -86,18 +85,18 @@ :error false; } + :local JSON [ :deserialize from=json value=$Data ]; :local UpdateID 0; :local Uptime [ /system/resource/get uptime ]; - :foreach UpdateArray in=([ $ParseJson $Data ]->"result") do={ - :local Update [ $ParseJson $UpdateArray ]; + :foreach Update in=($JSON->"result") do={ :set UpdateID ($Update->"update_id"); - :local Message [ $ParseJson ($Update->"message") ]; + :local Message ($Update->"message"); :local IsReply [ :len ($Message->"reply_to_message") ]; - :local IsMyReply ($TelegramMessageIDs->([ $ParseJson ($Message->"reply_to_message") ]->"message_id")); + :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; - :local Chat [ $ParseJson ($Message->"chat") ]; - :local From [ $ParseJson ($Message->"from") ]; + :local Chat ($Message->"chat"); + :local From ($Message->"from"); :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ From 29bcbc4db9d39573e8c8017e75eea4df7f603c2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 28 Mar 2024 22:43:18 +0100 Subject: [PATCH 089/988] mod/notification-telegram: use :deserialize ... ... instead of $ParseJson. This requires RouterOS 7.13. --- doc/mod/notification-telegram.md | 2 +- mod/notification-telegram.rsc | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index cb326f0d..159fda90 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -4,7 +4,7 @@ Send notifications via Telegram [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 506ec802..a43ff10d 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # send notifications via Telegram # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-telegram.md @@ -19,7 +21,6 @@ :global IsFullyConnected; :global LogPrint; - :global ParseJson; :global UrlEncode; :if ([ $IsFullyConnected ] = false) do={ @@ -43,7 +44,7 @@ "&reply_to_message_id=" . ($Message->"replyto") . "&disable_web_page_preview=true" . \ "&parse_mode=MarkdownV2&text=" . [ $UrlEncode ($Message->"text") ]) as-value ]->"data"); :set ($TelegramQueue->$Id); - :set ($TelegramMessageIDs->([ $ParseJson ([ $ParseJson $Data ]->"result") ]->"message_id")) 1; + :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; } on-error={ $LogPrint debug $0 ("Sending queued Telegram message failed."); :set AllDone false; @@ -75,7 +76,6 @@ :global EitherOr; :global IfThenElse; :global LogPrint; - :global ParseJson; :global SymbolForNotification; :global UrlEncode; @@ -144,7 +144,7 @@ http-data=("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ "&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); - :set ($TelegramMessageIDs->([ $ParseJson ([ $ParseJson $Data ]->"result") ]->"message_id")) 1; + :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; } on-error={ $LogPrint info $0 ("Failed sending telegram notification! Queuing..."); From bb237dcef3fea8c5a6988cc52b2a0360078faad8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 28 Mar 2024 22:54:23 +0100 Subject: [PATCH 090/988] mod/notification-matrix: use :deserialize ... ... instead of $ParseJson. This requires RouterOS 7.13. --- doc/mod/notification-matrix.md | 2 +- mod/notification-matrix.rsc | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index c68b0aad..88628e4b 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -4,7 +4,7 @@ Send notifications via Matrix [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index aa958419..82347794 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -4,6 +4,8 @@ # Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # send notifications via Matrix # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-matrix.md @@ -183,9 +185,7 @@ :local User [ :tostr $1 ]; :local Pass [ :tostr $2 ]; - :global CharacterReplace; :global LogPrint; - :global ParseJson; :global MatrixAccessToken; :global MatrixHomeServer; @@ -194,7 +194,7 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ ("https://" . $Domain . "/.well-known/matrix/client") as-value ]->"data"); - :set MatrixHomeServer ([ $ParseJson ([ $ParseJson [ $CharacterReplace $Data " " "" ] ]->"m.homeserver") ]->"base_url"); + :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!"); @@ -209,7 +209,7 @@ :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-method=post http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data"); - :set MatrixAccessToken ([ $ParseJson $Data ]->"access_token"); + :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)!"); From c01a424f4f41997d1b8b4a45c2bb033f37470393 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 28 Mar 2024 21:29:27 +0100 Subject: [PATCH 091/988] telegram-chat: read file content... ... instead of getting it. This lifts the size limit, though we are still limited by Telegram message size. This requires RouterOS 7.13. --- doc/telegram-chat.md | 7 +++---- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + telegram-chat.rsc | 9 ++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/telegram-chat.md b/doc/telegram-chat.md index 2a4af997..eb4acf5a 100644 --- a/doc/telegram-chat.md +++ b/doc/telegram-chat.md @@ -4,7 +4,7 @@ Chat with your router and send commands via Telegram bot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) @@ -130,9 +130,8 @@ send information on its own. Something like this should do the job: ### Output size -RouterOS is limited in reading file content to a size of about four -kilobytes. Reading larger files does just fail, and that is also the limit -for command output. +Telegram messages have a limit of 4096 characters. If output is too large it +is truncated, and a warning is added to the message. ### Sending commands to a group diff --git a/global-functions.rsc b/global-functions.rsc index bd723139..b2ef3a25 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 125; +:global ExpectedConfigVersion 126; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 5523c73d..2b04c29d 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -50,6 +50,7 @@ 123="Introduced new function '\$LogPrint', and deprecated '\$LogPrintExit2'. Please update custom scripts if you use it."; 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); + 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; }; # Migration steps to be applied on script updates diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 9ae59670..3d0f3976 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # use Telegram to chat with your Router and send commands # https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md @@ -141,14 +141,13 @@ :if ([ :len [ /file/find where name=($File . ".failed") ] ] > 0) do={ :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } - :local Content [ /file/get $File contents ]; + :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ $State . [ $IfThenElse ([ :len $Content ] > 0) \ - ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) [ $IfThenElse ([ /file/get $File size ] > 0) \ - ([ $SymbolForNotification "warning-sign" ] . "Output exceeds file read size.") \ - ([ $SymbolForNotification "memo" ] . "No output.") ] ]) }); + ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) \ + ([ $SymbolForNotification "memo" ] . "No output.") ]) }); /file/remove "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); From 4db91ec16eb482d0989435f40373f455f1665f97 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 28 Mar 2024 23:27:57 +0100 Subject: [PATCH 092/988] global-functions: drop $ParseJson --- global-functions.rsc | 61 -------------------------------------------- 1 file changed, 61 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index b2ef3a25..e19ed654 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -56,7 +56,6 @@ :global MkDir; :global NotificationFunctions; :global ParseDate; -:global ParseJson; :global ParseKeyValueStore; :global PrettyPrint; :global RandomDelay; @@ -830,66 +829,6 @@ "day"=[ :tonum [ :pick $Date 8 10 ] ] }); } -# parse JSON into array -# Warning: This is not a complete parser! -:set ParseJson do={ - :local Input [ :tostr $1 ]; - - :local InLen; - :local Return ({}); - :local Skip 0; - - :if ([ :pick $Input 0 ] = "{") do={ - :set Input [ :pick $Input 1 ([ :len $Input ] - 1) ]; - } - :set Input [ :toarray $Input ]; - :set InLen [ :len $Input ]; - - :for I from=0 to=$InLen do={ - :if ($Skip > 0 || $Input->$I = "\n" || $Input->$I = "\r\n") do={ - :if ($Skip > 0) do={ - :set $Skip ($Skip - 1); - } - } else={ - :local Done false; - :local Key ($Input->$I); - :local Val1 ($Input->($I + 1)); - :local Val2 ($Input->($I + 2)); - :if ($Val1 = ":") do={ - :set Skip 2; - :set ($Return->$Key) $Val2; - :set Done true; - } - :if ($Done = false && $Val1 = ":[") do={ - :local Last false; - :set Skip 1; - :set ($Return->$Key) ({}); - :do { - :set Skip ($Skip + 1); - :local ValX ($Input->($I + $Skip)); - :if ([ :pick $ValX ([ :len $ValX ] - 1) ] = "]") do={ - :set Last true; - :set ValX [ :pick $ValX 0 ([ :len $ValX ] - 1) ]; - } - :set ($Return->$Key) (($Return->$Key), $ValX); - } while=($Last = false && $I + $Skip < $InLen); - :set Done true; - } - :if ($Done = false && $Val1 = ":[]") do={ - :set Skip 1; - :set ($Return->$Key) ({}); - :set Done true; - } - :if ($Done = false) do={ - :set Skip 1; - :set ($Return->$Key) [ :pick $Val1 1 [ :len $Val1 ] ]; - } - } - } - - :return $Return; -} - # parse key value store :set ParseKeyValueStore do={ :local Source $1; From 6f6840680359757838664b1ae5f38cc47e90e37a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 1 Apr 2024 23:40:09 +0200 Subject: [PATCH 093/988] mod/notification-matrix: add new configuration snippet... ... instead of appending to global-config-overlay. --- .../01-authenticate.avif | Bin 4209 -> 3870 bytes .../notification-matrix.d/02-join-room.avif | Bin 3955 -> 3745 bytes doc/mod/notification-matrix.md | 7 +++++-- mod/notification-matrix.rsc | 15 +++++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/doc/mod/notification-matrix.d/01-authenticate.avif b/doc/mod/notification-matrix.d/01-authenticate.avif index 1db516b784b2779b1ab1054fcb149753b2c53dbf..b897943b1fc7d8c7c0ac6a9f225733d24dff9e37 100644 GIT binary patch delta 2829 zcmV+o3-a{wAf6tOdK3wf000Gz00IC2009610b2k72sV+9#{vz@lUD(N0;~tK*#Ub3 zf8bxk*LQNobem?QSjNg1WC-uim`wLe;=Ao zm+$o&BR}Z+GDP#I`p(N0lLR%2$wB9JUIv;PxZdxT$rGQgkUcrFkN@avpXd z;;c&ATAreA&nxo;q_^7s{-NsYW#)Gi^U6(b5B@ z=H64_hEz+4k^<6z9FnVs$;0HKe;nj<&r(hz!D(e`Zf|@uIn&(2R!!^)!Z2cACmWfR z;9ztfm4Ldoq_M{u>K9=nAfkzz3yfm}JYxeNN=bEHMtf0fHT~3<;9x}aF+e!u1mm#$ zg;SekM-2$8CjRz!^GRWGti8;B2WZdTFku2HQpA9~4a5LCXXQTiUe3o(e_yb&_!{x% z^Ajxdv5rH}7$+Df9eBV!tCO+UHE-=ZX%3}!%p^gUnT|j_1Cz+)@$P+T_d5QtZEWNI z)x8L@a0Ki*5;h6vlkfEOquMbnBoeZ3?|tgAH3&4{_(!F>xlteyr2biLrbp!D zbQm0xNL&uo?-JYEE}tZke|TEr!c}yS?FK?oLL#9U91>U(PjcS1%g29t70TR4cREg> zg_UF>fH}?&UUGjkQe0~KmD~mkoks3xOKvgAGcuFwf^nK$&ekbVikCIt-pYH@gRi082 z(zyYw>VoI(BT~E<8+Li3cHOr-v7F}_=N`06tm>1(@Xe`SNfUq>9(F3gX8?kE>VGII`)h|#)yCVy5<6`l^=YhcE*j3AIPWIEovzu$FA$jh{n$hf5&NM9i@zjrJz{TK4PF;h5!+g zpqw9GxjDn4iU260iU260iU260iU85kf8+800PC6lVz+AxMgIVg$NvDXXZecVpb!7q z5&#MbI3;p8*g!);q%!>qOvnV>gUn8L^U<9O&$%+0w`#KYA*%KrmdO!#yl1n5_^(n` zSEOf?f0Aid#mxDd`A%ziOmGlDunhQ<7iOxZMf|Cb4HIC4jK4`($}N%cPg< zZhYSED&D6~&M1|ihy(Ot9QH&{c2pfwc-{QsJ4lK@VuY7fA6|4-9xB))=XWxz&M8aQ5980Zz&1pa}*3t z6D@4vBG#V14{;mdJHW-kUWO0jdoc<890=;S40s?KDT2z2pt2vtT}7WE73~TlJDubG zomL4QbZOI8v)QIQtHXiqSF@Lp06DkO1z+b47dc~$+JV$G7zcWst`0M4+k124%Eqy; ze@<3ku?49z_!U{@c9+>&k|ssSAu$|uq$#3OB`rpi60N(~M*u&t!3O7w+)8ETdvWLYMwHV?$^UI z*x``4BN`!bC1G(e=sq-m(n852c{F-2j%>u(_s!V+pX*T7)W5DpYtE!(J60v;BFPY zCx4sA)yU!6@vT#9pE=;9;~dxF&6G+#3k0#OLM;sZKGhXwRyfhS7|Cx3v;9UGbIe-7 z>8B~!va$@2R@hlY|B~#G4MQ*j%0P0nG}q-FWT(+SH~rq9>)>-BPl&IX60o5 z-!)s9F@PHePbhw`e-}UrM}h8!$kAwQ*?r3z$Y}dS7lwo3W%Vns7INCse_xhT4edCA zZrpS;ASQ*71WC0tfFr>h;`2q$$NHIRX@yXU`Dvg?$Q~hbyIbZPI5d#0Dfy@r?i*U0 z+f&wz;gNZH`JG(?8sT=!GuCF!Fe)>lS<||BZj%hb&c}mf+H(cDj*g5Xhw%_7I(6l8 z9TAo;D3)@8e2weAo^LWURSN=$Mh`%gYyituUa zUkbPd`qX4JG9}NZ^&kt)k2|xCEMm%ZCe(pE0bOPx_52j4)AOk_qM^NBBl1uAX?hx% z5{Uh4-=sTLyKr%Ff8}Z<689gUBs;f=8PHACwlFz4%@)$IQC3!Y}@%}FicU)=qXk6)>_!W$GQdis6cJvK9d5MmwV`%jYyeBB!p00-|^mxFKM=-0hTYKimu2cpim3O!E;(j fO9X$sZ0tKx(FVvoX?{SiPU$5pd@nWyn2X;Cj2d3n delta 3171 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 L(XQ(=Q&YQu{cNRZ diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 88628e4b..92383bef 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -70,6 +70,9 @@ and write first part of the configuration: ![authenticate](notification-matrix.d/01-authenticate.avif) +The configuration is written to a new configuration snippet +`global-config-overlay.d/mod/notification-matrix`. + #### Join Room Every Matix chat is a room, so we have to create one. Do that with your @@ -87,8 +90,8 @@ the invite. ![join room](notification-matrix.d/02-join-room.avif) -The settings have been appended to `global-config-overlay`. You may want to -edit to move it to an appropriate place. +The configuration is appended to the configuration snippet +`global-config-overlay.d/mod/notification-matrix`. Usage and invocation -------------------- diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 82347794..5a081466 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -217,12 +217,14 @@ } :do { - /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ + /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 ("Appended configuration to global-config-overlay. Now create and join a room, please!"); + $LogPrint info $0 ("Added configuration snippet. Now create and join a room, please!"); } on-error={ - $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + $LogPrint error $0 ("Failed adding configuration snippet!"); :return false; } } @@ -250,11 +252,12 @@ } :do { - /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ + :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 global-config-overlay. Please review and cleanup!"); + $LogPrint info $0 ("Appended configuration to configuration snippet. Please review!"); } on-error={ - $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + $LogPrint error $0 ("Failed appending configuration to snippet!"); :return false; } } From 444f56f9b44baf8a2553e2e475f796626c5da3ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 19:09:00 +0200 Subject: [PATCH 094/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index dff933b2..20a11409 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -33,6 +33,7 @@ Add yourself to the list, * Andrea Ruffini Perico * Andrew Cox * Christoph Boss (@Kampfwurst) +* Daniel Ziegenberg (@ziegenberg) * Devin Dean (@dd2594gh) * Evaldo Gardenal * Giorgio Bikos From 1d8347d8ea0b4c16d4a3763e2f73c186da360a01 Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:11:36 +0000 Subject: [PATCH 095/988] README: add start-time & change interval in scheduler example Set the interval to once a day, Instead of every 1 hour. Add start-time to start-up. Thereby introducing randomization based on when the user last rebooted there device. As the interval is counted based on last boot time. --- README.d/11-schedule-script.avif | Bin 1847 -> 4113 bytes README.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.d/11-schedule-script.avif b/README.d/11-schedule-script.avif index 27541b75d69575591c432fe49b06da2b47a5ebf3..d6eb0f895d413232e27710b9a0ba2fae9e3d26c5 100644 GIT binary patch literal 4113 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 V659%C*l99!+jD6bz1FIc{x6~x&wc;^ delta 1600 zcmV-G2EX}{Ah!;XA_4&Nkt9JW9%*cEV*mgE07L))0RRC200031009~R00tcZ001ay zX>Mi!000000g;>?k?d&}1|@A|VRRAz3JEwRay-~TLqVi6jSQ2I2{3;oi|ja&nr%tA z3fh;(7tV^=51B3Lxt>LFq(F|Z|W_gRgBzG%sX4$_T zmXyO(Z5Q_XakN?V;!U#e$m_kW(F6nMDGL}MbJ*qz!U-`BV0Pk3alIj}&{O`$Vs^v^ z-=NRKLY4{W`msc2{3CyF2IY3I!+!^v!AUvI<9No1Rq$_*5u&SzoLUK$PUVKyMyfTj z_?F%=W9Kvq56Nxz^?GWKUq7KcG~X z181@h-vNbL&X4+Z>JJMQIkctNgAv4C9F$zUxcs}LU}pM8VXukYJg`u|5{FC9vt!Zs>L`DTAvo_qypKkWw=aUWVjamt z{PnM>TU9WHBK6QULfsO@#>Mm#${6BVY$>%Pr?V_aEt~mqZS}>rwfx@8Y(WMto?2n72M7yPt=8$tm7DC;eF3h=Wraz-;w zUA>dEcrHX-4cifjWTE@;5j39g&U`a!S@U})&FO!?K*ZxtJ?Cax8Q7NxUG0WYzF5PS zm_SFPMdR3$jUcfJnurYK8bXnS5v9k29@G{dD@65K5uPwzJ)`p;L#8Jmz1f?~-9*?wm7Y62tM=skFs3+r_o|;4BK03ed19tPwgxO#JH- z_bA9L%wJ#4%ye&ySykYg#l}5GC`1ORTC<9zcBnMB+&+~}@jFX=rvCa;diPy*KewbO z7%uGN9OU%jZniVPBs$^V6E~sd)>7cK0V2BFgsLvsEQ?pi17=tmn#N;Y!YW>!NqNPsIgf~*A#4zKE ziZkQ7@X!v?-en!zZYbp7bf{EV&4GmD{Er4?iFh)|q0^jEC6%4-e3#-5-AMSp2cLhn zK6zNRKX7?0RR;Dq`g#B-A&u%6`w0`4ny9m5-NL{IBIn3H(#HR^>e_*CTzcp=YMlDapgMPV)jWPhGBnk-~$Xw#WbK}?jT|h;{o;f(iz#`CLVB14RR_P9^ Date: Thu, 4 Apr 2024 19:10:55 +0200 Subject: [PATCH 096/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 20a11409..f4056e58 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -21,6 +21,7 @@ for details! * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) +* @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) * [Stefan Müller](mailto:stefan.mueller.83@gmail.com) (@PackElend) From 86d0f71acb760793c8ccd5320351320f684ce052 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 21:14:17 +0200 Subject: [PATCH 097/988] README: update screenshot on lease script setup --- README.d/12-setup-lease-script.avif | Bin 1686 -> 7642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/12-setup-lease-script.avif b/README.d/12-setup-lease-script.avif index 365e0e8d05470af99aef604d1ec24c292113d926..fb4024e2a730947774c6f165c7c5e3b191a4804c 100644 GIT binary patch literal 7642 zcmbVubyOT*v+dyS4g*YZ3j}uy!6Cth;BJG%3=Y9bg1d#_?hsrOd~gVEL4#We!R^D^+Q3X#fC$ z*TE8I`jmS#78?tD*MBGg;0!T`{hL2|dx+V;+u%AwU=DwC2#IqMUln__Te;NP)xaJm6^S@g@ZE6c~c6EOA$`EIBr$LnVQ>Jb0gp>$5N8L|r`)3<01%K75QC8c z0N{HE3)8Ofdkh{8{qOZK_pl1USCUhdd)(;npa8(bB0vU!j*5zg zih_=YhK7NGj)_f-gN=oSO+iS6M@&sgOG8Zw1cDeinL%_M^gtksAS=fUZazLfT4rH! zAs#VKUOt|uCI}c97}!|Yc%s&;cMo2XG-gilqY}5+EQEAUyN{XdmZ9 zLHKL`NO=;9gp7iUhK_-W^;l4k|8!DFh{#AND9De8j^Ov02Otxm5I*CUMkP`=MWb^e z<_V0;L8pIN(@CQ7{TBnTnQIURCMg*?1tlXBGYcylAHRU0kg$l%D_J>t1w|!IEwJ`m z9bG+h3rj0&8;C6w=H~9<>E#_95*qgY!^iOWgv6xel+?8J+`RmP!lL4m(%LU|^$m?p z%`IKsJ-vPK{(-@X$*Jj?*}3_Jwe^jkn_JsEyL%_UPyd{qUtC^YKk0hX`EUD2+5e@B z;87PMGBOe}+LJB>M2{!o1js1QxKRnE)zM5{i0F6%(TQKi<?U(fd!FO@gFu^( zl*EcL5Gx@J+O&<$dz@A*Uo=Ny-tz12uz2|e)60C?65-uUk+;?kE_k8Uh2aZsK%2TKq;T>gycxM#E;- zb*)nMQ8iLu3tEI>g0C}h<|=1=B3vhuPO5Eg+f3?E(wtW~U1mMRMQC`uwc6}H){VUC zTo<*w)W-N2nkR1)Mw?NFkUWIFy5YHcR-R~oWS;{u+U73;#i(UoUcOsb#<0M{#L}cI zJ?f_rBbeMj)GkU4UC@;l&Go} zUfbAowY*|SX#7>NR37ET(R+B2h6`URjr1mjcEATFb4sC#Yj>;$hL>i06!SpV*kq~N zzGYp|w`GLbb5QVjG{;UzWeM!r2?MLEc?_(I_?;0lp*50+C|P6>Kpd)L#Kba@q6+5f zRCcylq}h^qD^~I&6jX`+XG}^J`h}|$-g+}XZoDuzFOAXgE9#GPO}xPneo{kf8tO*8 z9C?|^1~MU_OywTv)4xrF_YFedFnq#6CGfcyTAe`@rr9Ah>UD_Tl6lV@|Au0LC7F*4 zr%P@znxtP`GBR_X{76<~O22=auHBeSZ%DiwMZ(}&GKidHg8>^K*Y7=_j~sJI@ZSA7 z!+DG4S>5@$5z!RkmJsT1QYcmAa4zO`P3l|WkP?K762Q+V!cT#(6(J(bA9v1mj_&Hex zIMzpSN0zWD_KR&QzyY6&BHfaY9A2jvmVdfxO}h|z{~k02yW)W5aBzP}-yh*R&0sYt zHMm$3?%!Q315Npgqvn`0pUVt55eB<#aX+UI>_l?s&aj}|F3z`s=_MV9Ij$w@K^g_1 zb&-R69)M;cDrNJVyu~b2ZU1^-de#+*kIoh>*{LgLM*!?YWZa%Rud_;xaKMg}8y976QXjkqZHU=9^V~_n|fAhS*^2C=$W4zfXVXzhIq>B`zcD)&-~v) z>dxX|=LGw_hD`LdmbBbUX$W%qz{n=#?ez6F*XR^i3^8t+uw}DNLRk|}@fX=Qv~Hl= z`4Zd`jJo=If5N?wPUkjxcIte+=r)N8P4obwq>lcD+%j7-0m=_4hnaL!oPEF4i+F^` zUVGqnGtbuR1>0T-Z+?ul92&gea{m(1UG{RLOQ816IkZL7In_wVZ81|G7~PDN!_3K5 zAF=N_7WUlL%(=nNg?#y|g)W+{hY;MJ`%pK1rrw_4Eqtg)q)VTH9QSuWy6~tlRWvjs z%QQ=+*$t8x-lyzmbywt*LL|7rbQ2)kn1Ksz&1MdSD-9?e&G2isHQSGfn=$H-P+5n? zFPn=V2c&kXyfaRrZ}d+!$AObPA6%*|LWt-VNao;lXhcn?!(&D-azgofK_Nu@qt{He z>{HoYf~|+9o^JoU{^Mo~H66=ZR8RG#?E>AV)-Unr^nxF_j-=*JwiLM|PkLkkL1KigVPkuKF@2x1=w}gJ4o-!4aFJ>?$alfi;eaSV5HZ*oRR>GfF zq-yQp#Ku|g?{u1xub+p_9l2^f6|GRze-mG$ZhKpGWGz#=djXwSJaW-Dj17=KGDYt7Ya3*w~uPsB_uWIS|vcIu6VtU7B$9j7(B&0AEp!B@8zUGR5iE*LAI@jwt2qkKC-DkGaZu z`)5uk>G}v-R}~h_q}00G-lyNoQIiy&Un{gkX`h>87<}>a!z=W@4=WVVGvh-WZnAVr z8<1Owi2mlmoTU_F-zwQOw#c>V59Kbd(Eq^qL59shnVlV9DKl?zv-1HUZfAZY*jWi5 zo^b>@aZu-yfdszC4O&&QVN(p7si|;)$;rT&W4#B<=1ygn&g3n(gPqGc zj^cKcNfoY#LuV)bky~dU#s)Cs*NdQqtMd+03l^~@>u1elPDM(jySQw3N_E;9?h8IL zz%h<+$r$t=q`*FxV>KD-Pn}Fx?gLxCpWkiGNTlvJuB4a7o!cI+Olm5s+b&eK70D8t zWURvWH7tlVZ`0h-ey>1~gX>lURlyvcT7-%nNbLYd;%rh7Kv4|90t%8Qr!VFMBx)Sk zZ$L(QBi;L;S87_7f{2fQm7;2h>aSlx$k|w}!~qmcpQNZqKixH!$dfm`SBh77#qD2i zZ9*zutf&ogP6gq+z5!5X&cJ&_l0Hu_X}3sx2fYRREq(%-kTCj${=82biHN}^Ah1)e z9s-(9d-EbAjB$6qel@-6n=4_lhk09-ZV1H^gI+Kv2)M?NgD zE6~R&eR=U?fE@1c2+f$;4kMHPBzF=SuO}bq@CmO@j=^(uUPM4b^TPl2YhD9J$0COE z51BMcicm$vPsYFEf1uNc=q(_S8%9+pBg2H5t0=NP(+`-wqf~D*9NK4Q_#I`yE+pzB zWF;Y->(>Ren}YspY^^=P2gy3ILGsDY+>`Ax&~^5*M3(WzO1TMj1v4HzgY69SU0q`J zL&hai!f+3DzR_mqQN!GT8ngKYpY#36#W_ur8Rj6}pZFbpW(AEULVYgLeh&a?-6@R{ zK@G8lX=>ht5><_qt`={~Q_t`{H5ZgRivU5n5FlP(h0Q(B6igZNEQkss)5;A=`uGze zn%o6WtGRD*Mv}wh+y=$)TnnP4Vu_naamn?u*b&8%X1{+WD(E1fe?|r_eitu zx7$TO#o06Kzb4PPr=rBo0epuuLuidn!NvLO>0gNB61)a!M4W|p``AUo8`0~n>i9FjvXDJUXQhEOWp1af z6f%^|2s&<}xzZ!3N)R&`C~erR)^Rpwa2=@2rzJwX*dBRbrF6U0lAbJb_9L_>As5aN z)0id*1ay8t630-_a#H${u#Pj1-`?=a8hdY-zF+WmxYZ@*lTg>{&y206J@!}e->Djw z%lG`(M8A>N=vRbgkm6_Rd#UIuZP-~fs>!+f+}R4ZITb5g&8*K1^2p!`6I@iv@nD!C zP&aKblaD~PGzliSA|3N42}d{%Yc^B!&08-bHobIKBV7hA;3{UH@uJ;?9M@78b^2p_ z%oJ#dHUnGf1LWBN>SLG^`KNqpXwpTVU5{Vmw8d0TW4+x+0it$&3h?557&Ieen>oG4 zZNn~NgzfjBp+FD+fblY$;2^+$mC%bJI7{s{#!uHjYG@Dh073vJh7jX#VF7&naR|=< zg^C5@4?Y>Q<>jw23@MsS^|0cy_!3U8?Sn0bmoID5L{E*IIy85*EK01$@+l;k$vbUwH z_Hd^zr#eS`@5ZVhRjq}0x|j3+Krxw<;*uxU@S?CIs~G#kgkA}XFp7&&YC-(Wo#~@F zvCue$STyY#F@lR%0hr>_$kJM0@)#|42UpM1T_Nvq@gBr#vTGj8R!M92y2hc<2PABm zWqz8}4F#UpK#Ai!BIbP+hjcivx-JAU^`1}G(&kIIOjdovqZ_F+30J z0T|g8!LpgO!ow_Xbtr}4nyYwo(oik7Z zc0!JxL@X!^+r;kJW*>=Lr!qeYTi+^a<~9c6Wop0p(5Jja8%7S;m!Y>cqXAyv4>tuf zOc|+^B4VNq%B}p`=xYu~0(QEmmKgsjGpAx?dR>BDk=K1rD&2Kj>Sz<07Cn5IKD3eag3nhUlNo!ad?vvqD@kbiaw}Q+Ft=L(?VX6;gJg>yFP7*6 zH=wXNn@u?U9SalH#2xT(uj0#rnBLpS>DOUfK{Cf!<+8!Q@n>LXmwF^rt0c^5d?`%n z?Aw>LHW9a^U#T4zVjb$DfD~S_OS)4^nCjkTcInZi0=z@Idm3Mb1byNzkABFBq*OKn z6A5_5b$$#C|C*kqOl%{SDc(yUgYX0;L7W8Z0^ef15O3^$Jrs-Q&c>QrVRtZ3IlJ|l z+j8KTqQl%QI>%N%*mJU(4TY1Y+|sX`N~g_D4`HBH%bODIq5k!i6Hn@wpe{>tNFngR zQ*$ponK()!YqrdUw1jb(HR96K=A zUkH1PM?_-z8-`i*U;5@AAQtROd&);|_JrF1aCAy}2ID#WNhCAgw?+$)N4@~(yn8z~ z;^GXRv?r&YfbwZRc!{QQb|sH+ms24=$Cb#X9r{%_(2t**{6MU0z4N>jc5_tfPj&Va zzaJJ#O9#*`&@bo;qrWp+g)}ptB-0Jmd)p|nyH`mM(Twuyx4HjSO zC%m%@#bH@3QiRV*D_1^Ha_Qd4DzJ=b*w`~TzV$%_o6lT&;vV}3! z^D|`Fy3Aon;X+b!kE+*3g;tzuLp(wCW};0+q-8{5J?xjM|lwTziD}L|=HbQd0zR589nr*mk&c8RJ z0b`k_zE3xP@IXGQb9Ch6h8J_*BVGn*anv4_TXr^bO@DYu5433ev*p;Qv9U;+C zO-d|(V{NE24vUw2f6csoOh_qbqkv%|&}mO!xi`kz56u3N694`5yleCwU@o2ShcB`Fh>)J0q9p`QSzcdc z|Bv^1j44q=B$Eg4^nByXd&#bCEQ7B3DZWKKb^Los;z!=IMZKUp;|+P$d4>kqEE$<6{34qtV$}_&0l_pOw_Q@J$?d{5tL4yCBlUDF+i?2aDcL@nt^!)44Yr zV#j}aY3_DZQr{A7@7JzjUb4mSmnW5A5pZQl34Rrf?;AQpMXixOhF5Hn7_O;s%WmDU z-L~L6uGI_TeCjP7adk|GsM3!w{SLcQ!jCEUo69TuzHPW9+44qZXE?5=kzyytC>7iw z^7*`EkgvmqR!Xv8yfwvX16B+EK2f_)w4t_jGi9k_N$aivHH6PW(ksLB(Z|0*twXaHS7qPG68RbrVZz=Nh=rx;dHL4L9*%==i;`JBCbp)o70%Q6VAcrBJN4X~qaE%mE!i*{8tHlH=tx#~KsKWDy;o)J+W(+AKIZG*lxJY~ zuF^;KB09gaK@KF)BjQ_D@8U1^Qgx`qIoKUHaE0;uQ4zrk$|n?+`d@oR=<2#Nn=^ z_b;YNr{ekVm!v>Txieu20uqhgjOHO&qKCw#sz3YiE(}>%G3UL{Dw!5u{Hng*+S`>Q zp2xbE8dF#w%8-pxhW&gFKPO4dVI2bm$%4yaW_B*mSV=;OjfH-Vn%+@36EQ`TX^Upo zf}dOElnv;V-?34MJUqiVf^BA#f?BIHrd9T?m%-?6*7%vkmSxN~W=Sx<2d*gG1uy#AJC+TQA_4&Nkt9JW9%*cEV*mgE07L))0RRC200031009~R00n#i001ay zX>Mi!000000g;>?k?bG=G?NVhNPh){ZDe6|5&#MbI3;pC*g!);q%!OZOvnV>gQg@` z_m7YztkP9q=ekxVu<1Gnw{Y@2QjB#Wb{x0cv%|CQJD zfI?jxVb&8{G=dd~A~jn%q$=xKpO$;*?8GNb)oBhZKVLArpD)X%<(?rIx_`u2##|5d zgN_rfP;O+Dp#J6_rug_ozF>ii&dBkRfeM#|&4b`KpKFdP8hqRb&`CyCvYPk+`_T-^^dGtZ_{>0Twwj7z+g>11dzW(Lu!|$PNgmGLp#v6}?39QLE4lIC_b?lR>;5{(W^ zT_}uJ{MCL>E@C4HV!k1)DRpZnf zqn-5GILy_pgz$?2Yk#2yKuTdw6}$Med7If_=%P_T<)=zpdh!@1^U*v^L8DWT%ymy3 zJ&SMTpwvUAF5K^R5}Z|B+OmuIE%Amis+L2Lni?nNQ;XbfY`nzl&+hNmAB?%CPF1r# z*6n#&-Lq?uCk8t~O$^=JGY(W!$Bw6;BoN1QchomRg!?t}2!CJ;4^QS4L8dO&YXsY! z8)F=;F#9gIEZgTxcW%jiANDLTtZ|um*rX8&Xg<$dSt@uR0?iP@C~J-#d@n(QoKYij zwV-c$M(ttIB72O6k(wyhBP%CW`CANTCfnS^e zs8A^h1d5&)NWGFQWz)J{^uZRFWG$1Y4bUkjpr^sv+byDH7(C|XBBm@Zk14CoXT(q zgue|MJ8e_gD+bOuIUkB&G_KltbOt$U4|=u@^ncuY`+K*70wg$W9_`$|hfi^aD}_P_i8@R+ZB55$_M{kLjC}svjEN$iI86=c;fEX qpRpEGf%k!RYtL1(Tlxu`Kmw1H3yMicM-BQDcAJXi@h Date: Wed, 27 Mar 2024 23:01:38 +0100 Subject: [PATCH 098/988] global-functions: introduce $FetchHuge --- README.md | 2 +- global-functions.rsc | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5109173b..45167363 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/global-functions.rsc b/global-functions.rsc index e19ed654..bd35cdf5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # global functions # https://git.eworm.de/cgit/routeros-scripts/about/ @@ -32,6 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; +:global FetchHuge; :global FetchUserAgentStr; :global FormatLine; :global FormatMultiLines; @@ -389,6 +390,42 @@ :return $Return; } +# fetch huge data to file, read in chunks +:set FetchHuge do={ + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + + :global GetRandom20CharAlNum; + :global LogPrint; + :global MkDir; + :global WaitForFile; + + :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ + $LogPrint error $0 ("Failed creating directory!"); + :return false; + } + + :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); + + :do { + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName as-value; + } on-error={ + $LogPrint debug $0 ("Failed downloading from: " . $Url); + :return false; + } + $WaitForFile $FileName; + + :local FileSize [ /file/get $FileName size ]; + :local Return ""; + :local VarSize 0; + :while ($VarSize < $FileSize) do={ + :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); + :set VarSize [ :len $Return ]; + } + /file/remove $FileName; + :return $Return; +} + # generate user agent string for fetch :set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; From ab6fd8855881681d7c69af3e5ce18b3a6e2e69fb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:37:31 +0100 Subject: [PATCH 099/988] global-functions: $FetchHuge: use custom user agent string --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index bd35cdf5..0ea7120d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -395,6 +395,7 @@ :local ScriptName [ :tostr $1 ]; :local Url [ :tostr $2 ]; + :global FetchUserAgentStr; :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; @@ -408,7 +409,8 @@ :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); :do { - /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName as-value; + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName \ + http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ $LogPrint debug $0 ("Failed downloading from: " . $Url); :return false; From 2edf983698a18d45de1c9e7823dad0959bff2504 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:35:01 +0100 Subject: [PATCH 100/988] global-functions: $FetchHuge: control check-certificate with parameter --- global-functions.rsc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 0ea7120d..65dd06e5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -392,15 +392,19 @@ # fetch huge data to file, read in chunks :set FetchHuge do={ - :local ScriptName [ :tostr $1 ]; - :local Url [ :tostr $2 ]; + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + :local CheckCert [ :tobool $3 ]; :global FetchUserAgentStr; :global GetRandom20CharAlNum; + :global IfThenElse; :global LogPrint; :global MkDir; :global WaitForFile; + :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; + :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; @@ -409,7 +413,7 @@ :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); :do { - /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName \ + /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ $LogPrint debug $0 ("Failed downloading from: " . $Url); From 61ee5cbd6cbce28385857f9cca184387234fe326 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Apr 2024 17:03:27 +0200 Subject: [PATCH 101/988] global-functions: $FetchHuge: make sure to work with clean file names --- global-functions.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 65dd06e5..3c14f22d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -396,6 +396,7 @@ :local Url [ :tostr $2 ]; :local CheckCert [ :tobool $3 ]; + :global CleanName; :global FetchUserAgentStr; :global GetRandom20CharAlNum; :global IfThenElse; @@ -405,13 +406,13 @@ :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; - :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ + :local FileName ("tmpfs/" . [ $CleanName $ScriptName ]); + :if ([ $MkDir $FileName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; } - :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); - + :set FileName ($FileName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); :do { /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; From 402f847db2b7446a67634d3720d824a7e6b87e71 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Apr 2024 17:36:47 +0200 Subject: [PATCH 102/988] global-functions: $FetchHuge: remove file on failed download --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 3c14f22d..ab8860fe 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -417,6 +417,9 @@ /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ + :if ([ $WaitForFile $FileName 500ms ] = true) do={ + /file/remove $FileName; + } $LogPrint debug $0 ("Failed downloading from: " . $Url); :return false; } From c3809f240d292e80c936e104e8aa9414b3dd3367 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:39:55 +0100 Subject: [PATCH 103/988] fw-addr-lists: use $FetchHuge --- doc/fw-addr-lists.md | 6 +++++- fw-addr-lists.rsc | 18 ++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 70ca6e98..ac34c885 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) @@ -29,6 +29,10 @@ see situation when the lists are not populated. To mitigate man-in-the-middle attacks with altered lists the server's certificate is checked. +> ⚠️ **Warning**: The script does not limit the size of a list, but keep in +> mind that huge lists can exhaust your device's resources (RAM and CPU), +> and may take a long time to process. + Requirements and installation ----------------------------- diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 68775b41..66f85817 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md @@ -19,7 +19,7 @@ :global CertificateAvailable; :global EitherOr; - :global FetchUserAgentStr; + :global FetchHuge; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -50,12 +50,12 @@ :local Failure false; :foreach List in=$FwList do={ - :local CheckCertificate "no"; + :local CheckCertificate false; :local Data false; :local TimeOut [ $EitherOr [ :totime ($List->"timeout") ] $FwAddrListTimeOut ]; :if ([ :len ($List->"cert") ] > 0) do={ - :set CheckCertificate "yes-without-crl"; + :set CheckCertificate true; :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed, trying anyway."); } @@ -63,10 +63,8 @@ :for I from=1 to=5 do={ :if ($Data = false) do={ - :do { - :set Data ([ /tool/fetch check-certificate=$CheckCertificate output=user \ - http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) ($List->"url") as-value ]->"data"); - } on-error={ + :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; + :if ($Data = false) do={ :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); :delay (($I * $I) . "s"); @@ -81,10 +79,6 @@ $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); } - :if ([ :len $Data ] > 63000) do={ - $LogPrintOnce warning $ScriptName ("The list is huge and may be truncated: " . $List->"url"); - } - :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); From 4b6d0c02f134f4c6535d4df44016dc9ae2ae5db2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 00:20:33 +0200 Subject: [PATCH 104/988] fw-addr-lists: try with less regexp matches --- fw-addr-lists.rsc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 66f85817..7e7ee389 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -82,14 +82,21 @@ :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); - :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$" || \ - $Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv4Addresses->$Address) $TimeOut; - } - :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$" || \ - $Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv6Addresses->$Address) $TimeOut; - } + :do { + :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ + :set ($IPv4Addresses->$Address) $TimeOut; + :error true; + } + :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ + :set ($IPv6Addresses->$Address) $TimeOut; + :error true; + } + :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ + :set ($IPv4Addresses->$Address) $TimeOut; + :set ($IPv6Addresses->$Address) $TimeOut; + :error true; + } + } on-error={ } :set Data [ :pick $Data ([ :len $Line ] + 1) [ :len $Data ] ]; } } From af6556bdba9d68174b45561215ea3be2e098e349 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 19:37:38 +0200 Subject: [PATCH 105/988] fw-addr-lists: add debug message on successful download --- fw-addr-lists.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 7e7ee389..5cdd379b 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -20,6 +20,7 @@ :global CertificateAvailable; :global EitherOr; :global FetchHuge; + :global HumanReadableNum; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -77,6 +78,8 @@ :set Data ""; :set Failure true; $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); + } else={ + $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . "B from: " . $List->"url"); } :while ([ :len $Data ] != 0) do={ From 70cc1ff53b7d113f8aff24034e5f5a25efb8b261 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 23:41:17 +0200 Subject: [PATCH 106/988] fw-addr-lists: rework log messages, always include list name --- fw-addr-lists.rsc | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 5cdd379b..c9f894b4 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -58,7 +58,8 @@ :if ([ :len ($List->"cert") ] > 0) do={ :set CheckCertificate true; :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ - $LogPrint warning $ScriptName ("Downloading required certificate failed, trying anyway."); + $LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \ + " / " . $List->"url" . ") failed, trying anyway."); } } @@ -67,7 +68,8 @@ :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; :if ($Data = false) do={ :if ($I < 5) do={ - $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); + $LogPrint debug $ScriptName ("Failed downloading for list '" . $FwListName . \ + "', " . $I . ". try from: " . $List->"url"); :delay (($I * $I) . "s"); } } @@ -77,9 +79,11 @@ :if ($Data = false) do={ :set Data ""; :set Failure true; - $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); + $LogPrint warning $ScriptName ("Failed downloading for list '" . $FwListName . \ + "' from: " . $List->"url"); } else={ - $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . "B from: " . $List->"url"); + $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . \ + "B for list '" . $FwListName . "' from: " . $List->"url"); } :while ([ :len $Data ] != 0) do={ @@ -107,13 +111,15 @@ :foreach Entry in=[ /ip/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv4 address for " . ($IPv4Addresses->$Address) . ": " . $Address); + $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ + "' with " . ($IPv4Addresses->$Address) . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv4 address: " . $Address); + $LogPrint debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ + "': " . $Address); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -123,13 +129,15 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv6 address for " . ($IPv6Addresses->$Address) . ": " . $Address); + $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ + "' with " . ($IPv6Addresses->$Address) . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing: " . $Address); + $LogPrint debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ + "': " . $Address); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -137,27 +145,32 @@ } :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv4 address for " . $Timeout . ": " . $Address); + $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv4 address " . $Address . " to list '" . $FwListName . "'."); + $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ + "': " . $Address); } } :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv6 address for " . $Timeout . ": " . $Address); + $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv6 address " . $Address . " to list '" . $FwListName . "'."); + $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ + "': " . $Address); } } - $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . " - renewed: " . $CntRenew . " - removed: " . $CntRemove); + $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . \ + " - renewed: " . $CntRenew . " - removed: " . $CntRemove); } } on-error={ } From 491d85000d607db09b7abd67d6002c9ca1a870f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 20:54:41 +0200 Subject: [PATCH 107/988] fw-addr-lists: human readable numbers for counts --- fw-addr-lists.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index c9f894b4..15d292ed 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -170,7 +170,9 @@ } } - $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . \ - " - renewed: " . $CntRenew . " - removed: " . $CntRemove); + $LogPrint info $ScriptName ("list: " . $FwListName . \ + " -- added: " . [ $HumanReadableNum $CntAdd 1000 ] . \ + " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ + " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } } on-error={ } From 19c52ed2a7a59c7ecfb472a9f0bbf4843fc5d713 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 22:50:04 +0200 Subject: [PATCH 108/988] fw-addr-lists: show count of active addresses --- fw-addr-lists.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 15d292ed..ab417cd3 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -171,6 +171,7 @@ } $LogPrint info $ScriptName ("list: " . $FwListName . \ + " (" . [ $HumanReadableNum ($CntAdd + $CntRenew) 1000 ] . ")" . \ " -- added: " . [ $HumanReadableNum $CntAdd 1000 ] . \ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); From c4d2ea19dda3434c92f604605c1d3f06ec8148c2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 23:53:05 +0200 Subject: [PATCH 109/988] fw-addr-lists: break long lines --- fw-addr-lists.rsc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index ab417cd3..007282cb 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -108,7 +108,8 @@ } } - :foreach Entry in=[ /ip/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ + :foreach Entry in=[ /ip/firewall/address-list/find where \ + list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -126,7 +127,8 @@ } } - :foreach Entry in=[ /ipv6/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ + :foreach Entry in=[ /ipv6/firewall/address-list/find where \ + list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ @@ -148,7 +150,8 @@ $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { - /ip/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; + /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ @@ -161,7 +164,8 @@ $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { - /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; + /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ From 009674b5bcf27589cd3469bc418dea72c9b4e979 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 21:45:02 +0200 Subject: [PATCH 110/988] bump RouterOS requirement for all scripts and modules... ... now that global-functions requires RouterOS 7.13 anyway. --- BRANCHES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/daily-psk.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/dhcp-to-dns.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/inspectvar.md | 2 +- doc/mod/ipcalc.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mod/ssh-keys-import.md | 2 +- doc/mode-button.md | 2 +- doc/netwatch-dns.md | 2 +- doc/netwatch-notify.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 ++ mod/bridge-port-vlan.rsc | 2 ++ mod/inspectvar.rsc | 2 ++ mod/ipcalc.rsc | 2 ++ mod/notification-email.rsc | 2 +- mod/notification-ntfy.rsc | 2 ++ mod/scriptrunonce.rsc | 2 ++ mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- ospf-to-leds.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 110 files changed, 116 insertions(+), 104 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 0fdbdb4d..f1062bb3 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index f4056e58..13d05088 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 0de50ae5..0320fe80 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 2ce83029..781ae78d 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 51ef6f3e..b79a724b 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 770fb305..b8067c87 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 65f8aaa4..c05e02cc 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index cccb41b6..9a062f27 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upload backup to MikroTik cloud # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index 64ca69ca..c32eb274 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # create and email backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index 503d3824..fc186c06 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # save configuration to fallback partition # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md diff --git a/backup-upload.rsc b/backup-upload.rsc index ef5b7c72..18223bba 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # create and upload backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index a3bd4a59..f5695f4b 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index cad3bcb5..762dbb65 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 909688f9..79aa9a7a 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 11bfd698..2c9ae3de 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index e0effd48..2098bc0f 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 8ec6f26b..36b8c0f2 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 45805c54..77ed3d05 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # renew locally issued certificates # https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index 20e2902f..e9235f12 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for certificate validity # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md diff --git a/check-health.rsc b/check-health.rsc index 2a97ad6e..1e8fcc08 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for RouterOS health state # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index e7f06f35..3a25f83d 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for LTE firmware upgrade, send notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c9ab93b3..6dca99af 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for RouterOS update, send notification and/or install # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index dcb303c0..74c07543 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 7c1122ce..8a60fea3 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index b8c5ff87..c5cf74a5 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index b8ad9396..12c33611 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 43651d07..64e8ce72 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 2dbc61bf..48e2b8d8 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index e190ffb7..5097b00a 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index ee3e1b05..9d7f2850 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 4ac228b9..b7f3589f 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index a49f74f4..e35bbe78 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 0f0975bb..d4323ad0 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index c9c091b1..f67ce6e3 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 5b6e64a7..a3d41c99 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index 109bebfe..a1f91980 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 03d59536..be6e06d9 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index 56b0540a..a506543d 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index e2ca8e0f..ba206570 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index 953ac933..f524adb3 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 20fb0072..c68900ea 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index 8362794b..27d855fe 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 2df8be31..91a1914c 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 62b9cebb..636f719c 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index ee52b61f..f94a0bf5 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index bec31775..59a62c72 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index dbb2b89b..f9d485c0 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index b0a22982..57032d83 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/daily-psk.md b/doc/daily-psk.md index f7236178..3894d521 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 4831b8cb..f95b1245 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index e7f3b880..13d5ef3a 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index 420dfe19..bac17a7a 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index a3fe6d63..4b42717a 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 03f79a73..7006fb39 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 6ce44219..275fe4d0 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index 8bb9811f..941a8ae7 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index ca5b86c5..0a919602 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index a5661fc6..20265fec 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index f346621a..4d2f3bc9 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index 5dd5f63b..90ea4180 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 4183d7be..44409dcf 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 838d1e0e..5c8bebce 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index 5660b9d5..d23d5b59 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 7ec74f2f..d4e59b3d 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index 5b24952b..cb655bcd 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 76816c1a..2138e319 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index a3fdf881..afa31090 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 6619efba..c5fa8915 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 3d815663..db8e3229 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 22ec215d..87343521 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index e00ccd09..443106ff 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 806bb3af..90cd830a 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index a7d4e9a1..121f77bd 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 418f05ef..21847c76 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index 18ca574d..b4678af7 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 2fe94865..597410bf 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index ec59b394..e4bae2e6 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index a6bf994d..66804477 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index fba2a653..80902b96 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 5aca5816..2539e2f5 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 038f74ea..169a2e09 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # install firmware upgrade, and reboot # https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md diff --git a/global-wait.rsc b/global-wait.rsc index f8c767bc..239f5750 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # wait for global-functions to finish # https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index 1aeab843..dbca38a9 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # track gps data by sending json data to http server # https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 0540ad5c..8f55d717 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 6f3b3e1e..7ac996c0 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 9c796287..39c9f25f 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 37c84644..113c95d1 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index cbce42a5..10f0c7e4 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 86aeed78..dbf50e0c 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index dd40ca23..8894eeee 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # and add/remove/update DNS entries from IPSec mode-config # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 65bb9595..ec9a03a5 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update firewall and dns settings on IPv6 prefix change # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index 8e1e8f64..a9d4b681 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run scripts on DHCP lease # https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index a919d8f2..7abcb4dd 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # forward log messages via notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 567a7623..000532a5 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # reset bridge ports to default bridge # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index aee5ef9b..760e8a68 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # manage VLANs on bridge ports # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 577abf33..5adca0a0 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # inspect variables # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index b098b445..128ca54c 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # ip address calculation # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 0d83d698..dbd648b0 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # send notifications via e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 6d48a59a..5da575a9 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # send notifications via Ntfy (ntfy.sh) # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 85d465a7..c3972a0b 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # download script and run it once # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 6716958a..f37c28bb 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md diff --git a/mode-button.rsc b/mode-button.rsc index f453f11f..4994f6bd 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # act on multiple mode and reset button presses # https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 50c2b4c0..09365bac 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index bdabe2ec..0b6c366c 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index a22e5a5f..09328153 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # visualize ospf instance state via leds # https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 61766c08..4ed92c5f 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run scripts on ppp up # https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 4c37565b..70bfb284 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run action on received SMS # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index b0966c3b..477d11e2 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # forward SMS to e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 74967cdf..76d0c819 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index c76b7eca..364dc086 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update local address of tunnelbroker interface # https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md From 36cf4d028bcf9597143249aed238dc5e131fda50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 18 Mar 2024 10:30:32 +0100 Subject: [PATCH 111/988] global-functions: drop $LogPrintExit2 --- global-functions.rsc | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ab8860fe..c8fec8dd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -50,7 +50,6 @@ :global IsMacLocallyAdministered; :global IsTimeSync; :global LogPrint; -:global LogPrintExit2; :global LogPrintOnce; :global MAX; :global MIN; @@ -744,27 +743,6 @@ } } -# log and print with same text, optionally exit -# Deprectated! - TODO: remove later -:set LogPrintExit2 do={ - :local Severity [ :tostr $1 ]; - :local Name [ :tostr $2 ]; - :local Message [ :tostr $3 ]; - :local Exit [ :tostr $4 ]; - - :global LogPrint; - :global LogPrintOnce; - - $LogPrintOnce warning $0 \ - ("This function is deprecated and will be removed. Please make your adjustments!"); - - $LogPrint $1 $2 $3; - - :if ($Exit = "true") do={ - :error ("Hard error to exit."); - } -} - # log and print, once until reboot :set LogPrintOnce do={ :local Severity [ :tostr $1 ]; From 3015743b19883d2e19605b819fd2bbcbc6597d8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 21:11:03 +0200 Subject: [PATCH 112/988] global-functions: $HumanReadableNum: indicate binary base... ... and update scripts to match the change. --- backup-cloud.rsc | 2 +- backup-upload.rsc | 2 +- check-health.rsc | 6 +++--- global-functions.rsc | 8 ++++++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 9a062f27..8e29c677 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -71,7 +71,7 @@ message=("Uploaded backup for " . $Identity . " to cloud.\n\n" . \ [ $DeviceInfo ] . "\n\n" . \ [ $FormatLine "Name" ($Cloud->"name") ] . "\n" . \ - [ $FormatLine "Size" ([ $HumanReadableNum ($Cloud->"size") 1024 ] . "iB") ] . "\n" . \ + [ $FormatLine "Size" ([ $HumanReadableNum ($Cloud->"size") 1024 ] . "B") ] . "\n" . \ [ $FormatLine "Download key" ($Cloud->"secret-download-key") ]); silent=true }); } else={ $SendNotification2 ({ origin=$ScriptName; \ diff --git a/backup-upload.rsc b/backup-upload.rsc index 18223bba..63e5b7f3 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -140,7 +140,7 @@ :return \ [ $IfThenElse ([ :typeof $File ] = "array") \ ($Name . ":\n" . [ $FormatLine " name" ($File->"name") ] . "\n" . \ - [ $FormatLine " size" ([ $HumanReadableNum ($File->"size") 1024 ] . "iB") ]) \ + [ $FormatLine " size" ([ $HumanReadableNum ($File->"size") 1024 ] . "B") ]) \ [ $FormatLine $Name $File ] ]; } diff --git a/check-health.rsc b/check-health.rsc index 1e8fcc08..a769fa89 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -64,9 +64,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "card-file-box,chart-increasing" ] . "Health warning: RAM utilization"); \ message=("The RAM utilization on " . $Identity . " is at " . $CheckHealthRAMUtilization . "%!\n\n" . \ - [ $FormatLine "total" ([ $HumanReadableNum ($Resource->"total-memory") 1024 ] . "iB") 8 ] . "\n" . \ - [ $FormatLine "used" ([ $HumanReadableNum ($Resource->"total-memory" - $Resource->"free-memory") 1024 ] . "iB") 8 ] . "\n" . \ - [ $FormatLine "free" ([ $HumanReadableNum ($Resource->"free-memory") 1024 ] . "iB") 8 ]) }); + [ $FormatLine "total" ([ $HumanReadableNum ($Resource->"total-memory") 1024 ] . "B") 8 ] . "\n" . \ + [ $FormatLine "used" ([ $HumanReadableNum ($Resource->"total-memory" - $Resource->"free-memory") 1024 ] . "B") 8 ] . "\n" . \ + [ $FormatLine "free" ([ $HumanReadableNum ($Resource->"free-memory") 1024 ] . "B") 8 ]) }); :set CheckHealthRAMUtilizationNotified true; } :if ($CheckHealthRAMUtilization < 70 && $CheckHealthRAMUtilizationNotified = true) do={ diff --git a/global-functions.rsc b/global-functions.rsc index c8fec8dd..aa39118f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -578,11 +578,13 @@ :local Base [ :tonum $2 ]; :global EitherOr; + :global IfThenElse; :local Prefix "kMGTPE"; :local Pow 1; :set Base [ $EitherOr $Base 1024 ]; + :local Bin [ $IfThenElse ($Base = 1024) "i" "" ]; :if ($Input < $Base) do={ :return $Input; @@ -595,9 +597,11 @@ :local Tmp1 ($Input * 100 / $Pow); :local Tmp2 ($Tmp1 / 100); :if ($Tmp2 >= 100) do={ - :return ($Tmp2 . $Prefix); + :return ($Tmp2 . $Prefix . $Bin); } - :return ($Tmp2 . "." . [ :pick $Tmp1 [ :len $Tmp2 ] ([ :len $Tmp1 ] - [ :len $Tmp2 ] + 1) ] . $Prefix); + :return ($Tmp2 . "." . \ + [ :pick $Tmp1 [ :len $Tmp2 ] ([ :len $Tmp1 ] - [ :len $Tmp2 ] + 1) ] . \ + $Prefix . $Bin); } } } From c5a5fb58363805efb824fb3336e95a1f6bf3dbb8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Apr 2024 08:27:55 +0200 Subject: [PATCH 113/988] global-functions: $SendNotification: set origin --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index aa39118f..c98a0120 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1299,7 +1299,7 @@ :set SendNotification do={ :global SendNotification2; - $SendNotification2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via NotificationFunctions - expects one array argument From 012d259ca1421e31390358cb6749fda80ef4e3ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:59:00 +0200 Subject: [PATCH 114/988] mod/notification-email: $SendEMail: set origin --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index dbd648b0..df2e81af 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -227,7 +227,7 @@ :set SendEMail do={ :global SendEMail2; - $SendEMail2 ({ subject=$1; message=$2; link=$3 }); + $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } # send notification via e-mail - expects one array argument From a9b9f853ffb6b6a9b331f055d47463654bd2a5e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:58:29 +0200 Subject: [PATCH 115/988] mod/notification-matrix: $SendMatrix: set origin --- mod/notification-matrix.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 5a081466..477bb099 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -168,7 +168,7 @@ :set SendMatrix do={ :global SendMatrix2; - $SendMatrix2 ({ subject=$1; message=$2; link=$3 }); + $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } # send notification via Matrix - expects one array argument From 9e2b72ccdc59bc6abc936bf271d9bfaf2a986107 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:56:36 +0200 Subject: [PATCH 116/988] mod/notification-ntfy: $SendNtfy: set origin --- mod/notification-ntfy.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 5da575a9..dc03903b 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -125,7 +125,7 @@ :set SendNtfy do={ :global SendNtfy2; - $SendNtfy2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via ntfy - expects one array argument From 9e4749a5b71e97c7732639019cff6ba7f6e84d57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:57:40 +0200 Subject: [PATCH 117/988] mod/notification-telegram: $SendTelegram: set origin --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index a43ff10d..c78a8ad1 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -175,7 +175,7 @@ :set SendTelegram do={ :global SendTelegram2; - $SendTelegram2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via telegram - expects one array argument From e53c31e9e669738fa50e45387d88d97a934f7e4d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:39:40 +0200 Subject: [PATCH 118/988] global-functions: $ScriptLock: degrade message to debug --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index c98a0120..ded34c37 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1290,8 +1290,8 @@ } $RemoveTicket $Script $MyTicket; - $LogPrint info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \ - " and timed out waiting for lock" "" ] . "..."); + $LogPrint debug $0 ("Script '" . $Script . "' started more than once" . \ + [ $IfThenElse ($WaitCount > 0) " and timed out waiting for lock" "" ] . "..."); :return false; } From 6db3355858157aceb92af47faa7937008d9cbf28 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:40:55 +0200 Subject: [PATCH 119/988] global-functions: $ScriptLock: break long lines --- global-functions.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ded34c37..25c248d2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1278,12 +1278,15 @@ $AddTicket $Script $MyTicket; :local WaitCount 0; - :while ($WaitMax > $WaitCount && ([ $IsFirstTicket $Script $MyTicket ] = false || [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ + :while ($WaitMax > $WaitCount && \ + ([ $IsFirstTicket $Script $MyTicket ] = false || \ + [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ :set WaitCount ($WaitCount + 1); :delay 100ms; } - :if ([ $IsFirstTicket $Script $MyTicket ] = true && [ $TicketCount $Script ] = [ $JobCount $Script ]) do={ + :if ([ $IsFirstTicket $Script $MyTicket ] = true && \ + [ $TicketCount $Script ] = [ $JobCount $Script ]) do={ $RemoveTicket $Script $MyTicket; $CleanupTickets $Script; :return true; From 5f76c245b016125f9e56d45bef381bae38731491 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:57:11 +0200 Subject: [PATCH 120/988] global-functions: $ScriptFromTerminal: check multiple invocations... ... and return false. We can not tell which job is us... So better safe than sorry. --- global-functions.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 25c248d2..abb9e22b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -931,6 +931,11 @@ :local Script [ :tostr $1 ]; :global LogPrint; + :global ScriptLock; + + :if ([ $ScriptLock $Script ] = false) do={ + :return false; + } :foreach Job in=[ /system/script/job/find where script=$Script ] do={ :set Job [ /system/script/job/get $Job ]; @@ -942,8 +947,8 @@ :return true; } } - $LogPrint debug $0 ("Script " . $Script . " NOT started from terminal."); + $LogPrint debug $0 ("Script " . $Script . " NOT started from terminal."); :return false; } From ca2e5f2a017c20f272419c5539b7c234a02f45a4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:46:32 +0200 Subject: [PATCH 121/988] mod/notification-ntfy: support basic auth Closes #59 --- doc/mod/notification-ntfy.md | 5 +++++ global-config.rsc | 2 ++ global-functions.rsc | 2 +- mod/notification-ntfy.rsc | 14 +++++++++++--- news-and-changes.rsc | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index afa31090..b2330a5b 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -47,6 +47,11 @@ Then reload the configuration. > [`global-config`](../../global-config.rsc) (the one without `-overlay`) to > your local `global-config-overlay` and modify it to your specific needs. +Using a paid account or running a server on-premises allows to add additional +basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. +Even authentication via access token is possible, adding it as password with +a blank username. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index f393abb4..6a37c0c0 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -56,6 +56,8 @@ # install the module: # $ScriptInstallUpdate mod/notification-ntfy :global NtfyServer "ntfy.sh"; +:global NtfyServerUser []; +:global NtfyServerPass []; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting diff --git a/global-functions.rsc b/global-functions.rsc index abb9e22b..8f2f179a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 126; +:global ExpectedConfigVersion 127; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index dc03903b..ffe0c509 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -38,7 +38,8 @@ :if ([ :typeof $Message ] = "array" ) do={ :do { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - ($Message->"url") http-header-field=($Message->"headers") http-data=($Message->"text") as-value; + http-header-field=($Message->"headers") http-data=($Message->"text") \ + ($Message->"url") user=($Message->"user") password=($Message->"pass") as-value; :set ($NtfyQueue->$Id); } on-error={ $LogPrint debug $0 ("Sending queued Ntfy message failed."); @@ -62,6 +63,10 @@ :global NtfyQueue; :global NtfyServer; :global NtfyServerOverride; + :global NtfyServerPass; + :global NtfyServerPassOverride; + :global NtfyServerUser; + :global NtfyServerUserOverride; :global NtfyTopic; :global NtfyTopicOverride; @@ -73,6 +78,8 @@ :global UrlEncode; :local Server [ $EitherOr ($NtfyServerOverride->($Notification->"origin")) $NtfyServer ]; + :local User [ $EitherOr ($NtfyServerUserOverride->($Notification->"origin")) $NtfyServerUser ]; + :local Pass [ $EitherOr ($NtfyServerPassOverride->($Notification->"origin")) $NtfyServerPass ]; :local Topic [ $EitherOr ($NtfyTopicOverride->($Notification->"origin")) $NtfyTopic ]; :if ([ :len $Topic ] = 0) do={ @@ -95,7 +102,7 @@ } } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - $Url http-header-field=$Headers http-data=$Text as-value; + http-header-field=$Headers http-data=$Text $Url user=$User password=$Pass as-value; } on-error={ $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); @@ -105,7 +112,8 @@ :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ "This message was queued since " . [ /system/clock/get date ] . " " . \ [ /system/clock/get time ] . " and may be obsolete."); - :set ($NtfyQueue->[ :len $NtfyQueue ]) { url=$Url; headers=$Headers; text=$Text }; + :set ($NtfyQueue->[ :len $NtfyQueue ]) \ + { url=$Url; user=$User; pass=$Pass; headers=$Headers; text=$Text }; :if ([ :len [ /system/scheduler/find where name="_FlushNtfyQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushNtfyQueue" interval=1m start-time=startup \ on-event=(":global FlushNtfyQueue; \$FlushNtfyQueue;"); diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 2b04c29d..8ddeb913 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -51,6 +51,7 @@ 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; + 127="Added support for authentication to Ntfy notification module."; }; # Migration steps to be applied on script updates From fb865ba114e610bcb272d8de7c1c882705e6e06e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:50:00 +0200 Subject: [PATCH 122/988] mod/notification-ntfy: use custom user agent string --- mod/notification-ntfy.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index ffe0c509..4413f07d 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -72,6 +72,7 @@ :global CertificateAvailable; :global EitherOr; + :global FetchUserAgentStr; :global IfThenElse; :global LogPrint; :global SymbolForNotification; @@ -87,7 +88,8 @@ } :local Url ("https://" . $NtfyServer . "/" . [ $UrlEncode $NtfyTopic ]); - :local Headers ({ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ + ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); :local Text (($Notification->"message") . "\n"); :if ([ :len ($Notification->"link") ] > 0) do={ From 9dfa11eac534019d08a5cfa289d7cde0f22c2a92 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Apr 2024 11:51:47 +0200 Subject: [PATCH 123/988] mod/notification-matrix: use custom user agent string --- mod/notification-matrix.rsc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 477bb099..12a0e335 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -39,7 +39,8 @@ :foreach Id,Message in=$MatrixQueue do={ :if ([ :typeof $Message ] = "array" ) do={ :do { - /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none \ + http-header-field=($Message->"headers") http-method=post \ ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ "/send/m.room.message?access_token=" . $Message->"accesstoken") \ http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Message->"plain" . "\"," . \ @@ -74,6 +75,7 @@ :global MatrixRoomOverride; :global EitherOr; + :global FetchUserAgentStr; :global LogPrint; :global SymbolForNotification; @@ -115,6 +117,7 @@ :return false; } + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ] }); :local Plain [ $PrepareText ("## [" . $IdentityExtra . $Identity . "] " . \ ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```") "plain" ]; :local Formatted ("

" . [ $PrepareText ("[" . $IdentityExtra . $Identity . "] " . \ @@ -129,7 +132,8 @@ } :do { - /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none \ + http-header-field=$Headers http-method=post \ ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ "/send/m.room.message?access_token=" . $AccessToken) \ http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Plain . "\"," . \ @@ -146,9 +150,9 @@ " " . [ /system/clock/get time ] . " and may be obsolete."); :set Plain ($Plain . "\\n" . $Text); :set Formatted ($Formatted . "
" . $Text); - :set ($MatrixQueue->[ :len $MatrixQueue ]) { room=$Room; \ - accesstoken=$AccessToken; homeserver=$HomeServer; \ - plain=$Plain; formatted=$Formatted }; + :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ + accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ + plain=$Plain; formatted=$Formatted }; :if ([ :len [ /system/scheduler/find where name="_FlushMatrixQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushMatrixQueue" interval=1m start-time=startup \ on-event=(":global FlushMatrixQueue; \$FlushMatrixQueue;"); @@ -185,6 +189,7 @@ :local User [ :tostr $1 ]; :local Pass [ :tostr $2 ]; + :global FetchUserAgentStr; :global LogPrint; :global MatrixAccessToken; @@ -193,6 +198,7 @@ :local Domain [ :pick $User ([ :find $User ":" ] + 1) [ :len $User] ]; :do { :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); @@ -207,7 +213,8 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ - http-method=post http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \ + http-data=("{\"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); @@ -233,6 +240,7 @@ :set SetupMatrixJoinRoom do={ :global MatrixRoom [ :tostr $1 ]; + :global FetchUserAgentStr; :global LogPrint; :global UrlEncode; @@ -242,7 +250,7 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-method=post http-data="" \ + 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."); From 2a232ad2f5eef4b60c97306ef731bc5883bf5cfb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:03:14 +0200 Subject: [PATCH 124/988] mod/notification-matrix: generate JSON with :serialize --- mod/notification-matrix.rsc | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 12a0e335..3e3a33ee 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -40,12 +40,11 @@ :if ([ :typeof $Message ] = "array" ) do={ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-header-field=($Message->"headers") http-method=post \ - ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ - "/send/m.room.message?access_token=" . $Message->"accesstoken") \ - http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Message->"plain" . "\"," . \ - "\"format\": \"org.matrix.custom.html\", \"formatted_body\": \"" . \ - $Message->"formatted" . "\" }") as-value; + http-header-field=($Message->"headers") http-method=post \ + http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=($Message->"plain"); + "format"="org.matrix.custom.html"; "formatted_body"=($Message->"formatted") } ] \ + ("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."); @@ -133,12 +132,11 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-header-field=$Headers http-method=post \ - ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ - "/send/m.room.message?access_token=" . $AccessToken) \ - http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Plain . "\"," . \ - "\"format\": \"org.matrix.custom.html\", \"formatted_body\": \"" . \ - $Formatted . "\" }") as-value; + 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..."); @@ -214,7 +212,7 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \ - http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ + 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); From d31afc9ec330634a2b66b346ee2d830ea5e5d436 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:10:34 +0200 Subject: [PATCH 125/988] gps-track: generate JSON with :serialize --- gps-track.rsc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index dbca38a9..f78dfe7d 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -33,11 +33,8 @@ :do { /tool/fetch check-certificate=yes-without-crl $GpsTrackUrl output=none \ http-method=post http-header-field=({ "Content-Type: application/json" }) \ - http-data=("{" . \ - "\"lat\":\"" . ($Gps->"latitude") . "\"," . \ - "\"lon\":\"" . ($Gps->"longitude") . "\"," . \ - "\"identity\":\"" . $Identity . "\"" . \ - "}") as-value; + http-data=[ :serialize to=json { "identity"=$Identity; \ + "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] as-value; $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ "lon: " . ($Gps->"longitude")); From 5736ecebc53a8e97e986eb50e4a1611b410dcc14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:14:01 +0200 Subject: [PATCH 126/988] gps-track: use custom user agent string --- gps-track.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index f78dfe7d..e2a4e16e 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -17,6 +17,7 @@ :global GpsTrackUrl; :global Identity; + :global FetchUserAgentStr; :global LogPrint; :global ScriptLock; :global WaitFullyConnected; @@ -31,10 +32,10 @@ :if ($Gps->"valid" = true) do={ :do { - /tool/fetch check-certificate=yes-without-crl $GpsTrackUrl output=none \ - http-method=post http-header-field=({ "Content-Type: application/json" }) \ + /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; \ - "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] as-value; + "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] $GpsTrackUrl as-value; $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ "lon: " . ($Gps->"longitude")); From 7aa5059f6d478fb8984caae7c906154a1d598488 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:18:42 +0200 Subject: [PATCH 127/988] global-functions: $CertificateAvailable: use single quotes --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8f2f179a..17aa38fe 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -107,7 +107,7 @@ } :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ - $LogPrint info $0 ("Certificate with CommonName \"" . $CommonName . "\" not available."); + $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } @@ -116,8 +116,8 @@ :local CertVal [ /certificate/get [ find where common-name=$CommonName ] ]; :while (($CertVal->"akid") != "" && ($CertVal->"akid") != ($CertVal->"skid")) do={ :if ([ :len [ /certificate/find where skid=($CertVal->"akid") ] ] = 0) do={ - $LogPrint info $0 ("Certificate chain for \"" . $CommonName . \ - "\" is incomplete, missing \"" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "\"."); + $LogPrint info $0 ("Certificate chain for '" . $CommonName . \ + "' is incomplete, missing '" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "'."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } From e1781fb8053db5cdb3b26d04009c216f7d2204ac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:19:37 +0200 Subject: [PATCH 128/988] global-functions: $CertificateDownload: use single quotes --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 17aa38fe..918ea9a3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -141,7 +141,7 @@ :global WaitForFile; $LogPrint info $0 ("Downloading and importing certificate with " . \ - "CommonName \"" . $CommonName . "\"."); + "CommonName '" . $CommonName . "'."); :do { :local FileName ([ $CleanName $CommonName ] . ".pem"); /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ @@ -156,7 +156,7 @@ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } } on-error={ - $LogPrint warning $0 ("Failed importing certificate with CommonName \"" . $CommonName . "\"!"); + $LogPrint warning $0 ("Failed importing certificate with CommonName '" . $CommonName . "'!"); :return false; } :return true; From 8c1543a402570278a8dfdcf8d052ab8bb6f282e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:21:54 +0200 Subject: [PATCH 129/988] certificate-renew-issued: use single quotes --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 77ed3d05..7815443b 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -36,13 +36,13 @@ /certificate/export-certificate ($CertVal->"name") type=pkcs12 \ file-name=("cert-issued/" . $CertVal->"common-name") \ export-passphrase=($CertIssuedExportPass->($CertVal->"common-name")); - $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . \ - "\", exported to \"cert-issued/" . $CertVal->"common-name" . ".p12\"."); + $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . \ + "', exported to 'cert-issued/" . $CertVal->"common-name" . ".p12'."); } else={ $LogPrint warning $ScriptName ("Failed creating directory, not exporting certificate."); } } else={ - $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . "\"."); + $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } } on-error={ } From 3a36db6de8a69cba493bdd0baf86c60401fe971c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 18 Apr 2024 08:43:41 +0200 Subject: [PATCH 130/988] mod/notification-matrix: fix double escaping That was introduced with 2a232ad2f5eef4b60c97306ef731bc5883bf5cfb when switching to :serialize... --- mod/notification-matrix.rsc | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 3e3a33ee..86e6b5fb 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -86,21 +86,15 @@ } :local Return ""; - :local Chars { - "plain"={ "\\"; "\""; "\n" }; - "format"={ "\\"; "\""; "\n"; "&"; "<"; ">" }; - } - :local Subs { - "plain"={ "\\\\"; "\\\""; "\\n" }; - "format"={ "\\\\"; """; "
"; "&"; "<"; ">" }; - } + :local Chars { "\""; "\n"; "&"; "<"; ">" }; + :local Subs { """; "
"; "&"; "<"; ">" }; :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; - :local Replace [ :find ($Chars->$2) $Char ]; + :local Replace [ :find $Chars $Char ]; :if ([ :typeof $Replace ] = "num") do={ - :set Char ($Subs->$2->$Replace); + :set Char ($Subs->$Replace); } :set Return ($Return . $Char); } @@ -117,17 +111,17 @@ } :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ] }); - :local Plain [ $PrepareText ("## [" . $IdentityExtra . $Identity . "] " . \ - ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```") "plain" ]; + :local Plain ("## [" . $IdentityExtra . $Identity . "] " . \ + ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```"); :local Formatted ("

" . [ $PrepareText ("[" . $IdentityExtra . $Identity . "] " . \ - ($Notification->"subject")) "format" ] . "

" . "
" . \
-    [ $PrepareText ($Notification->"message") "format" ] . "
"); + ($Notification->"subject")) ] . "

" . "
" . \
+    [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ :set Plain ($Plain . "\\n" . [ $SymbolForNotification "link" ] . \ - [ $PrepareText ("[" . $Notification->"link" . "](" . $Notification->"link" . ")") "plain" ]); + "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ - ""link") "format" ] . "\\\">" . \ - [ $PrepareText ($Notification->"link") "format" ] . ""); + ""link") ] . "\">" . \ + [ $PrepareText ($Notification->"link") ] . ""); } :do { From b50a5b294a50729e70d96c65ed1a12657bd1adf3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 18 Apr 2024 21:47:50 +0200 Subject: [PATCH 131/988] mod/notification-matrix: ... and more double escaping --- mod/notification-matrix.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 86e6b5fb..7eae1b0e 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -117,7 +117,7 @@ ($Notification->"subject")) ] . "" . "
" . \
     [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ - :set Plain ($Plain . "\\n" . [ $SymbolForNotification "link" ] . \ + :set Plain ($Plain . "\n" . [ $SymbolForNotification "link" ] . \ "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ ""link") ] . "\">" . \ @@ -140,7 +140,7 @@ :local Text ([ $SymbolForNotification "alarm-clock" ] . \ "This message was queued since " . [ /system/clock/get date ] . \ " " . [ /system/clock/get time ] . " and may be obsolete."); - :set Plain ($Plain . "\\n" . $Text); + :set Plain ($Plain . "\n" . $Text); :set Formatted ($Formatted . "
" . $Text); :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ From 6fd0becf64184184642e719e288bc537a0bee499 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 08:59:51 +0200 Subject: [PATCH 132/988] global-functions: introduce $ProtocolStrip --- global-functions.rsc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 918ea9a3..3b9f27c0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -58,6 +58,7 @@ :global ParseDate; :global ParseKeyValueStore; :global PrettyPrint; +:global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; :global ScriptFromTerminal; @@ -885,6 +886,17 @@ :put [ $Unix2Dos $Input ]; } +# strip protocol from from url string +:set ProtocolStrip do={ + :local Input [ :tostr $1 ]; + + :local Pos [ :find $Input "://" ]; + :if ([ :typeof $Pos ] = "nil") do={ + :return $Input; + } + :return [ :pick $Input ($Pos + 3) [ :len $Input ] ]; +} + # delay a random amount of seconds :set RandomDelay do={ :local Time [ :tonum $1 ]; From 8cd03167ca0bd47efd9b7c9b12aabebbe228b36c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 09:04:08 +0200 Subject: [PATCH 133/988] mod/notification-matrix: string protocol for display --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 7eae1b0e..9442f548 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -76,6 +76,7 @@ :global EitherOr; :global FetchUserAgentStr; :global LogPrint; + :global ProtocolStrip; :global SymbolForNotification; :local PrepareText do={ @@ -117,11 +118,12 @@ ($Notification->"subject")) ] . "" . "
" . \
     [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ + :local Label [ $ProtocolStrip ($Notification->"link") ]; :set Plain ($Plain . "\n" . [ $SymbolForNotification "link" ] . \ - "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); + "[" . $Label . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ "
"link") ] . "\">" . \ - [ $PrepareText ($Notification->"link") ] . ""); + [ $PrepareText $Label ] . ""); } :do { From ee54956a6909190eceb5eae696ad8590720bc3c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 09:09:13 +0200 Subject: [PATCH 134/988] mod/notification-telegram: string protocol for display --- mod/notification-telegram.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index c78a8ad1..745367a1 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -76,6 +76,7 @@ :global EitherOr; :global IfThenElse; :global LogPrint; + :global ProtocolStrip; :global SymbolForNotification; :global UrlEncode; @@ -117,7 +118,7 @@ ($Notification->"subject")) "plain" ] . "__*\n\n"); :local LenSubject [ :len $Text ]; :local LenMessage [ :len ($Notification->"message") ]; - :local LenLink [ :len ($Notification->"link") ]; + :local LenLink ([ :len ($Notification->"link") ] * 2); :local LenSum ($LenSubject + $LenMessage + $LenLink); :if ($LenSum > 3968) do={ :set Text ($Text . [ $EscapeMD ([ :pick ($Notification->"message") 0 (3840 - $LenSubject - $LenLink) ] . "...") "body" ]); @@ -126,7 +127,9 @@ :set Text ($Text . [ $EscapeMD ($Notification->"message") "body" ]); } :if ($LenLink > 0) do={ - :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . [ $EscapeMD ($Notification->"link") "plain" ]); + :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . \ + "[" . [ $EscapeMD [ $ProtocolStrip ($Notification->"link") ] "plain" ] . "]" . \ + "(" . [ $EscapeMD ($Notification->"link") "plain" ] . ")"); } :if ($Truncated = true) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "scissors" ] . \ From b0cd53f813be602edf59db2ec18e085d84fbebeb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 10:05:52 +0200 Subject: [PATCH 135/988] netwatch-notify: allow to suppress resolve failure --- doc/netwatch-notify.md | 9 +++++++++ netwatch-notify.rsc | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 90cd830a..2db32bb1 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -104,6 +104,15 @@ powered off, but accessibility is of interest. Go and get your coffee ☕️ before sending the print job. +### No log on failed resolve + +A message is writting to log after three failed attemts to resolve a host. +However this can cause some noise for hosts that are expected to have +failures, for example when the name is dynamically added by +[`dhcp-to-dns`](dhcp-to-dns.md). This can be suppressed: + + /tool/netwatch/add comment="notify, name=client, resolve=client.dhcp.example.com, no-resolve-fail" host=10.0.0.0; + ### Add a note in notification For some extra information it is possible to add a text note. This is diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0b6c366c..9b0beb93 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -116,7 +116,7 @@ } } on-error={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); - :if ($Metric->"resolve-failcnt" = 3) do={ + :if ($Metric->"resolve-failcnt" = 3 && $HostInfo->"no-resolve-fail" != true) do={ $LogPrint warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ $HostInfo->"name") "" ] . "' failed."); From 0f2a4aedab31a7f697158d3d34ac6ce08756ebce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:34:35 +0200 Subject: [PATCH 136/988] global-functions: $CertificateDownload: remove with find... ... to make sure this does not break when the file does no longer exist. Starting with RouterOS 7.15rc1 the file is automatically removed on import. --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b9f27c0..66765bfa 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -151,7 +151,7 @@ $WaitForFile $FileName; /certificate/import file-name=$FileName passphrase="" as-value; :delay 1s; - /file/remove $FileName; + /file/remove [ find where name=$FileName ]; :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ $CertificateNameByCN [ /certificate/get $Cert common-name ]; From e42f8843bd3e25657d7af1ced4a4ce0270817358 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:53:32 +0200 Subject: [PATCH 137/988] INITIAL-COMMANDS: remove the certificate file with find Required as RouterOS 7.15rc1 removes it automatically. --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 0320fe80..4a121973 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -23,7 +23,7 @@ Run the complete base installation: :if ([ :len [ /certificate/find where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ :error "Something is wrong with your certificates!"; }; - /file/remove "letsencrypt-E1.pem"; + /file/remove [ find where name="letsencrypt-E1.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ From de8da38a0cf60be3f79f5a64ad766343c18cb2a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:59:03 +0200 Subject: [PATCH 138/988] README: remove left over certificate file But use find as RouterOS 7.15rc1 removes it automatically. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45167363..a92f71df 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,12 @@ a sensitive property, the passphrase. For basic verification we rename the certificates and print them by fingerprint. Make sure exactly these two certificates ("*E1*" and -"*ISRG-Root-X2*") are shown. +"*ISRG-Root-X2*") are shown. Also remove the left over file. /certificate/set name="E1" [ find where common-name="E1" ]; /certificate/set name="ISRG-Root-X2" [ find where common-name="ISRG Root X2" ]; /certificate/print proplist=name where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + /file/remove [ find where name="letsencrypt-E1.pem" ]; ![screenshot: check certs](README.d/03-check-certs.avif) From b0e4449e4f3f6318bbe9ad83fe1b8e30a77ea1ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 12:00:13 +0200 Subject: [PATCH 139/988] README: show fingerprints in output This is not scrictly necessary, as we filter by fingerprint already... But it gives better overview and feeling. --- README.d/03-check-certs.avif | Bin 9339 -> 12089 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 33bdc408e4dcd3c35e95c87109926d801f8c9fe8..0477c398b41b439ec6eff03c8bcd2357f2637857 100644 GIT binary patch delta 10851 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 delta 8079 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�Ibb~WfBjIbKo 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 g9gomMY$x< Date: Tue, 23 Apr 2024 10:43:19 +0200 Subject: [PATCH 140/988] netwatch-notify: log to debug... ... instead of discarding the message completely. --- netwatch-notify.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 9b0beb93..17682f04 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -116,8 +116,9 @@ } } on-error={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); - :if ($Metric->"resolve-failcnt" = 3 && $HostInfo->"no-resolve-fail" != true) do={ - $LogPrint warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ + :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."); } From db1faf1091ed300931793e2e198acf83e8eca4d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 13:41:36 +0200 Subject: [PATCH 141/988] backup-upload: remove temporary directory --- backup-upload.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index 63e5b7f3..1b9058d5 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -158,4 +158,5 @@ :set PackagesUpdateBackupFailure true; :error false; } + /file/remove $DirName; } on-error={ } From b3b7643661b13856437ff75cca0bb48f1e1aa0bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 18:03:08 +0200 Subject: [PATCH 142/988] backup-upload: no early exit... --- backup-upload.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 1b9058d5..1dc98d52 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -156,7 +156,6 @@ :if ($Failed = 1) do={ :set PackagesUpdateBackupFailure true; - :error false; } /file/remove $DirName; } on-error={ } From 505074e6d333f9696eb1b2e6afc90a59a5e1e1d6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:09:21 +0200 Subject: [PATCH 143/988] backup-cloud: no early exit... ... as we want to make sure the directory (and its content) is removed. --- backup-cloud.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 8e29c677..1085f058 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -79,7 +79,6 @@ message=("Failed uploading backup for " . $Identity . " to cloud!\n\n" . [ $DeviceInfo ]) }); $LogPrint error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!"); :set PackagesUpdateBackupFailure true; - :error false; } /file/remove "tmpfs/backup-cloud"; } on-error={ } From 5f1656b7ce439e6567803299eaddca215e8cb7cf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 13:53:04 +0200 Subject: [PATCH 144/988] backup-cloud: clean up and simplify code --- backup-cloud.rsc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 1085f058..bdc6c340 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -49,13 +49,11 @@ :execute { :global BackupPassword; - # we are not interested in output, but print is - # required to fetch information from cloud - /system/backup/cloud/print as-value; - :delay 20ms; - :if ([ :len [ /system/backup/cloud/find ] ] > 0) do={ + + :local Backup ([ /system/backup/cloud/find ]->0); + :if ([ :typeof $Backup ] = "id") do={ /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword replace=[ get ([ find ]->0) name ]; + password=$BackupPassword replace=$Backup; } else={ /system/backup/cloud/upload-file action=create-and-upload \ password=$BackupPassword; From 57ebcfb41cbd078ba62c7d4e7e921ffdae834521 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:37:28 +0200 Subject: [PATCH 145/988] backup-cloud: retry on error... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's see if brute force helps. 🤪 --- backup-cloud.rsc | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index bdc6c340..88dd3457 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -47,19 +47,23 @@ :error false; } - :execute { - :global BackupPassword; + :local I 5; + :do { + :execute { + :global BackupPassword; - :local Backup ([ /system/backup/cloud/find ]->0); - :if ([ :typeof $Backup ] = "id") do={ - /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword replace=$Backup; - } else={ - /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword; - } - /file/add name="tmpfs/backup-cloud/done"; - } as-string; + :local Backup ([ /system/backup/cloud/find ]->0); + :if ([ :typeof $Backup ] = "id") do={ + /system/backup/cloud/upload-file action=create-and-upload \ + password=$BackupPassword replace=$Backup; + } else={ + /system/backup/cloud/upload-file action=create-and-upload \ + password=$BackupPassword; + } + /file/add name="tmpfs/backup-cloud/done"; + } as-string; + :set I ($I - 1); + } while=([ $WaitForFile "tmpfs/backup-cloud/done" 200ms ] = false && $I > 0); :if ([ $WaitForFile "tmpfs/backup-cloud/done" ] = true) do={ :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; From 4006d07222511b94fd84aa4578a0b857a59639d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:20:30 +0200 Subject: [PATCH 146/988] global-functions: $FetchHuge: remove temporary directory --- global-functions.rsc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 66765bfa..b0bde7e3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -406,13 +406,13 @@ :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; - :local FileName ("tmpfs/" . [ $CleanName $ScriptName ]); - :if ([ $MkDir $FileName ] = false) do={ + :local DirName ("tmpfs/" . [ $CleanName $ScriptName ]); + :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; } - :set FileName ($FileName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); + :local FileName ($DirName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); :do { /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; @@ -421,6 +421,7 @@ /file/remove $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); + /file/remove $DirName; :return false; } $WaitForFile $FileName; @@ -432,7 +433,7 @@ :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); :set VarSize [ :len $Return ]; } - /file/remove $FileName; + /file/remove $DirName; :return $Return; } From f1ad80873498e314bbc04f3f2be5feff33d7e9ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:26:05 +0200 Subject: [PATCH 147/988] mod/ssh-keys-import: create directory later --- mod/ssh-keys-import.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index f37c28bb..e920762f 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -38,11 +38,6 @@ :return false; } - :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ - $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); - :return false; - } - :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; :if ([ :len [ /user/ssh-keys/find where user=$User key-owner~("\\bmd5=" . $FingerPrintMD5 . "\\b") ] ] > 0) do={ @@ -51,6 +46,11 @@ :return false; } + :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ + $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); + :return false; + } + :local FileName ("tmpfs/ssh-keys-import/key-" . [ $GetRandom20CharAlNum 6 ] . ".pub"); /file/add name=$FileName contents=($Key . ", md5=" . $FingerPrintMD5); $WaitForFile $FileName; From b0f58696f334c9c378229f68f7e5e6d69a4b6af7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:30:42 +0200 Subject: [PATCH 148/988] mod/ssh-keys-import: remove temporary directory --- mod/ssh-keys-import.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index e920762f..6272a939 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -59,8 +59,10 @@ /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 . "'."); + /file/remove "tmpfs/ssh-keys-import"; } on-error={ $LogPrint warning $0 ("Failed importing key."); + /file/remove "tmpfs/ssh-keys-import"; :return false; } } From 755db5d66db8e24872fb7bf959e09b047f7cd5f9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:50:57 +0200 Subject: [PATCH 149/988] global-functions: $CleanName: do not start with a dash --- global-functions.rsc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index b0bde7e3..5135fc1a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -230,11 +230,19 @@ :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-" $Char ] ] = "nil") do={ - :set Char "-"; - } - :if ($Char != "-" || [ :pick $Return ([ :len $Return ] - 1) ] != "-") do={ - :set Return ($Return . $Char); + :do { + :if ([ :len $Return ] = 0) do={ + :error true; + } + :if ([ :pick $Return ([ :len $Return ] - 1) ] = "-") do={ + :error true; + } + :set Char "-"; + } on-error={ + :set Char ""; + } } + :set Return ($Return . $Char); } :return $Return; } From e7cdb2d7f454fa093b6b9be3e38a86a90d344d55 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 25 Apr 2024 23:59:11 +0200 Subject: [PATCH 150/988] mod/notification-matrix: format date & time italic --- mod/notification-matrix.rsc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 9442f548..196633a4 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -139,11 +139,12 @@ :if ([ :typeof $MatrixQueue ] = "nothing") do={ :set MatrixQueue ({}); } - :local Text ([ $SymbolForNotification "alarm-clock" ] . \ - "This message was queued since " . [ /system/clock/get date ] . \ - " " . [ /system/clock/get time ] . " and may be obsolete."); - :set Plain ($Plain . "\n" . $Text); - :set Formatted ($Formatted . "
" . $Text); + :local Symbol [ $SymbolForNotification "alarm-clock" ]; + :local DateTime ([ /system/clock/get date ] . " " . [ /system/clock/get time ]); + :set Plain ($Plain . "\n" . $Symbol . "This message was queued since *" . \ + $DateTime . "* and may be obsolete."); + :set Formatted ($Formatted . "
" . $Symbol . "This message was queued since " . \ + $DateTime . " and may be obsolete."); :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ plain=$Plain; formatted=$Formatted }; From d6e315580bf354e7a5620955c707e604d3cdaf9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 00:18:07 +0200 Subject: [PATCH 151/988] mod/notification-telegram: capitalize Telegram in message --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 745367a1..440e0dd8 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -149,7 +149,7 @@ "&parse_mode=MarkdownV2&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..."); + $LogPrint info $0 ("Failed sending Telegram notification! Queuing..."); :if ([ :typeof $TelegramQueue ] = "nothing") do={ :set TelegramQueue ({}); From 4b6cd7ba2911b44f8d0890c19c5342ce28a6b3a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 08:15:56 +0200 Subject: [PATCH 152/988] mod/notification-telegram: use proper variable naming... ... in local escaping function. --- mod/notification-telegram.rsc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 440e0dd8..efde85a1 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -81,24 +81,26 @@ :global UrlEncode; :local EscapeMD do={ + :local Text [ :tostr $1 ]; + :local Mode [ :tostr $2 ]; + :global CharacterReplace; :global IfThenElse; - :local Return $1; :local Chars { - "body"={ "\\"; "`" }; + "body"={ "\\"; "`" }; "plain"={ "_"; "*"; "["; "]"; "("; ")"; "~"; "`"; ">"; "#"; "+"; "-"; "="; "|"; "{"; "}"; "."; "!" }; } - :foreach Char in=($Chars->$2) do={ - :set Return [ $CharacterReplace $Return $Char ("\\" . $Char) ]; + :foreach Char in=($Chars->$Mode) do={ + :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; } - :if ($2 = "body") do={ - :return ("```\n" . $Return . "\n```"); + :if ($Mode = "body") do={ + :return ("```\n" . $Text . "\n```"); } - :return $Return; + :return $Text; } :local ChatId [ $EitherOr ($Notification->"chatid") \ From f8856ae7423d2b969b02094cc002e75388ee6374 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 08:24:06 +0200 Subject: [PATCH 153/988] mod/notification-telegram: support excluding characters from escaping... ... to support formatting in plain text. Handle with care, this can break the request if done wrong! --- mod/notification-telegram.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index efde85a1..858ab1bc 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -83,6 +83,7 @@ :local EscapeMD do={ :local Text [ :tostr $1 ]; :local Mode [ :tostr $2 ]; + :local Excl [ :tostr $3 ]; :global CharacterReplace; :global IfThenElse; @@ -93,7 +94,9 @@ "#"; "+"; "-"; "="; "|"; "{"; "}"; "."; "!" }; } :foreach Char in=($Chars->$Mode) do={ - :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; + :if ([ :typeof [ :find $Excl $Char ] ] = "nil") do={ + :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; + } } :if ($Mode = "body") do={ From 0fd1e506badcce5580fc6505c423e4fe65db4d1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 25 Apr 2024 23:59:38 +0200 Subject: [PATCH 154/988] mod/notification-telegram: format date & time italic --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 858ab1bc..4c2fd94f 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -160,8 +160,8 @@ :set TelegramQueue ({}); } :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ - [ $EscapeMD ("This message was queued since " . [ /system/clock/get date ] . \ - " " . [ /system/clock/get time ] . " and may be obsolete.") "plain" ]); + [ $EscapeMD ("This message was queued since _" . [ /system/clock/get date ] . \ + " " . [ /system/clock/get time ] . "_ and may be obsolete.") "plain" "_" ]); :set ($TelegramQueue->[ :len $TelegramQueue ]) { chatid=$ChatId; tokenid=$TokenId; text=$Text; silent=($Notification->"silent"); replyto=($Notification->"replyto") }; :if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] = 0) do={ From 40f13b6ca45a15def2e63bab22d87ddf398c3cc7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 13:34:30 +0200 Subject: [PATCH 155/988] mod/notification-telegram: format percentage italic --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 4c2fd94f..9a628ced 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -138,8 +138,8 @@ } :if ($Truncated = true) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "scissors" ] . \ - [ $EscapeMD ("The message was too long and has been truncated, cut off " . \ - (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%!") "plain" ]); + [ $EscapeMD ("The message was too long and has been truncated, cut off _" . \ + (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%_!") "plain" "_" ]); } :do { From 6ba1faca4c156097448c766098688cc5c4ef6045 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 20:50:08 +0200 Subject: [PATCH 156/988] telegram-chat: shorten the message --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index c1a1cbcc..f8dcd423 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -81,7 +81,7 @@ } :if ($Data = false) do={ - $LogPrint warning $ScriptName ("Failed getting updates from Telegram."); + $LogPrint warning $ScriptName ("Failed getting updates."); :error false; } From 52ec6b7ea19256e47d9ffd1519ef9d7799ca48ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:57:22 +0200 Subject: [PATCH 157/988] global-functions: $WaitForFile: use fewer steps --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 5135fc1a..1c36e2ab 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1520,10 +1520,10 @@ :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 20); + :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :if ($I >= 20) do={ + :if ($I >= 10) do={ :return false; } :delay $Delay; From 517ed7bf8cefe47e6c409915a4b27384f081715d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:55:48 +0200 Subject: [PATCH 158/988] global-functions: $WaitForFile: respect minimum delay --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1c36e2ab..9c009ae4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1517,10 +1517,11 @@ :global CleanFilePath; :global EitherOr; + :global MAX; :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 10); + :local Delay ([ :totime [ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ :if ($I >= 10) do={ From eae8dbbb378dbfe43c83e77529895747da0e260e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:59:41 +0200 Subject: [PATCH 159/988] global-functions: $WaitForFile: drop extra conversion --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 9c009ae4..e8163eda 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1521,7 +1521,7 @@ :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] ] / 10); + :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ :if ($I >= 10) do={ From fb7170f3121dd9e25cc320e5f0c98d1829e49d33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 May 2024 12:30:13 +0200 Subject: [PATCH 160/988] global-functions: $IsTimeSync: log just once --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index e8163eda..5cc665c7 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -673,7 +673,7 @@ :global IsTimeSyncCached; :global IsTimeSyncResetNtp; - :global LogPrint; + :global LogPrintOnce; :if ($IsTimeSyncCached = true) do={ :return true; @@ -702,7 +702,7 @@ :if ([ /system/license/get ]->"level" = "free" || \ [ /system/resource/get ]->"board-name" = "x86") do={ - $LogPrint debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86."); + $LogPrintOnce debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86."); :return true; } @@ -714,7 +714,7 @@ :return false; } - $LogPrint debug $0 ("No time source configured! Returning gracefully..."); + $LogPrintOnce debug $0 ("No time source configured! Returning gracefully..."); :return true; } From 2745597b93901d34a4ade63d789c984adccd8b54 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 May 2024 14:25:02 +0200 Subject: [PATCH 161/988] global-functions: $IsTimeSync: add (one time) warning on failed ntp sync --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5cc665c7..b1833b11 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -693,6 +693,7 @@ :return false; } + $LogPrintOnce warning $0 ("The ntp client is configured, but did not sync."); :set IsTimeSyncResetNtp $Uptime; /system/ntp/client/set enabled=no; :delay 20ms; From c87a7519fe03249b8dbc5da3233e593c0290095d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 10 May 2024 13:17:02 +0200 Subject: [PATCH 162/988] fw-addr-lists: add 'strongips' list from blocklist.de --- certs/Certum-Domain-Validation-CA-SHA2.pem | 176 +++++++++++++++++++++ doc/fw-addr-lists.md | 4 +- global-config.rsc | 2 + global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 5 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 certs/Certum-Domain-Validation-CA-SHA2.pem diff --git a/certs/Certum-Domain-Validation-CA-SHA2.pem b/certs/Certum-Domain-Validation-CA-SHA2.pem new file mode 100644 index 00000000..0cc17ac5 --- /dev/null +++ b/certs/Certum-Domain-Validation-CA-SHA2.pem @@ -0,0 +1,176 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 279744 (0x444c0) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Validity + Not Before: Oct 22 12:07:37 2008 GMT + Not After : Dec 31 12:07:37 2029 GMT + Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e3:fb:7d:a3:72:ba:c2:f0:c9:14:87:f5:6b:01: + 4e:e1:6e:40:07:ba:6d:27:5d:7f:f7:5b:2d:b3:5a: + c7:51:5f:ab:a4:32:a6:61:87:b6:6e:0f:86:d2:30: + 02:97:f8:d7:69:57:a1:18:39:5d:6a:64:79:c6:01: + 59:ac:3c:31:4a:38:7c:d2:04:d2:4b:28:e8:20:5f: + 3b:07:a2:cc:4d:73:db:f3:ae:4f:c7:56:d5:5a:a7: + 96:89:fa:f3:ab:68:d4:23:86:59:27:cf:09:27:bc: + ac:6e:72:83:1c:30:72:df:e0:a2:e9:d2:e1:74:75: + 19:bd:2a:9e:7b:15:54:04:1b:d7:43:39:ad:55:28: + c5:e2:1a:bb:f4:c0:e4:ae:38:49:33:cc:76:85:9f: + 39:45:d2:a4:9e:f2:12:8c:51:f8:7c:e4:2d:7f:f5: + ac:5f:eb:16:9f:b1:2d:d1:ba:cc:91:42:77:4c:25: + c9:90:38:6f:db:f0:cc:fb:8e:1e:97:59:3e:d5:60: + 4e:e6:05:28:ed:49:79:13:4b:ba:48:db:2f:f9:72: + d3:39:ca:fe:1f:d8:34:72:f5:b4:40:cf:31:01:c3: + ec:de:11:2d:17:5d:1f:b8:50:d1:5e:19:a7:69:de: + 07:33:28:ca:50:95:f9:a7:54:cb:54:86:50:45:a9: + f9:49 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + Signature Algorithm: sha1WithRSAEncryption + Signature Value: + a6:a8:ad:22:ce:01:3d:a6:a3:ff:62:d0:48:9d:8b:5e:72:b0: + 78:44:e3:dc:1c:af:09:fd:23:48:fa:bd:2a:c4:b9:55:04:b5: + 10:a3:8d:27:de:0b:82:63:d0:ee:de:0c:37:79:41:5b:22:b2: + b0:9a:41:5c:a6:70:e0:d4:d0:77:cb:23:d3:00:e0:6c:56:2f: + e1:69:0d:0d:d9:aa:bf:21:81:50:d9:06:a5:a8:ff:95:37:d0: + aa:fe:e2:b3:f5:99:2d:45:84:8a:e5:42:09:d7:74:02:2f:f7: + 89:d8:99:e9:bc:27:d4:47:8d:ba:0d:46:1c:77:cf:14:a4:1c: + b9:a4:31:c4:9c:28:74:03:34:ff:33:19:26:a5:e9:0d:74:b7: + 3e:97:c6:76:e8:27:96:a3:66:dd:e1:ae:f2:41:5b:ca:98:56: + 83:73:70:e4:86:1a:d2:31:41:ba:2f:be:2d:13:5a:76:6f:4e: + e8:4e:81:0e:3f:5b:03:22:a0:12:be:66:58:11:4a:cb:03:c4: + b4:2a:2a:2d:96:17:e0:39:54:bc:48:d3:76:27:9d:9a:2d:06: + a6:c9:ec:39:d2:ab:db:9f:9a:0b:27:02:35:29:b1:40:95:e7: + f9:e8:9c:55:88:19:46:d6:b7:34:f5:7e:ce:39:9a:d9:38:f1: + 51:f7:4f:2c +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 26:dd:d2:2b:46:c9:c4:4d:5a:69:4d:39:80:7e:72:ad + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Validity + Not Before: Sep 11 12:00:00 2014 GMT + Not After : Jun 9 10:46:39 2027 GMT + Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Domain Validation CA SHA2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a1:25:63:df:8d:e4:20:07:d9:54:d1:d1:04:f6: + 17:e2:3e:47:fb:c3:74:25:b8:c4:bf:12:12:bc:e0: + 70:d1:39:05:c2:17:b3:f7:82:70:a0:4e:07:fe:10: + 2a:ff:db:0d:46:5e:24:94:a3:8b:45:9f:18:9b:ce: + 42:c4:ae:db:83:33:bc:c2:bb:b4:30:b6:a7:37:87: + 78:7b:48:cb:25:2c:82:bb:0a:48:12:60:76:89:ec: + 8e:cc:8f:1e:52:48:e9:86:02:5a:c2:b0:8a:7c:85: + 3d:d9:ff:60:4f:33:6c:a6:a1:a0:85:e1:d7:53:f2: + ea:27:3d:65:a9:72:c1:08:83:cc:b0:25:9c:11:46: + 24:e0:3e:f4:a7:ef:ed:51:b1:65:93:42:b4:f6:e6: + 86:0a:10:79:32:36:58:b2:6b:a8:dc:d5:7a:1e:9d: + 14:ee:40:e7:b2:46:4c:bd:9a:29:c2:ec:f8:30:c1: + 62:02:2a:e2:1c:83:62:d0:85:36:1a:83:de:12:84: + 29:65:ef:d2:32:be:31:60:42:a8:cf:f8:dd:ea:d0: + 56:47:1d:bd:76:96:24:13:e7:be:d9:99:2b:fa:30: + 64:f1:8a:38:7a:a6:e1:2a:96:02:b0:9d:ba:d8:8f: + 6d:4e:7a:94:69:7d:b0:93:aa:74:e5:93:90:13:fa: + a2:99 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + E5:31:AD:BF:3A:11:96:F4:83:BC:50:3C:D4:B7:90:9B:90:EE:DE:25 + X509v3 Authority Key Identifier: + 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 CRL Distribution Points: + Full Name: + URI:http://crl.certum.pl/ctnca.crl + Authority Information Access: + OCSP - URI:http://subca.ocsp-certum.com + CA Issuers - URI:http://repository.certum.pl/ctnca.cer + X509v3 Certificate Policies: + Policy: X509v3 Any Policy + CPS: http://www.certum.pl/CPS + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + ba:bf:f0:e1:dd:4d:2b:42:43:64:58:df:64:f3:ff:80:1a:5f: + 56:be:3b:a9:b2:76:f7:54:7a:4c:30:c1:99:24:4b:72:d2:ca: + d4:fa:08:c6:90:de:88:12:ed:f8:90:f9:fc:a9:84:fd:92:f2: + 78:e5:db:c9:22:57:ab:41:30:42:6b:0b:9f:d7:73:33:fb:01: + 67:1c:42:5c:8f:27:67:c7:6e:07:03:8d:0e:96:cb:0a:03:cc: + 3e:f8:87:3c:35:30:cd:18:8c:d5:71:dd:cd:dd:61:b0:13:a3: + 64:46:4e:fe:71:4e:6b:65:e9:14:04:f2:3f:a8:bd:0c:36:3d: + 2a:5d:9e:07:f2:c2:4f:90:c5:5e:4d:18:37:d1:27:28:80:a4: + 36:e5:ca:93:6a:65:0e:f8:93:b9:af:52:58:4b:7a:71:d8:ba: + f3:ef:d2:f3:f6:a2:97:e4:5d:14:02:9a:cb:e5:ae:b6:93:e1: + 23:9f:9b:3f:46:f7:ee:8e:a1:00:5b:66:c3:1e:68:23:86:0f: + 5d:77:ba:53:ad:f9:52:fb:70:15:c5:75:eb:cf:79:ad:49:7c: + f2:76:62:ae:44:2f:c5:5f:51:34:25:41:6a:12:0a:5f:8e:ae: + 10:c4:43:89:35:fd:ec:ff:31:e6:ec:1e:87:e9:3a:7c:29:50: + 45:41:a3:14 +-----BEGIN CERTIFICATE----- +MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+ +MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B +LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD +VQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMB4XDTE0MDkxMTEyMDAwMFoX +DTI3MDYwOTEwNDYzOVowgYUxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRv +IFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxKTAnBgNVBAMTIENlcnR1bSBEb21haW4gVmFsaWRhdGlvbiBD +QSBTSEEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSVj343kIAfZ +VNHRBPYX4j5H+8N0JbjEvxISvOBw0TkFwhez94JwoE4H/hAq/9sNRl4klKOLRZ8Y +m85CxK7bgzO8wru0MLanN4d4e0jLJSyCuwpIEmB2ieyOzI8eUkjphgJawrCKfIU9 +2f9gTzNspqGgheHXU/LqJz1lqXLBCIPMsCWcEUYk4D70p+/tUbFlk0K09uaGChB5 +MjZYsmuo3NV6Hp0U7kDnskZMvZopwuz4MMFiAiriHINi0IU2GoPeEoQpZe/SMr4x +YEKoz/jd6tBWRx29dpYkE+e+2Zkr+jBk8Yo4eqbhKpYCsJ262I9tTnqUaX2wk6p0 +5ZOQE/qimQIDAQABo4IBPjCCATowDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +5TGtvzoRlvSDvFA81LeQm5Du3iUwHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzi +hDdGdfcwDgYDVR0PAQH/BAQDAgEGMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j +cmwuY2VydHVtLnBsL2N0bmNhLmNybDBrBggrBgEFBQcBAQRfMF0wKAYIKwYBBQUH +MAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMQYIKwYBBQUHMAKGJWh0 +dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOQYDVR0gBDIwMDAu +BgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93d3cuY2VydHVtLnBsL0NQUzAN +BgkqhkiG9w0BAQsFAAOCAQEAur/w4d1NK0JDZFjfZPP/gBpfVr47qbJ291R6TDDB +mSRLctLK1PoIxpDeiBLt+JD5/KmE/ZLyeOXbySJXq0EwQmsLn9dzM/sBZxxCXI8n +Z8duBwONDpbLCgPMPviHPDUwzRiM1XHdzd1hsBOjZEZO/nFOa2XpFATyP6i9DDY9 +Kl2eB/LCT5DFXk0YN9EnKICkNuXKk2plDviTua9SWEt6cdi68+/S8/ail+RdFAKa +y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv +xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA== +-----END CERTIFICATE----- diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index ac34c885..e9a8ff74 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,8 +19,8 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains -lists from [abuse.ch](https://abuse.ch/) and -[dshield.org](https://dshield.org/), and +lists from [abuse.ch](https://abuse.ch/), [dshield.org](https://dshield.org/) +and [blocklist.de](https://www.blocklist.de/), and lists from [spamhaus.org](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not diff --git a/global-config.rsc b/global-config.rsc index 6a37c0c0..646eddb5 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -101,6 +101,8 @@ cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="R3" }; + { url="https://lists.blocklist.de/lists/strongips.txt"; + cert="Certum Domain Validation CA SHA2" }; # { url="https://www.spamhaus.org/drop/drop.txt"; # cert="Cloudflare Inc ECC CA-3" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index b1833b11..f8903764 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 127; +:global ExpectedConfigVersion 128; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 8ddeb913..13a358f2 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -52,6 +52,7 @@ 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; 127="Added support for authentication to Ntfy notification module."; + 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; }; # Migration steps to be applied on script updates From 545fb5583aee9e8971749a7eab71b4040cf7847f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 14:27:11 +0200 Subject: [PATCH 163/988] global-functions: $IsTimeSync: initialize with uptime... ... to make sure the warning is not issued too early. --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f8903764..3800ad53 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -685,10 +685,10 @@ :return true; } - :if ([ :typeof $IsTimeSyncResetNtp ] = "nothing") do={ - :set IsTimeSyncResetNtp 0s; - } :local Uptime [ /system/resource/get uptime ]; + :if ([ :typeof $IsTimeSyncResetNtp ] = "nothing") do={ + :set IsTimeSyncResetNtp $Uptime; + } :if ($Uptime - $IsTimeSyncResetNtp < 3m) do={ :return false; } From ca7a592dfd9f19e07bbabc32d999b604bff0d0c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 14:15:54 +0200 Subject: [PATCH 164/988] daily-psk: adopt syntax changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RouterOS 7.15beta8 came with this change: *) wifi - show inherited properties with "print" command (replaces "actual-configuration") and added "print config" for showing only configured values; While the old code is bad syntax with RouterOS 7.15, the new code is valid for older RouterOS, but produces different (and more or less unexpected) results. 🥴 Let's use the new code, and add a check on the RouterOS version. With old RouterOS this now sends the notification even if the interface is disabled. --- daily-psk.capsman.rsc | 1 + daily-psk.local.rsc | 1 + daily-psk.template.rsc | 3 ++- daily-psk.wifi.rsc | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 64e8ce72..985bc471 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 48e2b8d8..185165ab 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5097b00a..434410b1 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -24,6 +24,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -85,7 +86,7 @@ /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ - :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ + :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9d7f2850..9b938dc4 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -71,7 +72,7 @@ $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; - :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ + :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ From 169c1ab6e1fce71c50cc4eaadeaae7cc685ee7bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 15:51:34 +0200 Subject: [PATCH 165/988] daily-psk: decrease indention in notification --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 985bc471..51eea364 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -81,9 +81,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 185165ab..46d03a84 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -80,9 +80,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 434410b1..6c67a575 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -96,9 +96,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9b938dc4..9c28e9cd 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -81,9 +81,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } From 787ae4440ccc795e82373e80ed5e0266e529374a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 15:54:12 +0200 Subject: [PATCH 166/988] daily-psk: quote ssid and passphrase --- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 51eea364..cd5b6b05 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -69,7 +69,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 46d03a84..fbdb784e 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -68,7 +68,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 6c67a575..35fa82c7 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -80,7 +80,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; /interface/wifi/access-list/set $AccList passphrase=$NewPsk; /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9c28e9cd..c1f71336 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -69,7 +69,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ From 51331ea2acd5f5563ed3641090bbb7f2104d3e96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 09:26:13 +0200 Subject: [PATCH 167/988] backup-partition: support RouterOS copy-over... ... when run interactively from CLI. --- backup-partition.rsc | 17 +++++++++++++++++ doc/backup-partition.md | 11 ++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index fc186c06..9eeb1ae4 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -18,6 +18,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global ScriptFromTerminal; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -41,6 +42,22 @@ :local FallbackTo [ /partitions/get $ActiveRunning fallback-to ]; + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + :do { + /partitions/copy-to $FallbackTo; + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + } on-error={ + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :set PackagesUpdateBackupFailure true; + :error false; + } + } + } + } + :do { /system/scheduler/add start-time=startup name="running-from-backup-partition" \ on-event=(":log warning (\"Running from partition '\" . " . \ diff --git a/doc/backup-partition.md b/doc/backup-partition.md index ba206570..89962035 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -18,6 +18,7 @@ Description This script saves the current configuration to fallback [partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). +It can also copy-over the RouterOS installation when run interactively. For this to work you need a device with sufficient flash storage that is properly partitioned. @@ -26,9 +27,10 @@ To make you aware of a possible issue a scheduler logging a warning is added in the backup partition's configuration. You may want to use [log-forward](log-forward.md) to be notified. -> ⚠️ **Warning**: Only the configuration is saved to backup partition. -> Every now and then you should copy your installation over for a recent -> RouterOS version! +> ⚠️ **Warning**: By default only the configuration is saved to backup +> partition. Every now and then you should copy your installation over +> for a recent RouterOS version! For that run the script from terminal +> manually. Requirements and installation ----------------------------- @@ -44,6 +46,9 @@ Just run the script: /system/script/run backup-partition; +When run interactively from terminal it supports to copy-over the RouterOS +installation when versions differ. + Creating a scheduler may be an option: /system/scheduler/add interval=1w name=backup-partition on-event="/system/script/run backup-partition;" start-time=09:30:00; From c26e44ae4673f58a89833c15faf06828e7e2dd3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:02 +0200 Subject: [PATCH 168/988] doc/backup-cloud: fix link for backup-partition --- doc/backup-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index be6e06d9..1f9e1238 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -68,7 +68,7 @@ See also -------- * [Send backup via e-mail](backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) * [Upload backup to server](backup-upload.md) --- From 6cbe13a135fe39c097b6a7078506d99eedde2e06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 11:58:26 +0200 Subject: [PATCH 169/988] backup-partition: move code to a local function --- backup-partition.rsc | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 9eeb1ae4..a72dd0b0 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -21,6 +21,22 @@ :global ScriptFromTerminal; :global ScriptLock; + :local CopyTo do={ + :local ScriptName [ :tostr $1 ]; + :local FallbackTo [ :tostr $2 ]; + + :global LogPrint; + + :do { + /partitions/copy-to $FallbackTo; + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + :return true; + } on-error={ + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :return false; + } + } + :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; @@ -46,11 +62,7 @@ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :do { - /partitions/copy-to $FallbackTo; - $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); - } on-error={ - $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } From 16831aa1e8aa0ecb7ba95918e42aae2659530385 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:28 +0200 Subject: [PATCH 170/988] doc/backup-email: fix link for backup-partition --- doc/backup-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-email.md b/doc/backup-email.md index a506543d..3b1dbb26 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -59,7 +59,7 @@ See also -------- * [Upload backup to Mikrotik cloud](backup-cloud.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) * [Send notifications via e-mail](mod/notification-email.md) * [Upload backup to server](backup-upload.md) From affa11816182fa2bff454b3e82df3166c6cdd744 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 12:03:53 +0200 Subject: [PATCH 171/988] backup-partition: support copy before feature update --- backup-partition.rsc | 13 +++++++++++++ doc/backup-partition.md | 18 +++++++++++++++--- global-config.rsc | 2 ++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index a72dd0b0..3c883f7e 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -15,11 +15,13 @@ :do { :local ScriptName [ :jobname ]; + :global BackupPartitionCopyBeforeFeatureUpdate; :global PackagesUpdateBackupFailure; :global LogPrint; :global ScriptFromTerminal; :global ScriptLock; + :global VersionToNum; :local CopyTo do={ :local ScriptName [ :tostr $1 ]; @@ -67,6 +69,17 @@ :error false; } } + } else={ + :local Update [ /system/package/update/get ]; + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; + :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ + ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ + :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :set PackagesUpdateBackupFailure true; + :error false; + } + } } } diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 89962035..1cef2c9b 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -18,7 +18,8 @@ Description This script saves the current configuration to fallback [partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). -It can also copy-over the RouterOS installation when run interactively. +It can also copy-over the RouterOS installation when run interactively +or just before a feature update. For this to work you need a device with sufficient flash storage that is properly partitioned. @@ -29,8 +30,7 @@ added in the backup partition's configuration. You may want to use > ⚠️ **Warning**: By default only the configuration is saved to backup > partition. Every now and then you should copy your installation over -> for a recent RouterOS version! For that run the script from terminal -> manually. +> for a recent RouterOS version! See below for options. Requirements and installation ----------------------------- @@ -39,6 +39,18 @@ Just install the script: $ScriptInstallUpdate backup-partition; +Configuration +------------- + +The configuration goes to `global-config-overlay`, the only parameter is: + +* `BackupPartitionCopyBeforeFeatureUpdate`: copy-over the RouterOS + installation when a feature update is pending + +> ℹ️ **Info**: Copy relevant configuration from +> [`global-config`](../global-config.rsc) (the one without `-overlay`) to +> your local `global-config-overlay` and modify it to your specific needs. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index 646eddb5..8a42b817 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -85,6 +85,8 @@ :global BackupUploadUrl "sftp://example.com/backup/"; :global BackupUploadUser "mikrotik"; :global BackupUploadPass "v3ry-s3cr3t"; +# Copy the RouterOS installation to backup partition before feature update. +:global BackupPartitionCopyBeforeFeatureUpdate false; # This defines the settings for firewall address-lists (fw-addr-lists). :global FwAddrLists { From 0a46fb536f929f3248085072979b7acfe119dbd5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:46 +0200 Subject: [PATCH 172/988] doc/backup-upload: fix link for backup-partition --- doc/backup-upload.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index f524adb3..c44217c5 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -85,7 +85,7 @@ See also * [Upload backup to Mikrotik cloud](backup-cloud.md) * [Send backup via e-mail](backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) --- [⬅️ Go back to main README](../README.md) From 33a495beb76f438ba79e56ab8e4872d2df5c4da8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:18:13 +0200 Subject: [PATCH 173/988] backup-partition: news on support for copy-over --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3800ad53..96ed71d6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 128; +:global ExpectedConfigVersion 129; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 13a358f2..b20bbaf4 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -53,6 +53,7 @@ 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; 127="Added support for authentication to Ntfy notification module."; 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; + 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; }; # Migration steps to be applied on script updates From d6648563267a3c807a3b99f14881767b6e9826f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:00:03 +0200 Subject: [PATCH 174/988] telegram-chat: convert the message (command) to string RouterOS 7.15beta4 fixed a bug in JSON parser: *) console - do not convert string to array in ":deserialize" command; Before that change commands with a comma caused very crazy issues. Let's convert the message to a string. This does not give exactly the expected result, but mitigates telegram-chat to explode. A command like... /ip/address/print proplist=address,network; ... is converted to... /ip/address/print proplist=address;network; ... and results in: Columns: ADDRESS # ADDRESS 0 10.0.0.1/24 1 127.0.0.1/8 bad command name network (line 1 column 36) --- telegram-chat.rsc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f8dcd423..f3efd08e 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -97,6 +97,7 @@ :local Trusted false; :local Chat ($Message->"chat"); :local From ($Message->"from"); + :local Command [ :tostr ($Message->"text") ]; :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ @@ -106,15 +107,15 @@ :if ($Trusted = true) do={ :local Done false; - :if ($Message->"text" = "?") do={ + :if ($Command = "?") do={ $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } - :if ($Done = false && [ :pick ($Message->"text") 0 1 ] = "!") do={ - :if ($Message->"text" ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ + :if ($Done = false && [ :pick ($Command) 0 1 ] = "!") do={ + :if ($Command ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ :set TelegramChatActive true; } else={ :set TelegramChatActive false; @@ -123,16 +124,16 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Message->"text") ] > 0) do={ - :if ([ $ValidateSyntax ($Message->"text") ] = true) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Command) ] > 0) do={ + :if ([ $ValidateSyntax ($Command) ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); :error false; } - $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Message->"text"); - :execute script=(":do {\n" . $Message->"text" . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ + $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Command); + :execute script=(":do {\n" . $Command . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ "/file/add name=\"" . $File . ".done\"") file=($File . "\00"); :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ :set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n"); @@ -143,7 +144,7 @@ :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ $State . [ $IfThenElse ([ :len $Content ] > 0) \ ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) \ ([ $SymbolForNotification "memo" ] . "No output.") ]) }); @@ -152,7 +153,7 @@ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ [ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") }); } } @@ -160,7 +161,7 @@ :local MessageText ("Received a message from untrusted contact " . \ [ $IfThenElse ([ :len ($From->"username") ] = 0) "without username" ("'" . $From->"username" . "'") ] . \ " (ID " . $From->"id" . ") in update " . $UpdateID . "!"); - :if ($Message->"text" ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ + :if ($Command ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ $LogPrint warning $ScriptName $MessageText; $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ From a97820d12a5833bce5160da674e5085b2882b53a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 25 May 2024 19:55:13 +0200 Subject: [PATCH 175/988] telegram-chat: drop extra parenthesis --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f3efd08e..0fd8a066 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -114,7 +114,7 @@ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } - :if ($Done = false && [ :pick ($Command) 0 1 ] = "!") do={ + :if ($Done = false && [ :pick $Command 0 1 ] = "!") do={ :if ($Command ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ :set TelegramChatActive true; } else={ @@ -124,8 +124,8 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Command) ] > 0) do={ - :if ([ $ValidateSyntax ($Command) ] = true) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ + :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ From e35ba4b06ce300b698a8bf684503437961e1343a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 1 Jun 2024 23:06:24 +0200 Subject: [PATCH 176/988] global-functions: $CleanName: no exception for dash... ... as we still want to deduplicate it when it is inside the input string. This also unbreak certificate import for "Go Daddy Secure Certificate Authority - G2" (and more)... --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 96ed71d6..447d6e9a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -229,7 +229,7 @@ :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; - :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-" $Char ] ] = "nil") do={ + :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" $Char ] ] = "nil") do={ :do { :if ([ :len $Return ] = 0) do={ :error true; From cd4ac2c0881f92327ce173f2294b066ca4bc2ba2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Jun 2024 14:50:55 +0200 Subject: [PATCH 177/988] backup-cloud: log note on previous connection errors --- backup-cloud.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 88dd3457..8f5575ea 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -66,6 +66,10 @@ } while=([ $WaitForFile "tmpfs/backup-cloud/done" 200ms ] = false && $I > 0); :if ([ $WaitForFile "tmpfs/backup-cloud/done" ] = true) do={ + :if ($I < 4) do={ + :log warning ($ScriptName . ": Retry successful, please discard previous connection errors."); + } + :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; $SendNotification2 ({ origin=$ScriptName; \ From 0a085e6610aadf546b936076f6e3ae68538b1cfa Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:53:17 +0200 Subject: [PATCH 178/988] check-lte-firmware-upgrade: omit once Omit `once` from the `/interface/lte/firmware-upgrade` command to make sure it does acutally return a valid result. --- check-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 3a25f83d..5ea094ec 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -44,7 +44,7 @@ :local Firmware; :local Info; :do { - :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; + :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; :set Info [ /interface/lte/monitor $Interface once as-value ]; } on-error={ $LogPrint debug $ScriptName ("Could not get latest LTE firmware version for interface " . \ From c2dd9de9b1789c81f2a7db14f5dbba87d5881286 Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Sun, 9 Jun 2024 13:13:59 +0200 Subject: [PATCH 179/988] unattended-lte-firmware-upgrade: omit once Omit `once` from the `/interface/lte/firmware-upgrade` command to make sure it does acutally return a valid result. Fixes #69 --- unattended-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 904f9528..ba22c6f8 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -10,7 +10,7 @@ :local Firmware; :local IntName [ /interface/lte/get $Interface name ]; :do { - :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; + :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; } on-error={ :log debug ("Could not get latest LTE firmware version for interface " . $IntName . "."); } From 9c899f871d672d599564d94911abcabad0ea069b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Jun 2024 18:10:22 +0200 Subject: [PATCH 180/988] backup-cloud: remove trailing spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit How did I produce these!? 😳 --- backup-cloud.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 8f5575ea..697ee956 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -69,7 +69,7 @@ :if ($I < 4) do={ :log warning ($ScriptName . ": Retry successful, please discard previous connection errors."); } - + :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; $SendNotification2 ({ origin=$ScriptName; \ From 2166f262c8aed8b30560e37ea01c458567892a52 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:07:17 +0200 Subject: [PATCH 181/988] unattended-lte-firmware-upgrade: omit just another once --- unattended-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index ba22c6f8..af2b6e58 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -28,7 +28,7 @@ /interface/lte/firmware-upgrade $1 upgrade=yes; :log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset."); :delay 240s; - :local Firmware [ /interface/lte/firmware-upgrade $1 once as-value ]; + :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; :if (($Firmware->"installed") != ($Firmware->"latest")) do={ :log warning ("LTE firmware versions still differ. Resetting again..."); /interface/lte/at-chat $1 input="AT+RESET"; From 1e1c9be94522a6dfe24440321950c3dd0b2256a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:09:06 +0200 Subject: [PATCH 182/988] unattended-lte-firmware-upgrade: drop the AT reset The AT command to reset is specific to modem. So this worked for some only... Let's just drop it, and update the log message. --- unattended-lte-firmware-upgrade.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index af2b6e58..a8182e56 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -30,8 +30,7 @@ :delay 240s; :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; :if (($Firmware->"installed") != ($Firmware->"latest")) do={ - :log warning ("LTE firmware versions still differ. Resetting again..."); - /interface/lte/at-chat $1 input="AT+RESET"; + :log warning ("LTE firmware versions still differ. Upgrade failed anyway?"); } } on-error={ :log error ("LTE firmware upgrade on '" . $1 . "' failed."); From d01362dbaa352efccf4d64a5e0404b2d43060cd5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:12:46 +0200 Subject: [PATCH 183/988] unattended-lte-firmware-upgrade: check on valid version first --- unattended-lte-firmware-upgrade.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index a8182e56..7ce40280 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -29,7 +29,8 @@ :log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset."); :delay 240s; :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; - :if (($Firmware->"installed") != ($Firmware->"latest")) do={ + :if ([ :len ($Firmware->"latest") ] > 0 && \ + ($Firmware->"installed") != ($Firmware->"latest")) do={ :log warning ("LTE firmware versions still differ. Upgrade failed anyway?"); } } on-error={ From 76dd069fa653ad9ed8f100f71124fc5027b159df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Jun 2024 08:56:07 +0200 Subject: [PATCH 184/988] Let's Encrypt changed their intermediate certificates https://letsencrypt.org/2024/03/19/new-intermediate-certificates https://letsencrypt.org/certificates/ But let's keep the old ones around for now, as some sites are still using the old intermediate. --- INITIAL-COMMANDS.md | 10 +- README.d/01-download-certs.avif | Bin 4420 -> 4578 bytes README.d/03-check-certs.avif | Bin 12089 -> 12118 bytes README.md | 14 +- certs/E5.pem | 119 ++++++++++++++++ certs/R10.pem | 231 ++++++++++++++++++++++++++++++++ global-config.rsc | 6 +- global-functions.rsc | 2 +- 8 files changed, 366 insertions(+), 16 deletions(-) create mode 100644 certs/E5.pem create mode 100644 certs/R10.pem diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 4a121973..889192da 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,13 +17,13 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E1.pem" dst-path="letsencrypt-E1.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem" as-value; :delay 1s; - /certificate/import file-name=letsencrypt-E1.pem passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ + /certificate/import file-name=letsencrypt-E5.pem passphrase=""; + :if ([ :len [ /certificate/find where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="letsencrypt-E1.pem" ]; + /file/remove [ find where name="letsencrypt-E5.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -34,7 +34,7 @@ Run the complete base installation: /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "E1"; + $CertificateNameByCN "E5"; $CertificateNameByCN "ISRG Root X2"; }; diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index b27b23b8ca7990d261be1e4b23349de6d493f767..b543aff2848235791b59fc0805e850a748f17a23 100644 GIT binary patch delta 3558 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 delta 3399 zcmb8ehdUGw0|4N=!`;s~WMp&MBU#~a_B<*hIh^%#vLbsXheR&>%FdNsAxFrF$mZ-7 zWy{V!r>ywCKjHhH=Y4;QbPA_GV#fmjbX5Ql0002~7a9OyfM=ve1LN^fpb3cO0FMH~ zfztSNpfRul{~cHbl&-;n`hi%x>pSn8?6NzuZ?VBw|4vJ$xgd`baEl#relfFG-neMKrOAKTy>{RgK+Mz|SwFgCwUwEb?@2BIyOEC_Mnb@FR+bI?8=LI4*!TDr5=dDB|uA#5AyI#OB`WV%5<%G*}({sFUX8nnm zoB6!acODq?Ro&KZZsuG_W>JhPwf`$rm-a)+<`ha15&xlkmG;4RU=x14va;@WP3f`5 zj>VPNvwsU@B3g%Ll6t$fqA)zeOAaIs;OORbVuCLfTUoQ<6~=`U>&Vsj*4nwpaz!hxHO_osZ8`Tle{ym)d=dDV{7n#9~)v{eX zeiwehvZt+74U;a}iqa+9%rRszGNseE;00kLJn0e zR?*!CtN3vlvK#ZAe`k4IWd2RzC7?s%ZW4*=mDNK~7POID;JdRO8B!6618fki_Nif6 zd%ndVpW5akW@|8>0Dwd3x@ackA$)CRnh?*y=t)g-;(VFYSDff?1g7_ifiE6R#X6*L z04G(5O9pYmc|P4X#<)8`jZk%|^;Kr`tP?Cv9E-ykvh-MYDf7x(N9oLN6;#JHh1b7q z*O|+8)Br*i5vGzfWsazJD-%(IZcfze2+O`!DW1IskK|AY3}5igc}Et6HlaO5+Km{! zCyQCfUXvTzE_l;}NDirp#sL<-h4{+dMg8#1dYZ?Ecy8dBuTQToKV(L82>{Zh)?$lK z6Jv{VIXtI=ieh*s-7OY$&>~|Eza&9B#97dRSWEn^XYhL#5C;laX}^P1K6sshhF$ROI&M}@W!lJ7CefH zw4QFBPmv||KIv*Cjw|G1a7NkgV`h>XiPvzi5l1W3F2L<2xw?qPxam!cS)p1s*rS*? zd`$8>4vNdE{-1lIY?{2our`8xUz&V*d1PbKZ*GMXFT8NO+-W?tv4m2@+GnURW%PzJ zd^ew@qy+$r}DMHT0KW~Di2NXuE zFnfZ`UO7!ZR$rU-^6x>6pA;?Ku`_-TBlO1ZOlephSL)2wX)~a)jr977?$+)WL2)3L zP$Bcc+W`|65K9SM@J`pxxi($Rs}s*v8jZJ7Pbk!N_z~cUjA-Vt02==9!Dq+XckQwe z?YfexpjK!fcLcxXWPbSZf{}BnmK9=Chcf*Uw;1}R2A5oSJ9WC8SJwvh3;mr zzA2sneTy=kfkZsnEffuY3Z{Sb2vqa-kJ$H3z#rKDnxFzAWMuMk)HgVSwuk~ry-(>z!sui}%}LN(dX z*XsOunlHazIRF5rRDV)g!OJ>n4=yj`&2#lkZdeB!TLq5D+QkdglszsrVMY2I`wYl? z6Yr#}sFA0pQZ9_=j3}NK>zsPO6AUjJ*Vk4~2Ca+IG)u~^Zyl6Ijc;K;oF`jhDwXx~ z?{Alr6V;>1=nr(z?5FB?TxXaI;JJWLNZw zu(Ra{?rYWTf1l&+t-uX@sZ(xm$EpN&rcSLgh4||A-E7B-V|n*&8%d;E9Kbk7tzellR6Nj+ZO)mj}<#)+$cJ4*f3VH`J`rDyXLG^w#uyxdmL)TjHc z({XThgz$SNVi?(wkcm0Pinrz#T&HqgdSBSh&1Y=BcP$`GY{MKjoU7V+=61d8Sk`(Tnx#A)dl_V=q+l~-Y5bk1#)=lB2o-M#8j z3Wd01C0SCdd^E6;!ij_X6;S(Q1tUkSVBe{7l)44&3daHagLrZ;r~8g4Idu(0{R zgvbwMM}vlR--(=&-W8=@3&x{ArNa4HGH{R(We4KlWSO^wN3^^ z0hAD@GRRl?#&nlNOlOaeTIvd2#>(#W7iH)E(uYDLCV~`kVS3@JrvutfjIBF&2C2{k z-9>5VdpPj1)1-Yfr|4;3Or78b)@5USNL5lE%5E9lC-b9MQw`EG^toO~#UOH6$-rL2 zDP>jo0K00?KBI{fW%&I;k1j3xs{h$jeUIg8EE!mBe-#SOV^`4D>J>uR9?IomRHyH5 zdzC$)BB{PI&|Iu~iJ$1%f&6Rj7&XmB=uFGS#G;F{1lz3Q&&me($QvZa^*WQtvD+vX z+9%=iO8!UbQB{v2j@4Th<8@!U_Y&g-9@u_U!itS_@@~mzdCggYURbbCa?=*RE`yXw zZTx!0?Bqf}=3Vyh-vvO0u##=0Lk{YM`kc~bB?qIZ^iOrW#3)fFNX01eA_ z#_sgsFJ(+iZdPXe!*-K%c(`!hw3n0E%3Zz9bXZbW8p50HY&-<3s+IJupfB^7(UUr5 z?MDJ$*5?mPD8Z?xXM5B|MBHWLE25ie+BF+4IV0lmE{J|fUp(jRobw-Dxt^`PtG2T$ nb&RY?1~z?HTCUKYv`g!M>Dli^*klbt=|>f6+jrmZQ%(K@0ZD3K diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 0477c398b41b439ec6eff03c8bcd2357f2637857..f24c6b567a0696bfd30899f66157ec7c23248212 100644 GIT binary patch delta 10014 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 LW+fw9Oi7tgtG9@| diff --git a/README.md b/README.md index b6e529d7..1ad5aca0 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ download the certificates. If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E1.pem" dst-path="letsencrypt-E1.pem"; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem"; ![screenshot: download certs](README.d/01-download-certs.avif) @@ -78,11 +78,11 @@ want to be safe download with your workstations's browser and transfer the files to your MikroTik device. * [ISRG Root X2](https://letsencrypt.org/certs/isrg-root-x2.pem) -* Let's Encrypt [E1](https://letsencrypt.org/certs/lets-encrypt-e1.pem) +* Let's Encrypt [E5](https://letsencrypt.org/certs/2024/e5.pem) Then we import the certificates. - /certificate/import file-name=letsencrypt-E1.pem passphrase=""; + /certificate/import file-name=letsencrypt-E5.pem passphrase=""; Do not worry that the command is not shown - that happens because it contains a sensitive property, the passphrase. @@ -90,13 +90,13 @@ a sensitive property, the passphrase. ![screenshot: import certs](README.d/02-import-certs.avif) For basic verification we rename the certificates and print them by -fingerprint. Make sure exactly these two certificates ("*E1*" and +fingerprint. Make sure exactly these two certificates ("*E5*" and "*ISRG-Root-X2*") are shown. Also remove the left over file. - /certificate/set name="E1" [ find where common-name="E1" ]; + /certificate/set name="E5" [ find where common-name="E5" ]; /certificate/set name="ISRG-Root-X2" [ find where common-name="ISRG Root X2" ]; - /certificate/print proplist=name,fingerprint where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - /file/remove [ find where name="letsencrypt-E1.pem" ]; + /certificate/print proplist=name,fingerprint where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + /file/remove [ find where name="letsencrypt-E5.pem" ]; ![screenshot: check certs](README.d/03-check-certs.avif) diff --git a/certs/E5.pem b/certs/E5.pem new file mode 100644 index 00000000..3f9e9157 --- /dev/null +++ b/certs/E5.pem @@ -0,0 +1,119 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 18:6e:75:d4:ee:b0:a0:5d:fd:2d:a8:20:86:5d:1e:31 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X2 + Validity + Not Before: Mar 13 00:00:00 2024 GMT + Not After : Mar 12 23:59:59 2027 GMT + Subject: C=US, O=Let's Encrypt, CN=E5 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (384 bit) + pub: + 04:0d:0b:3a:8a:6b:61:8e:b6:ef:dc:5f:58:e7:c6: + 42:45:54:ab:63:f6:66:61:48:0a:2e:59:75:b4:81: + 02:37:50:b7:3f:16:79:dc:98:ec:a1:28:97:72:20: + 1c:2c:cf:d5:7c:52:20:4e:54:78:5b:84:14:6b:c0: + 90:ae:85:ec:c0:51:41:3c:5a:87:7f:06:4d:d4:fe: + 60:d1:fa:6c:2d:e1:7d:95:10:88:a2:08:54:0f:99: + 1a:4c:e6:ea:0a:ac:d8 + ASN1 OID: secp384r1 + NIST CURVE: P-384 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Client Authentication, TLS Web Server Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 9F:2B:5F:CF:3C:21:4F:9D:04:B7:ED:2B:2C:C4:C6:70:8B:D2:D7:0D + X509v3 Authority Key Identifier: + 7C:42:96:AE:DE:4B:48:3B:FA:92:F8:9E:8C:CF:6D:8B:A9:72:37:95 + Authority Information Access: + CA Issuers - URI:http://x2.i.lencr.org/ + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + X509v3 CRL Distribution Points: + Full Name: + URI:http://x2.c.lencr.org/ + Signature Algorithm: ecdsa-with-SHA384 + Signature Value: + 30:64:02:30:1b:6d:2e:45:41:1c:45:3e:d9:5f:34:18:74:67: + 13:79:ba:ab:29:b5:b6:10:4e:83:27:4a:8b:45:4e:c7:7b:cf: + f4:40:30:1d:61:a5:e6:1c:6d:a4:90:09:92:6e:46:4b:02:30: + 46:29:18:84:34:7a:bc:fb:de:d8:1b:d8:19:a7:04:f5:cb:7e: + e7:6d:84:d9:da:8e:ea:ce:36:30:b9:a2:80:4c:2c:e6:60:12: + 4b:a9:76:aa:e8:6d:95:47:da:72:09:0c +-----BEGIN CERTIFICATE----- +MIICtDCCAjugAwIBAgIQGG511O6woF39Lagghl0eMTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABA0LOoprYY62 +79xfWOfGQkVUq2P2ZmFICi5ZdbSBAjdQtz8WedyY7KEol3IgHCzP1XxSIE5UeFuE +FGvAkK6F7MBRQTxah38GTdT+YNH6bC3hfZUQiKIIVA+ZGkzm6gqs2KOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJ8rX888IU+dBLftKyzExnCL0tcN +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2cAMGQCMBttLkVBHEU+2V80GHRnE3m6qym1thBOgydK +i0VOx3vP9EAwHWGl5hxtpJAJkm5GSwIwRikYhDR6vPve2BvYGacE9ct+522E2dqO +6s42MLmigEws5mASS6l2quhtlUfacgkM +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X2 + Validity + Not Before: Sep 4 00:00:00 2020 GMT + Not After : Sep 17 16:00:00 2040 GMT + Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X2 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (384 bit) + pub: + 04:cd:9b:d5:9f:80:83:0a:ec:09:4a:f3:16:4a:3e: + 5c:cf:77:ac:de:67:05:0d:1d:07:b6:dc:16:fb:5a: + 8b:14:db:e2:71:60:c4:ba:45:95:11:89:8e:ea:06: + df:f7:2a:16:1c:a4:b9:c5:c5:32:e0:03:e0:1e:82: + 18:38:8b:d7:45:d8:0a:6a:6e:e6:00:77:fb:02:51: + 7d:22:d8:0a:6e:9a:5b:77:df:f0:fa:41:ec:39:dc: + 75:ca:68:07:0c:1f:ea + ASN1 OID: secp384r1 + NIST CURVE: P-384 + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 7C:42:96:AE:DE:4B:48:3B:FA:92:F8:9E:8C:CF:6D:8B:A9:72:37:95 + Signature Algorithm: ecdsa-with-SHA384 + 30:65:02:30:7b:79:4e:46:50:84:c2:44:87:46:1b:45:70:ff: + 58:99:de:f4:fd:a4:d2:55:a6:20:2d:74:d6:34:bc:41:a3:50: + 5f:01:27:56:b4:be:27:75:06:af:12:2e:75:98:8d:fc:02:31: + 00:8b:f5:77:6c:d4:c8:65:aa:e0:0b:2c:ee:14:9d:27:37:a4: + f9:53:a5:51:e4:29:83:d7:f8:90:31:5b:42:9f:0a:f5:fe:ae: + 00:68:e7:8c:49:0f:b6:6f:5b:5b:15:f2:e7 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- diff --git a/certs/R10.pem b/certs/R10.pem new file mode 100644 index 00000000..e8c1c4a3 --- /dev/null +++ b/certs/R10.pem @@ -0,0 +1,231 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 4b:a8:52:93:f7:9a:2f:a2:73:06:4b:a8:04:8d:75:d0 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1 + Validity + Not Before: Mar 13 00:00:00 2024 GMT + Not After : Mar 12 23:59:59 2027 GMT + Subject: C=US, O=Let's Encrypt, CN=R10 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cf:57:e5:e6:c4:54:12:ed:b4:47:fe:c9:27:58: + 76:46:50:28:8c:1d:3e:88:df:05:9d:d5:b5:18:29: + bd:dd:b5:5a:bf:fa:f6:ce:a3:be:af:00:21:4b:62: + 5a:5a:3c:01:2f:c5:58:03:f6:89:ff:8e:11:43:eb: + c1:b5:e0:14:07:96:8f:6f:1f:d7:e7:ba:81:39:09: + 75:65:b7:c2:af:18:5b:37:26:28:e7:a3:f4:07:2b: + 6d:1a:ff:ab:58:bc:95:ae:40:ff:e9:cb:57:c4:b5: + 5b:7f:78:0d:18:61:bc:17:e7:54:c6:bb:49:91:cd: + 6e:18:d1:80:85:ee:a6:65:36:bc:74:ea:bc:50:4c: + ea:fc:21:f3:38:16:93:94:ba:b0:d3:6b:38:06:cd: + 16:12:7a:ca:52:75:c8:ad:76:b2:c2:9c:5d:98:45: + 5c:6f:61:7b:c6:2d:ee:3c:13:52:86:01:d9:57:e6: + 38:1c:df:8d:b5:1f:92:91:9a:e7:4a:1c:cc:45:a8: + 72:55:f0:b0:e6:a3:07:ec:fd:a7:1b:66:9e:3f:48: + 8b:71:84:71:58:c9:3a:fa:ef:5e:f2:5b:44:2b:3c: + 74:e7:8f:b2:47:c1:07:6a:cd:9a:b7:0d:96:f7:12: + 81:26:51:54:0a:ec:61:f6:f7:f5:e2:f2:8a:c8:95: + 0d:8d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Client Authentication, TLS Web Server Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8 + X509v3 Authority Key Identifier: + 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E + Authority Information Access: + CA Issuers - URI:http://x1.i.lencr.org/ + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + X509v3 CRL Distribution Points: + Full Name: + URI:http://x1.c.lencr.org/ + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + 92:b1:e7:41:37:eb:79:9d:81:e6:cd:e2:25:e1:3a:20:e9:90: + 44:95:a3:81:5c:cf:c3:5d:fd:bd:a0:70:d5:b1:96:28:22:0b: + d2:f2:28:cf:0c:e7:d4:e6:43:8c:24:22:1d:c1:42:92:d1:09: + af:9f:4b:f4:c8:70:4f:20:16:b1:5a:dd:01:f6:1f:f8:1f:61: + 6b:14:27:b0:72:8d:63:ae:ee:e2:ce:4b:cf:37:dd:bb:a3:d4: + cd:e7:ad:50:ad:bd:bf:e3:ec:3e:62:36:70:99:31:a7:e8:8d: + dd:ea:62:e2:12:ae:f5:9c:d4:3d:2c:0c:aa:d0:9c:79:be:ea: + 3d:5c:44:6e:96:31:63:5a:7d:d6:7e:4f:24:a0:4b:05:7f:5e: + 6f:d2:d4:ea:5f:33:4b:13:d6:57:b6:ca:de:51:b8:5d:a3:09: + 82:74:fd:c7:78:9e:b3:b9:ac:16:da:4a:2b:96:c3:b6:8b:62: + 8f:f9:74:19:a2:9e:03:de:e9:6f:9b:b0:0f:d2:a0:5a:f6:85: + 5c:c2:04:b7:c8:d5:4e:32:c4:bf:04:5d:bc:29:f6:f7:81:8f: + 0c:5d:3c:53:c9:40:90:8b:fb:b6:08:65:b9:a4:21:d5:09:e5: + 13:84:84:37:82:ce:10:28:fc:76:c2:06:25:7a:46:52:4d:da: + 53:72:a4:27:3f:62:70:ac:be:69:48:00:fb:67:0f:db:5b:a1: + e8:d7:03:21:2d:d7:c9:f6:99:42:39:83:43:df:77:0a:12:08: + f1:25:d6:ba:94:19:54:18:88:a5:c5:8e:e1:1a:99:93:79:6b: + ec:1c:f9:31:40:b0:cc:32:00:df:9f:5e:e7:b4:92:ab:90:82: + 91:8d:0d:e0:1e:95:ba:59:3b:2e:4b:5f:c2:b7:46:35:52:39: + 06:c0:bd:aa:ac:52:c1:22:a0:44:97:99:f7:0c:a0:21:a7:a1: + 6c:71:47:16:17:01:68:c0:ca:a6:26:65:04:7c:b3:ae:c9:e7: + 94:55:c2:6f:9b:3c:1c:a9:f9:2e:c5:20:1a:f0:76:e0:be:ec: + 18:d6:4f:d8:25:fb:76:11:e8:bf:e6:21:0f:e8:e8:cc:b5:b6: + a7:d5:b8:f7:9f:41:cf:61:22:46:6a:83:b6:68:97:2e:7c:ea: + 4e:95:db:23:eb:2e:c8:2b:28:84:a4:60:e9:49:f4:44:2e:3b: + f9:ca:62:57:01:e2:5d:90:16:f9:c9:fc:7a:23:48:8e:a6:d5: + 81:72:f1:28:fa:5d:ce:fb:ed:4e:73:8f:94:2e:d2:41:94:98: + 99:db:a7:af:70:5f:f5:be:fb:02:20:bf:66:27:6c:b4:ad:fa: + 75:12:0b:2b:3e:ce:03:9e +-----BEGIN CERTIFICATE----- +MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL +YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a +/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4 +FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR +mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3 +DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5 +tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG +Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD +VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B +AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo +zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd +u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9 +1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0 +GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh +1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ +QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N +4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz +rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei +RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx +KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 + Validity + Not Before: Jun 4 11:04:38 2015 GMT + Not After : Jun 4 11:04:38 2035 GMT + Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (4096 bit) + Modulus: + 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: + 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: + 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: + 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: + 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: + 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: + 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: + 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: + 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: + b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: + fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: + cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: + 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: + 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: + 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: + 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: + e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: + 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: + 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: + 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: + 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: + 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: + 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: + 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: + 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: + 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: + 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: + d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: + 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: + a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: + 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: + 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: + e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: + ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: + 33:43:4f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E + Signature Algorithm: sha256WithRSAEncryption + 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: + ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: + 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: + 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: + 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: + d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: + fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: + 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: + 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: + 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: + 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: + 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: + 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: + ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: + 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: + 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: + 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: + e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: + 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: + b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: + 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: + 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: + cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: + d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: + 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: + ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: + c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: + bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: + 9d:7e:62:22:da:de:18:27 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 8a42b817..a0835f86 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -92,11 +92,11 @@ :global FwAddrLists { # "allow"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/allow"; -# cert="E1"; timeout=1w }; +# cert="E5"; timeout=1w }; # }; "block"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; -# cert="E1" }; +# cert="E5" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; @@ -112,7 +112,7 @@ }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; -# cert="E1"; timeout=1w }; +# cert="E5"; timeout=1w }; # }; }; :global FwAddrListTimeOut 1d; diff --git a/global-functions.rsc b/global-functions.rsc index 447d6e9a..eb700efb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -999,7 +999,7 @@ :global SymbolForNotification; :global ValidateSyntax; - :if ([ $CertificateAvailable "E1" ] = false) do={ + :if ([ $CertificateAvailable "E5" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } From 35f4ec0b1d1d8c26ec9293efe2d9091993d7bf89 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:42:36 +0200 Subject: [PATCH 185/988] doc/mod/notification-matrix: drop certificate hint... ... as matrix.org switched to Let's Encrypt with ISRG Root X2. --- doc/mod/notification-matrix.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 92383bef..18b66078 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -46,9 +46,6 @@ The Matrix server is connected via encrypted https, and certificate verification is applied. So make sure you have the certificate chain for your server in device's certificate store. -> ℹ️ **Info**: The *matrix.org* server uses a Cloudflare certificate. You can -> install that with: `$CertificateAvailable "Cloudflare Inc ECC CA-3"` - ### From other device If you have setup your Matrix *notification account* before just reuse that. From d1693a241b0ec444d7ad469681e4ba81c1b398df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 09:50:39 +0200 Subject: [PATCH 186/988] certs: E1 / E5 -> ISRG Root X2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the beginning of Let's Encrypt their root certificate ISRG Root X1 was not widely trusted, at least some older and/or mobile platforms were missing that certificate in their root certificate store. At that time Let's Encrypt was using an alternative chain of trust, where a certificate was cross-signed with DST Root CA X3. To make sure a valid chain of trust is available under all circumstances a set of all certificates had to be supplied: both root vertificates ISRG Root X1 & DST Root CA X3, and an intermediate certificate. This was still true after DST Root CA X3 expired, as it could still be used as a root anchor and was shipped by Let's Encrypt when requested. 🤪 This time is finally over, and we have a clean chain for trust ending in ISRG Root X1 (or ISRG Root X2). Well, actually it is the other way round... Let's Encrypt signs with different tantamount intermediate certificates. There is not only E5, but also E6 - and we can not know beforehand which one is used on renew. So let's jetzt drop the intermediate certificates now, and rely on root certificates only. We are perfectly fine with this these days. Follow-up commits will do the same for *all* certificates. The certificate is downloaded with: curl -d '["ISRG Root X2"]' https://mkcert.org/generate/ | grep -v '^$' > certs/ISRG-Root-X2.pem --- INITIAL-COMMANDS.md | 9 ++- README.d/01-download-certs.avif | Bin 4578 -> 4596 bytes README.d/02-import-certs.avif | Bin 3606 -> 3605 bytes README.d/03-check-certs.avif | Bin 12118 -> 8932 bytes README.md | 20 +++--- certs/E1.pem | 124 -------------------------------- certs/E5.pem | 119 ------------------------------ certs/ISRG-Root-X2.pem | 21 ++++++ global-config.rsc | 6 +- global-functions.rsc | 2 +- 10 files changed, 38 insertions(+), 263 deletions(-) delete mode 100644 certs/E1.pem delete mode 100644 certs/E5.pem create mode 100644 certs/ISRG-Root-X2.pem diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 889192da..b3eff35d 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,13 +17,13 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="ISRG-Root-X2.pem" as-value; :delay 1s; - /certificate/import file-name=letsencrypt-E5.pem passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ + /certificate/import file-name=ISRG-Root-X2.pem passphrase=""; + :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="letsencrypt-E5.pem" ]; + /file/remove [ find where name="ISRG-Root-X2.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -34,7 +34,6 @@ Run the complete base installation: /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "E5"; $CertificateNameByCN "ISRG Root X2"; }; diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index b543aff2848235791b59fc0805e850a748f17a23..4a074eb59dce96fbf79c0b50dfdf028f7eff9d4f 100644 GIT binary patch delta 2976 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 delta 2958 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�R1WN5% zg-tJ%wPX*GuD@b+3_&3F=D-hV{b&G`{ZV;95^SikZitbU?F~VVRM&x1gelrAyjUKY zn_F8i(`<8UlU`Ix zCa~VK8~U70|EGhk9s!M@h{J?Cg2nm;3=3vgnzn0f9b?QJ4&LNcKGyRnJ3(lEmJpy_ zUTmiPV#jYTnhi^)?6Hxp44pJu$GJM4;v(y$B2}9e&yBFFYodEaJsnPBLWGY v6AxLT2LpoCn6B^KE^+4-CCMJ+U$KG$VAX*k6%!x5arK#GJ@R8$|JKfbcmJgf delta 1460 zcma*c|3A|S0LSr)YHb_>7oup<^(wsn7WgBg}wPIho;=Wl3P z2i*F_t9Y)+-un#}dM(zgKJ^TuD3M!n`Y{R-F?qn_k3aWoc^aVhqv&7-O+?6a5xt8; z9^8~Qmu@BPgT2)tmceCaC2eVyE69y1u(maJg$dV{l6kj}5a+jm=S)ySZ z)PFPQCTvg;GG&5(5H{Eo-Ua!wlS!y@m*=>D> zRkV^S{3Ug-J)hjtwqQrM8Eq=o^cp2DqSo9Vrc`PpSL9G`iu!33b_E0@2Ao$dn}gz<7Iq5P~d$jWWU^fhXs(_s`aJ`%5(7L?PUF7x24l9yzY6a=|1RXuzG6+hN8lo+wRj z2E);N5{(=?#A{tC!!TXarbx}^))Lr>SZv#xC>~To4rTU(06A#&r3mdqz)=KAWw?Ui zdX;gWwU`dh;6h}nP+#@LZkpW<%t<{D5-FAHlM_D=%=j%6w*Fy7jEvmE#FP*2TQ~H6 zst>sfVhYP$tEWdaTL~RUoBtox|B8x- zFBl3ldjq$g1rFJEv(0>^(&Q+H@O1FeWSg@t>iG#2fPN8PXPnFvk~^eV&gy)OO9HwZ zQUXvV_qe5W%kp&9&)k56J{qQ4HUkR(KoLBI#nm}c8n|cdo0TN13bhNcJ0eV)`6E;S z71t6oz*4>zAR9}I+%TThxN*uV}rv=-V;J` z`qUAS+WW?09`ywUiI7Ph^x>B<*G%1le(Q-TNVg1Nu;ALTOz3_Pv6x+$XzlQNKDq3e z?Xb&Nq=1X21wxVLKFQ}u6-#l-Lg?TORhm2+5LjH%uB*?I0g)-W33}e2__8P;Hdua2 zUo2LkReU+9XaB^Uaml*TlY`9nheKbgeM^%*VfM?`ou$Z}fZDk8SmvKuHma#UC8kkr zp(~Y3v{|cSq~)0wMyQ9BeDj>AQ#~ML+o11+Yq`gRSWH7-jm5;5|^Xs?wv)JXHotpBwBnbbTxnJ2uOizp0VhE$6M#{MC()R2qC@F z4UnLb3*y*bC#rx&ciq9aJux295$MsHZ+b5hVo4-Cwo$$5kqfam@9M$qOW1bYzxvXq AY5)KL diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index f24c6b567a0696bfd30899f66157ec7c23248212..46b7220f1df02c8379e95113aeb13bf91859de0f 100644 GIT binary patch delta 7712 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 a&VeHE+7Y9`eJGj|@?~PMWFSj}fDV{(%j#DE delta 10923 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 Date: Thu, 20 Jun 2024 09:52:17 +0200 Subject: [PATCH 187/988] certs: R3 / R10 -> ISRG Root X1 --- certs/ISRG-Root-X1.pem | 38 ++++++ certs/R10.pem | 231 ------------------------------------- certs/R3.pem | 237 -------------------------------------- global-config.rsc | 2 +- global-functions.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- 6 files changed, 41 insertions(+), 471 deletions(-) create mode 100644 certs/ISRG-Root-X1.pem delete mode 100644 certs/R10.pem delete mode 100644 certs/R3.pem diff --git a/certs/ISRG-Root-X1.pem b/certs/ISRG-Root-X1.pem new file mode 100644 index 00000000..995c95d5 --- /dev/null +++ b/certs/ISRG-Root-X1.pem @@ -0,0 +1,38 @@ +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/certs/R10.pem b/certs/R10.pem deleted file mode 100644 index e8c1c4a3..00000000 --- a/certs/R10.pem +++ /dev/null @@ -1,231 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 4b:a8:52:93:f7:9a:2f:a2:73:06:4b:a8:04:8d:75:d0 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1 - Validity - Not Before: Mar 13 00:00:00 2024 GMT - Not After : Mar 12 23:59:59 2027 GMT - Subject: C=US, O=Let's Encrypt, CN=R10 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cf:57:e5:e6:c4:54:12:ed:b4:47:fe:c9:27:58: - 76:46:50:28:8c:1d:3e:88:df:05:9d:d5:b5:18:29: - bd:dd:b5:5a:bf:fa:f6:ce:a3:be:af:00:21:4b:62: - 5a:5a:3c:01:2f:c5:58:03:f6:89:ff:8e:11:43:eb: - c1:b5:e0:14:07:96:8f:6f:1f:d7:e7:ba:81:39:09: - 75:65:b7:c2:af:18:5b:37:26:28:e7:a3:f4:07:2b: - 6d:1a:ff:ab:58:bc:95:ae:40:ff:e9:cb:57:c4:b5: - 5b:7f:78:0d:18:61:bc:17:e7:54:c6:bb:49:91:cd: - 6e:18:d1:80:85:ee:a6:65:36:bc:74:ea:bc:50:4c: - ea:fc:21:f3:38:16:93:94:ba:b0:d3:6b:38:06:cd: - 16:12:7a:ca:52:75:c8:ad:76:b2:c2:9c:5d:98:45: - 5c:6f:61:7b:c6:2d:ee:3c:13:52:86:01:d9:57:e6: - 38:1c:df:8d:b5:1f:92:91:9a:e7:4a:1c:cc:45:a8: - 72:55:f0:b0:e6:a3:07:ec:fd:a7:1b:66:9e:3f:48: - 8b:71:84:71:58:c9:3a:fa:ef:5e:f2:5b:44:2b:3c: - 74:e7:8f:b2:47:c1:07:6a:cd:9a:b7:0d:96:f7:12: - 81:26:51:54:0a:ec:61:f6:f7:f5:e2:f2:8a:c8:95: - 0d:8d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Client Authentication, TLS Web Server Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8 - X509v3 Authority Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Authority Information Access: - CA Issuers - URI:http://x1.i.lencr.org/ - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - X509v3 CRL Distribution Points: - Full Name: - URI:http://x1.c.lencr.org/ - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 92:b1:e7:41:37:eb:79:9d:81:e6:cd:e2:25:e1:3a:20:e9:90: - 44:95:a3:81:5c:cf:c3:5d:fd:bd:a0:70:d5:b1:96:28:22:0b: - d2:f2:28:cf:0c:e7:d4:e6:43:8c:24:22:1d:c1:42:92:d1:09: - af:9f:4b:f4:c8:70:4f:20:16:b1:5a:dd:01:f6:1f:f8:1f:61: - 6b:14:27:b0:72:8d:63:ae:ee:e2:ce:4b:cf:37:dd:bb:a3:d4: - cd:e7:ad:50:ad:bd:bf:e3:ec:3e:62:36:70:99:31:a7:e8:8d: - dd:ea:62:e2:12:ae:f5:9c:d4:3d:2c:0c:aa:d0:9c:79:be:ea: - 3d:5c:44:6e:96:31:63:5a:7d:d6:7e:4f:24:a0:4b:05:7f:5e: - 6f:d2:d4:ea:5f:33:4b:13:d6:57:b6:ca:de:51:b8:5d:a3:09: - 82:74:fd:c7:78:9e:b3:b9:ac:16:da:4a:2b:96:c3:b6:8b:62: - 8f:f9:74:19:a2:9e:03:de:e9:6f:9b:b0:0f:d2:a0:5a:f6:85: - 5c:c2:04:b7:c8:d5:4e:32:c4:bf:04:5d:bc:29:f6:f7:81:8f: - 0c:5d:3c:53:c9:40:90:8b:fb:b6:08:65:b9:a4:21:d5:09:e5: - 13:84:84:37:82:ce:10:28:fc:76:c2:06:25:7a:46:52:4d:da: - 53:72:a4:27:3f:62:70:ac:be:69:48:00:fb:67:0f:db:5b:a1: - e8:d7:03:21:2d:d7:c9:f6:99:42:39:83:43:df:77:0a:12:08: - f1:25:d6:ba:94:19:54:18:88:a5:c5:8e:e1:1a:99:93:79:6b: - ec:1c:f9:31:40:b0:cc:32:00:df:9f:5e:e7:b4:92:ab:90:82: - 91:8d:0d:e0:1e:95:ba:59:3b:2e:4b:5f:c2:b7:46:35:52:39: - 06:c0:bd:aa:ac:52:c1:22:a0:44:97:99:f7:0c:a0:21:a7:a1: - 6c:71:47:16:17:01:68:c0:ca:a6:26:65:04:7c:b3:ae:c9:e7: - 94:55:c2:6f:9b:3c:1c:a9:f9:2e:c5:20:1a:f0:76:e0:be:ec: - 18:d6:4f:d8:25:fb:76:11:e8:bf:e6:21:0f:e8:e8:cc:b5:b6: - a7:d5:b8:f7:9f:41:cf:61:22:46:6a:83:b6:68:97:2e:7c:ea: - 4e:95:db:23:eb:2e:c8:2b:28:84:a4:60:e9:49:f4:44:2e:3b: - f9:ca:62:57:01:e2:5d:90:16:f9:c9:fc:7a:23:48:8e:a6:d5: - 81:72:f1:28:fa:5d:ce:fb:ed:4e:73:8f:94:2e:d2:41:94:98: - 99:db:a7:af:70:5f:f5:be:fb:02:20:bf:66:27:6c:b4:ad:fa: - 75:12:0b:2b:3e:ce:03:9e ------BEGIN CERTIFICATE----- -MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy -Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa -Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF -bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL -YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a -/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4 -FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR -mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3 -DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG -MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/ -AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5 -tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG -Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD -VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B -AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo -zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd -u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9 -1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0 -GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh -1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ -QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N -4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz -rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei -RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx -KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Jun 4 11:04:38 2015 GMT - Not After : Jun 4 11:04:38 2035 GMT - Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: - 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: - 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: - 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: - 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: - 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: - 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: - 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: - 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: - b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: - fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: - cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: - 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: - 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: - 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: - 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: - e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: - 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: - 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: - 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: - 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: - 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: - 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: - 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: - 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: - 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: - 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: - d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: - 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: - a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: - 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: - 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: - e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: - ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: - 33:43:4f - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Signature Algorithm: sha256WithRSAEncryption - 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: - ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: - 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: - 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: - 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: - d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: - fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: - 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: - 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: - 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: - 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: - 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: - 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: - ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: - 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: - 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: - 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: - e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: - 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: - b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: - 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: - 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: - cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: - d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: - 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: - ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: - c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: - bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: - 9d:7e:62:22:da:de:18:27 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- diff --git a/certs/R3.pem b/certs/R3.pem deleted file mode 100644 index 837b709c..00000000 --- a/certs/R3.pem +++ /dev/null @@ -1,237 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 91:2b:08:4a:cf:0c:18:a7:53:f6:d6:2e:25:a7:5f:5a - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Sep 4 00:00:00 2020 GMT - Not After : Sep 15 16:00:00 2025 GMT - Subject: C = US, O = Let's Encrypt, CN = R3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bb:02:15:28:cc:f6:a0:94:d3:0f:12:ec:8d:55: - 92:c3:f8:82:f1:99:a6:7a:42:88:a7:5d:26:aa:b5: - 2b:b9:c5:4c:b1:af:8e:6b:f9:75:c8:a3:d7:0f:47: - 94:14:55:35:57:8c:9e:a8:a2:39:19:f5:82:3c:42: - a9:4e:6e:f5:3b:c3:2e:db:8d:c0:b0:5c:f3:59:38: - e7:ed:cf:69:f0:5a:0b:1b:be:c0:94:24:25:87:fa: - 37:71:b3:13:e7:1c:ac:e1:9b:ef:db:e4:3b:45:52: - 45:96:a9:c1:53:ce:34:c8:52:ee:b5:ae:ed:8f:de: - 60:70:e2:a5:54:ab:b6:6d:0e:97:a5:40:34:6b:2b: - d3:bc:66:eb:66:34:7c:fa:6b:8b:8f:57:29:99:f8: - 30:17:5d:ba:72:6f:fb:81:c5:ad:d2:86:58:3d:17: - c7:e7:09:bb:f1:2b:f7:86:dc:c1:da:71:5d:d4:46: - e3:cc:ad:25:c1:88:bc:60:67:75:66:b3:f1:18:f7: - a2:5c:e6:53:ff:3a:88:b6:47:a5:ff:13:18:ea:98: - 09:77:3f:9d:53:f9:cf:01:e5:f5:a6:70:17:14:af: - 63:a4:ff:99:b3:93:9d:dc:53:a7:06:fe:48:85:1d: - a1:69:ae:25:75:bb:13:cc:52:03:f5:ed:51:a1:8b: - db:15 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Client Authentication, TLS Web Server Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6 - X509v3 Authority Key Identifier: - keyid:79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - - Authority Information Access: - CA Issuers - URI:http://x1.i.lencr.org/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://x1.c.lencr.org/ - - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - Policy: 1.3.6.1.4.1.44947.1.1.1 - - Signature Algorithm: sha256WithRSAEncryption - 85:ca:4e:47:3e:a3:f7:85:44:85:bc:d5:67:78:b2:98:63:ad: - 75:4d:1e:96:3d:33:65:72:54:2d:81:a0:ea:c3:ed:f8:20:bf: - 5f:cc:b7:70:00:b7:6e:3b:f6:5e:94:de:e4:20:9f:a6:ef:8b: - b2:03:e7:a2:b5:16:3c:91:ce:b4:ed:39:02:e7:7c:25:8a:47: - e6:65:6e:3f:46:f4:d9:f0:ce:94:2b:ee:54:ce:12:bc:8c:27: - 4b:b8:c1:98:2f:a2:af:cd:71:91:4a:08:b7:c8:b8:23:7b:04: - 2d:08:f9:08:57:3e:83:d9:04:33:0a:47:21:78:09:82:27:c3: - 2a:c8:9b:b9:ce:5c:f2:64:c8:c0:be:79:c0:4f:8e:6d:44:0c: - 5e:92:bb:2e:f7:8b:10:e1:e8:1d:44:29:db:59:20:ed:63:b9: - 21:f8:12:26:94:93:57:a0:1d:65:04:c1:0a:22:ae:10:0d:43: - 97:a1:18:1f:7e:e0:e0:86:37:b5:5a:b1:bd:30:bf:87:6e:2b: - 2a:ff:21:4e:1b:05:c3:f5:18:97:f0:5e:ac:c3:a5:b8:6a:f0: - 2e:bc:3b:33:b9:ee:4b:de:cc:fc:e4:af:84:0b:86:3f:c0:55: - 43:36:f6:68:e1:36:17:6a:8e:99:d1:ff:a5:40:a7:34:b7:c0: - d0:63:39:35:39:75:6e:f2:ba:76:c8:93:02:e9:a9:4b:6c:17: - ce:0c:02:d9:bd:81:fb:9f:b7:68:d4:06:65:b3:82:3d:77:53: - f8:8e:79:03:ad:0a:31:07:75:2a:43:d8:55:97:72:c4:29:0e: - f7:c4:5d:4e:c8:ae:46:84:30:d7:f2:85:5f:18:a1:79:bb:e7: - 5e:70:8b:07:e1:86:93:c3:b9:8f:dc:61:71:25:2a:af:df:ed: - 25:50:52:68:8b:92:dc:e5:d6:b5:e3:da:7d:d0:87:6c:84:21: - 31:ae:82:f5:fb:b9:ab:c8:89:17:3d:e1:4c:e5:38:0e:f6:bd: - 2b:bd:96:81:14:eb:d5:db:3d:20:a7:7e:59:d3:e2:f8:58:f9: - 5b:b8:48:cd:fe:5c:4f:16:29:fe:1e:55:23:af:c8:11:b0:8d: - ea:7c:93:90:17:2f:fd:ac:a2:09:47:46:3f:f0:e9:b0:b7:ff: - 28:4d:68:32:d6:67:5e:1e:69:a3:93:b8:f5:9d:8b:2f:0b:d2: - 52:43:a6:6f:32:57:65:4d:32:81:df:38:53:85:5d:7e:5d:66: - 29:ea:b8:dd:e4:95:b5:cd:b5:56:12:42:cd:c4:4e:c6:25:38: - 44:50:6d:ec:ce:00:55:18:fe:e9:49:64:d4:4e:ca:97:9c:b4: - 5b:c0:73:a8:ab:b8:47:c2 ------BEGIN CERTIFICATE----- -MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw -WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP -R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx -sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm -NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg -Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG -/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB -Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA -FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw -AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw -Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB -gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W -PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl -ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz -CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm -lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 -avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 -yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O -yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids -hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ -HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv -MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX -nLRbwHOoq7hHwg== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Jun 4 11:04:38 2015 GMT - Not After : Jun 4 11:04:38 2035 GMT - Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: - 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: - 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: - 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: - 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: - 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: - 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: - 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: - 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: - b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: - fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: - cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: - 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: - 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: - 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: - 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: - e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: - 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: - 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: - 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: - 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: - 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: - 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: - 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: - 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: - 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: - 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: - d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: - 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: - a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: - 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: - 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: - e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: - ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: - 33:43:4f - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Signature Algorithm: sha256WithRSAEncryption - 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: - ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: - 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: - 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: - 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: - d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: - fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: - 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: - 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: - 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: - 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: - 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: - 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: - ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: - 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: - 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: - 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: - e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: - 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: - b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: - 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: - 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: - cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: - d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: - 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: - ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: - c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: - bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: - 9d:7e:62:22:da:de:18:27 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 734b51e0..f99fdf13 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -102,7 +102,7 @@ { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; - cert="R3" }; + cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Domain Validation CA SHA2" }; # { url="https://www.spamhaus.org/drop/drop.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index 6c5ce02f..567444ee 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -334,7 +334,7 @@ :return true; } - :if ([ $CertificateAvailable "R3" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint error $0 ("Downloading required certificate failed."); :return false; } diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 4413f07d..cdc10e7c 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -98,7 +98,7 @@ :do { :if ($NtfyServer = "ntfy.sh") do={ - :if ([ $CertificateAvailable "R3" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From b875d64724a8ac3218b2e0779effe19c1729e11a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:25:53 +0200 Subject: [PATCH 188/988] certs: GlobalSign Atlas R3 DV TLS CA 2022 Q3 -> GlobalSign --- .../GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem | 177 ------------------ certs/GlobalSign.pem | 28 +++ global-config.rsc | 4 +- 3 files changed, 30 insertions(+), 179 deletions(-) delete mode 100644 certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem create mode 100644 certs/GlobalSign.pem diff --git a/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem b/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem deleted file mode 100644 index b514c117..00000000 --- a/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem +++ /dev/null @@ -1,177 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 7c:2a:0c:21:3f:c6:55:53:45:c9:1f:19:1f:b8:4e:fa - Signature Algorithm: sha256WithRSAEncryption - Issuer: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Validity - Not Before: Apr 20 12:00:00 2022 GMT - Not After : Apr 20 00:00:00 2025 GMT - Subject: C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2022 Q3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b8:a8:7a:66:3c:4e:66:9c:ce:37:a5:54:35:4d: - 36:c7:99:d3:a8:27:36:f2:2f:c6:d5:18:3e:e9:09: - dd:05:d6:d7:2c:34:32:7c:08:63:49:d1:10:37:e5: - 78:5d:11:62:ce:6d:fb:2f:3f:37:94:db:8f:7b:30: - e9:5e:2c:d9:55:3f:b2:db:b9:a0:b5:60:37:8b:a4: - 06:32:35:50:a4:09:af:0a:45:ff:a8:1f:9b:65:8e: - dd:4a:e0:40:a1:e3:63:37:58:90:dd:75:3b:fc:0e: - 1c:82:40:98:bd:70:b1:c1:48:14:14:3c:04:4b:69: - dd:d4:9c:01:a6:e9:21:e3:82:0a:fe:e4:aa:bf:34: - a0:8c:cb:c9:79:6e:3e:5c:6a:52:9e:c4:ed:2b:c5: - 69:fe:50:3c:93:9d:b5:ff:2d:28:a8:6c:06:6c:9d: - c5:af:b2:59:fb:59:77:0d:74:7a:88:84:a4:d4:1d: - d4:ba:20:06:cc:b5:1e:48:4e:74:21:15:86:75:c0: - cc:5a:d1:05:cf:57:16:7a:13:17:ec:c2:4a:ae:d5: - 1e:72:aa:22:5a:8c:9c:82:32:c4:10:e6:42:6e:21: - 86:68:7c:80:23:30:35:d3:bd:b0:5e:0a:29:2b:f0: - 14:b1:18:37:d9:59:25:c3:e7:38:d9:e9:d4:2d:36: - 35:65 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - FA:91:39:63:9A:FB:AD:10:24:E5:BE:B5:B9:DA:AB:D9:C4:46:69:AB - X509v3 Authority Key Identifier: - 8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC - Authority Information Access: - OCSP - URI:http://ocsp2.globalsign.com/rootr3 - CA Issuers - URI:http://secure.globalsign.com/cacert/root-r3.crt - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.globalsign.com/root-r3.crl - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - Policy: 1.3.6.1.4.1.4146.10.1.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 14:33:2c:79:e5:3f:82:c6:70:3f:da:59:38:a7:bb:a2:76:ac: - 61:18:05:68:57:d9:0d:fb:8a:46:bc:f1:a8:e8:0c:70:02:1d: - c6:2f:97:ed:36:3e:9e:52:86:2f:5c:62:d8:d5:47:43:9a:73: - d1:2b:25:87:9f:44:b4:14:eb:26:bc:21:47:74:20:bd:9f:a4: - bf:b3:80:1d:4d:35:7d:cd:b9:b5:da:55:f2:90:50:c8:b2:17: - 4e:0e:b4:61:88:29:5f:44:5d:03:7f:57:91:81:d0:eb:30:ae: - d5:2a:ec:82:20:ce:4e:d2:b0:8b:95:02:61:73:d8:69:34:f4: - ad:63:0e:5c:e4:20:1f:a9:7d:ed:8e:e5:1c:04:bb:22:9f:c7: - a9:22:ca:99:3d:02:a7:67:e8:06:2d:fa:04:6b:bb:49:d2:6c: - 99:57:63:6c:2d:c2:61:78:e1:20:b1:fb:f6:bf:e1:82:39:39: - 3c:7b:ef:7d:1a:95:4a:b2:72:da:55:90:ae:ed:dd:e2:70:90: - 7c:1a:ee:b5:32:5a:5d:cf:d6:fa:45:f2:9e:01:0c:31:2f:89: - 84:fe:31:60:0f:fd:ee:a6:5b:84:d5:c7:18:e6:a4:f9:40:30: - 29:18:1e:fe:fc:41:b5:b9:29:05:75:8b:62:1a:5b:22:2e:bf: - e4:59:6c:b0 ------BEGIN CERTIFICATE----- -MIIEjzCCA3egAwIBAgIQfCoMIT/GVVNFyR8ZH7hO+jANBgkqhkiG9w0BAQsFADBM -MSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv -YmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjA0MjAxMjAwMDBaFw0y -NTA0MjAwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu -IG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIERWIFRMUyBDQSAy -MDIyIFEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuKh6ZjxOZpzO -N6VUNU02x5nTqCc28i/G1Rg+6QndBdbXLDQyfAhjSdEQN+V4XRFizm37Lz83lNuP -ezDpXizZVT+y27mgtWA3i6QGMjVQpAmvCkX/qB+bZY7dSuBAoeNjN1iQ3XU7/A4c -gkCYvXCxwUgUFDwES2nd1JwBpukh44IK/uSqvzSgjMvJeW4+XGpSnsTtK8Vp/lA8 -k521/y0oqGwGbJ3Fr7JZ+1l3DXR6iISk1B3UuiAGzLUeSE50IRWGdcDMWtEFz1cW -ehMX7MJKrtUecqoiWoycgjLEEOZCbiGGaHyAIzA1072wXgopK/AUsRg32Vklw+c4 -2enULTY1ZQIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG -CCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW -BBT6kTljmvutECTlvrW52qvZxEZpqzAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj -move4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw -Mi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1 -cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w -K6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD -VR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAGgMgoBAzANBgkqhkiG9w0BAQsFAAOC -AQEAFDMseeU/gsZwP9pZOKe7onasYRgFaFfZDfuKRrzxqOgMcAIdxi+X7TY+nlKG -L1xi2NVHQ5pz0Sslh59EtBTrJrwhR3QgvZ+kv7OAHU01fc25tdpV8pBQyLIXTg60 -YYgpX0RdA39XkYHQ6zCu1SrsgiDOTtKwi5UCYXPYaTT0rWMOXOQgH6l97Y7lHAS7 -Ip/HqSLKmT0Cp2foBi36BGu7SdJsmVdjbC3CYXjhILH79r/hgjk5PHvvfRqVSrJy -2lWQru3d4nCQfBrutTJaXc/W+kXyngEMMS+JhP4xYA/97qZbhNXHGOak+UAwKRge -/vxBtbkpBXWLYhpbIi6/5FlssA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 04:00:00:00:00:01:21:58:53:08:a2 - Signature Algorithm: sha256WithRSAEncryption - Issuer: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Validity - Not Before: Mar 18 10:00:00 2009 GMT - Not After : Mar 18 10:00:00 2029 GMT - Subject: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cc:25:76:90:79:06:78:22:16:f5:c0:83:b6:84: - ca:28:9e:fd:05:76:11:c5:ad:88:72:fc:46:02:43: - c7:b2:8a:9d:04:5f:24:cb:2e:4b:e1:60:82:46:e1: - 52:ab:0c:81:47:70:6c:dd:64:d1:eb:f5:2c:a3:0f: - 82:3d:0c:2b:ae:97:d7:b6:14:86:10:79:bb:3b:13: - 80:77:8c:08:e1:49:d2:6a:62:2f:1f:5e:fa:96:68: - df:89:27:95:38:9f:06:d7:3e:c9:cb:26:59:0d:73: - de:b0:c8:e9:26:0e:83:15:c6:ef:5b:8b:d2:04:60: - ca:49:a6:28:f6:69:3b:f6:cb:c8:28:91:e5:9d:8a: - 61:57:37:ac:74:14:dc:74:e0:3a:ee:72:2f:2e:9c: - fb:d0:bb:bf:f5:3d:00:e1:06:33:e8:82:2b:ae:53: - a6:3a:16:73:8c:dd:41:0e:20:3a:c0:b4:a7:a1:e9: - b2:4f:90:2e:32:60:e9:57:cb:b9:04:92:68:68:e5: - 38:26:60:75:b2:9f:77:ff:91:14:ef:ae:20:49:fc: - ad:40:15:48:d1:02:31:61:19:5e:b8:97:ef:ad:77: - b7:64:9a:7a:bf:5f:c1:13:ef:9b:62:fb:0d:6c:e0: - 54:69:16:a9:03:da:6e:e9:83:93:71:76:c6:69:85: - 82:17 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 4b:40:db:c0:50:aa:fe:c8:0c:ef:f7:96:54:45:49:bb:96:00: - 09:41:ac:b3:13:86:86:28:07:33:ca:6b:e6:74:b9:ba:00:2d: - ae:a4:0a:d3:f5:f1:f1:0f:8a:bf:73:67:4a:83:c7:44:7b:78: - e0:af:6e:6c:6f:03:29:8e:33:39:45:c3:8e:e4:b9:57:6c:aa: - fc:12:96:ec:53:c6:2d:e4:24:6c:b9:94:63:fb:dc:53:68:67: - 56:3e:83:b8:cf:35:21:c3:c9:68:fe:ce:da:c2:53:aa:cc:90: - 8a:e9:f0:5d:46:8c:95:dd:7a:58:28:1a:2f:1d:de:cd:00:37: - 41:8f:ed:44:6d:d7:53:28:97:7e:f3:67:04:1e:15:d7:8a:96: - b4:d3:de:4c:27:a4:4c:1b:73:73:76:f4:17:99:c2:1f:7a:0e: - e3:2d:08:ad:0a:1c:2c:ff:3c:ab:55:0e:0f:91:7e:36:eb:c3: - 57:49:be:e1:2e:2d:7c:60:8b:c3:41:51:13:23:9d:ce:f7:32: - 6b:94:01:a8:99:e7:2c:33:1f:3a:3b:25:d2:86:40:ce:3b:2c: - 86:78:c9:61:2f:14:ba:ee:db:55:6f:df:84:ee:05:09:4d:bd: - 28:d8:72:ce:d3:62:50:65:1e:eb:92:97:83:31:d9:b3:b5:ca: - 47:58:3f:5f ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- diff --git a/certs/GlobalSign.pem b/certs/GlobalSign.pem new file mode 100644 index 00000000..47035e48 --- /dev/null +++ b/certs/GlobalSign.pem @@ -0,0 +1,28 @@ +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index f99fdf13..16de7213 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -98,9 +98,9 @@ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; - cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; + cert="GlobalSign" }; { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; - cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; + cert="GlobalSign" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From 944e125ef9186d933609c131dfdd85178a57453b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:29:40 +0200 Subject: [PATCH 189/988] certs: Certum Domain Validation CA SHA2 -> Certum Trusted Network CA --- certs/Certum-Domain-Validation-CA-SHA2.pem | 176 --------------------- certs/Certum-Trusted-Network-CA.pem | 29 ++++ global-config.rsc | 2 +- 3 files changed, 30 insertions(+), 177 deletions(-) delete mode 100644 certs/Certum-Domain-Validation-CA-SHA2.pem create mode 100644 certs/Certum-Trusted-Network-CA.pem diff --git a/certs/Certum-Domain-Validation-CA-SHA2.pem b/certs/Certum-Domain-Validation-CA-SHA2.pem deleted file mode 100644 index 0cc17ac5..00000000 --- a/certs/Certum-Domain-Validation-CA-SHA2.pem +++ /dev/null @@ -1,176 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 279744 (0x444c0) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Validity - Not Before: Oct 22 12:07:37 2008 GMT - Not After : Dec 31 12:07:37 2029 GMT - Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:e3:fb:7d:a3:72:ba:c2:f0:c9:14:87:f5:6b:01: - 4e:e1:6e:40:07:ba:6d:27:5d:7f:f7:5b:2d:b3:5a: - c7:51:5f:ab:a4:32:a6:61:87:b6:6e:0f:86:d2:30: - 02:97:f8:d7:69:57:a1:18:39:5d:6a:64:79:c6:01: - 59:ac:3c:31:4a:38:7c:d2:04:d2:4b:28:e8:20:5f: - 3b:07:a2:cc:4d:73:db:f3:ae:4f:c7:56:d5:5a:a7: - 96:89:fa:f3:ab:68:d4:23:86:59:27:cf:09:27:bc: - ac:6e:72:83:1c:30:72:df:e0:a2:e9:d2:e1:74:75: - 19:bd:2a:9e:7b:15:54:04:1b:d7:43:39:ad:55:28: - c5:e2:1a:bb:f4:c0:e4:ae:38:49:33:cc:76:85:9f: - 39:45:d2:a4:9e:f2:12:8c:51:f8:7c:e4:2d:7f:f5: - ac:5f:eb:16:9f:b1:2d:d1:ba:cc:91:42:77:4c:25: - c9:90:38:6f:db:f0:cc:fb:8e:1e:97:59:3e:d5:60: - 4e:e6:05:28:ed:49:79:13:4b:ba:48:db:2f:f9:72: - d3:39:ca:fe:1f:d8:34:72:f5:b4:40:cf:31:01:c3: - ec:de:11:2d:17:5d:1f:b8:50:d1:5e:19:a7:69:de: - 07:33:28:ca:50:95:f9:a7:54:cb:54:86:50:45:a9: - f9:49 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - Signature Algorithm: sha1WithRSAEncryption - Signature Value: - a6:a8:ad:22:ce:01:3d:a6:a3:ff:62:d0:48:9d:8b:5e:72:b0: - 78:44:e3:dc:1c:af:09:fd:23:48:fa:bd:2a:c4:b9:55:04:b5: - 10:a3:8d:27:de:0b:82:63:d0:ee:de:0c:37:79:41:5b:22:b2: - b0:9a:41:5c:a6:70:e0:d4:d0:77:cb:23:d3:00:e0:6c:56:2f: - e1:69:0d:0d:d9:aa:bf:21:81:50:d9:06:a5:a8:ff:95:37:d0: - aa:fe:e2:b3:f5:99:2d:45:84:8a:e5:42:09:d7:74:02:2f:f7: - 89:d8:99:e9:bc:27:d4:47:8d:ba:0d:46:1c:77:cf:14:a4:1c: - b9:a4:31:c4:9c:28:74:03:34:ff:33:19:26:a5:e9:0d:74:b7: - 3e:97:c6:76:e8:27:96:a3:66:dd:e1:ae:f2:41:5b:ca:98:56: - 83:73:70:e4:86:1a:d2:31:41:ba:2f:be:2d:13:5a:76:6f:4e: - e8:4e:81:0e:3f:5b:03:22:a0:12:be:66:58:11:4a:cb:03:c4: - b4:2a:2a:2d:96:17:e0:39:54:bc:48:d3:76:27:9d:9a:2d:06: - a6:c9:ec:39:d2:ab:db:9f:9a:0b:27:02:35:29:b1:40:95:e7: - f9:e8:9c:55:88:19:46:d6:b7:34:f5:7e:ce:39:9a:d9:38:f1: - 51:f7:4f:2c ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 26:dd:d2:2b:46:c9:c4:4d:5a:69:4d:39:80:7e:72:ad - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Validity - Not Before: Sep 11 12:00:00 2014 GMT - Not After : Jun 9 10:46:39 2027 GMT - Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Domain Validation CA SHA2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:a1:25:63:df:8d:e4:20:07:d9:54:d1:d1:04:f6: - 17:e2:3e:47:fb:c3:74:25:b8:c4:bf:12:12:bc:e0: - 70:d1:39:05:c2:17:b3:f7:82:70:a0:4e:07:fe:10: - 2a:ff:db:0d:46:5e:24:94:a3:8b:45:9f:18:9b:ce: - 42:c4:ae:db:83:33:bc:c2:bb:b4:30:b6:a7:37:87: - 78:7b:48:cb:25:2c:82:bb:0a:48:12:60:76:89:ec: - 8e:cc:8f:1e:52:48:e9:86:02:5a:c2:b0:8a:7c:85: - 3d:d9:ff:60:4f:33:6c:a6:a1:a0:85:e1:d7:53:f2: - ea:27:3d:65:a9:72:c1:08:83:cc:b0:25:9c:11:46: - 24:e0:3e:f4:a7:ef:ed:51:b1:65:93:42:b4:f6:e6: - 86:0a:10:79:32:36:58:b2:6b:a8:dc:d5:7a:1e:9d: - 14:ee:40:e7:b2:46:4c:bd:9a:29:c2:ec:f8:30:c1: - 62:02:2a:e2:1c:83:62:d0:85:36:1a:83:de:12:84: - 29:65:ef:d2:32:be:31:60:42:a8:cf:f8:dd:ea:d0: - 56:47:1d:bd:76:96:24:13:e7:be:d9:99:2b:fa:30: - 64:f1:8a:38:7a:a6:e1:2a:96:02:b0:9d:ba:d8:8f: - 6d:4e:7a:94:69:7d:b0:93:aa:74:e5:93:90:13:fa: - a2:99 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E5:31:AD:BF:3A:11:96:F4:83:BC:50:3C:D4:B7:90:9B:90:EE:DE:25 - X509v3 Authority Key Identifier: - 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.certum.pl/ctnca.crl - Authority Information Access: - OCSP - URI:http://subca.ocsp-certum.com - CA Issuers - URI:http://repository.certum.pl/ctnca.cer - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: http://www.certum.pl/CPS - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - ba:bf:f0:e1:dd:4d:2b:42:43:64:58:df:64:f3:ff:80:1a:5f: - 56:be:3b:a9:b2:76:f7:54:7a:4c:30:c1:99:24:4b:72:d2:ca: - d4:fa:08:c6:90:de:88:12:ed:f8:90:f9:fc:a9:84:fd:92:f2: - 78:e5:db:c9:22:57:ab:41:30:42:6b:0b:9f:d7:73:33:fb:01: - 67:1c:42:5c:8f:27:67:c7:6e:07:03:8d:0e:96:cb:0a:03:cc: - 3e:f8:87:3c:35:30:cd:18:8c:d5:71:dd:cd:dd:61:b0:13:a3: - 64:46:4e:fe:71:4e:6b:65:e9:14:04:f2:3f:a8:bd:0c:36:3d: - 2a:5d:9e:07:f2:c2:4f:90:c5:5e:4d:18:37:d1:27:28:80:a4: - 36:e5:ca:93:6a:65:0e:f8:93:b9:af:52:58:4b:7a:71:d8:ba: - f3:ef:d2:f3:f6:a2:97:e4:5d:14:02:9a:cb:e5:ae:b6:93:e1: - 23:9f:9b:3f:46:f7:ee:8e:a1:00:5b:66:c3:1e:68:23:86:0f: - 5d:77:ba:53:ad:f9:52:fb:70:15:c5:75:eb:cf:79:ad:49:7c: - f2:76:62:ae:44:2f:c5:5f:51:34:25:41:6a:12:0a:5f:8e:ae: - 10:c4:43:89:35:fd:ec:ff:31:e6:ec:1e:87:e9:3a:7c:29:50: - 45:41:a3:14 ------BEGIN CERTIFICATE----- -MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+ -MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B -LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD -VQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMB4XDTE0MDkxMTEyMDAwMFoX -DTI3MDYwOTEwNDYzOVowgYUxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRv -IFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxKTAnBgNVBAMTIENlcnR1bSBEb21haW4gVmFsaWRhdGlvbiBD -QSBTSEEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSVj343kIAfZ -VNHRBPYX4j5H+8N0JbjEvxISvOBw0TkFwhez94JwoE4H/hAq/9sNRl4klKOLRZ8Y -m85CxK7bgzO8wru0MLanN4d4e0jLJSyCuwpIEmB2ieyOzI8eUkjphgJawrCKfIU9 -2f9gTzNspqGgheHXU/LqJz1lqXLBCIPMsCWcEUYk4D70p+/tUbFlk0K09uaGChB5 -MjZYsmuo3NV6Hp0U7kDnskZMvZopwuz4MMFiAiriHINi0IU2GoPeEoQpZe/SMr4x -YEKoz/jd6tBWRx29dpYkE+e+2Zkr+jBk8Yo4eqbhKpYCsJ262I9tTnqUaX2wk6p0 -5ZOQE/qimQIDAQABo4IBPjCCATowDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -5TGtvzoRlvSDvFA81LeQm5Du3iUwHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzi -hDdGdfcwDgYDVR0PAQH/BAQDAgEGMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j -cmwuY2VydHVtLnBsL2N0bmNhLmNybDBrBggrBgEFBQcBAQRfMF0wKAYIKwYBBQUH -MAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMQYIKwYBBQUHMAKGJWh0 -dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOQYDVR0gBDIwMDAu -BgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93d3cuY2VydHVtLnBsL0NQUzAN -BgkqhkiG9w0BAQsFAAOCAQEAur/w4d1NK0JDZFjfZPP/gBpfVr47qbJ291R6TDDB -mSRLctLK1PoIxpDeiBLt+JD5/KmE/ZLyeOXbySJXq0EwQmsLn9dzM/sBZxxCXI8n -Z8duBwONDpbLCgPMPviHPDUwzRiM1XHdzd1hsBOjZEZO/nFOa2XpFATyP6i9DDY9 -Kl2eB/LCT5DFXk0YN9EnKICkNuXKk2plDviTua9SWEt6cdi68+/S8/ail+RdFAKa -y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv -xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA== ------END CERTIFICATE----- diff --git a/certs/Certum-Trusted-Network-CA.pem b/certs/Certum-Trusted-Network-CA.pem new file mode 100644 index 00000000..a48e7063 --- /dev/null +++ b/certs/Certum-Trusted-Network-CA.pem @@ -0,0 +1,29 @@ +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 16de7213..73a9ca02 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -104,7 +104,7 @@ { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; - cert="Certum Domain Validation CA SHA2" }; + cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; # cert="Cloudflare Inc ECC CA-3" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; From 7553870f2aac7182f5181273fb4a73e219fc68c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:32:01 +0200 Subject: [PATCH 190/988] certs: Cloudflare Inc ECC CA-3 -> Baltimore CyberTrust Root --- certs/Baltimore-CyberTrust-Root.pem | 28 +++++ certs/Cloudflare-Inc-ECC-CA-3.pem | 163 ---------------------------- global-config.rsc | 4 +- 3 files changed, 30 insertions(+), 165 deletions(-) create mode 100644 certs/Baltimore-CyberTrust-Root.pem delete mode 100644 certs/Cloudflare-Inc-ECC-CA-3.pem diff --git a/certs/Baltimore-CyberTrust-Root.pem b/certs/Baltimore-CyberTrust-Root.pem new file mode 100644 index 00000000..de8121a2 --- /dev/null +++ b/certs/Baltimore-CyberTrust-Root.pem @@ -0,0 +1,28 @@ +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- diff --git a/certs/Cloudflare-Inc-ECC-CA-3.pem b/certs/Cloudflare-Inc-ECC-CA-3.pem deleted file mode 100644 index fa916034..00000000 --- a/certs/Cloudflare-Inc-ECC-CA-3.pem +++ /dev/null @@ -1,163 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 0a:37:87:64:5e:5f:b4:8c:22:4e:fd:1b:ed:14:0c:3c - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Validity - Not Before: Jan 27 12:48:08 2020 GMT - Not After : Dec 31 23:59:59 2024 GMT - Subject: C = US, O = "Cloudflare, Inc.", CN = Cloudflare Inc ECC CA-3 - Subject Public Key Info: - Public Key Algorithm: id-ecPublicKey - Public-Key: (256 bit) - pub: - 04:b9:ad:4d:66:99:14:0b:46:ec:1f:81:d1:2a:50: - 1e:9d:03:15:2f:34:12:7d:2d:96:b8:88:38:9b:85: - 5f:8f:bf:bb:4d:ef:61:46:c4:c9:73:d4:24:4f:e0: - ee:1c:ce:6c:b3:51:71:2f:6a:ee:4c:05:09:77:d3: - 72:62:a4:9b:d7 - ASN1 OID: prime256v1 - NIST CURVE: P-256 - X509v3 extensions: - X509v3 Subject Key Identifier: - A5:CE:37:EA:EB:B0:75:0E:94:67:88:B4:45:FA:D9:24:10:87:96:1F - X509v3 Authority Key Identifier: - E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl3.digicert.com/Omniroot2025.crl - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.1.1 - CPS: https://www.digicert.com/CPS - Policy: 2.16.840.1.114412.1.2 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 05:24:1d:dd:1b:b0:2a:eb:98:d6:85:e3:39:4d:5e:6b:57:9d: - 82:57:fc:eb:e8:31:a2:57:90:65:05:be:16:44:38:5a:77:02: - b9:cf:10:42:c6:e1:92:a4:e3:45:27:f8:00:47:2c:68:a8:56: - 99:53:54:8f:ad:9e:40:c1:d0:0f:b6:d7:0d:0b:38:48:6c:50: - 2c:49:90:06:5b:64:1d:8b:cc:48:30:2e:de:08:e2:9b:49:22: - c0:92:0c:11:5e:96:92:94:d5:fc:20:dc:56:6c:e5:92:93:bf: - 7a:1c:c0:37:e3:85:49:15:fa:2b:e1:74:39:18:0f:b7:da:f3: - a2:57:58:60:4f:cc:8e:94:00:fc:46:7b:34:31:3e:4d:47:82: - 81:3a:cb:f4:89:5d:0e:ef:4d:0d:6e:9c:1b:82:24:dd:32:25: - 5d:11:78:51:10:3d:a0:35:23:04:2f:65:6f:9c:c1:d1:43:d7: - d0:1e:f3:31:67:59:27:dd:6b:d2:75:09:93:11:24:24:14:cf: - 29:be:e6:23:c3:b8:8f:72:3f:e9:07:c8:24:44:53:7a:b3:b9: - 61:65:a1:4c:0e:c6:48:00:c9:75:63:05:87:70:45:52:83:d3: - 95:9d:45:ea:f0:e8:31:1d:7e:09:1f:0a:fe:3e:dd:aa:3c:5e: - 74:d2:ac:b1 ------BEGIN CERTIFICATE----- -MIIDzTCCArWgAwIBAgIQCjeHZF5ftIwiTv0b7RQMPDANBgkqhkiG9w0BAQsFADBa -MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl -clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw -MDEyNzEyNDgwOFoXDTI0MTIzMTIzNTk1OVowSjELMAkGA1UEBhMCVVMxGTAXBgNV -BAoTEENsb3VkZmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkZmxhcmUgSW5jIEVD -QyBDQS0zMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEua1NZpkUC0bsH4HRKlAe -nQMVLzQSfS2WuIg4m4Vfj7+7Te9hRsTJc9QkT+DuHM5ss1FxL2ruTAUJd9NyYqSb -16OCAWgwggFkMB0GA1UdDgQWBBSlzjfq67B1DpRniLRF+tkkEIeWHzAfBgNVHSME -GDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l -BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYI -KwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL09t -bmlyb290MjAyNS5jcmwwbQYDVR0gBGYwZDA3BglghkgBhv1sAQEwKjAoBggrBgEF -BQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sAQIw -CAYGZ4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEB -AAUkHd0bsCrrmNaF4zlNXmtXnYJX/OvoMaJXkGUFvhZEOFp3ArnPEELG4ZKk40Un -+ABHLGioVplTVI+tnkDB0A+21w0LOEhsUCxJkAZbZB2LzEgwLt4I4ptJIsCSDBFe -lpKU1fwg3FZs5ZKTv3ocwDfjhUkV+ivhdDkYD7fa86JXWGBPzI6UAPxGezQxPk1H -goE6y/SJXQ7vTQ1unBuCJN0yJV0ReFEQPaA1IwQvZW+cwdFD19Ae8zFnWSfda9J1 -CZMRJCQUzym+5iPDuI9yP+kHyCREU3qzuWFloUwOxkgAyXVjBYdwRVKD05WdRerw -6DEdfgkfCv4+3ao8XnTSrLE= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 33554617 (0x20000b9) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Validity - Not Before: May 12 18:46:00 2000 GMT - Not After : May 12 23:59:00 2025 GMT - Subject: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:a3:04:bb:22:ab:98:3d:57:e8:26:72:9a:b5:79: - d4:29:e2:e1:e8:95:80:b1:b0:e3:5b:8e:2b:29:9a: - 64:df:a1:5d:ed:b0:09:05:6d:db:28:2e:ce:62:a2: - 62:fe:b4:88:da:12:eb:38:eb:21:9d:c0:41:2b:01: - 52:7b:88:77:d3:1c:8f:c7:ba:b9:88:b5:6a:09:e7: - 73:e8:11:40:a7:d1:cc:ca:62:8d:2d:e5:8f:0b:a6: - 50:d2:a8:50:c3:28:ea:f5:ab:25:87:8a:9a:96:1c: - a9:67:b8:3f:0c:d5:f7:f9:52:13:2f:c2:1b:d5:70: - 70:f0:8f:c0:12:ca:06:cb:9a:e1:d9:ca:33:7a:77: - d6:f8:ec:b9:f1:68:44:42:48:13:d2:c0:c2:a4:ae: - 5e:60:fe:b6:a6:05:fc:b4:dd:07:59:02:d4:59:18: - 98:63:f5:a5:63:e0:90:0c:7d:5d:b2:06:7a:f3:85: - ea:eb:d4:03:ae:5e:84:3e:5f:ff:15:ed:69:bc:f9: - 39:36:72:75:cf:77:52:4d:f3:c9:90:2c:b9:3d:e5: - c9:23:53:3f:1f:24:98:21:5c:07:99:29:bd:c6:3a: - ec:e7:6e:86:3a:6b:97:74:63:33:bd:68:18:31:f0: - 78:8d:76:bf:fc:9e:8e:5d:2a:86:a7:4d:90:dc:27: - 1a:39 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:3 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - Signature Algorithm: sha1WithRSAEncryption - Signature Value: - 85:0c:5d:8e:e4:6f:51:68:42:05:a0:dd:bb:4f:27:25:84:03: - bd:f7:64:fd:2d:d7:30:e3:a4:10:17:eb:da:29:29:b6:79:3f: - 76:f6:19:13:23:b8:10:0a:f9:58:a4:d4:61:70:bd:04:61:6a: - 12:8a:17:d5:0a:bd:c5:bc:30:7c:d6:e9:0c:25:8d:86:40:4f: - ec:cc:a3:7e:38:c6:37:11:4f:ed:dd:68:31:8e:4c:d2:b3:01: - 74:ee:be:75:5e:07:48:1a:7f:70:ff:16:5c:84:c0:79:85:b8: - 05:fd:7f:be:65:11:a3:0f:c0:02:b4:f8:52:37:39:04:d5:a9: - 31:7a:18:bf:a0:2a:f4:12:99:f7:a3:45:82:e3:3c:5e:f5:9d: - 9e:b5:c8:9e:7c:2e:c8:a4:9e:4e:08:14:4b:6d:fd:70:6d:6b: - 1a:63:bd:64:e6:1f:b7:ce:f0:f2:9f:2e:bb:1b:b7:f2:50:88: - 73:92:c2:e2:e3:16:8d:9a:32:02:ab:8e:18:dd:e9:10:11:ee: - 7e:35:ab:90:af:3e:30:94:7a:d0:33:3d:a7:65:0f:f5:fc:8e: - 9e:62:cf:47:44:2c:01:5d:bb:1d:b5:32:d2:47:d2:38:2e:d0: - fe:81:dc:32:6a:1e:b5:ee:3c:d5:fc:e7:81:1d:19:c3:24:42: - ea:63:39:a9 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 73a9ca02..cdc1d5ca 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="Cloudflare Inc ECC CA-3" }; +# cert="Baltimore CyberTrust Root" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; -# cert="Cloudflare Inc ECC CA-3" }; +# cert="Baltimore CyberTrust Root" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From a744508d4f59bb95106b454c930fbb3f9eb28066 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:34:49 +0200 Subject: [PATCH 191/988] certs: Starfield Secure Certificate Authority - G2 -> Starfield Root Certificate Authority - G2 --- ...tarfield-Root-Certificate-Authority-G2.pem | 30 +++ ...rfield-Secure-Certificate-Authority-G2.pem | 179 ------------------ update-tunnelbroker.rsc | 2 +- 3 files changed, 31 insertions(+), 180 deletions(-) create mode 100644 certs/Starfield-Root-Certificate-Authority-G2.pem delete mode 100644 certs/Starfield-Secure-Certificate-Authority-G2.pem diff --git a/certs/Starfield-Root-Certificate-Authority-G2.pem b/certs/Starfield-Root-Certificate-Authority-G2.pem new file mode 100644 index 00000000..4e6774d2 --- /dev/null +++ b/certs/Starfield-Root-Certificate-Authority-G2.pem @@ -0,0 +1,30 @@ +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- diff --git a/certs/Starfield-Secure-Certificate-Authority-G2.pem b/certs/Starfield-Secure-Certificate-Authority-G2.pem deleted file mode 100644 index 7772e6ba..00000000 --- a/certs/Starfield-Secure-Certificate-Authority-G2.pem +++ /dev/null @@ -1,179 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 7 (0x7) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Validity - Not Before: May 3 07:00:00 2011 GMT - Not After : May 3 07:00:00 2031 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", OU = http://certs.starfieldtech.com/repository/, CN = Starfield Secure Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:e5:90:66:4b:ec:f9:46:71:a9:20:83:be:e9:6c: - bf:4a:c9:48:69:81:75:4e:6d:24:f6:cb:17:13:f8: - b0:71:59:84:7a:6b:2b:85:a4:34:b5:16:e5:cb:cc: - e9:41:70:2c:a4:2e:d6:fa:32:7d:e1:a8:de:94:10: - ac:31:c1:c0:d8:6a:ff:59:27:ab:76:d6:fc:0b:74: - 6b:b8:a7:ae:3f:c4:54:f4:b4:31:44:dd:93:56:8c: - a4:4c:5e:9b:89:cb:24:83:9b:e2:57:7d:b7:d8:12: - 1f:c9:85:6d:f4:d1:80:f1:50:9b:87:ae:d4:0b:10: - 05:fb:27:ba:28:6d:17:e9:0e:d6:4d:b9:39:55:06: - ff:0a:24:05:7e:2f:c6:1d:72:6c:d4:8b:29:8c:57: - 7d:da:d9:eb:66:1a:d3:4f:a7:df:7f:52:c4:30:c5: - a5:c9:0e:02:c5:53:bf:77:38:68:06:24:c3:66:c8: - 37:7e:30:1e:45:71:23:35:ff:90:d8:2a:9d:8d:e7: - b0:92:4d:3c:7f:2a:0a:93:dc:cd:16:46:65:f7:60: - 84:8b:76:4b:91:27:73:14:92:e0:ea:ee:8f:16:ea: - 8d:0e:3e:76:17:bf:7d:89:80:80:44:43:e7:2d:e0: - 43:09:75:da:36:e8:ad:db:89:3a:f5:5d:12:8e:23: - 04:83 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 25:45:81:68:50:26:38:3D:3B:2D:2C:BE:CD:6A:D9:B6:3D:B3:66:63 - X509v3 Authority Key Identifier: - keyid:7C:0C:32:1F:A7:D9:30:7F:C4:7D:68:A3:62:A8:A1:CE:AB:07:5B:27 - - Authority Information Access: - OCSP - URI:http://ocsp.starfieldtech.com/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.starfieldtech.com/sfroot-g2.crl - - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: https://certs.starfieldtech.com/repository/ - - Signature Algorithm: sha256WithRSAEncryption - 56:65:ca:fe:f3:3f:0a:a8:93:8b:18:c7:de:43:69:13:34:20: - be:4e:5f:78:a8:6b:9c:db:6a:4d:41:db:c1:13:ec:dc:31:00: - 22:5e:f7:00:9e:0c:e0:34:65:34:f9:b1:3a:4e:48:c8:12:81: - 88:5c:5b:3e:08:53:7a:f7:1a:64:df:b8:50:61:cc:53:51:40: - 29:4b:c2:f4:ae:3a:5f:e4:ca:ad:26:cc:4e:61:43:e5:fd:57: - a6:37:70:ce:43:2b:b0:94:c3:92:e9:e1:5f:aa:10:49:b7:69: - e4:e0:d0:1f:64:a4:2b:cd:1f:6f:a0:f8:84:24:18:ce:79:3d: - a9:91:bf:54:18:13:89:99:54:11:0d:55:c5:26:0b:79:4f:5a: - 1c:6e:f9:63:db:14:80:a4:07:ab:fa:b2:a5:b9:88:dd:91:fe: - 65:3b:a4:a3:79:be:89:4d:e1:d0:b0:f4:c8:17:0c:0a:96:14: - 7c:09:b7:6c:e1:c2:d8:55:d4:18:a0:aa:41:69:70:24:a3:b9: - ef:e9:5a:dc:3e:eb:94:4a:f0:b7:de:5f:0e:76:fa:fb:fb:69: - 03:45:40:50:ee:72:0c:a4:12:86:81:cd:13:d1:4e:c4:3c:ca: - 4e:0d:d2:26:f1:00:b7:b4:a6:a2:e1:6e:7a:81:fd:30:ac:7a: - 1f:c7:59:7b ------BEGIN CERTIFICATE----- -MIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAw -MFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxk -dGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUg -Q2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuF -pDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE -3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlV -Bv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+ -MB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYX -v32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMB -Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+ -zWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYB -BQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNo -LmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNo -LmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUF -BwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkv -MA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pN -QdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0 -rjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjO -eT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQ -sPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ -7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7 ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Validity - Not Before: Sep 1 00:00:00 2009 GMT - Not After : Dec 31 23:59:59 2037 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bd:ed:c1:03:fc:f6:8f:fc:02:b1:6f:5b:9f:48: - d9:9d:79:e2:a2:b7:03:61:56:18:c3:47:b6:d7:ca: - 3d:35:2e:89:43:f7:a1:69:9b:de:8a:1a:fd:13:20: - 9c:b4:49:77:32:29:56:fd:b9:ec:8c:dd:22:fa:72: - dc:27:61:97:ee:f6:5a:84:ec:6e:19:b9:89:2c:dc: - 84:5b:d5:74:fb:6b:5f:c5:89:a5:10:52:89:46:55: - f4:b8:75:1c:e6:7f:e4:54:ae:4b:f8:55:72:57:02: - 19:f8:17:71:59:eb:1e:28:07:74:c5:9d:48:be:6c: - b4:f4:a4:b0:f3:64:37:79:92:c0:ec:46:5e:7f:e1: - 6d:53:4c:62:af:cd:1f:0b:63:bb:3a:9d:fb:fc:79: - 00:98:61:74:cf:26:82:40:63:f3:b2:72:6a:19:0d: - 99:ca:d4:0e:75:cc:37:fb:8b:89:c1:59:f1:62:7f: - 5f:b3:5f:65:30:f8:a7:b7:4d:76:5a:1e:76:5e:34: - c0:e8:96:56:99:8a:b3:f0:7f:a4:cd:bd:dc:32:31: - 7c:91:cf:e0:5f:11:f8:6b:aa:49:5c:d1:99:94:d1: - a2:e3:63:5b:09:76:b5:56:62:e1:4b:74:1d:96:d4: - 26:d4:08:04:59:d0:98:0e:0e:e6:de:fc:c3:ec:1f: - 90:f1 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 7C:0C:32:1F:A7:D9:30:7F:C4:7D:68:A3:62:A8:A1:CE:AB:07:5B:27 - Signature Algorithm: sha256WithRSAEncryption - 11:59:fa:25:4f:03:6f:94:99:3b:9a:1f:82:85:39:d4:76:05: - 94:5e:e1:28:93:6d:62:5d:09:c2:a0:a8:d4:b0:75:38:f1:34: - 6a:9d:e4:9f:8a:86:26:51:e6:2c:d1:c6:2d:6e:95:20:4a:92: - 01:ec:b8:8a:67:7b:31:e2:67:2e:8c:95:03:26:2e:43:9d:4a: - 31:f6:0e:b5:0c:bb:b7:e2:37:7f:22:ba:00:a3:0e:7b:52:fb: - 6b:bb:3b:c4:d3:79:51:4e:cd:90:f4:67:07:19:c8:3c:46:7a: - 0d:01:7d:c5:58:e7:6d:e6:85:30:17:9a:24:c4:10:e0:04:f7: - e0:f2:7f:d4:aa:0a:ff:42:1d:37:ed:94:e5:64:59:12:20:77: - 38:d3:32:3e:38:81:75:96:73:fa:68:8f:b1:cb:ce:1f:c5:ec: - fa:9c:7e:cf:7e:b1:f1:07:2d:b6:fc:bf:ca:a4:bf:d0:97:05: - 4a:bc:ea:18:28:02:90:bd:54:78:09:21:71:d3:d1:7d:1d:d9: - 16:b0:a9:61:3d:d0:0a:00:22:fc:c7:7b:cb:09:64:45:0b:3b: - 40:81:f7:7d:7c:32:f5:98:ca:58:8e:7d:2a:ee:90:59:73:64: - f9:36:74:5e:25:a1:f5:66:05:2e:7f:39:15:a9:2a:fb:50:8b: - 8e:85:69:f4 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 364dc086..f9ba202e 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -25,7 +25,7 @@ :error false; } - :if ([ $CertificateAvailable "Starfield Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); :error false; } From 0ae3d31c58d57578092e76368ebd82bdc859123d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:38:35 +0200 Subject: [PATCH 192/988] certs: GTS CA 1C3 / GTS CA 1P5 -> GTS Root R1 --- certs/GTS-CA-1C3.pem | 242 ------------------------------------------ certs/GTS-CA-1P5.pem | 238 ----------------------------------------- certs/GTS-Root-R1.pem | 38 +++++++ doc/netwatch-dns.md | 2 +- global-functions.rsc | 2 +- 5 files changed, 40 insertions(+), 482 deletions(-) delete mode 100644 certs/GTS-CA-1C3.pem delete mode 100644 certs/GTS-CA-1P5.pem create mode 100644 certs/GTS-Root-R1.pem diff --git a/certs/GTS-CA-1C3.pem b/certs/GTS-CA-1C3.pem deleted file mode 100644 index a8432d23..00000000 --- a/certs/GTS-CA-1C3.pem +++ /dev/null @@ -1,242 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:bc:53:59:6b:34:c7:18:f5:01:50:66 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Validity - Not Before: Aug 13 00:00:42 2020 GMT - Not After : Sep 30 00:00:42 2027 GMT - Subject: C = US, O = Google Trust Services LLC, CN = GTS CA 1C3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:f5:88:df:e7:62:8c:1e:37:f8:37:42:90:7f:6c: - 87:d0:fb:65:82:25:fd:e8:cb:6b:a4:ff:6d:e9:5a: - 23:e2:99:f6:1c:e9:92:03:99:13:7c:09:0a:8a:fa: - 42:d6:5e:56:24:aa:7a:33:84:1f:d1:e9:69:bb:b9: - 74:ec:57:4c:66:68:93:77:37:55:53:fe:39:10:4d: - b7:34:bb:5f:25:77:37:3b:17:94:ea:3c:e5:9d:d5: - bc:c3:b4:43:eb:2e:a7:47:ef:b0:44:11:63:d8:b4: - 41:85:dd:41:30:48:93:1b:bf:b7:f6:e0:45:02:21: - e0:96:42:17:cf:d9:2b:65:56:34:07:26:04:0d:a8: - fd:7d:ca:2e:ef:ea:48:7c:37:4d:3f:00:9f:83:df: - ef:75:84:2e:79:57:5c:fc:57:6e:1a:96:ff:fc:8c: - 9a:a6:99:be:25:d9:7f:96:2c:06:f7:11:2a:02:80: - 80:eb:63:18:3c:50:49:87:e5:8a:ca:5f:19:2b:59: - 96:81:00:a0:fb:51:db:ca:77:0b:0b:c9:96:4f:ef: - 70:49:c7:5c:6d:20:fd:99:b4:b4:e2:ca:2e:77:fd: - 2d:dc:0b:b6:6b:13:0c:8c:19:2b:17:96:98:b9:f0: - 8b:f6:a0:27:bb:b6:e3:8d:51:8f:bd:ae:c7:9b:b1: - 89:9d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 8A:74:7F:AF:85:CD:EE:95:CD:3D:9C:D0:E2:46:14:F3:71:35:1D:27 - X509v3 Authority Key Identifier: - keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - - Authority Information Access: - OCSP - URI:http://ocsp.pki.goog/gtsr1 - CA Issuers - URI:http://pki.goog/repo/certs/gtsr1.der - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.pki.goog/gtsr1/gtsr1.crl - - X509v3 Certificate Policies: - Policy: 1.3.6.1.4.1.11129.2.5.3 - CPS: https://pki.goog/repository/ - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - - Signature Algorithm: sha256WithRSAEncryption - 89:7d:ac:20:5c:0c:3c:be:9a:a8:57:95:1b:b4:ae:fa:ab:a5: - 72:71:b4:36:95:fd:df:40:11:03:4c:c2:46:14:bb:14:24:ab: - f0:50:71:22:db:ad:c4:6e:7f:cf:f1:6a:6f:c8:83:1b:d8:ce: - 89:5f:87:6c:87:b8:a9:0c:a3:9b:a1:62:94:93:95:df:5b:ae: - 66:19:0b:02:96:9e:fc:b5:e7:10:69:3e:7a:cb:46:49:5f:46: - e1:41:b1:d7:98:4d:65:34:00:80:1a:3f:4f:9f:6c:7f:49:00: - 81:53:41:a4:92:21:82:82:1a:f1:a3:44:5b:2a:50:12:13:4d: - c1:53:36:f3:42:08:af:54:fa:8e:77:53:1b:64:38:27:17:09: - bd:58:c9:1b:7c:39:2d:5b:f3:ce:d4:ed:97:db:14:03:bf:09: - 53:24:1f:c2:0c:04:79:98:26:f2:61:f1:53:52:fd:42:8c:1b: - 66:2b:3f:15:a1:bb:ff:f6:9b:e3:81:9a:01:06:71:89:35:28: - 24:dd:e1:bd:eb:19:2d:e1:48:cb:3d:59:83:51:b4:74:c6:9d: - 7c:c6:b1:86:5b:af:cc:34:c4:d3:cc:d4:81:11:95:00:a1:f4: - 12:22:01:fa:b4:83:71:af:8c:b7:8c:73:24:ac:37:53:c2:00: - 90:3f:11:fe:5c:ed:36:94:10:3b:bd:29:ae:e2:c7:3a:62:3b: - 6c:63:d9:80:bf:59:71:ac:63:27:b9:4c:17:a0:da:f6:73:15: - bf:2a:de:8f:f3:a5:6c:32:81:33:03:d0:86:51:71:99:34:ba: - 93:8d:5d:b5:51:58:f7:b2:93:e8:01:f6:59:be:71:9b:fd:4d: - 28:ce:cf:6d:c7:16:dc:f7:d1:d6:46:9b:a7:ca:6b:e9:77:0f: - fd:a0:b6:1b:23:83:1d:10:1a:d9:09:00:84:e0:44:d3:a2:75: - 23:b3:34:86:f6:20:b0:a4:5e:10:1d:e0:52:46:00:9d:b1:0f: - 1f:21:70:51:f5:9a:dd:06:fc:55:f4:2b:0e:33:77:c3:4b:42: - c2:f1:77:13:fc:73:80:94:eb:1f:bb:37:3f:ce:02:2a:66:b0: - 73:1d:32:a5:32:6c:32:b0:8e:e0:c4:23:ff:5b:7d:4d:65:70: - ac:2b:9b:3d:ce:db:e0:6d:8e:32:80:be:96:9f:92:63:bc:97: - bb:5d:b9:f4:e1:71:5e:2a:e4:ef:03:22:b1:8a:65:3a:8f:c0: - 93:65:d4:85:cd:0f:0f:5b:83:59:16:47:16:2d:9c:24:3a:c8: - 80:a6:26:14:85:9b:f6:37:9b:ac:6f:f9:c5:c3:06:51:f3:e2: - 7f:c5:b1:10:ba:51:f4:dd ------BEGIN CERTIFICATE----- -MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAw -MDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzp -kgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsX -lOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcm -BA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKA -gOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwL -tmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T -AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYD -VR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYG -CCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcw -AoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQt -MCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcG -A1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3Br -aS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcN -AQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQ -cSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrL -RklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U -+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2Yr -PxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IER -lQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGs -Yye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjO -z23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJG -AJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKw -juDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl -1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1 - Signature Algorithm: sha384WithRSAEncryption - Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Validity - Not Before: Jun 22 00:00:00 2016 GMT - Not After : Jun 22 00:00:00 2036 GMT - Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:b6:11:02:8b:1e:e3:a1:77:9b:3b:dc:bf:94:3e: - b7:95:a7:40:3c:a1:fd:82:f9:7d:32:06:82:71:f6: - f6:8c:7f:fb:e8:db:bc:6a:2e:97:97:a3:8c:4b:f9: - 2b:f6:b1:f9:ce:84:1d:b1:f9:c5:97:de:ef:b9:f2: - a3:e9:bc:12:89:5e:a7:aa:52:ab:f8:23:27:cb:a4: - b1:9c:63:db:d7:99:7e:f0:0a:5e:eb:68:a6:f4:c6: - 5a:47:0d:4d:10:33:e3:4e:b1:13:a3:c8:18:6c:4b: - ec:fc:09:90:df:9d:64:29:25:23:07:a1:b4:d2:3d: - 2e:60:e0:cf:d2:09:87:bb:cd:48:f0:4d:c2:c2:7a: - 88:8a:bb:ba:cf:59:19:d6:af:8f:b0:07:b0:9e:31: - f1:82:c1:c0:df:2e:a6:6d:6c:19:0e:b5:d8:7e:26: - 1a:45:03:3d:b0:79:a4:94:28:ad:0f:7f:26:e5:a8: - 08:fe:96:e8:3c:68:94:53:ee:83:3a:88:2b:15:96: - 09:b2:e0:7a:8c:2e:75:d6:9c:eb:a7:56:64:8f:96: - 4f:68:ae:3d:97:c2:84:8f:c0:bc:40:c0:0b:5c:bd: - f6:87:b3:35:6c:ac:18:50:7f:84:e0:4c:cd:92:d3: - 20:e9:33:bc:52:99:af:32:b5:29:b3:25:2a:b4:48: - f9:72:e1:ca:64:f7:e6:82:10:8d:e8:9d:c2:8a:88: - fa:38:66:8a:fc:63:f9:01:f9:78:fd:7b:5c:77:fa: - 76:87:fa:ec:df:b1:0e:79:95:57:b4:bd:26:ef:d6: - 01:d1:eb:16:0a:bb:8e:0b:b5:c5:c5:8a:55:ab:d3: - ac:ea:91:4b:29:cc:19:a4:32:25:4e:2a:f1:65:44: - d0:02:ce:aa:ce:49:b4:ea:9f:7c:83:b0:40:7b:e7: - 43:ab:a7:6c:a3:8f:7d:89:81:fa:4c:a5:ff:d5:8e: - c3:ce:4b:e0:b5:d8:b3:8e:45:cf:76:c0:ed:40:2b: - fd:53:0f:b0:a7:d5:3b:0d:b1:8a:a2:03:de:31:ad: - cc:77:ea:6f:7b:3e:d6:df:91:22:12:e6:be:fa:d8: - 32:fc:10:63:14:51:72:de:5d:d6:16:93:bd:29:68: - 33:ef:3a:66:ec:07:8a:26:df:13:d7:57:65:78:27: - de:5e:49:14:00:a2:00:7f:9a:a8:21:b6:a9:b1:95: - b0:a5:b9:0d:16:11:da:c7:6c:48:3c:40:e0:7e:0d: - 5a:cd:56:3c:d1:97:05:b9:cb:4b:ed:39:4b:9c:c4: - 3f:d2:55:13:6e:24:b0:d6:71:fa:f4:c1:ba:cc:ed: - 1b:f5:fe:81:41:d8:00:98:3d:3a:c8:ae:7a:98:37: - 18:05:95 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Signature Algorithm: sha384WithRSAEncryption - 38:96:0a:ee:3d:b4:96:1e:5f:ef:9d:9c:0b:33:9f:2b:e0:ca: - fd:d2:8e:0a:1f:41:74:a5:7c:aa:84:d4:e5:f2:1e:e6:37:52: - 32:9c:0b:d1:61:1d:bf:28:c1:b6:44:29:35:75:77:98:b2:7c: - d9:bd:74:ac:8a:68:e3:a9:31:09:29:01:60:73:e3:47:7c:53: - a8:90:4a:27:ef:4b:d7:9f:93:e7:82:36:ce:9a:68:0c:82:e7: - cf:d4:10:16:6f:5f:0e:99:5c:f6:1f:71:7d:ef:ef:7b:2f:7e: - ea:36:d6:97:70:0b:15:ee:d7:5c:56:6a:33:a5:e3:49:38:0c: - b8:7d:fb:8d:85:a4:b1:59:5e:f4:6a:e1:dd:a1:f6:64:44:ae: - e6:51:83:21:66:c6:11:3e:f3:ce:47:ee:9c:28:1f:25:da:ff: - ac:66:95:dd:35:0f:5c:ef:20:2c:62:fd:91:ba:a9:cc:fc:5a: - 9c:93:81:83:29:97:4a:7c:5a:72:b4:39:d0:b7:77:cb:79:fd: - 69:3a:92:37:ed:6e:38:65:46:7e:e9:60:bd:79:88:97:5f:38: - 12:f4:ee:af:5b:82:c8:86:d5:e1:99:6d:8c:04:f2:76:ba:49: - f6:6e:e9:6d:1e:5f:a0:ef:27:82:76:40:f8:a6:d3:58:5c:0f: - 2c:42:da:42:c6:7b:88:34:c7:c1:d8:45:9b:c1:3e:c5:61:1d: - d9:63:50:49:f6:34:85:6a:e0:18:c5:6e:47:ab:41:42:29:9b: - f6:60:0d:d2:31:d3:63:98:23:93:5a:00:81:48:b4:ef:cd:8a: - cd:c9:cf:99:ee:d9:9e:aa:36:e1:68:4b:71:49:14:36:28:3a: - 3d:1d:ce:9a:8f:25:e6:80:71:61:2b:b5:7b:cc:f9:25:16:81: - e1:31:5f:a1:a3:7e:16:a4:9c:16:6a:97:18:bd:76:72:a5:0b: - 9e:1d:36:e6:2f:a1:2f:be:70:91:0f:a8:e6:da:f8:c4:92:40: - 6c:25:7e:7b:b3:09:dc:b2:17:ad:80:44:f0:68:a5:8f:94:75: - ff:74:5a:e8:a8:02:7c:0c:09:e2:a9:4b:0b:a0:85:0b:62:b9: - ef:a1:31:92:fb:ef:f6:51:04:89:6c:e8:a9:74:a1:bb:17:b3: - b5:fd:49:0f:7c:3c:ec:83:18:20:43:4e:d5:93:ba:b4:34:b1: - 1f:16:36:1f:0c:e6:64:39:16:4c:dc:e0:fe:1d:c8:a9:62:3d: - 40:ea:ca:c5:34:02:b4:ae:89:88:33:35:dc:2c:13:73:d8:27: - f1:d0:72:ee:75:3b:22:de:98:68:66:5b:f1:c6:63:47:55:1c: - ba:a5:08:51:75:a6:48:25 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- diff --git a/certs/GTS-CA-1P5.pem b/certs/GTS-CA-1P5.pem deleted file mode 100644 index 5be738d2..00000000 --- a/certs/GTS-CA-1P5.pem +++ /dev/null @@ -1,238 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:bc:50:a3:27:53:f0:91:80:22:ed:f1 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Validity - Not Before: Aug 13 00:00:42 2020 GMT - Not After : Sep 30 00:00:42 2027 GMT - Subject: C=US, O=Google Trust Services LLC, CN=GTS CA 1P5 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b3:82:f0:24:8c:bf:2d:87:af:b2:d9:a7:ae:fa: - ca:ba:44:d6:5b:3e:fe:b2:f7:b2:65:16:dc:de:10: - e8:4f:2d:10:58:5a:28:86:87:a1:ee:6a:b3:a0:d9: - 75:4f:7f:a1:52:01:8b:55:a8:4a:5b:06:48:c8:36: - 12:25:ab:89:f9:f2:23:5f:9d:60:65:f9:5c:da:be: - 3a:e8:5c:6d:7d:9c:d0:84:18:85:30:cd:4e:9b:ec: - 3c:d8:b3:e1:96:d4:f3:c5:0b:65:db:8f:b0:74:cb: - f6:1e:f3:78:f1:ac:95:c5:dd:73:c3:31:88:81:af: - 74:aa:6f:fd:0c:e3:05:95:f0:c5:10:4f:65:63:fa: - a0:af:c6:18:3d:c5:a1:df:97:79:d7:05:89:b3:30: - b0:74:ae:3d:92:10:6b:8c:15:77:dd:0b:04:57:fb: - 81:03:dd:ea:22:34:d5:e5:56:b2:f0:c4:8d:41:b1: - c3:02:db:62:ec:80:d0:ff:76:d4:86:e4:04:1a:b6: - b6:0c:2b:62:71:7d:d9:af:d9:f1:5e:fa:c0:1e:ca: - a0:19:5c:55:f0:80:d1:2a:0c:07:86:90:9f:35:e3: - 28:2b:5b:ef:23:c8:a3:1d:a4:a3:3a:ee:fe:83:dc: - 82:4c:25:b0:4d:c5:51:ad:9e:9b:d3:5b:84:c2:1a: - 5a:e9 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - D5:FC:9E:0D:DF:1E:CA:DD:08:97:97:6E:2B:C5:5F:C5:2B:F5:EC:B8 - X509v3 Authority Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Authority Information Access: - OCSP - URI:http://ocsp.pki.goog/gtsr1 - CA Issuers - URI:http://pki.goog/repo/certs/gtsr1.der - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.pki.goog/gtsr1/gtsr1.crl - X509v3 Certificate Policies: - Policy: 1.3.6.1.4.1.11129.2.5.3 - CPS: https://pki.goog/repository/ - Policy: 2.23.140.1.2.1 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 6c:63:27:ee:23:df:e5:52:68:4d:81:66:91:85:df:7d:65:e5: - 5b:37:31:08:26:b2:07:5d:9a:be:b1:ca:01:b9:ad:bf:9d:77: - f6:51:1d:d7:98:c5:0b:49:a1:7b:a1:d7:d3:68:e5:44:0f:8b: - ba:36:dd:42:82:77:d2:8d:dd:f5:3f:fb:eb:c8:07:98:93:ee: - 5a:d0:b5:3d:de:4b:1c:2d:8c:4d:ec:7e:8c:7b:fe:4e:40:fd: - f0:b4:b3:59:02:10:51:5c:e3:c0:2b:fd:b7:06:48:51:7e:09: - 5e:3f:0f:dc:a7:fe:97:e7:79:c5:0e:44:89:78:c5:69:59:29: - a0:9a:3a:48:36:29:a6:94:93:55:2d:b8:47:b5:e9:96:b5:9f: - 07:cd:a6:ab:3e:32:8a:c0:86:83:c5:c1:41:c8:9f:2f:35:8e: - 0d:c0:07:7a:e1:ac:c9:65:b5:cb:8a:a7:dd:71:d8:61:65:39: - 84:ac:32:3e:f7:7a:36:f1:56:9f:57:a9:41:6d:5a:90:a7:db: - 3a:ea:75:80:0c:63:0b:69:74:6f:07:4c:15:f3:37:28:a5:19: - a4:6e:f5:f6:20:cd:63:b2:7e:c4:2b:09:75:89:da:d1:3c:2e: - 72:4f:36:1a:a1:9e:44:d0:cd:9b:a6:23:08:3f:97:a1:a7:9e: - 5a:a5:f7:09:94:ad:5d:76:5d:28:56:d1:1a:66:51:51:07:7b: - de:3d:b0:c8:ef:30:7a:24:2d:be:b8:b3:86:f6:4b:f7:f0:b5: - 4f:ff:ce:c6:f9:f6:3f:2a:27:08:0f:09:3e:23:5a:c7:e3:42: - 2d:7a:36:e4:3d:98:96:60:39:98:ea:d1:db:63:2a:eb:78:09: - b1:4e:21:b3:8e:b7:ce:3e:92:f1:95:5c:a4:39:d0:c0:2b:c8: - 53:15:f5:d2:2f:82:cd:06:74:67:99:90:77:37:0a:97:2d:c5: - 1c:1e:f4:d0:5b:e9:15:e3:ea:02:09:c8:13:d7:13:70:65:bf: - fb:88:9b:5a:25:be:77:09:e1:a7:6a:4e:11:75:b9:1e:4d:f1: - 00:1b:6a:66:79:8e:c3:6e:d8:6d:a2:22:a2:6d:05:fb:2c:f2: - f1:50:e5:a0:d1:d8:9f:35:7d:fc:70:ab:59:2a:02:f1:be:b0: - d3:f1:f8:cd:12:b9:6a:25:90:5b:e3:85:20:e6:f5:da:cb:40: - 1c:19:34:20:03:61:77:ba:7f:48:0f:49:0b:29:eb:e7:61:64: - c7:63:d1:47:eb:1c:e1:ee:94:46:ef:39:73:cc:ee:4f:2b:8d: - dc:fb:58:a7:b3:65:20:99:95:b9:fb:55:6f:d7:96:6e:94:3d: - f4:7a:92:8e:63:1d:df:6d ------BEGIN CERTIFICATE----- -MIIFjDCCA3SgAwIBAgINAgO8UKMnU/CRgCLt8TANBgkqhkiG9w0BAQsFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAw -MDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFQNTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALOC8CSMvy2Hr7LZp676yrpE1ls+/rL3smUW3N4Q6E8tEFha -KIaHoe5qs6DZdU9/oVIBi1WoSlsGSMg2EiWrifnyI1+dYGX5XNq+OuhcbX2c0IQY -hTDNTpvsPNiz4ZbU88ULZduPsHTL9h7zePGslcXdc8MxiIGvdKpv/QzjBZXwxRBP -ZWP6oK/GGD3Fod+XedcFibMwsHSuPZIQa4wVd90LBFf7gQPd6iI01eVWsvDEjUGx -wwLbYuyA0P921IbkBBq2tgwrYnF92a/Z8V76wB7KoBlcVfCA0SoMB4aQnzXjKCtb -7yPIox2kozru/oPcgkwlsE3FUa2em9NbhMIaWukCAwEAAaOCAXYwggFyMA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T -AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU1fyeDd8eyt0Il5duK8VfxSv17LgwHwYD -VR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYG -CCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcw -AoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQt -MCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsME0G -A1UdIARGMEQwOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3Br -aS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAgEA -bGMn7iPf5VJoTYFmkYXffWXlWzcxCCayB12avrHKAbmtv5139lEd15jFC0mhe6HX -02jlRA+LujbdQoJ30o3d9T/768gHmJPuWtC1Pd5LHC2MTex+jHv+TkD98LSzWQIQ -UVzjwCv9twZIUX4JXj8P3Kf+l+d5xQ5EiXjFaVkpoJo6SDYpppSTVS24R7XplrWf -B82mqz4yisCGg8XBQcifLzWODcAHeuGsyWW1y4qn3XHYYWU5hKwyPvd6NvFWn1ep -QW1akKfbOup1gAxjC2l0bwdMFfM3KKUZpG719iDNY7J+xCsJdYna0Twuck82GqGe -RNDNm6YjCD+XoaeeWqX3CZStXXZdKFbRGmZRUQd73j2wyO8weiQtvrizhvZL9/C1 -T//Oxvn2PyonCA8JPiNax+NCLXo25D2YlmA5mOrR22Mq63gJsU4hs463zj6S8ZVc -pDnQwCvIUxX10i+CzQZ0Z5mQdzcKly3FHB700FvpFePqAgnIE9cTcGW/+4ibWiW+ -dwnhp2pOEXW5Hk3xABtqZnmOw27YbaIiom0F+yzy8VDloNHYnzV9/HCrWSoC8b6w -0/H4zRK5aiWQW+OFIOb12stAHBk0IANhd7p/SA9JCynr52Fkx2PRR+sc4e6URu85 -c8zuTyuN3PtYp7NlIJmVuftVb9eWbpQ99HqSjmMd320= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17 - Signature Algorithm: sha384WithRSAEncryption - Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Validity - Not Before: Jun 22 00:00:00 2016 GMT - Not After : Jun 22 00:00:00 2036 GMT - Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (4096 bit) - Modulus: - 00:b6:11:02:8b:1e:e3:a1:77:9b:3b:dc:bf:94:3e: - b7:95:a7:40:3c:a1:fd:82:f9:7d:32:06:82:71:f6: - f6:8c:7f:fb:e8:db:bc:6a:2e:97:97:a3:8c:4b:f9: - 2b:f6:b1:f9:ce:84:1d:b1:f9:c5:97:de:ef:b9:f2: - a3:e9:bc:12:89:5e:a7:aa:52:ab:f8:23:27:cb:a4: - b1:9c:63:db:d7:99:7e:f0:0a:5e:eb:68:a6:f4:c6: - 5a:47:0d:4d:10:33:e3:4e:b1:13:a3:c8:18:6c:4b: - ec:fc:09:90:df:9d:64:29:25:23:07:a1:b4:d2:3d: - 2e:60:e0:cf:d2:09:87:bb:cd:48:f0:4d:c2:c2:7a: - 88:8a:bb:ba:cf:59:19:d6:af:8f:b0:07:b0:9e:31: - f1:82:c1:c0:df:2e:a6:6d:6c:19:0e:b5:d8:7e:26: - 1a:45:03:3d:b0:79:a4:94:28:ad:0f:7f:26:e5:a8: - 08:fe:96:e8:3c:68:94:53:ee:83:3a:88:2b:15:96: - 09:b2:e0:7a:8c:2e:75:d6:9c:eb:a7:56:64:8f:96: - 4f:68:ae:3d:97:c2:84:8f:c0:bc:40:c0:0b:5c:bd: - f6:87:b3:35:6c:ac:18:50:7f:84:e0:4c:cd:92:d3: - 20:e9:33:bc:52:99:af:32:b5:29:b3:25:2a:b4:48: - f9:72:e1:ca:64:f7:e6:82:10:8d:e8:9d:c2:8a:88: - fa:38:66:8a:fc:63:f9:01:f9:78:fd:7b:5c:77:fa: - 76:87:fa:ec:df:b1:0e:79:95:57:b4:bd:26:ef:d6: - 01:d1:eb:16:0a:bb:8e:0b:b5:c5:c5:8a:55:ab:d3: - ac:ea:91:4b:29:cc:19:a4:32:25:4e:2a:f1:65:44: - d0:02:ce:aa:ce:49:b4:ea:9f:7c:83:b0:40:7b:e7: - 43:ab:a7:6c:a3:8f:7d:89:81:fa:4c:a5:ff:d5:8e: - c3:ce:4b:e0:b5:d8:b3:8e:45:cf:76:c0:ed:40:2b: - fd:53:0f:b0:a7:d5:3b:0d:b1:8a:a2:03:de:31:ad: - cc:77:ea:6f:7b:3e:d6:df:91:22:12:e6:be:fa:d8: - 32:fc:10:63:14:51:72:de:5d:d6:16:93:bd:29:68: - 33:ef:3a:66:ec:07:8a:26:df:13:d7:57:65:78:27: - de:5e:49:14:00:a2:00:7f:9a:a8:21:b6:a9:b1:95: - b0:a5:b9:0d:16:11:da:c7:6c:48:3c:40:e0:7e:0d: - 5a:cd:56:3c:d1:97:05:b9:cb:4b:ed:39:4b:9c:c4: - 3f:d2:55:13:6e:24:b0:d6:71:fa:f4:c1:ba:cc:ed: - 1b:f5:fe:81:41:d8:00:98:3d:3a:c8:ae:7a:98:37: - 18:05:95 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Signature Algorithm: sha384WithRSAEncryption - Signature Value: - 9f:aa:42:26:db:0b:9b:be:ff:1e:96:92:2e:3e:a2:65:4a:6a: - 98:ba:22:cb:7d:c1:3a:d8:82:0a:06:c6:f6:a5:de:c0:4e:87: - 66:79:a1:f9:a6:58:9c:aa:f9:b5:e6:60:e7:e0:e8:b1:1e:42: - 41:33:0b:37:3d:ce:89:70:15:ca:b5:24:a8:cf:6b:b5:d2:40: - 21:98:cf:22:34:cf:3b:c5:22:84:e0:c5:0e:8a:7c:5d:88:e4: - 35:24:ce:9b:3e:1a:54:1e:6e:db:b2:87:a7:fc:f3:fa:81:55: - 14:62:0a:59:a9:22:05:31:3e:82:d6:ee:db:57:34:bc:33:95: - d3:17:1b:e8:27:a2:8b:7b:4e:26:1a:7a:5a:64:b6:d1:ac:37: - f1:fd:a0:f3:38:ec:72:f0:11:75:9d:cb:34:52:8d:e6:76:6b: - 17:c6:df:86:ab:27:8e:49:2b:75:66:81:10:21:a6:ea:3e:f4: - ae:25:ff:7c:15:de:ce:8c:25:3f:ca:62:70:0a:f7:2f:09:66: - 07:c8:3f:1c:fc:f0:db:45:30:df:62:88:c1:b5:0f:9d:c3:9f: - 4a:de:59:59:47:c5:87:22:36:e6:82:a7:ed:0a:b9:e2:07:a0: - 8d:7b:7a:4a:3c:71:d2:e2:03:a1:1f:32:07:dd:1b:e4:42:ce: - 0c:00:45:61:80:b5:0b:20:59:29:78:bd:f9:55:cb:63:c5:3c: - 4c:f4:b6:ff:db:6a:5f:31:6b:99:9e:2c:c1:6b:50:a4:d7:e6: - 18:14:bd:85:3f:67:ab:46:9f:a0:ff:42:a7:3a:7f:5c:cb:5d: - b0:70:1d:2b:34:f5:d4:76:09:0c:eb:78:4c:59:05:f3:33:42: - c3:61:15:10:1b:77:4d:ce:22:8c:d4:85:f2:45:7d:b7:53:ea: - ef:40:5a:94:0a:5c:20:5f:4e:40:5d:62:22:76:df:ff:ce:61: - bd:8c:23:78:d2:37:02:e0:8e:de:d1:11:37:89:f6:bf:ed:49: - 07:62:ae:92:ec:40:1a:af:14:09:d9:d0:4e:b2:a2:f7:be:ee: - ee:d8:ff:dc:1a:2d:de:b8:36:71:e2:fc:79:b7:94:25:d1:48: - 73:5b:a1:35:e7:b3:99:67:75:c1:19:3a:2b:47:4e:d3:42:8e: - fd:31:c8:16:66:da:d2:0c:3c:db:b3:8e:c9:a1:0d:80:0f:7b: - 16:77:14:bf:ff:db:09:94:b2:93:bc:20:58:15:e9:db:71:43: - f3:de:10:c3:00:dc:a8:2a:95:b6:c2:d6:3f:90:6b:76:db:6c: - fe:8c:bc:f2:70:35:0c:dc:99:19:35:dc:d7:c8:46:63:d5:36: - 71:ae:57:fb:b7:82:6d:dc ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- diff --git a/certs/GTS-Root-R1.pem b/certs/GTS-Root-R1.pem new file mode 100644 index 00000000..a6095d2b --- /dev/null +++ b/certs/GTS-Root-R1.pem @@ -0,0 +1,38 @@ +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 443106ff..3214368d 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -64,7 +64,7 @@ the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global G2 TLS RSA SHA256 2020 CA1" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; - /tool/netwatch/add comment="doh, doh-cert=GTS CA 1C3" host=8.8.8.8; + /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be desired, with fallback in case it fails. This is possible as well: diff --git a/global-functions.rsc b/global-functions.rsc index 567444ee..ca8ecb11 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -509,7 +509,7 @@ } :do { - :if ([ $CertificateAvailable "GTS CA 1P5" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 588dacb5af93819021b71a88f200464359dee701 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:47:42 +0200 Subject: [PATCH 193/988] certs: Go Daddy Secure Certificate Authority - G2 -> Go Daddy Root Certificate Authority - G2 --- ...Go-Daddy-Root-Certificate-Authority-G2.pem | 30 +++ ...-Daddy-Secure-Certificate-Authority-G2.pem | 178 ------------------ mod/notification-telegram.rsc | 2 +- telegram-chat.rsc | 2 +- 4 files changed, 32 insertions(+), 180 deletions(-) create mode 100644 certs/Go-Daddy-Root-Certificate-Authority-G2.pem delete mode 100644 certs/Go-Daddy-Secure-Certificate-Authority-G2.pem diff --git a/certs/Go-Daddy-Root-Certificate-Authority-G2.pem b/certs/Go-Daddy-Root-Certificate-Authority-G2.pem new file mode 100644 index 00000000..c61f300e --- /dev/null +++ b/certs/Go-Daddy-Root-Certificate-Authority-G2.pem @@ -0,0 +1,30 @@ +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- diff --git a/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem b/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem deleted file mode 100644 index 4faba90c..00000000 --- a/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem +++ /dev/null @@ -1,178 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 7 (0x7) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Validity - Not Before: May 3 07:00:00 2011 GMT - Not After : May 3 07:00:00 2031 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", OU = http://certs.godaddy.com/repository/, CN = Go Daddy Secure Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:b9:e0:cb:10:d4:af:76:bd:d4:93:62:eb:30:64: - b8:81:08:6c:c3:04:d9:62:17:8e:2f:ff:3e:65:cf: - 8f:ce:62:e6:3c:52:1c:da:16:45:4b:55:ab:78:6b: - 63:83:62:90:ce:0f:69:6c:99:c8:1a:14:8b:4c:cc: - 45:33:ea:88:dc:9e:a3:af:2b:fe:80:61:9d:79:57: - c4:cf:2e:f4:3f:30:3c:5d:47:fc:9a:16:bc:c3:37: - 96:41:51:8e:11:4b:54:f8:28:be:d0:8c:be:f0:30: - 38:1e:f3:b0:26:f8:66:47:63:6d:de:71:26:47:8f: - 38:47:53:d1:46:1d:b4:e3:dc:00:ea:45:ac:bd:bc: - 71:d9:aa:6f:00:db:db:cd:30:3a:79:4f:5f:4c:47: - f8:1d:ef:5b:c2:c4:9d:60:3b:b1:b2:43:91:d8:a4: - 33:4e:ea:b3:d6:27:4f:ad:25:8a:a5:c6:f4:d5:d0: - a6:ae:74:05:64:57:88:b5:44:55:d4:2d:2a:3a:3e: - f8:b8:bd:e9:32:0a:02:94:64:c4:16:3a:50:f1:4a: - ae:e7:79:33:af:0c:20:07:7f:e8:df:04:39:c2:69: - 02:6c:63:52:fa:77:c1:1b:c8:74:87:c8:b9:93:18: - 50:54:35:4b:69:4e:bc:3b:d3:49:2e:1f:dc:c1:d2: - 52:fb - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 40:C2:BD:27:8E:CC:34:83:30:A2:33:D7:FB:6C:B3:F0:B4:2C:80:CE - X509v3 Authority Key Identifier: - keyid:3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE - - Authority Information Access: - OCSP - URI:http://ocsp.godaddy.com/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.godaddy.com/gdroot-g2.crl - - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: https://certs.godaddy.com/repository/ - - Signature Algorithm: sha256WithRSAEncryption - 08:7e:6c:93:10:c8:38:b8:96:a9:90:4b:ff:a1:5f:4f:04:ef: - 6c:3e:9c:88:06:c9:50:8f:a6:73:f7:57:31:1b:be:bc:e4:2f: - db:f8:ba:d3:5b:e0:b4:e7:e6:79:62:0e:0c:a2:d7:6a:63:73: - 31:b5:f5:a8:48:a4:3b:08:2d:a2:5d:90:d7:b4:7c:25:4f:11: - 56:30:c4:b6:44:9d:7b:2c:9d:e5:5e:e6:ef:0c:61:aa:bf:e4: - 2a:1b:ee:84:9e:b8:83:7d:c1:43:ce:44:a7:13:70:0d:91:1f: - f4:c8:13:ad:83:60:d9:d8:72:a8:73:24:1e:b5:ac:22:0e:ca: - 17:89:62:58:44:1b:ab:89:25:01:00:0f:cd:c4:1b:62:db:51: - b4:d3:0f:51:2a:9b:f4:bc:73:fc:76:ce:36:a4:cd:d9:d8:2c: - ea:ae:9b:f5:2a:b2:90:d1:4d:75:18:8a:3f:8a:41:90:23:7d: - 5b:4b:fe:a4:03:58:9b:46:b2:c3:60:60:83:f8:7d:50:41:ce: - c2:a1:90:c3:bb:ef:02:2f:d2:15:54:ee:44:15:d9:0a:ae:a7: - 8a:33:ed:b1:2d:76:36:26:dc:04:eb:9f:f7:61:1f:15:dc:87: - 6f:ee:46:96:28:ad:a1:26:7d:0a:09:a7:2e:04:a3:8d:bc:f8: - bc:04:30:01 ------BEGIN CERTIFICATE----- -MIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3 -MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UE -CxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQD -EypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYuswZLiBCGzD -BNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz6ojcnqOv -K/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am+GZHY23e -cSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1gO7GyQ5HY -pDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQWOlDxSq7n -eTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB0lL7AgMB -AAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqFBxBnKLbv -9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v -b2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5n -b2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEG -CCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv -MA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyIBslQj6Zz -91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwlTxFWMMS2 -RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKocyQetawi -DsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1KrKQ0U11 -GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkKrqeKM+2x -LXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Validity - Not Before: Sep 1 00:00:00 2009 GMT - Not After : Dec 31 23:59:59 2037 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7: - 80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1: - e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98: - c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30: - 22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39: - 51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f: - a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19: - 14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00: - 66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60: - b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d: - 7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61: - 1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e: - 29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1: - 88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56: - 27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d: - 9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f: - 46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3: - e0:47 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE - Signature Algorithm: sha256WithRSAEncryption - 99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d: - a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee: - cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7: - ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11: - ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85: - 17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02: - 2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e: - ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1: - 9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd: - ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33: - ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33: - ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5: - 7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43: - 09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c: - f7:ea:1c:f5 ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 9a628ced..18904833 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -143,7 +143,7 @@ } :do { - :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 0fd8a066..1c274ece 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -55,7 +55,7 @@ :set TelegramRandomDelay 0; } - :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); :error false; } From a05efdc07fa912d0d17f4994ee9e892b51030be1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:55:13 +0200 Subject: [PATCH 194/988] certs: DigiCert Global G2 TLS RSA SHA256 2020 CA1 -> DigiCert Global Root G2 This is used by Cloudflare DNS (1.1.1.1). $CertificateAvailable "DigiCert Global Root G2"; /ip/dns/set use-doh-server=https://1.1.1.1/dns-query verify-doh-cert=yes; --- ...Cert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem | 182 ------------------ certs/DigiCert-Global-Root-G2.pem | 29 +++ doc/netwatch-dns.md | 2 +- 3 files changed, 30 insertions(+), 183 deletions(-) delete mode 100644 certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem create mode 100644 certs/DigiCert-Global-Root-G2.pem diff --git a/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem b/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem deleted file mode 100644 index 12084ee4..00000000 --- a/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem +++ /dev/null @@ -1,182 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 0c:f5:bd:06:2b:56:02:f4:7a:b8:50:2c:23:cc:f0:66 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Validity - Not Before: Mar 30 00:00:00 2021 GMT - Not After : Mar 29 23:59:59 2031 GMT - Subject: C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cc:f7:10:62:4f:a6:bb:63:6f:ed:90:52:56:c5: - 6d:27:7b:7a:12:56:8a:f1:f4:f9:d6:e7:e1:8f:bd: - 95:ab:f2:60:41:15:70:db:12:00:fa:27:0a:b5:57: - 38:5b:7d:b2:51:93:71:95:0e:6a:41:94:5b:35:1b: - fa:7b:fa:bb:c5:be:24:30:fe:56:ef:c4:f3:7d:97: - e3:14:f5:14:4d:cb:a7:10:f2:16:ea:ab:22:f0:31: - 22:11:61:69:90:26:ba:78:d9:97:1f:e3:7d:66:ab: - 75:44:95:73:c8:ac:ff:ef:5d:0a:8a:59:43:e1:ac: - b2:3a:0f:f3:48:fc:d7:6b:37:c1:63:dc:de:46:d6: - db:45:fe:7d:23:fd:90:e8:51:07:1e:51:a3:5f:ed: - 49:46:54:7f:2c:88:c5:f4:13:9c:97:15:3c:03:e8: - a1:39:dc:69:0c:32:c1:af:16:57:4c:94:47:42:7c: - a2:c8:9c:7d:e6:d4:4d:54:af:42:99:a8:c1:04:c2: - 77:9c:d6:48:e4:ce:11:e0:2a:80:99:f0:43:70:cf: - 3f:76:6b:d1:4c:49:ab:24:5e:c2:0d:82:fd:46:a8: - ab:6c:93:cc:62:52:42:75:92:f8:9a:fa:5e:5e:b2: - b0:61:e5:1f:1f:b9:7f:09:98:e8:3d:fa:83:7f:47: - 69:a1 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 74:85:80:C0:66:C7:DF:37:DE:CF:BD:29:37:AA:03:1D:BE:ED:CD:17 - X509v3 Authority Key Identifier: - 4E:22:54:20:18:95:E6:E3:6E:E6:0F:FA:FA:B9:12:ED:06:17:8F:39 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - CA Issuers - URI:http://cacerts.digicert.com/DigiCertGlobalRootG2.crt - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl3.digicert.com/DigiCertGlobalRootG2.crl - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.2.1 - Policy: 2.23.140.1.1 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 90:f1:70:cb:28:97:69:97:7c:74:fd:c0:fa:26:7b:53:ab:ad: - cd:65:fd:ba:9c:06:9c:8a:d7:5a:43:87:ed:4d:4c:56:5f:ad: - c1:c5:b5:05:20:2e:59:d1:ff:4a:f5:a0:2a:d8:b0:95:ad:c9: - 2e:4a:3b:d7:a7:f6:6f:88:29:fc:30:3f:24:84:bb:c3:b7:7b: - 93:07:2c:af:87:6b:76:33:ed:00:55:52:b2:59:9e:e4:b9:d0: - f3:df:e7:0f:fe:dd:f8:c4:b9:10:72:81:09:04:5f:cf:97:9e: - 2e:32:75:8e:cf:9a:58:d2:57:31:7e:37:01:81:b2:66:6d:29: - 1a:b1:66:09:6d:d1:6e:90:f4:b9:fa:2f:01:14:c5:5c:56:64: - 01:d9:7d:87:a8:38:53:9f:8b:5d:46:6d:5c:c6:27:84:81:d4: - 7e:8c:8c:a3:9b:52:e7:c6:88:ec:37:7c:2a:fb:f0:55:5a:38: - 72:10:d8:00:13:cf:4c:73:db:aa:37:35:a8:29:81:69:9c:76: - bc:de:18:7b:90:d4:ca:cf:ef:67:03:fd:04:5a:21:16:b1:ff: - ea:3f:df:dc:82:f5:eb:f4:59:92:23:0d:24:2a:95:25:4c:ca: - a1:91:e6:d4:b7:ac:87:74:b3:f1:6d:a3:99:db:f9:d5:bd:84: - 40:9f:07:98 ------BEGIN CERTIFICATE----- -MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh -bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV -cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy -FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc -3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8 -osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT -zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud -EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G -A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG -CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG -NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH -Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t -L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC -ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG -9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t -wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS -slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R -bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4 -chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN -JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Validity - Not Before: Aug 1 12:00:00 2013 GMT - Not After : Jan 15 12:00:00 2038 GMT - Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:bb:37:cd:34:dc:7b:6b:c9:b2:68:90:ad:4a:75: - ff:46:ba:21:0a:08:8d:f5:19:54:c9:fb:88:db:f3: - ae:f2:3a:89:91:3c:7a:e6:ab:06:1a:6b:cf:ac:2d: - e8:5e:09:24:44:ba:62:9a:7e:d6:a3:a8:7e:e0:54: - 75:20:05:ac:50:b7:9c:63:1a:6c:30:dc:da:1f:19: - b1:d7:1e:de:fd:d7:e0:cb:94:83:37:ae:ec:1f:43: - 4e:dd:7b:2c:d2:bd:2e:a5:2f:e4:a9:b8:ad:3a:d4: - 99:a4:b6:25:e9:9b:6b:00:60:92:60:ff:4f:21:49: - 18:f7:67:90:ab:61:06:9c:8f:f2:ba:e9:b4:e9:92: - 32:6b:b5:f3:57:e8:5d:1b:cd:8c:1d:ab:95:04:95: - 49:f3:35:2d:96:e3:49:6d:dd:77:e3:fb:49:4b:b4: - ac:55:07:a9:8f:95:b3:b4:23:bb:4c:6d:45:f0:f6: - a9:b2:95:30:b4:fd:4c:55:8c:27:4a:57:14:7c:82: - 9d:cd:73:92:d3:16:4a:06:0c:8c:50:d1:8f:1e:09: - be:17:a1:e6:21:ca:fd:83:e5:10:bc:83:a5:0a:c4: - 67:28:f6:73:14:14:3d:46:76:c3:87:14:89:21:34: - 4d:af:0f:45:0c:a6:49:a1:ba:bb:9c:c5:b1:33:83: - 29:85 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 4E:22:54:20:18:95:E6:E3:6E:E6:0F:FA:FA:B9:12:ED:06:17:8F:39 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 60:67:28:94:6f:0e:48:63:eb:31:dd:ea:67:18:d5:89:7d:3c: - c5:8b:4a:7f:e9:be:db:2b:17:df:b0:5f:73:77:2a:32:13:39: - 81:67:42:84:23:f2:45:67:35:ec:88:bf:f8:8f:b0:61:0c:34: - a4:ae:20:4c:84:c6:db:f8:35:e1:76:d9:df:a6:42:bb:c7:44: - 08:86:7f:36:74:24:5a:da:6c:0d:14:59:35:bd:f2:49:dd:b6: - 1f:c9:b3:0d:47:2a:3d:99:2f:bb:5c:bb:b5:d4:20:e1:99:5f: - 53:46:15:db:68:9b:f0:f3:30:d5:3e:31:e2:8d:84:9e:e3:8a: - da:da:96:3e:35:13:a5:5f:f0:f9:70:50:70:47:41:11:57:19: - 4e:c0:8f:ae:06:c4:95:13:17:2f:1b:25:9f:75:f2:b1:8e:99: - a1:6f:13:b1:41:71:fe:88:2a:c8:4f:10:20:55:d7:f3:14:45: - e5:e0:44:f4:ea:87:95:32:93:0e:fe:53:46:fa:2c:9d:ff:8b: - 22:b9:4b:d9:09:45:a4:de:a4:b8:9a:58:dd:1b:7d:52:9f:8e: - 59:43:88:81:a4:9e:26:d5:6f:ad:dd:0d:c6:37:7d:ed:03:92: - 1b:e5:77:5f:76:ee:3c:8d:c4:5d:56:5b:a2:d9:66:6e:b3:35: - 37:e5:32:b6 ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- diff --git a/certs/DigiCert-Global-Root-G2.pem b/certs/DigiCert-Global-Root-G2.pem new file mode 100644 index 00000000..8af6c7aa --- /dev/null +++ b/certs/DigiCert-Global-Root-G2.pem @@ -0,0 +1,29 @@ +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 3214368d..3d2c6be1 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -62,7 +62,7 @@ manually! Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). - /tool/netwatch/add comment="doh, doh-cert=DigiCert Global G2 TLS RSA SHA256 2020 CA1" host=1.1.1.1; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; From c4e8d01de19f9c5e1d19c74c010079233c4d4df5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:57:16 +0200 Subject: [PATCH 195/988] certs: DigiCert TLS Hybrid ECC SHA384 2020 CA1 -> DigiCert Global Root CA This is used by Cloudflare DNS Quard9 (9.9.9.9). $CertificateAvailable "DigiCert Global Root CA"; /ip/dns/set use-doh-server=https://9.9.9.9/dns-query verify-doh-cert=yes; --- certs/DigiCert-Global-Root-CA.pem | 29 +++ ...igiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem | 174 ------------------ doc/netwatch-dns.md | 2 +- 3 files changed, 30 insertions(+), 175 deletions(-) create mode 100644 certs/DigiCert-Global-Root-CA.pem delete mode 100644 certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem diff --git a/certs/DigiCert-Global-Root-CA.pem b/certs/DigiCert-Global-Root-CA.pem new file mode 100644 index 00000000..b0f00130 --- /dev/null +++ b/certs/DigiCert-Global-Root-CA.pem @@ -0,0 +1,29 @@ +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- diff --git a/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem b/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem deleted file mode 100644 index 446f56f4..00000000 --- a/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem +++ /dev/null @@ -1,174 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 07:f2:f3:5c:87:a8:77:af:7a:ef:e9:47:99:35:25:bd - Signature Algorithm: sha384WithRSAEncryption - Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Validity - Not Before: Apr 14 00:00:00 2021 GMT - Not After : Apr 13 23:59:59 2031 GMT - Subject: C = US, O = DigiCert Inc, CN = DigiCert TLS Hybrid ECC SHA384 2020 CA1 - Subject Public Key Info: - Public Key Algorithm: id-ecPublicKey - Public-Key: (384 bit) - pub: - 04:c1:1b:c6:9a:5b:98:d9:a4:29:a0:e9:d4:04:b5: - db:eb:a6:b2:6c:55:c0:ff:ed:98:c6:49:2f:06:27: - 51:cb:bf:70:c1:05:7a:c3:b1:9d:87:89:ba:ad:b4: - 13:17:c9:a8:b4:83:c8:b8:90:d1:cc:74:35:36:3c: - 83:72:b0:b5:d0:f7:22:69:c8:f1:80:c4:7b:40:8f: - cf:68:87:26:5c:39:89:f1:4d:91:4d:da:89:8b:e4: - 03:c3:43:e5:bf:2f:73 - ASN1 OID: secp384r1 - NIST CURVE: P-384 - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 0A:BC:08:29:17:8C:A5:39:6D:7A:0E:CE:33:C7:2E:B3:ED:FB:C3:7A - X509v3 Authority Key Identifier: - keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - CA Issuers - URI:http://cacerts.digicert.com/DigiCertGlobalRootCA.crt - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl3.digicert.com/DigiCertGlobalRootCA.crl - - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.2.1 - Policy: 2.23.140.1.1 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - - Signature Algorithm: sha384WithRSAEncryption - 47:59:81:7f:d4:1b:1f:b0:71:f6:98:5d:18:ba:98:47:98:b0: - 7e:76:2b:ea:ff:1a:8b:ac:26:b3:42:8d:31:e6:4a:e8:19:d0: - ef:da:14:e7:d7:14:92:a1:92:f2:a7:2e:2d:af:fb:1d:f6:fb: - 53:b0:8a:3f:fc:d8:16:0a:e9:b0:2e:b6:a5:0b:18:90:35:26: - a2:da:f6:a8:b7:32:fc:95:23:4b:c6:45:b9:c4:cf:e4:7c:ee: - e6:c9:f8:90:bd:72:e3:99:c3:1d:0b:05:7c:6a:97:6d:b2:ab: - 02:36:d8:c2:bc:2c:01:92:3f:04:a3:8b:75:11:c7:b9:29:bc: - 11:d0:86:ba:92:bc:26:f9:65:c8:37:cd:26:f6:86:13:0c:04: - aa:89:e5:78:b1:c1:4e:79:bc:76:a3:0b:51:e4:c5:d0:9e:6a: - fe:1a:2c:56:ae:06:36:27:a3:73:1c:08:7d:93:32:d0:c2:44: - 19:da:8d:f4:0e:7b:1d:28:03:2b:09:8a:76:ca:77:dc:87:7a: - ac:7b:52:26:55:a7:72:0f:9d:d2:88:4f:fe:b1:21:c5:1a:a1: - aa:39:f5:56:db:c2:84:c4:35:1f:70:da:bb:46:f0:86:bf:64: - 00:c4:3e:f7:9f:46:1b:9d:23:05:b9:7d:b3:4f:0f:a9:45:3a: - e3:74:30:98 ------BEGIN CERTIFICATE----- -MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI -eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ -qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v -c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5 -bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G -A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI -KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp -Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny -bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE -NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG -BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr -6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY -kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/ -BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos -Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh -xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a - Signature Algorithm: sha1WithRSAEncryption - Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Validity - Not Before: Nov 10 00:00:00 2006 GMT - Not After : Nov 10 00:00:00 2031 GMT - Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:e2:3b:e1:11:72:de:a8:a4:d3:a3:57:aa:50:a2: - 8f:0b:77:90:c9:a2:a5:ee:12:ce:96:5b:01:09:20: - cc:01:93:a7:4e:30:b7:53:f7:43:c4:69:00:57:9d: - e2:8d:22:dd:87:06:40:00:81:09:ce:ce:1b:83:bf: - df:cd:3b:71:46:e2:d6:66:c7:05:b3:76:27:16:8f: - 7b:9e:1e:95:7d:ee:b7:48:a3:08:da:d6:af:7a:0c: - 39:06:65:7f:4a:5d:1f:bc:17:f8:ab:be:ee:28:d7: - 74:7f:7a:78:99:59:85:68:6e:5c:23:32:4b:bf:4e: - c0:e8:5a:6d:e3:70:bf:77:10:bf:fc:01:f6:85:d9: - a8:44:10:58:32:a9:75:18:d5:d1:a2:be:47:e2:27: - 6a:f4:9a:33:f8:49:08:60:8b:d4:5f:b4:3a:84:bf: - a1:aa:4a:4c:7d:3e:cf:4f:5f:6c:76:5e:a0:4b:37: - 91:9e:dc:22:e6:6d:ce:14:1a:8e:6a:cb:fe:cd:b3: - 14:64:17:c7:5b:29:9e:32:bf:f2:ee:fa:d3:0b:42: - d4:ab:b7:41:32:da:0c:d4:ef:f8:81:d5:bb:8d:58: - 3f:b5:1b:e8:49:28:a2:70:da:31:04:dd:f7:b2:16: - f2:4c:0a:4e:07:a8:ed:4a:3d:5e:b5:7f:a3:90:c3: - af:27 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - X509v3 Authority Key Identifier: - keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - - Signature Algorithm: sha1WithRSAEncryption - cb:9c:37:aa:48:13:12:0a:fa:dd:44:9c:4f:52:b0:f4:df:ae: - 04:f5:79:79:08:a3:24:18:fc:4b:2b:84:c0:2d:b9:d5:c7:fe: - f4:c1:1f:58:cb:b8:6d:9c:7a:74:e7:98:29:ab:11:b5:e3:70: - a0:a1:cd:4c:88:99:93:8c:91:70:e2:ab:0f:1c:be:93:a9:ff: - 63:d5:e4:07:60:d3:a3:bf:9d:5b:09:f1:d5:8e:e3:53:f4:8e: - 63:fa:3f:a7:db:b4:66:df:62:66:d6:d1:6e:41:8d:f2:2d:b5: - ea:77:4a:9f:9d:58:e2:2b:59:c0:40:23:ed:2d:28:82:45:3e: - 79:54:92:26:98:e0:80:48:a8:37:ef:f0:d6:79:60:16:de:ac: - e8:0e:cd:6e:ac:44:17:38:2f:49:da:e1:45:3e:2a:b9:36:53: - cf:3a:50:06:f7:2e:e8:c4:57:49:6c:61:21:18:d5:04:ad:78: - 3c:2c:3a:80:6b:a7:eb:af:15:14:e9:d8:89:c1:b9:38:6c:e2: - 91:6c:8a:ff:64:b9:77:25:57:30:c0:1b:24:a3:e1:dc:e9:df: - 47:7c:b5:b4:24:08:05:30:ec:2d:bd:0b:bf:45:bf:50:b9:a9: - f3:eb:98:01:12:ad:c8:88:c6:98:34:5f:8d:0a:3c:c6:e9:d5: - 95:95:6d:de ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 3d2c6be1..9fe486e6 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -63,7 +63,7 @@ Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; - /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root CA" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be From 1a6812ef797a1683cec9678062cfaca367500ad0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 20:51:46 +0200 Subject: [PATCH 196/988] notify on changes regarding certificates --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ca8ecb11..eb9f6382 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 129; +:global ExpectedConfigVersion 130; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index b20bbaf4..cf17e7a3 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -54,6 +54,7 @@ 127="Added support for authentication to Ntfy notification module."; 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; + 130="Dropped intermediate certificates, depending on just root certificates now."; }; # Migration steps to be applied on script updates From cdb553d39b21e82e70f427b0a7c4e95dc4f2055f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 12:25:26 +0200 Subject: [PATCH 197/988] global-functions: $CertificateDownload: try fallback to mkcert.org There's a nice API that allows to download certificate by exact common name. Let's use that, as a fallback at least. https://mkcert.org/ --- global-functions.rsc | 41 ++++++++++++++++++++++++++++++----------- news-and-changes.rsc | 1 + 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index eb9f6382..26472b87 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 130; +:global ExpectedConfigVersion 131; # global variables not to be changed by user :global GlobalFunctionsReady false; @@ -135,6 +135,7 @@ :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; + :global CertificateAvailable; :global CertificateNameByCN; :global CleanName; :global FetchUserAgentStr; @@ -143,22 +144,40 @@ $LogPrint info $0 ("Downloading and importing certificate with " . \ "CommonName '" . $CommonName . "'."); + :local FileName ([ $CleanName $CommonName ] . ".pem"); :do { - :local FileName ([ $CleanName $CommonName ] . ".pem"); /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ ($ScriptUpdatesBaseUrl . "certs/" . $FileName . $ScriptUpdatesUrlSuffix) \ dst-path=$FileName as-value; $WaitForFile $FileName; - /certificate/import file-name=$FileName passphrase="" as-value; - :delay 1s; - /file/remove [ find where name=$FileName ]; - - :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ - $CertificateNameByCN [ /certificate/get $Cert common-name ]; - } } on-error={ - $LogPrint warning $0 ("Failed importing certificate with CommonName '" . $CommonName . "'!"); - :return false; + $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . \ + "' from repository! Trying fallback to mkcert.org..."); + :do { + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + $LogPrint error $0 ("Downloading required certificate failed."); + :return false; + } + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ + "https://mkcert.org/generate/" http-data=[ :serialize to=json ({ $CommonName }) ] \ + dst-path=$FileName as-value; + $WaitForFile $FileName; + :if ([ /file/get $FileName size ] = 0) do={ + /file/remove $FileName; + :error false; + } + } on-error={ + $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . "'!"); + :return false; + } + } + + /certificate/import file-name=$FileName passphrase="" as-value; + :delay 1s; + /file/remove [ find where name=$FileName ]; + + :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ + $CertificateNameByCN [ /certificate/get $Cert common-name ]; } :return true; } diff --git a/news-and-changes.rsc b/news-and-changes.rsc index cf17e7a3..8ddc3d60 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -55,6 +55,7 @@ 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; 130="Dropped intermediate certificates, depending on just root certificates now."; + 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; }; # Migration steps to be applied on script updates From f3f7d3edc0f6bd895e27019ed5d48e4afafe95fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Jun 2024 07:55:58 +0200 Subject: [PATCH 198/988] check-certificates: limit scope for $CertNew... ... into block where certificate is replaced. This should unbreak renewing with a certificate updated in place. --- check-certificates.rsc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index e9235f12..c9622b74 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -139,7 +139,6 @@ :foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ :local CertVal [ /certificate/get $Cert ]; - :local CertNew; :local LastName; :do { @@ -166,7 +165,7 @@ } else={ $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced."); - :set CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ + :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ (common-name=($CertVal->"common-name") or subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $LastName ] . "(\\W|\$)")) \ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; @@ -190,13 +189,13 @@ /certificate/remove $Cert; /certificate/set $CertNew name=($CertVal->"name"); - :set CertNewVal; + :set Cert $CertNew; :set CertVal [ /certificate/get $CertNew ]; } $SendNotification2 ({ origin=$ScriptName; silent=true; \ subject=([ $SymbolForNotification "lock-with-ink-pen" ] . "Certificate renewed: " . ($CertVal->"name")); \ - message=("A certificate on " . $Identity . " has been renewed.\n\n" . [ $FormatInfo $CertNew ]) }); + message=("A certificate on " . $Identity . " has been renewed.\n\n" . [ $FormatInfo $Cert ]) }); $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' has been renewed."); } on-error={ $LogPrint debug $ScriptName ("Could not renew certificate '" . ($CertVal->"name") . "'."); From ce1b635eb2d96706ef0a8b603737062338f92238 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 2 Jul 2024 21:29:14 +0200 Subject: [PATCH 199/988] global-functions: $GetMacVendor: cert 'GTS Root R4' --- certs/GTS-Root-R4.pem | 20 ++++++++++++++++++++ global-functions.rsc | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 certs/GTS-Root-R4.pem diff --git a/certs/GTS-Root-R4.pem b/certs/GTS-Root-R4.pem new file mode 100644 index 00000000..16a1c368 --- /dev/null +++ b/certs/GTS-Root-R4.pem @@ -0,0 +1,20 @@ +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- diff --git a/global-functions.rsc b/global-functions.rsc index 26472b87..121c5ec6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -528,7 +528,7 @@ } :do { - :if ([ $CertificateAvailable "GTS Root R1" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R4" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From eab9b28cd28b1d12d3f0d178db22acdac5ad1758 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Jul 2024 11:56:56 +0200 Subject: [PATCH 200/988] global-functions: $MkDir: enable tmpfs if disabled --- global-functions.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 121c5ec6..44b3abeb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -829,7 +829,12 @@ :global LogPrint; :global WaitForFile; - :if ([ :len [ /disk/find where slot=tmpfs type=tmpfs ] ] = 1) do={ + :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ]; + :if ([ :len $TmpFs ] = 1) do={ + :if ([ /disk/get $TmpFs disabled ] = true) do={ + $LogPrint info $0 ("The tmpfs is disabled, enabling."); + /disk/enable $TmpFs; + } :return true; } From 64bc9f73f7ed24cfb7dec9f24fb101594ae4cb79 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Jul 2024 16:35:39 +0200 Subject: [PATCH 201/988] packages-update: run backups before package download This reduces memory pressure, especially on device with very limited RAM like mAP with its 64 MB. --- packages-update.rsc | 52 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 0208b1e6..97039ecb 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -60,32 +60,6 @@ :error true; } - :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; - :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; - - :local DoDowngrade false; - :if ($NumInstalled > $NumLatest) do={ - :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :put "Latest version is older than installed one. Want to downgrade? [y/N]"; - :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :set DoDowngrade true; - } else={ - :put "Canceled..."; - } - } else={ - $LogPrint warning $ScriptName ("Not installing downgrade automatically."); - :error false; - } - } - - :foreach Package in=[ /system/package/find where !bundle ] do={ - :local PkgName [ /system/package/get $Package name ]; - :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ - $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); - :error false; - } - } - :local RunOrder ({}); :foreach Script in=[ /system/script/find where source~("\n# provides: backup-script\\b") ] do={ :local ScriptVal [ /system/script/get $Script ]; @@ -120,6 +94,32 @@ } } + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; + :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + + :local DoDowngrade false; + :if ($NumInstalled > $NumLatest) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :put "Latest version is older than installed one. Want to downgrade? [y/N]"; + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + :set DoDowngrade true; + } else={ + :put "Canceled..."; + } + } else={ + $LogPrint warning $ScriptName ("Not installing downgrade automatically."); + :error false; + } + } + + :foreach Package in=[ /system/package/find where !bundle ] do={ + :local PkgName [ /system/package/get $Package name ]; + :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ + $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); + :error false; + } + } + :if ($DoDowngrade = true) do={ $LogPrint info $ScriptName ("Rebooting for downgrade."); :delay 1s; From 1bc6f9c45c7487c6b1fa1c26a9ceeaeadd86c90c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:19:11 +0200 Subject: [PATCH 202/988] backup-partition: rename variable --- backup-partition.rsc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 3c883f7e..572c7400 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -58,13 +58,13 @@ :error false; } - :local FallbackTo [ /partitions/get $ActiveRunning fallback-to ]; + :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; - :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackToName version]) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); + :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackToName . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -75,7 +75,7 @@ :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ - :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -87,12 +87,12 @@ /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; + /partitions/save-config-to $FallbackToName; /system/scheduler/remove "running-from-backup-partition"; - $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackTo . "'."); + $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'."); } on-error={ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; - $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackTo . "'!"); + $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!"); :set PackagesUpdateBackupFailure true; :error false; } From 235737c2327cf377a1208dc96af53d9c8642b305 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:21:52 +0200 Subject: [PATCH 203/988] backup-partition: check the fallback partition actually exists... ... and use its id for actions. --- backup-partition.rsc | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 572c7400..211db0f9 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -24,17 +24,18 @@ :global VersionToNum; :local CopyTo do={ - :local ScriptName [ :tostr $1 ]; - :local FallbackTo [ :tostr $2 ]; + :local ScriptName [ :tostr $1 ]; + :local FallbackTo [ :toid $2 ]; + :local FallbackToName [ :tostr $3 ]; :global LogPrint; :do { /partitions/copy-to $FallbackTo; - $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackToName . "'."); :return true; } on-error={ - $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackToName . "'!"); :return false; } } @@ -59,12 +60,19 @@ } :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; + :local FallbackTo [ /partition/find where name=$FallbackToName ]; - :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackToName version]) do={ + :if ([ :len $FallbackTo ] < 1) do={ + $LogPrint error $ScriptName ("There is no partition with name '" . $FallbackToName . "'."); + :set PackagesUpdateBackupFailure true; + :error false; + } + + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackToName . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -75,7 +83,7 @@ :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ - :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -87,7 +95,7 @@ /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 $FallbackToName; + /partitions/save-config-to $FallbackTo; /system/scheduler/remove "running-from-backup-partition"; $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'."); } on-error={ From 25135b64e549e129914b9b5dfb74ca2011ee3d5d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:32:49 +0200 Subject: [PATCH 204/988] backup-partition: check that target is inactive --- backup-partition.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 211db0f9..34cdc8f8 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -60,10 +60,10 @@ } :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; - :local FallbackTo [ /partition/find where name=$FallbackToName ]; + :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; :if ([ :len $FallbackTo ] < 1) do={ - $LogPrint error $ScriptName ("There is no partition with name '" . $FallbackToName . "'."); + $LogPrint error $ScriptName ("There is no inactive partition named '" . $FallbackToName . "'."); :set PackagesUpdateBackupFailure true; :error false; } From 35d3c058b83388b8e187bb53ff8c1e0d85c299b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Jul 2024 11:02:53 +0200 Subject: [PATCH 205/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 13d05088..e9bf7d18 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -47,6 +47,7 @@ Add yourself to the list, * Marek Čábák * Oleksandr Yukhymchuk * Peter Holtkamp +* Peter Ponzel * Reiner Vehrenkamp * Richard Österreicher * Simon Hitzemann From 78dfc568c10332ea63cc26e39ccf165f3d384c9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 08:45:53 +0200 Subject: [PATCH 206/988] capsman-{download-packages,rolling-upgrade}: run matching script It is possible to run old and new CAPsMAN on one system simultaneously (... since RouterOS 7.13?). Thus it may make sense to have both variants of these scripts installed, and we have to make sure to run the correct one. --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index f5695f4b..84d36f7b 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,7 +73,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 762dbb65..deb15a7e 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,7 +83,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 79aa9a7a..6147d21d 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,7 +75,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 2c9ae3de..e9ca5ccd 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade.capsman # requires RouterOS, version=7.13 # # upgrade CAPs one after another diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 2098bc0f..a28d7f77 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade%TEMPL% # requires RouterOS, version=7.13 # # upgrade CAPs one after another diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 36b8c0f2..22f88181 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade.wifi # requires RouterOS, version=7.13 # # upgrade CAPs one after another From 3fd1896ad622f8097cc14af8f37114f9fc47f5b7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 08:55:26 +0200 Subject: [PATCH 207/988] capsman-download-packages: support running several scripts... ... as it is possible to have more than just one providing the functionality. --- capsman-download-packages.capsman.rsc | 8 +++++--- capsman-download-packages.template.rsc | 8 +++++--- capsman-download-packages.wifi.rsc | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 84d36f7b..4f9ab9d5 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,9 +73,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index deb15a7e..c0e815bb 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,9 +83,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 6147d21d..64ac7cdc 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,9 +75,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } From f09fa83105ea40876e7103a118b3d6d57098cf0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 13:49:02 +0200 Subject: [PATCH 208/988] doc/mod/ssh-keys-import: drop hint on older RouterOS --- doc/mod/ssh-keys-import.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index db8e3229..88524aba 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -34,12 +34,8 @@ Usage and invocation Call the function `$SSHKeysImport` with key and user as parameter to import that key: - $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; - -Starting with RouterOS *7.12beta1* support for keys of type `ed25519` has -been added: - $SSHKeysImport "ssh-ed25519 AAAAC3Nza...ZVugJT user" admin; + $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; The third part of the key (`user` in this example) is inherited as `key-owner` in RouterOS. Also the `MD5` fingerprint is recorded, this helps From 0101b56bff0cfad4043c4e86aa7e68325530eca3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:10:42 +0200 Subject: [PATCH 209/988] README: use :tocrlf to convert global-config-overlay --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b3cd058..4fd0e3e7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) @@ -155,7 +155,7 @@ This last step is required when ever you make changes to your configuration. > ℹ️ **Info**: It is recommended to edit the configuration using the command > line interface. If using Winbox on Windows OS, the line endings may be > missing. To fix this run: -> `/system/script/set source=[ $Unix2Dos [ get global-config-overlay source ] ] global-config-overlay;` +> `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;` Updating scripts ---------------- From 2d42fed621f5bb79a187774afe46c04e06b9c71b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:23:02 +0200 Subject: [PATCH 210/988] global-functions: $ScriptInstallUpdate: forcibly convert to LF... ... to make sure we do not have unintended CRLF line breaks. --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 44b3abeb..2c7c87ca 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # global functions # https://git.eworm.de/cgit/routeros-scripts/about/ @@ -1060,7 +1060,7 @@ :local Result [ /tool/fetch check-certificate=yes-without-crl \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ - :set SourceNew ($Result->"data"); + :set SourceNew [ :tolf ($Result->"data") ]; } } on-error={ :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ From 68f61ae6221afeb279ea3823e42cb8da4656a2a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:27:08 +0200 Subject: [PATCH 211/988] global-functions: $ScriptInstallUpdate: allow CRLF on device --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2c7c87ca..327443ab 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1074,7 +1074,8 @@ } :if ([ :len $SourceNew ] > 0) do={ - :if ($SourceNew != $ScriptVal->"source") do={ + :local SourceCRLF [ :tocrlf $SourceNew ]; + :if ($SourceNew != $ScriptVal->"source" && $SourceCRLF != $ScriptVal->"source") do={ :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ From 7cf0c5b2056bb7522f6174bd76d4b0ea19d4c647 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:38:18 +0200 Subject: [PATCH 212/988] capsman-download-packages: support scripts with CRLF line breaks --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 4f9ab9d5..1247d9ae 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,7 +73,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index c0e815bb..8418841c 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,7 +83,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 64ac7cdc..c5a69992 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,7 +75,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; From ee928605df642ab9f917dd1e65f85f7cb09e8192 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:41:17 +0200 Subject: [PATCH 213/988] news-and-changes: support scripts with CRLF line breaks --- news-and-changes.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 8ddc3d60..9ab811d6 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -61,7 +61,7 @@ # Migration steps to be applied on script updates :global GlobalConfigMigration { 97=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; - 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; + 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; }; From a26f78329a1e941fcab969611ffbb83af4f2ea01 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:42:24 +0200 Subject: [PATCH 214/988] ppp-on-up: support scripts with CRLF line breaks --- ppp-on-up.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 4ed92c5f..6484ecb0 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -28,7 +28,7 @@ /ipv6/dhcp-client/release [ find where interface=$IntName !disabled ]; - :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\n") ] do={ + :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\r?\n") ] do={ :local ScriptName [ /system/script/get $Script name ]; :do { $LogPrint debug $ScriptName ("Running script: " . $ScriptName); From f2ca62aed0ff062b6e2dec13f8bb20e828bfdeb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:33:47 +0200 Subject: [PATCH 215/988] global-functions: $ScriptInstallUpdate: support storing with CRLF Adding this in `global-config-overlay` make the scripts being stored with CRLF line breaks: :global ScriptUpdatesCRLF true; Handle with care, I do not recommend it. Thus it's just a hidden setting. --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 327443ab..b824d62f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1008,6 +1008,7 @@ :global IDonate; :global NoNewsAndChangesNotification; :global ScriptUpdatesBaseUrl; + :global ScriptUpdatesCRLF; :global ScriptUpdatesUrlSuffix; :global CertificateAvailable; @@ -1081,7 +1082,8 @@ :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ :if ([ $ValidateSyntax $SourceNew ] = true) do={ $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); - /system/script/set owner=($ScriptVal->"name") source=$SourceNew $Script; + /system/script/set owner=($ScriptVal->"name") \ + source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; :if ($ScriptVal->"name" = "global-config") do={ :set ReloadGlobalConfig true; } From 8074305b9250d98e182f5cb968de2c8bd438f7f3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:09:32 +0200 Subject: [PATCH 216/988] global-functions: $Dos2Unix: use :tolf --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index b824d62f..312936b9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -313,11 +313,7 @@ # convert line endings, DOS -> UNIX :set Dos2Unix do={ - :local Input [ :tostr $1 ]; - - :global CharacterReplace; - - :return [ $CharacterReplace $Input ("\r\n") ("\n") ]; + :return [ :tolf [ :tostr $1 ] ]; } # download package from upgrade server From 8f75d542f3aa7cb3c5726412daa0ab41c6880489 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:06:57 +0200 Subject: [PATCH 217/988] global-functions: $PrettyPrint: use :tocrlf --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 312936b9..950ccd63 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -909,11 +909,7 @@ # print lines with trailing carriage return :set PrettyPrint do={ - :local Input [ :tostr $1 ]; - - :global Unix2Dos; - - :put [ $Unix2Dos $Input ]; + :put [ :tocrlf [ :tostr $1 ] ]; } # strip protocol from from url string From 2fd0d27447b8ce6620ec3f6d68c9d5ca62bb9f02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:08:42 +0200 Subject: [PATCH 218/988] global-functions: $Unix2Dos: use :tocrlf --- global-functions.rsc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 950ccd63..54dcb68f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1433,12 +1433,7 @@ # convert line endings, UNIX -> DOS :set Unix2Dos do={ - :local Input [ :tostr $1 ]; - - :global CharacterReplace; - - :return [ $CharacterReplace [ $CharacterReplace $Input \ - ("\n") ("\r\n") ] ("\r\r\n") ("\r\n") ]; + :return [ :tocrlf [ :tostr $1 ] ]; } # url encoding From 2b758b83fd47ca765dd8c5ed15ff3d001d60a6fc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:12:50 +0200 Subject: [PATCH 219/988] mod/inspectvar: use :tocrlf --- doc/mod/inspectvar.md | 2 +- mod/inspectvar.rsc | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index d4e59b3d..4e2f4c1d 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 5adca0a0..73205b25 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # inspect variables # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md @@ -14,9 +14,8 @@ # inspect variable and print on terminal :set InspectVar do={ :global InspectVarReturn; - :global PrettyPrint; - $PrettyPrint [ $InspectVarReturn $1 ]; + :put [ :tocrlf [ $InspectVarReturn $1 ] ]; } # inspect variable and return formatted string From 075a9bd6c43e08efee73eb6e1ec5b0ea0391fef2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:13:50 +0200 Subject: [PATCH 220/988] mod/ipcalc: use :tocrlf --- doc/mod/ipcalc.md | 2 +- mod/ipcalc.rsc | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index cb655bcd..9f394293 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 128ca54c..003bdc36 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # ip address calculation # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md @@ -17,17 +17,16 @@ :global FormatLine; :global IPCalcReturn; - :global PrettyPrint; :local Values [ $IPCalcReturn $1 ]; - $PrettyPrint ( \ + :put [ :tocrlf ( \ [ $FormatLine "Address" ($Values->"address") ] . "\n" . \ [ $FormatLine "Netmask" ($Values->"netmask") ] . "\n" . \ [ $FormatLine "Network" ($Values->"network") ] . "\n" . \ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ - [ $FormatLine "Broadcast" ($Values->"broadcast") ]); + [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; } # calculate and return netmask, network, min host, max host and broadcast From 6fbafe76ba27e35d1f3067430ba78cedfa85eb19 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 13:45:16 +0200 Subject: [PATCH 221/988] bump RouterOS requirement for all scripts and modules... ... now that global-functions requires RouterOS 7.14 anyway. --- BRANCHES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/daily-psk.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/dhcp-to-dns.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/fw-addr-lists.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-matrix.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/notification-telegram.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mod/ssh-keys-import.md | 2 +- doc/mode-button.md | 2 +- doc/netwatch-dns.md | 2 +- doc/netwatch-notify.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/packages-update.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/telegram-chat.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- telegram-chat.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 116 files changed, 116 insertions(+), 116 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index f1062bb3..2bacf8e8 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index e9bf7d18..0b192fc2 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index b3eff35d..2be51c54 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 781ae78d..d6e2928c 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index b79a724b..e90842db 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index b8067c87..d2753404 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index c05e02cc..f4dae4b5 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 697ee956..f70752e4 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upload backup to MikroTik cloud # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index c32eb274..e507c6e1 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # create and email backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index 34cdc8f8..23dd7ef8 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # save configuration to fallback partition # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md diff --git a/backup-upload.rsc b/backup-upload.rsc index 1dc98d52..8d96eba5 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # create and upload backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 1247d9ae..f2ff0249 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 8418841c..ad9b926a 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index c5a69992..056136f2 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index e9ca5ccd..f287ea3c 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade.capsman -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index a28d7f77..3d987475 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 22f88181..369dccc0 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade.wifi -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 7815443b..f2c1dfec 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # renew locally issued certificates # https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index c9622b74..7aaac84f 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for certificate validity # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md diff --git a/check-health.rsc b/check-health.rsc index a769fa89..540336dc 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for RouterOS health state # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 5ea094ec..2e52c2a7 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for LTE firmware upgrade, send notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 6dca99af..d45432a5 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for RouterOS update, send notification and/or install # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 74c07543..9efa9ef5 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 8a60fea3..27c9d1cb 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index c5cf74a5..d41c17d7 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 12c33611..00753203 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index cd5b6b05..6dafc08f 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index fbdb784e..4709f3a0 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 35fa82c7..6b7f5fd1 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index c1f71336..90c6ac5f 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index b7f3589f..c435ec32 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index e35bbe78..27e6605d 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index d4323ad0..c562ca29 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index f67ce6e3..ba617d71 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index a3d41c99..0ab5e2a3 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index a1f91980..a6302f5a 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 1f9e1238..d6587609 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index 3b1dbb26..aedae4d8 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 1cef2c9b..9f62967b 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index c44217c5..f2858b29 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index c68900ea..d7199347 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index 27d855fe..f366d403 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 91a1914c..096e07b9 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 636f719c..4188815b 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index f94a0bf5..578ea437 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 59a62c72..66b2cf57 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index f9d485c0..2e9b8aa2 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 57032d83..84c111d6 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 3894d521..2a15af58 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index f95b1245..6a4c930a 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index 13d5ef3a..572011fb 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index bac17a7a..7ab6ac57 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index e9a8ff74..2008c7ea 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index 4b42717a..6787d209 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 7006fb39..9685899f 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 275fe4d0..07d07dc8 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index 941a8ae7..ddbcc0a7 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index 0a919602..a688e809 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 20265fec..88600c55 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index 4d2f3bc9..1b59ff7a 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index 90ea4180..c01472e2 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 44409dcf..55b15405 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 5c8bebce..2ed9dc7d 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index d23d5b59..ded26039 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 2138e319..0bef4553 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 18b66078..c96a7191 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -4,7 +4,7 @@ Send notifications via Matrix [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index b2330a5b..2a43e3c8 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 159fda90..f55f936d 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -4,7 +4,7 @@ Send notifications via Telegram [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index c5fa8915..0127c6d3 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 88524aba..dcfd95b1 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 87343521..7feb19fa 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 9fe486e6..ff6c29c8 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 2db32bb1..f504ed7c 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index 121f77bd..23248b5b 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/packages-update.md b/doc/packages-update.md index fae38962..8b0d4a31 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -4,7 +4,7 @@ Manage system update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 21847c76..7902f3bb 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index b4678af7..5de7f0d7 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 597410bf..8e7417b8 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index e4bae2e6..2ffb25b3 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/telegram-chat.md b/doc/telegram-chat.md index eb4acf5a..95f8cf97 100644 --- a/doc/telegram-chat.md +++ b/doc/telegram-chat.md @@ -4,7 +4,7 @@ Chat with your router and send commands via Telegram bot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index 66804477..e9a888c3 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index 80902b96..7e101c4a 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 2539e2f5..126d470b 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 169a2e09..74847acb 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # install firmware upgrade, and reboot # https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 007282cb..4930e865 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md diff --git a/global-wait.rsc b/global-wait.rsc index 239f5750..f0631e27 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # wait for global-functions to finish # https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index e2a4e16e..a2ea9fff 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # track gps data by sending json data to http server # https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 8f55d717..29bd48d4 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 7ac996c0..06dd9f07 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 39c9f25f..7c74d109 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 113c95d1..b85c5911 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 10f0c7e4..44607cc1 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index dbf50e0c..25933c63 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 8894eeee..bd74a8f8 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # and add/remove/update DNS entries from IPSec mode-config # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ec9a03a5..0577bdcb 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update firewall and dns settings on IPv6 prefix change # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index a9d4b681..f484414f 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run scripts on DHCP lease # https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index 7abcb4dd..5133e736 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # forward log messages via notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 000532a5..7dae6797 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # reset bridge ports to default bridge # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 760e8a68..c9f55ae2 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage VLANs on bridge ports # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index df2e81af..3d62ddfb 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 196633a4..3adc1dfa 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -4,7 +4,7 @@ # Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Matrix # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-matrix.md diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index cdc10e7c..661f69f0 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Ntfy (ntfy.sh) # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 18904833..671bd1c4 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Telegram # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-telegram.md diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index c3972a0b..3d5dce9d 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download script and run it once # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 6272a939..8cafa954 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md diff --git a/mode-button.rsc b/mode-button.rsc index 4994f6bd..7908a7f1 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # act on multiple mode and reset button presses # https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 09365bac..9635be63 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 17682f04..b658eaef 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 09328153..b78faa4a 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # visualize ospf instance state via leds # https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md diff --git a/packages-update.rsc b/packages-update.rsc index 97039ecb..b08a48d2 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download packages and reboot for installation # https://git.eworm.de/cgit/routeros-scripts/about/doc/packages-update.md diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 6484ecb0..337b32da 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run scripts on ppp up # https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 70bfb284..c8966595 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run action on received SMS # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index 477d11e2..0d493b65 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # forward SMS to e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 1c274ece..2bdc04de 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # use Telegram to chat with your Router and send commands # https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 76d0c819..6dd829d8 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index f9ba202e..67a5d30f 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update local address of tunnelbroker interface # https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md From 8ea780554164ef14e5fddc1ab8692eec455a0d0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Jul 2024 17:57:22 +0200 Subject: [PATCH 222/988] global-functions: $EitherOr: pass boolean value Note that literal "true" or "false" (even without quotes) is converted to string. So you may have to enclose it in parentheses for a boolean value: > :put [ :typeof [ $EitherOr true false ] ]; str > :put [ :typeof [ $EitherOr (true) (false) ] ]; bool --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 54dcb68f..4f37fa59 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -382,6 +382,9 @@ :set EitherOr do={ :global IfThenElse; + :if ([ :typeof $1 ] = "bool") do={ + :return $1; + } :if ([ :typeof $1 ] = "num") do={ :return [ $IfThenElse ($1 != 0) $1 $2 ]; } From 511184a4a7bbabd6b7789defb9cc65c22bb50664 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Jul 2024 21:13:02 +0200 Subject: [PATCH 223/988] global-functions: $EitherOr: revert... ... but leave a comment. --- global-functions.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4f37fa59..41120fd3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -382,15 +382,13 @@ :set EitherOr do={ :global IfThenElse; - :if ([ :typeof $1 ] = "bool") do={ - :return $1; - } :if ([ :typeof $1 ] = "num") do={ :return [ $IfThenElse ($1 != 0) $1 $2 ]; } :if ([ :typeof $1 ] = "time") do={ :return [ $IfThenElse ($1 > 0s) $1 $2 ]; } + # this works for boolean values, literal ones with parentheses :return [ $IfThenElse ([ :len [ :tostr $1 ] ] > 0) $1 $2 ]; } From 22d93d07081cd23954abcae66aa448794f3dda51 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 10:13:33 +0200 Subject: [PATCH 224/988] README: drop command to remove certificate file... ... as this is done automatically with RouterOS 7.15rc1 and later. Not bumping the required RouterOS version (badge) here... Worst thing that can happen is a stale certificate file left on storage. --- README.d/03-check-certs.avif | Bin 8932 -> 8047 bytes README.md | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 46b7220f1df02c8379e95113aeb13bf91859de0f..4717b3ea9cc9436ab94be0e471263f601fcf47c8 100644 GIT binary patch delta 3868 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 m?X8>I9uN Date: Tue, 23 Apr 2024 10:14:47 +0200 Subject: [PATCH 225/988] INITIAL-COMMANDS: drop command to remove certificate file... ... as this is done automatically with RouterOS 7.15rc1 and later. --- INITIAL-COMMANDS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 2be51c54..3f5f75ce 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -23,7 +23,6 @@ Run the complete base installation: :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="ISRG-Root-X2.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ From 209c37664baddffb730dcb5d85ebc09b9bf8f3b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Mar 2024 09:13:39 +0100 Subject: [PATCH 226/988] netwatch-notify: do not switch type when resolving This requires RouterOS 7.15beta4, but let's bump the required version to next stable release instead. --- doc/netwatch-notify.md | 2 +- netwatch-notify.rsc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index f504ed7c..948cbecb 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index b658eaef..a49d0cde 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md @@ -102,7 +102,8 @@ :if ([ :typeof ($HostInfo->"resolve") ] = "str") do={ :if ([ $IsDNSResolving ] = true) do={ :do { - :local Resolve [ :resolve ($HostInfo->"resolve") ]; + :local Resolve [ :resolve type=[ $IfThenElse ([ :typeof ($HostVal->"host") ] = "ip") \ + "ipv4" "ipv6" ] ($HostInfo->"resolve") ]; :if ($Resolve != $HostVal->"host") do={ :if ([ $ResolveExpected $ScriptName ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={ $LogPrint info $ScriptName ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ From a017f2422442d71bac2ae7081e089e90a1636d83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:35:06 +0200 Subject: [PATCH 227/988] daily-psk: drop workaround for old RouterOS --- daily-psk.capsman.rsc | 3 +-- daily-psk.local.rsc | 3 +-- daily-psk.template.rsc | 5 ++--- daily-psk.wifi.rsc | 5 ++--- doc/daily-psk.md | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 6dafc08f..0562e399 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 4709f3a0..0bef0e9c 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 6b7f5fd1..9d71958e 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -24,7 +24,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -86,7 +85,7 @@ /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ - :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ + :if ([ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 90c6ac5f..83a896ce 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -72,7 +71,7 @@ $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; - :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ + :if ([ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 2a15af58..4a3de64e 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 32474c751f9fb69e096dc7f3b9e8c1f2c1fe6f90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:37:42 +0200 Subject: [PATCH 228/988] telegram-chat: drop extra conversion The JSON parser was actually fixed in RouterOS 7.15beta4, but let's bump the required version to next stable release instead. --- doc/telegram-chat.md | 2 +- telegram-chat.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/telegram-chat.md b/doc/telegram-chat.md index 95f8cf97..1e6f70f0 100644 --- a/doc/telegram-chat.md +++ b/doc/telegram-chat.md @@ -4,7 +4,7 @@ Chat with your router and send commands via Telegram bot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 2bdc04de..f2750f5f 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # use Telegram to chat with your Router and send commands # https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md @@ -97,7 +97,7 @@ :local Trusted false; :local Chat ($Message->"chat"); :local From ($Message->"from"); - :local Command [ :tostr ($Message->"text") ]; + :local Command ($Message->"text"); :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ From c28574b8f4484463e326e895fcac110d805efa01 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 19 Aug 2024 10:35:18 +0200 Subject: [PATCH 229/988] README: make the QR code a link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53dcffb2..ab6bd8c4 100644 --- a/README.md +++ b/README.md @@ -364,7 +364,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Upstream -------- -![upstream](README.d/upstream.png) +[![upstream](README.d/upstream.png)](https://rsc.eworm.de/) URL: [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) From 342d459436414ea94b9081474122c60b50f61569 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 19 Aug 2024 14:54:17 +0200 Subject: [PATCH 230/988] README: match the certificate file name from Let's Encrypt website... ... so import from manually downloaded and transferred file works out of the box as well. --- README.d/01-download-certs.avif | Bin 4596 -> 4890 bytes README.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index 4a074eb59dce96fbf79c0b50dfdf028f7eff9d4f..d41ca0595fa2f6b2ca1eaf3a94e34244d46e017a 100644 GIT binary patch delta 3543 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 delta 3247 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 Date: Mon, 19 Aug 2024 14:55:04 +0200 Subject: [PATCH 231/988] INITIAL-COMMANDS: match the certificate file name from Let's Encrypt website... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... and our README. 😜 --- INITIAL-COMMANDS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 3f5f75ce..84a88fee 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,9 +17,9 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="ISRG-Root-X2.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; :delay 1s; - /certificate/import file-name=ISRG-Root-X2.pem passphrase=""; + /certificate/import file-name=isrg-root-x2.pem passphrase=""; :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; From d360cc05becf4363aef07db652e39dd1315a2875 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 17 Aug 2024 21:53:10 +0200 Subject: [PATCH 232/988] netwatch-dns: disable DoH if time not sync... ... as it is possible that time is off, DNS via DoH fails (cert invalid), and finally syncing time fails due to failing DNS. --- netwatch-dns.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 9635be63..e205081f 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -16,6 +16,8 @@ :global CertificateAvailable; :global EitherOr; + :global IsDNSResolving; + :global IsTimeSync; :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -67,6 +69,12 @@ :local DohCurrent [ /ip/dns/get use-doh-server ]; :local DohServers ({}); + :if ([ :len $DohCurrent ] > 0 && [ $IsDNSResolving ] = false && [ $IsTimeSync ] = false) do={ + $LogPrint info $ScriptName ("Time is not sync, disabling DoH: " . $DohCurrent); + /ip/dns/set use-doh-server=""; + :set DohCurrent ""; + } + :foreach Host in=[ /tool/netwatch/find where comment~"\\bdoh\\b" status="up" ] do={ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; From f17502d3d0e54173f6c843685b4e26a3c7cac89b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 18 Aug 2024 22:10:37 +0200 Subject: [PATCH 233/988] check-routeros-update: support switching to stable channel... ... with a feature update in testing channel. --- check-routeros-update.rsc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index d45432a5..3584a945 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -125,6 +125,15 @@ } :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :if (($Update->"channel") = "testing" && ($NumInstalled & 0xffff0000) < ($NumLatest & 0xffff0000)) do={ + :put ("This is a feature update in testing channel. Switch to channel 'stable'? [y/N]"); + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + /system/package/update/set channel=stable; + $LogPrint info $ScriptName ("Switched to channel 'stable', please re-run!"); + :error true; + } + } + :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $DoUpdate; From 3e9a7ea75a29111f4601cedf966471cbf4d9c894 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 09:38:13 +0200 Subject: [PATCH 234/988] certs: add 'DigiCert Global Root G3'... ... for quad9.net which can be used for DoH: $CertificateAvailable "DigiCert Global Root G3"; /ip/dns/set use-doh-server=https://9.9.9.9/dns-query verify-doh-cert=yes; --- certs/DigiCert-Global-Root-G3.pem | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 certs/DigiCert-Global-Root-G3.pem diff --git a/certs/DigiCert-Global-Root-G3.pem b/certs/DigiCert-Global-Root-G3.pem new file mode 100644 index 00000000..12324dcc --- /dev/null +++ b/certs/DigiCert-Global-Root-G3.pem @@ -0,0 +1,22 @@ +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- From 90632f223adce7139b831fc2e6a0668431e5f26c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 10:59:51 +0200 Subject: [PATCH 235/988] doc/netwatch-dns: 'DigiCert Global Root G3' for Quad9 --- doc/netwatch-dns.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index ff6c29c8..54dd6c62 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -63,7 +63,7 @@ Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; - /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root CA" host=9.9.9.9; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be From 48fd281c1d048bbce9dbe0f0e6940eb8f417a9f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 16:43:35 +0200 Subject: [PATCH 236/988] certs: drop 'DigiCert Global Root CA' --- certs/DigiCert-Global-Root-CA.pem | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 certs/DigiCert-Global-Root-CA.pem diff --git a/certs/DigiCert-Global-Root-CA.pem b/certs/DigiCert-Global-Root-CA.pem deleted file mode 100644 index b0f00130..00000000 --- a/certs/DigiCert-Global-Root-CA.pem +++ /dev/null @@ -1,29 +0,0 @@ -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- From 917be4b42574cd66254a4559330e83bc5c2ed233 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:54:13 +0200 Subject: [PATCH 237/988] fw-addr-lists: spamhaus.org requires 'GTS Root R4' now Fixes: https://github.com/eworm-de/routeros-scripts/issues/78 --- global-config.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index cdc1d5ca..2d10a9e1 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="Baltimore CyberTrust Root" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; -# cert="Baltimore CyberTrust Root" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From f4c97559b337413fb91bec4927a3de2ac7e81d09 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:56:48 +0200 Subject: [PATCH 238/988] fw-addr-lists: drop edrop.txt, which does no longer exist --- global-config.rsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 2d10a9e1..03e5bb4a 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,8 +106,6 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="GTS Root R4" }; -# { url="https://www.spamhaus.org/drop/edrop.txt"; # cert="GTS Root R4" }; }; # "mikrotik"={ From 21fa46fdf6720cf3ec57980e29b4da9cf2e0f46d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:59:44 +0200 Subject: [PATCH 239/988] certs: drop 'Baltimore CyberTrust Root' --- certs/Baltimore-CyberTrust-Root.pem | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 certs/Baltimore-CyberTrust-Root.pem diff --git a/certs/Baltimore-CyberTrust-Root.pem b/certs/Baltimore-CyberTrust-Root.pem deleted file mode 100644 index de8121a2..00000000 --- a/certs/Baltimore-CyberTrust-Root.pem +++ /dev/null @@ -1,28 +0,0 @@ -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- From 9737bfa46ad5b08f39ba0442061d08e974cb14c5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Sep 2024 22:54:41 +0200 Subject: [PATCH 240/988] =?UTF-8?q?certs:=20add=20poor=20man's=20check=20?= =?UTF-8?q?=F0=9F=98=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- certs/Makefile | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 certs/Makefile diff --git a/certs/Makefile b/certs/Makefile new file mode 100644 index 00000000..2e6ac9da --- /dev/null +++ b/certs/Makefile @@ -0,0 +1,31 @@ +# Makefile to check certificates + +DOMAINS = \ + 1.1.1.1/DigiCert-Global-Root-G2 \ + 8.8.8.8/GTS-Root-R1 \ + 9.9.9.9/DigiCert-Global-Root-G3 \ + api.macvendors.com/GTS-Root-R4 \ + api.mullvad.net/ISRG-Root-X1 \ + api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ + cloudflare-dns.com/DigiCert-Global-Root-G2 \ + dns.google/GTS-Root-R1 \ + dns.quad9.net/DigiCert-Global-Root-G3 \ + feodotracker.abuse.ch/GlobalSign \ + git.eworm.de/ISRG-Root-X2 \ + ipv4.showipv6.de/ISRG-Root-X1 \ + ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ + ipv6.showipv6.de/ISRG-Root-X1 \ + lists.blocklist.de/Certum-Trusted-Network-CA \ + mkcert.org/ISRG-Root-X1 \ + ntfy.sh/ISRG-Root-X1 \ + sslbl.abuse.ch/GlobalSign \ + upgrade.mikrotik.com/ISRG-Root-X1 \ + www.dshield.org/ISRG-Root-X1 \ + www.spamhaus.org/GTS-Root-R4 + +.PHONY: $(DOMAINS) + +all: $(DOMAINS) + +$(DOMAINS): + curl --output /dev/null --silent --connect-timeout 5 --cacert $(notdir $@).pem https://$(dir $@) From 09dcd51feb0d17e7c0715aa10786df169936760a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 4 Sep 2024 12:02:20 +0200 Subject: [PATCH 241/988] netwatch-dns: give warning on CRL use --- netwatch-dns.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index e205081f..09d471df 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -19,6 +19,7 @@ :global IsDNSResolving; :global IsTimeSync; :global LogPrint; + :global LogPrintOnce; :global ParseKeyValueStore; :global ScriptLock; @@ -126,6 +127,9 @@ :if ($Data != false) do={ :if ([ :typeof [ :find $Data "doh-check-OK" ] ] = "num") do={ /ip/dns/set use-doh-server=($DohServer->"doh-url") verify-doh-cert=yes; + :if ([ /certificate/settings/get crl-use ] = true) do={ + $LogPrintOnce warning $ScriptName ("Configured to use CRL, that can cause severe issue!"); + } /ip/dns/cache/flush; $LogPrint info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")); :error true; From d23d05f2ea3b3d0e5c11d0780ef87566641296c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 5 Sep 2024 22:10:11 +0200 Subject: [PATCH 242/988] fw-addr-lists: handle JSON format from spamhaus.org Closes: https://github.com/eworm-de/routeros-scripts/issues/79 --- fw-addr-lists.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4930e865..4675e3a4 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -88,7 +88,12 @@ :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; - :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); + :local Address; + :if ([ :pick $Line 0 1 ] = "{") do={ + :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + } else={ + :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); + } :do { :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :set ($IPv4Addresses->$Address) $TimeOut; From fe52bd4a0a496f896439887c0943e38e8f39ce2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 5 Sep 2024 22:58:19 +0200 Subject: [PATCH 243/988] fw-addr-lists: use lists in JSON format for spamhaus.org --- global-config.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 03e5bb4a..2ed67f3c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -105,7 +105,9 @@ cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; -# { url="https://www.spamhaus.org/drop/drop.txt"; +# { url="https://www.spamhaus.org/drop/drop_v4.json"; +# cert="GTS Root R4" }; +# { url="https://www.spamhaus.org/drop/drop_v6.json"; # cert="GTS Root R4" }; }; # "mikrotik"={ From 41b19b045ad98c528ce9d8d84ab086fe7c54f265 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:16:17 +0200 Subject: [PATCH 244/988] global-functions: $VersionToNum: support "zero"... ... to have a clean way to generate bitmasks. [admin@mikrotik] > :put [ $VersionToNum 0.255zero0 ] 16711680 [admin@mikrotik] > :put 0x00ff0000 16711680 Once implemented everywhere the internal calculation could be changed easily. --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 41120fd3..9ee5312c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1485,7 +1485,7 @@ :global CharacterReplace; :set Input [ $CharacterReplace $Input "." "," ]; - :foreach I in={ "alpha"; "beta"; "rc" } do={ + :foreach I in={ "zero"; "alpha"; "beta"; "rc" } do={ :set Input [ $CharacterReplace $Input $I ("," . $I . ",") ]; } @@ -1496,6 +1496,7 @@ :set Return ($Return + 0xff00); :set Multi ($Multi / 0x100); } else={ + :if ($Value = "zero") do={ } :if ($Value = "alpha") do={ :set Return ($Return + 0x3f00); } :if ($Value = "beta") do={ :set Return ($Return + 0x5f00); } :if ($Value = "rc") do={ :set Return ($Return + 0x7f00); } From 734a80ba82cfb76c34484415a5e810a1d29bdbfe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:29:06 +0200 Subject: [PATCH 245/988] backup-partition: use $VersionToNum to calculate bitmask --- backup-partition.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 23dd7ef8..51df4545 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -81,8 +81,9 @@ :local Update [ /system/package/update/get ]; :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :local BitMask [ $VersionToNum "255.255zero0" ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ - ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ + ($NumInstalled & $BitMask) != ($NumLatest & $BitMask)) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; From c708832b69ece50eca184b0946eebd5b3c579475 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:32:40 +0200 Subject: [PATCH 246/988] check-routeros-update: use $VersionToNum to calculate bitmask --- check-routeros-update.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 3584a945..84849ead 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -62,6 +62,9 @@ :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :local BitMask [ $VersionToNum "255.255zero0" ]; + :local NumInstalledFeature ($NumInstalled & $BitMask); + :local NumLatestFeature ($NumLatest & $BitMask); :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); :if ($NumLatest < 117505792) do={ @@ -80,7 +83,7 @@ $DoUpdate; } - :if ($SafeUpdatePatch = true && ($NumInstalled & 0xffff0000) = ($NumLatest & 0xffff0000)) do={ + :if ($SafeUpdatePatch = true && $NumInstalledFeature = $NumLatestFeature) do={ $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is a patch release, updating..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ @@ -125,7 +128,7 @@ } :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :if (($Update->"channel") = "testing" && ($NumInstalled & 0xffff0000) < ($NumLatest & 0xffff0000)) do={ + :if (($Update->"channel") = "testing" && $NumInstalledFeature < $NumLatestFeature) do={ :put ("This is a feature update in testing channel. Switch to channel 'stable'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ /system/package/update/set channel=stable; From 60aa553219b289e9d3e4ef7f0bb7db471f45af69 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Sep 2024 11:01:40 +0200 Subject: [PATCH 247/988] hotspot-to-wpa-cleanup: only match access-list with mac-address --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 29bd48d4..45ea72b0 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -50,7 +50,7 @@ } :foreach Client in=[ /caps-man/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /caps-man/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 06dd9f07..081f3d0d 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -54,7 +54,7 @@ :foreach Client in=[ /caps-man/access-list/find where comment~"^hotspot-to-wpa:" \ :foreach Client in=[ /interface/wifi/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /caps-man/access-list/get $Client ]; :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 7c74d109..23f773f5 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -50,7 +50,7 @@ } :foreach Client in=[ /interface/wifi/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ From c2c72818de2cf35ea5b50eed3a505f86ed6be294 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 26 Sep 2024 15:24:05 +0200 Subject: [PATCH 248/988] global-functions: $CertificateDownload: add another check... ... that the certificate is really available. Turns out that mkcert.org ships certificates where OU or whatever matches - that's not what we want. --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 9ee5312c..e5471dd0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -176,6 +176,12 @@ :delay 1s; /file/remove [ find where name=$FileName ]; + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ + /certificate/remove [ find where name~("^" . $FileName . "_[0-9]+\$") ]; + $LogPrint warning $0 ("Certificate with CommonName '" . $CommonName . "' still unavailable!"); + :return false; + } + :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } From 1776b8f50b173b49ca7ce3ab917de4493ae36ff6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 27 Sep 2024 17:13:32 +0200 Subject: [PATCH 249/988] backup-partition: give warning on lock in device-mode RouterOS 7.17beta2 introduced some extra security measures, including some to prevent downgrade attacks for the installation. Thus switching partitions (which can hold quite old installations) is denied by device-mode now by default. Warn about that... https://help.mikrotik.com/docs/display/ROS/Device-mode --- backup-partition.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index 51df4545..56738bac 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,6 +19,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -59,6 +60,12 @@ :error false; } + :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ + ([ /system/device-mode/get ]->"partitions") != true) do={ + $LogPrint warning $ScriptName \ + ("The device mode has locked switching partitions! You will need physical access!"); + } + :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; From f2576cf55892618c65fca6a1bff03b35a94acee8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Sep 2024 16:10:55 +0200 Subject: [PATCH 250/988] packages-update: give warning on lock in device-mode RouterOS 7.17beta2 introduced some extra security measures, including some to prevent downgrade attacks for the installation. Detect early and exit with message and error. https://help.mikrotik.com/docs/display/ROS/Device-mode --- packages-update.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index b08a48d2..b4fab46c 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -18,6 +18,7 @@ :global Grep; :global LogPrint; :global ParseKeyValueStore; + :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -99,6 +100,13 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ + :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ + ([ /system/device-mode/get ]->"downgrade") != true) do={ + $LogPrint error $ScriptName \ + ("The device mode has locked downgrades! You will need physical access!"); + :error false; + } + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Latest version is older than installed one. Want to downgrade? [y/N]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ From f75e701be3ceb89615bd29a2bce1404f1bf4117c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Sep 2024 21:51:31 +0200 Subject: [PATCH 251/988] log-forward: get last message from log... ... not only from matched massages. --- log-forward.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 5133e736..e0d8f359 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -94,9 +94,10 @@ [ $IfThenElse ($Duplicates = true) (" Multi-repeated messages have been skipped.") ] . \ [ $IfThenElse ($LogForwardRateLimit > 30) ("\nRate limit in action, delaying forwarding.") ] . \ "\n" . $Messages) }); - - :set LogForwardLast ($MessageVal->".id"); } else={ :set LogForwardRateLimit [ $MAX 0 ($LogForwardRateLimit - 1) ]; } + + :local LogAll [ /log/find ]; + :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); } on-error={ } From 5135e836b82d36e49dd34ebde7ad2aedda6f8af2 Mon Sep 17 00:00:00 2001 From: Ignacio Serrano Date: Tue, 1 Oct 2024 20:32:37 +0200 Subject: [PATCH 252/988] mod/notification-ntfy: fix ntfy overrides --- mod/notification-ntfy.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 661f69f0..b2bb2800 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -87,7 +87,7 @@ :return false; } - :local Url ("https://" . $NtfyServer . "/" . [ $UrlEncode $NtfyTopic ]); + :local Url ("https://" . $Server . "/" . [ $UrlEncode $Topic ]); :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); @@ -97,7 +97,7 @@ } :do { - :if ($NtfyServer = "ntfy.sh") do={ + :if ($Server = "ntfy.sh") do={ :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; From 98e62e3eaca9d5d09b70e7ddad44c7fbe21dfbf2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 1 Oct 2024 21:42:20 +0200 Subject: [PATCH 253/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b192fc2..dd21fa5c 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -20,6 +20,7 @@ for details! * [Anatoly Bubenkov](mailto:bubenkoff@gmail.com) (@bubenkoff) * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) +* [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) From c955c94098190847856c62e4e9b437200b19884c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 2 Oct 2024 14:02:29 +0200 Subject: [PATCH 254/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index dd21fa5c..ed1d6faa 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -38,6 +38,7 @@ Add yourself to the list, * Daniel Ziegenberg (@ziegenberg) * Devin Dean (@dd2594gh) * Evaldo Gardenal +* Florian Estraviz * Giorgio Bikos * Harold Schoemaker * Hugo BV From 85a7a16c1526acfc86ec313e8527fb616f142a57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 9 Oct 2024 14:30:29 +0200 Subject: [PATCH 255/988] backup-partition: log the warning just once --- backup-partition.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 56738bac..8b4be9b4 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,6 +19,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global LogPrintOnce; :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; @@ -62,7 +63,7 @@ :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ ([ /system/device-mode/get ]->"partitions") != true) do={ - $LogPrint warning $ScriptName \ + $LogPrintOnce warning $ScriptName \ ("The device mode has locked switching partitions! You will need physical access!"); } From 82e3e7a9fce024be5b93aa6adc41d6d799c05271 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:20:31 +0200 Subject: [PATCH 256/988] doc/netwatch-notify: always give a host... ... as that is a required property. Any ip address is fine, it is changed anyway. --- doc/netwatch-notify.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 948cbecb..411a4d9b 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -88,7 +88,7 @@ threshould by one. The host address can be updated dynamically. Give extra parameter `resolve` with a resolvable name: - /tool/netwatch/add comment="notify, name=example.com, resolve=example.com"; + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=0.0; This supports multiple A or AAAA records for a name just fine, even a CNAME to those. An update happens only if no more record with the configured host @@ -125,7 +125,7 @@ included verbatim into the notification. It is possible to add a link in notification, that is added below the formatted notification text. - /tool/netwatch/add comment="notify, name=example.com, resolve=example.com, link=https://example.com/"; + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com, link=https://example.com/" host=0.0; Tips & Tricks ------------- From f7f50a9d45980e94041c9f48f017778b8a1d279c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:24:56 +0200 Subject: [PATCH 257/988] doc/netwatch-notify: give an extra example for resolving AAAA records --- doc/netwatch-notify.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 411a4d9b..9fa0e262 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -90,10 +90,15 @@ with a resolvable name: /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=0.0; -This supports multiple A or AAAA records for a name just fine, even a CNAME +This supports multiple A records for a name just fine, even a CNAME to those. An update happens only if no more record with the configured host address is found. +The address family is preserved, so if you want AAAA records (for IPv6) +use this: + + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=::; + ### No notification on host down Also suppressing the notification on host down is possible with parameter From 71c58c6afb27fc66356f9d5d3d41c5af7ab2f9d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:32:46 +0200 Subject: [PATCH 258/988] doc/netwatch-notify: fix typo(s) --- doc/netwatch-notify.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 9fa0e262..81adfe9d 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -66,9 +66,9 @@ notification is sent. Getting the escaping right may be troublesome. Please consider adding a script in `/system/script`, then running that from hook. -### Count threshould +### Count threshold -The count threshould (default is 5 checks) is configurable as well: +The count threshold (default is 5 checks) is configurable as well: /tool/netwatch/add comment="notify, name=example.com, count=10" host=104.18.144.11; @@ -81,7 +81,7 @@ suppress notification if the parent host is down: /tool/netwatch/add comment="notify, name=example.com, parent=gateway" host=93.184.216.34; Note that every configured parent in a chain increases the check count -threshould by one. +threshold by one. ### Update from DNS From 435f70999c0fc28aaf804c00552d0d54dcf10806 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 19:32:19 +0200 Subject: [PATCH 259/988] backup-partition: drop warning on lock in device-mode ... as switching partitions is possible again in RouterOS 7.17beta4. --- backup-partition.rsc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 8b4be9b4..51df4545 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,8 +19,6 @@ :global PackagesUpdateBackupFailure; :global LogPrint; - :global LogPrintOnce; - :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -61,12 +59,6 @@ :error false; } - :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ - ([ /system/device-mode/get ]->"partitions") != true) do={ - $LogPrintOnce warning $ScriptName \ - ("The device mode has locked switching partitions! You will need physical access!"); - } - :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; From 07c95763775cb5fdef056ef6ba7ff3ac1399dbaf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 19:38:20 +0200 Subject: [PATCH 260/988] packages-update: check for explicit state... ... as all device-mode properties are given since RouterOS 7.14beta4. Let's assume we do not have to care about RouterOS 7.14beta2 any more... As older versions will not match the check we can now merge right away. --- packages-update.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index b4fab46c..c2f0ba6d 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -18,7 +18,6 @@ :global Grep; :global LogPrint; :global ParseKeyValueStore; - :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -100,8 +99,7 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ - :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ - ([ /system/device-mode/get ]->"downgrade") != true) do={ + :if (([ /system/device-mode/get ]->"downgrade") = false) do={ $LogPrint error $ScriptName \ ("The device mode has locked downgrades! You will need physical access!"); :error false; From 7229c756af86df3a670ca79138e6e35342951461 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 23:19:16 +0200 Subject: [PATCH 261/988] fw-addr-lists: spamhaus.org requires 'ISRG Root X1' now --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 2e6ac9da..09e7a204 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -21,7 +21,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/GTS-Root-R4 + www.spamhaus.org/ISRG-Root-X1 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 2ed67f3c..c4e04b5e 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From d022c876514107bd345a17a0c01896947a83b45f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 21:38:38 +0200 Subject: [PATCH 262/988] ipv6-update: ignore if address was acquired https://github.com/eworm-de/routeros-scripts/issues/85 --- ipv6-update.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 0577bdcb..47bf3ded 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -18,12 +18,18 @@ :global ParseKeyValueStore; :global ScriptLock; + :local NaAddress $"na-address"; :local PdPrefix $"pd-prefix"; :if ([ $ScriptLock $ScriptName ] = false) do={ :error false; } + :if ([ :typeof $NaAddress ] = "str") do={ + $LogPrint info $ScriptName ("An address (" . $NaAddress . ") was acquired, not a prefix. Ignoring."); + :error false; + } + :if ([ :typeof $PdPrefix ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); :error false; From e803f8b3c0956e8b9f3992433d0a3caf9cb4c899 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 22:35:14 +0200 Subject: [PATCH 263/988] ipv6-update: create a dynamic address-list entry only This should make sure that the script runs once after reboot, even if the prefix does not change. An existing static entry needs to be removed to make this work! https://github.com/eworm-de/routeros-scripts/issues/85 --- doc/ipv6-update.md | 12 ++++++++---- ipv6-update.rsc | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 88600c55..42f0fe4c 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -45,13 +45,17 @@ Installing [ppp-on-up](ppp-on-up.md) may solve this. Configuration ------------- -An address list entry is updated with current prefix and can be used in -firewall rules, comment has to be "`ipv6-pool-`" and actual pool name: +As an address-list entry is mandatory a dynamic one is created automatically. +It is updated with current prefix and can be used in firewall rules. + +Alternatively a static address-list entry can be used, where comment has to +be "`ipv6-pool-`" and actual pool name. Use what ever list is desired, and +create it with: /ipv6/firewall/address-list/add address=2003:cf:2f0f:de00::/56 comment=ipv6-pool-isp list=extern; -As this entry is mandatory it is created automatically if it does not exist, -with the comment also set for list. +If the dynamic entry exists already you need to remove it before creating +the static one.. Address list entries for specific interfaces can be updated as well. The interface needs to get its address from pool `isp` and the address list entry diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 47bf3ded..ccc0eb95 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -37,8 +37,8 @@ :local Pool [ /ipv6/pool/get [ find where prefix=$PdPrefix ] name ]; :if ([ :len [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ] ] = 0) do={ - /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool); - $LogPrint warning $ScriptName ("Added ipv6 address list entry for ipv6-pool-" . $Pool); + /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool) dynamic=yes; + $LogPrint warning $ScriptName ("Added dynamic ipv6 address list entry for ipv6-pool-" . $Pool); } :local AddrList [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ]; :local OldPrefix [ /ipv6/firewall/address-list/get ($AddrList->0) address ]; From 3169270dbda239b860ee7b2989d2bfdf7b5b78c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Oct 2024 22:31:58 +0100 Subject: [PATCH 264/988] doc/mod/notification-matrix: better document certificate import --- doc/mod/notification-matrix.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index c96a7191..dd46404c 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -46,6 +46,13 @@ The Matrix server is connected via encrypted https, and certificate verification is applied. So make sure you have the certificate chain for your server in device's certificate store. +The example below is for `matrix.org`, which uses a trust chain from *Google +Trust Services*. Run this to import the required certificate: + + $CertificateAvailable "GTS Root R4"; + +Replace the CA certificate name with what ever is needed for your server. + ### From other device If you have setup your Matrix *notification account* before just reuse that. From a6584170c31dc9773840adbc1c7b9721544c764e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Oct 2024 22:33:46 +0100 Subject: [PATCH 265/988] certs: check cert for matrix.org --- certs/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/certs/Makefile b/certs/Makefile index 09e7a204..9ce8dd42 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -16,6 +16,7 @@ DOMAINS = \ ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ ipv6.showipv6.de/ISRG-Root-X1 \ lists.blocklist.de/Certum-Trusted-Network-CA \ + matrix.org/GTS-Root-R4 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ sslbl.abuse.ch/GlobalSign \ From 3506f710710332186caecfcd64d9a6d8f57f3180 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 30 Oct 2024 21:52:50 +0100 Subject: [PATCH 266/988] global-functions: $CertificateAvailable: fail without CommonName --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index e5471dd0..47a69c47 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -107,6 +107,11 @@ "is configured to download certificate CRLs to system!"); } + :if ([ :len $CommonName ] = 0) do={ + $LogPrint warning $0 ("No CommonName given!"); + :return false; + } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ From 3c0852d6b829d8babc3a57002991e35f7bd31d0a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 30 Oct 2024 17:46:03 +0100 Subject: [PATCH 267/988] introduce CERTIFICATES, guide to find root certificate --- CERTIFICATES.d/01-dialog-A.avif | Bin 0 -> 29972 bytes CERTIFICATES.d/02-dialog-B.avif | Bin 0 -> 28821 bytes CERTIFICATES.d/03-window.avif | Bin 0 -> 48111 bytes CERTIFICATES.d/04-certificate.avif | Bin 0 -> 22386 bytes CERTIFICATES.md | 74 +++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 CERTIFICATES.d/01-dialog-A.avif create mode 100644 CERTIFICATES.d/02-dialog-B.avif create mode 100644 CERTIFICATES.d/03-window.avif create mode 100644 CERTIFICATES.d/04-certificate.avif create mode 100644 CERTIFICATES.md diff --git a/CERTIFICATES.d/01-dialog-A.avif b/CERTIFICATES.d/01-dialog-A.avif new file mode 100644 index 0000000000000000000000000000000000000000..2fc3c9bdd9e2e846b90814f7d1cb6fc130c498f4 GIT binary patch literal 29972 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 X(5VeJS+20d`+(Mw9f)=(A|Jb;MOUpz literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/02-dialog-B.avif b/CERTIFICATES.d/02-dialog-B.avif new file mode 100644 index 0000000000000000000000000000000000000000..5e408abedc1a94d8d0988382312d3f34715aef9e GIT binary patch literal 28821 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 literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/03-window.avif b/CERTIFICATES.d/03-window.avif new file mode 100644 index 0000000000000000000000000000000000000000..96039a3bbab865a20c017636205ab56dc3c0f099 GIT binary patch literal 48111 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 BgM9!1 literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/04-certificate.avif b/CERTIFICATES.d/04-certificate.avif new file mode 100644 index 0000000000000000000000000000000000000000..e6663146d6f4ec8f70a068751ed96f7f9b90ad75 GIT binary patch literal 22386 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

RouterOS-Scripts Logo Color Changer

+

Logo Color Changer

You want the logo for your own notifications? But you joined the Telegram Group and want @@ -36,5 +34,4 @@ for other browsers may differ.)

Set a profile photo for your Telegram bot.

- - + diff --git a/contrib/notification.html b/contrib/notification.html index b7d6764d..472ce48a 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -1,14 +1,12 @@ - - - - -RouterOS-Scripts Notification Generator + + +RouterOS Scripts :: Notification Generator + - - + -

RouterOS-Scripts Notification Generator

+

Notification Generator

@@ -31,5 +29,4 @@

Then right-click, click "Take Screenshot" and finally select the notification and download it.

- - + diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 804104fa..7d5092d3 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -107,7 +107,7 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) Have a look at my -[RouterOS-Scripts Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) +[Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) to create a colored version of this scripts' logo. See also From 8faf4ab7cf9ad6313b1fe7903b9325c17827cfdc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 15:35:14 +0100 Subject: [PATCH 885/988] contrib/{logo-color,notification}: add navigation structure --- contrib/logo-color.html | 6 ++++++ contrib/notification.html | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index eb00492c..8ee1ba95 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -8,6 +8,8 @@

Logo Color Changer

+

⬅️ Go back to main README

+

You want the logo for your own notifications? But you joined the Telegram Group and want something that differentiates? Color it!

@@ -34,4 +36,8 @@ for other browsers may differ.)

Set a profile photo for your Telegram bot.

+
+ +

⬅️ Go back to main README
+⬆️ Go back to top

diff --git a/contrib/notification.html b/contrib/notification.html index 472ce48a..3bc86fcb 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -8,6 +8,8 @@

Notification Generator

+

⬅️ Go back to main README

+
@@ -29,4 +31,8 @@

Then right-click, click "Take Screenshot" and finally select the notification and download it.

+
+ +

⬅️ Go back to main README
+⬆️ Go back to top

From eb89f8359b4e8c387144330a435841430e85feab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 16:06:42 +0100 Subject: [PATCH 886/988] contrib/notification: update date format --- contrib/notification.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/notification.html b/contrib/notification.html index 3bc86fcb..c86450cf 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -16,7 +16,7 @@

[MikroTik] ℹ️ Subject

Message
-

⏰ This message was queued since oct/18/2022 18:30:48 and may be obsolete.

+

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

✂️ The message was too long and has been truncated, cut off 13%!

@@ -25,7 +25,7 @@

Subject:

Message:

Show link:

-

Queued since

+

Queued since

Cut-off with percent

Then right-click, click "Take Screenshot" and finally select the From 8d68f24095c8aeb0b14720d048a8493c996cf4e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 16:11:23 +0100 Subject: [PATCH 887/988] contrib/notification: format the values italic --- contrib/notification.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/notification.html b/contrib/notification.html index c86450cf..a4d04864 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -16,8 +16,8 @@

[MikroTik] ℹ️ Subject

Message
-

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

-

✂️ The message was too long and has been truncated, cut off 13%!

+

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

+

✂️ The message was too long and has been truncated, cut off 13%!

From 5986894749a5de9c589f2269ab9ecac174f304f7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:25:01 +0100 Subject: [PATCH 888/988] doc/mod/notification-telegram: use relative reference in link This may break, depending on site. --- doc/mod/notification-telegram.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 7d5092d3..bdf1331b 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -106,8 +106,7 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) -Have a look at my -[Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) +Have a look at my [Logo Color Changer](../../contrib/logo-color.html) to create a colored version of this scripts' logo. See also From 036c6ef68266d599747dfe59eab5f96c5fa4a388 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:27:59 +0100 Subject: [PATCH 889/988] contrib/logo-color: use relative reference in link ... without extra path elements. This may break, depending on site. --- contrib/logo-color.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 8ee1ba95..9962e999 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -33,7 +33,7 @@ logo and download it.

for other browsers may differ.)

See how to -Set +Set a profile photo for your Telegram bot.


From 148d40e18d5bd7f2309b06428c2ca85a0f5cb793 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:26:05 +0100 Subject: [PATCH 890/988] contrib: introduce Makefile... ... and update references in links. --- contrib/Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 contrib/Makefile diff --git a/contrib/Makefile b/contrib/Makefile new file mode 100644 index 00000000..aae31786 --- /dev/null +++ b/contrib/Makefile @@ -0,0 +1,10 @@ +# Makefile + +HTML := $(wildcard *.html) + +.PHONY: all docs + +all: docs + +docs: $(HTML) + sed -i '/href=/s|\.md|\.html|' $(HTML) From 607a608502c4f38a51c4679d6162c15a52332bab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:40:27 +0100 Subject: [PATCH 891/988] doc/mod/notification-telegram: hint on possibly broken link --- doc/mod/notification-telegram.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index bdf1331b..f464ff0f 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -109,6 +109,10 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. Have a look at my [Logo Color Changer](../../contrib/logo-color.html) to create a colored version of this scripts' logo. +> 💡️ **Hint**: The above link may be broken on code hosting sites. +> Use [Logo Color Changer](https://rsc.eworm.de/main/contrib/logo-color.html) +> instead. + See also -------- From 1ce3160933ee70a3cc6264139247f6b668ae0b3b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:59:08 +0100 Subject: [PATCH 892/988] contrib/html: hide the hint on broken link --- contrib/html.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index b1d25115..09064ba8 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -13,6 +13,7 @@ sed \ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ - -e '/' From cbb0aba1b1ea8b40cec99643de2cfb6f6a933bc9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:51:05 +0100 Subject: [PATCH 893/988] contrib/logo-color: hint on possibly broken site --- contrib/logo-color.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 9962e999..f05f4bb6 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -10,6 +10,11 @@

⬅️ Go back to main README

+

💡️ Hint: This site or links +on it may be broken on code hosting sites. Use +Logo Color Changer +instead.

+

You want the logo for your own notifications? But you joined the Telegram Group and want something that differentiates? Color it!

From b16c2f5b90170a81c30f5b98666264b020e3ac7f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:52:58 +0100 Subject: [PATCH 894/988] contrib/notification: hint on possibly broken site --- contrib/notification.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index a4d04864..3ff87541 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -10,6 +10,11 @@

⬅️ Go back to main README

+

💡️ Hint: This site or links +on it may be broken on code hosting sites. Use +Notification Generator +instead.

+
From 165d7c60d4d156484cc106b4271ade78ab97a026 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:08:11 +0100 Subject: [PATCH 895/988] contrib/html: add a head with eworm, QR code and caption --- contrib/html.sh | 2 ++ contrib/html.sh.d/head.html | 9 +++++++++ general/eworm-meadow.avif | Bin 0 -> 3922 bytes general/style.css | 12 ++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 general/eworm-meadow.avif diff --git a/contrib/html.sh b/contrib/html.sh index 09064ba8..0b89724a 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -8,6 +8,8 @@ sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ + -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ + -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 0ce3ff73..da541579 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -4,3 +4,12 @@ + + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+ diff --git a/general/eworm-meadow.avif b/general/eworm-meadow.avif new file mode 100644 index 0000000000000000000000000000000000000000..f592d59b86c9d178954a09bfb30dd7b6268a3a0b GIT binary patch literal 3922 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 Ol=-JRBU@RH*#86W_XlVI literal 0 HcmV?d00001 diff --git a/general/style.css b/general/style.css index ad25c7c6..018ccc49 100644 --- a/general/style.css +++ b/general/style.css @@ -68,6 +68,18 @@ pre code { span.link { color: #863600; } +td.head { + line-height: 1.2; + padding: 0 2em; +} +td.head .top { + font-size: 250%; + font-weight: bold; +} +td.head .bottom { + font-size: 125%; + color: #555; +} @media only screen and (orientation: landscape) { body { margin-left: 10vw; From 7b45bb5b46a9cc63d3f32f45610ba010c485b304 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:56:16 +0100 Subject: [PATCH 896/988] contrib/Makefile: hide the hint on broken site --- contrib/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index aae31786..cdb9f4cd 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -7,4 +7,7 @@ HTML := $(wildcard *.html) all: docs docs: $(HTML) - sed -i '/href=/s|\.md|\.html|' $(HTML) + sed -i \ + -e '/href=/s|\.md|\.html|' \ + -e '/blockquote/s|/\*! display \*/|display: none;|' \ + $(HTML) From 75692abf4794b6950cb42288dbf2e104a2e797fe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:26:37 +0100 Subject: [PATCH 897/988] contrib/logo-color: add a head with eworm, QR code and caption --- contrib/logo-color.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index f05f4bb6..3aca3248 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -6,6 +6,14 @@ + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+

Logo Color Changer

⬅️ Go back to main README

From b4e6cc5b590ede01c67726cce5bef12e6aca9420 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:27:09 +0100 Subject: [PATCH 898/988] contrib/notification: add a head with eworm, QR code and caption --- contrib/notification.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index 3ff87541..902d328f 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -6,6 +6,14 @@ + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+

Notification Generator

⬅️ Go back to main README

From d1fa3facfdbf09ff09fc572b79dd8099e069415a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Nov 2025 17:32:37 +0100 Subject: [PATCH 899/988] Makefile: clean up and add phony targets --- Makefile | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index b799535e..f841ca2b 100644 --- a/Makefile +++ b/Makefile @@ -2,18 +2,28 @@ # template scripts -> final scripts # markdown files -> html files -CAPSMAN = $(wildcard *.capsman.rsc) -LOCAL = $(wildcard *.local.rsc) -WIFI = $(wildcard *.wifi.rsc) +ALL_RSC := $(wildcard *.rsc */*.rsc) +GEN_RSC := $(wildcard *.capsman.rsc *.local.rsc *.wifi.rsc) -MARKDOWN = $(wildcard *.md doc/*.md doc/mod/*.md) -HTML = $(MARKDOWN:.md=.html) +MARKDOWN := $(wildcard *.md doc/*.md doc/mod/*.md) +HTML := $(MARKDOWN:.md=.html) -all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json +.PHONY: all checksums docs rsc clean + +all: checksums docs rsc + +checksums: checksums.json + +checksums.json: contrib/checksums.sh $(ALL_RSC) + contrib/checksums.sh > $@ + +docs: $(HTML) %.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh $< > $@ +rsc: $(GEN_RSC) + %.capsman.rsc: %.template.rsc Makefile sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ -e '/^# NOT \/caps-man\/ #$$/,/^# NOT \/caps-man\/ #$$/d' \ @@ -32,8 +42,5 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ -checksums.json: contrib/checksums.sh *.rsc */*.rsc - contrib/checksums.sh > $@ - clean: rm -f $(HTML) checksums.json From edd51ca71905851f4a202ac3129391a8c0615047 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 17:22:30 +0100 Subject: [PATCH 900/988] contrib/html: add a footer with date and version info --- Makefile | 6 +++++- contrib/html.sh | 5 ++++- contrib/html.sh.d/foot.html | 4 ++++ general/style.css | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 contrib/html.sh.d/foot.html diff --git a/Makefile b/Makefile index f841ca2b..ecb25bc9 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,10 @@ GEN_RSC := $(wildcard *.capsman.rsc *.local.rsc *.wifi.rsc) MARKDOWN := $(wildcard *.md doc/*.md doc/mod/*.md) HTML := $(MARKDOWN:.md=.html) +DATE ?= $(shell date --rfc-email) +VERSION ?= $(shell git symbolic-ref --short HEAD 2>/dev/null)/$(shell git rev-list --count HEAD 2>/dev/null)/$(shell git rev-parse --short=8 HEAD 2>/dev/null) +export DATE VERSION + .PHONY: all checksums docs rsc clean all: checksums docs rsc @@ -19,7 +23,7 @@ checksums.json: contrib/checksums.sh $(ALL_RSC) docs: $(HTML) -%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html +%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh.d/foot.html contrib/html.sh $< > $@ rsc: $(GEN_RSC) diff --git a/contrib/html.sh b/contrib/html.sh index 0b89724a..2fe9ef77 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -18,4 +18,7 @@ markdown -f toc,idanchor "${1}" | sed \ -e '/' +sed \ + -e "s|__DATE__|${DATE:-$(date --rfc-email)}|" \ + -e "s|__VERSION__|${VERSION:-unknown}|" \ + < "${0}.d/foot.html" diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html new file mode 100644 index 00000000..106c2bd0 --- /dev/null +++ b/contrib/html.sh.d/foot.html @@ -0,0 +1,4 @@ + +

RouterOS Scripts documentation generated on __DATE__ for __VERSION__

+ + diff --git a/general/style.css b/general/style.css index 018ccc49..73b09214 100644 --- a/general/style.css +++ b/general/style.css @@ -43,6 +43,10 @@ img.logo { float: left; border-radius: 50%; } +p.foot { + color: #777; + text-align: center; +} p.heading { margin: 0px; font-weight: bold; From 82587ec589b7c9f6a1639d05f002ad18c8540192 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:21:51 +0100 Subject: [PATCH 901/988] contrib/html: add copyright notice in footer --- contrib/html.sh.d/foot.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html index 106c2bd0..d3041520 100644 --- a/contrib/html.sh.d/foot.html +++ b/contrib/html.sh.d/foot.html @@ -1,4 +1,5 @@ -

RouterOS Scripts documentation generated on __DATE__ for __VERSION__

+

RouterOS Scripts documentation generated on __DATE__ for __VERSION__
+Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

From f3afee3e4b29068847d1713fe6c1689620ce4d8d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 23:03:58 +0100 Subject: [PATCH 902/988] fw-addr-lists.d/{allow,block}: use short url rsc.eworm.de --- fw-addr-lists.d/allow | 2 +- fw-addr-lists.d/block | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.d/allow b/fw-addr-lists.d/allow index 8b59ed7c..f0239cde 100644 --- a/fw-addr-lists.d/allow +++ b/fw-addr-lists.d/allow @@ -1,3 +1,3 @@ # an ip address list for use with fw-addr-lists script -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md git.eworm.de diff --git a/fw-addr-lists.d/block b/fw-addr-lists.d/block index 5e9fef29..86a6c626 100644 --- a/fw-addr-lists.d/block +++ b/fw-addr-lists.d/block @@ -1,5 +1,5 @@ # an ip address list for use with fw-addr-lists script -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md # example.net 93.184.216.34 From d12be8f1ac000af5126c223f22b96b56916fc682 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 23:05:56 +0100 Subject: [PATCH 903/988] fw-addr-lists.d/allow: use rsc.eworm.de in the list --- fw-addr-lists.d/allow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.d/allow b/fw-addr-lists.d/allow index f0239cde..8c4ca3c7 100644 --- a/fw-addr-lists.d/allow +++ b/fw-addr-lists.d/allow @@ -1,3 +1,3 @@ # an ip address list for use with fw-addr-lists script # https://rsc.eworm.de/doc/fw-addr-lists.md -git.eworm.de +rsc.eworm.de From 4935c81bd9fe73dba6f55d2acdc8ad23c19d8875 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:18:36 +0100 Subject: [PATCH 904/988] contrib/template-capsman: split off from Makefile --- Makefile | 7 ++----- contrib/template-capsman.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-capsman.sh diff --git a/Makefile b/Makefile index ecb25bc9..14aab088 100644 --- a/Makefile +++ b/Makefile @@ -28,11 +28,8 @@ docs: $(HTML) rsc: $(GEN_RSC) -%.capsman.rsc: %.template.rsc Makefile - sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ - -e '/^# NOT \/caps-man\/ #$$/,/^# NOT \/caps-man\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.capsman.rsc: %.template.rsc contrib/template-capsman.sh + contrib/template-capsman.sh $< > $@ %.local.rsc: %.template.rsc Makefile sed -e '/\/caps-man\//d' -e '/\/interface\/wifi\//d' -e 's|%TEMPL%|.local|' \ diff --git a/contrib/template-capsman.sh b/contrib/template-capsman.sh new file mode 100755 index 00000000..5771b53c --- /dev/null +++ b/contrib/template-capsman.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/interface\/wifi\//d' \ + -e '/\/interface\/wireless\//d' \ + -e 's|%TEMPL%|.capsman|' \ + -e '/^# NOT \/caps-man\/ #$/,/^# NOT \/caps-man\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From c6451c87f1cfb3f707822fb481f09b869f4ba84f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:53:31 +0100 Subject: [PATCH 905/988] general/style: make the blockquote darker --- general/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index 73b09214..ea9b1118 100644 --- a/general/style.css +++ b/general/style.css @@ -18,7 +18,7 @@ a:hover { blockquote { border-left: 4px solid #ccc; padding: 0 10px; - color: #777; + color: #555; } code { margin: 0 2px; From 05f08381190c560aca16895197910be08a53db23 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:23:02 +0100 Subject: [PATCH 906/988] README: install from rsc.eworm.de --- README.d/01-download-certs.avif | Bin 4890 -> 1869 bytes README.d/04-import-scripts.avif | Bin 3782 -> 3932 bytes README.d/07-edit-global-config-overlay.avif | Bin 5103 -> 5161 bytes README.md | 4 ++-- global-config-overlay.rsc | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index d41ca0595fa2f6b2ca1eaf3a94e34244d46e017a..0532ec3addc1b174c13c5edd6acc1294dbf36666 100644 GIT binary patch delta 1661 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 diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index 53439e4e5f832c7cd7e8a424f1b70e471ac8e31a..a5cfa7bf46733ae385e5cb9c8cc55364724c0b2d 100644 GIT binary patch delta 3727 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 diff --git a/README.d/07-edit-global-config-overlay.avif b/README.d/07-edit-global-config-overlay.avif index f87fda88e60281d3b0c4a2cb301025832c2bf8de..5b9c0a6952a9a5a411ebb70e607a26d3f19bf942 100644 GIT binary patch delta 4703 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 delta 4645 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 b-ISb_DgD!KOtbL*N&uA}Yt=~bR1)#28+8JP diff --git a/README.md b/README.md index 59c695e7..f33c2a29 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem"; + /tool/fetch "https://rsc.eworm.de/main/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem"; ![screenshot: download certs](README.d/01-download-certs.avif) @@ -125,7 +125,7 @@ date and time is set correctly! Now let's download the main scripts and add them in configuration on the fly. - :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . ".rsc") output=user as-value]->"data"); }; + :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value]->"data"); }; ![screenshot: import scripts](README.d/04-import-scripts.avif) diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 9afacebd..88bb4d99 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -6,7 +6,7 @@ # https://rsc.eworm.de/#editing-configuration # Copy relevant configuration from global-config, paste and modify it here. -# https://rsc.eworm.de/global-config.rsc +# https://rsc.eworm.de/main/global-config.rsc # End of global-config-overlay From 54612e333fe72a7fb329f11cf543e87cec80479e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:21:39 +0100 Subject: [PATCH 907/988] contrib/template-local: split off from Makefile --- Makefile | 7 ++----- contrib/template-local.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-local.sh diff --git a/Makefile b/Makefile index 14aab088..b90002d9 100644 --- a/Makefile +++ b/Makefile @@ -31,11 +31,8 @@ rsc: $(GEN_RSC) %.capsman.rsc: %.template.rsc contrib/template-capsman.sh contrib/template-capsman.sh $< > $@ -%.local.rsc: %.template.rsc Makefile - sed -e '/\/caps-man\//d' -e '/\/interface\/wifi\//d' -e 's|%TEMPL%|.local|' \ - -e '/^# NOT \/interface\/wireless\/ #$$/,/^# NOT \/interface\/wireless\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.local.rsc: %.template.rsc contrib/template-local.sh + contrib/template-local.sh $< > $@ %.wifi.rsc: %.template.rsc Makefile sed -e '/\/caps-man\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.wifi|' \ diff --git a/contrib/template-local.sh b/contrib/template-local.sh new file mode 100755 index 00000000..bc5b3272 --- /dev/null +++ b/contrib/template-local.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/caps-man\//d' \ + -e '/\/interface\/wifi\//d' \ + -e 's|%TEMPL%|.local|' \ + -e '/^# NOT \/interface\/wireless\/ #$/,/^# NOT \/interface\/wireless\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From 0b7528db99cbb6aa943ddc83498ced13bb0dc013 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 17:07:01 +0100 Subject: [PATCH 908/988] contrib/logo-color: place screenshots below each other... ... not side by side. --- contrib/logo-color.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 3aca3248..2c4cef6f 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -37,9 +37,9 @@ something that differentiates? Color it!

Then right-click, click "Take Screenshot" and finally select the logo and download it.

-

Screenshot Browser 01 -Screenshot Browser 02 -Screenshot Browser 03

+

Screenshot Browser 01

+

Screenshot Browser 02

+

Screenshot Browser 03

(This example is with Firefox. The workflow From af5f01a9738ec449d4cb28b1f5718c456f1c9a10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:23:37 +0100 Subject: [PATCH 909/988] INITIAL-COMMANDS: install from rsc.eworm.de --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 6e70b66a..787c11e6 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,7 +17,7 @@ Initial commands Run the complete base installation: { - :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local BaseUrl "https://rsc.eworm.de/main/"; :local CertCommonName "ISRG Root X2"; :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; From aeca778284ede7b0c1cc3e64c13f93d502a06b9c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:22:35 +0100 Subject: [PATCH 910/988] contrib/template-wifi: split off from Makefile --- Makefile | 7 ++----- contrib/template-wifi.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-wifi.sh diff --git a/Makefile b/Makefile index b90002d9..fa4cdcb2 100644 --- a/Makefile +++ b/Makefile @@ -34,11 +34,8 @@ rsc: $(GEN_RSC) %.local.rsc: %.template.rsc contrib/template-local.sh contrib/template-local.sh $< > $@ -%.wifi.rsc: %.template.rsc Makefile - sed -e '/\/caps-man\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.wifi|' \ - -e '/^# NOT \/interface\/wifi\/ #$$/,/^# NOT \/interface\/wifi\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.wifi.rsc: %.template.rsc contrib/template-wifi.sh + contrib/template-wifi.sh $< > $@ clean: rm -f $(HTML) checksums.json diff --git a/contrib/template-wifi.sh b/contrib/template-wifi.sh new file mode 100755 index 00000000..5e297d9e --- /dev/null +++ b/contrib/template-wifi.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/caps-man\//d' \ + -e '/\/interface\/wireless\//d' \ + -e 's|%TEMPL%|.wifi|' \ + -e '/^# NOT \/interface\/wifi\/ #$/,/^# NOT \/interface\/wifi\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From ce37544baeb55390e65eceee1c6571e4cea26b41 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 12:18:38 +0100 Subject: [PATCH 911/988] contrib/logo-color: drop width & height properties for images --- contrib/logo-color.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 2c4cef6f..55169641 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -37,9 +37,9 @@ something that differentiates? Color it!

Then right-click, click "Take Screenshot" and finally select the logo and download it.

-

Screenshot Browser 01

-

Screenshot Browser 02

-

Screenshot Browser 03

+

Screenshot Browser 01

+

Screenshot Browser 02

+

Screenshot Browser 03

(This example is with Firefox. The workflow From fa9c4be576d2de88bf5c95b713abb8b1e03f6480 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:25:18 +0100 Subject: [PATCH 912/988] doc/mod/scriptrunonce: get script from rsc.eworm.de --- doc/mod/scriptrunonce.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 955d12ed..1fbb697f 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -48,7 +48,7 @@ Usage and invocation The function `$ScriptRunOnce` expects an URL (or name if `ScriptRunOnceBaseUrl` is given) pointing to a script as parameter. - $ScriptRunOnce https://git.eworm.de/cgit/routeros-scripts/plain/doc/mod/scriptrunonce.d/hello-world.rsc; + $ScriptRunOnce https://rsc.eworm.de/main/doc/mod/scriptrunonce.d/hello-world.rsc; ![ScriptRunOnce](scriptrunonce.d/scriptrunonce.avif) From 93eb218589cbaa0c567b0acbeb463d75543ed826 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 15:30:30 +0100 Subject: [PATCH 913/988] global-functions: $FetchUserAgentStr: add commit info in user agent string --- global-functions.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 48aaf7fb..dccb8b6e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -539,10 +539,16 @@ :set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; + :global CommitId; + :global CommitInfo; + + :global IfThenElse; + :local Resource [ /system/resource/get ]; - :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . \ - $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); + :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . $Resource->"architecture-name" . \ + " " . $Caller . "/Fetch (https://rsc.eworm.de/" . [ $IfThenElse ($CommitId != "unknown") \ + ("; " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . ")"); } # check for existence of file, optionally with type From b285f2c5d291513f11e8a8f6fd26b316c2cfc8ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 19:48:02 +0100 Subject: [PATCH 914/988] global-functions: add and fix global scheduler automatically... ... and also adjust README and INITIAL-COMMANDS. --- INITIAL-COMMANDS.md | 3 --- README.d/05-run-and-schedule-scripts.avif | Bin 1946 -> 0 bytes README.d/05-run-scripts.avif | Bin 0 -> 1801 bytes README.md | 6 +++--- global-functions.rsc | 9 +++++++++ 5 files changed, 12 insertions(+), 6 deletions(-) delete mode 100644 README.d/05-run-and-schedule-scripts.avif create mode 100644 README.d/05-run-scripts.avif diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 787c11e6..374f7165 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -45,9 +45,6 @@ Run the complete base installation: }; :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; - :put "Scheduling to load configuration and functions..."; - /system/scheduler/remove [ find where name="global-scripts" ]; - /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={ :put "Renaming certificate by its common-name..."; :global CertificateNameByCN; diff --git a/README.d/05-run-and-schedule-scripts.avif b/README.d/05-run-and-schedule-scripts.avif deleted file mode 100644 index 37e1173f13037180a42ff7451fdd8bac7728211f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1946 zcmXv|2{_by7ao$eCd(wt7ly$|Vk}v&XplV_jHon&(ccX7Czq5k;o7$l*H)IS4IzY# zE&DbZMAqzkK1tM9zTrOi{GQ+Yp7XxvIp;ti5D9{hKZx@M2oPo*u?Ijvc>p+qg+5B3 zDeZW;`rwW{W+3mmki7p%ArKI7_W3tIViJJ=cMKE+d_0al7AA@TB(n2SWdMP&Fy9eE zSVSNY_F!g?1OU(D-N%jyvv6f)%10H>R|$nClgP&_-2u=WWa?%B=uBoZ47d-v9yLNB zClE|fWqw`|cmNzLoSd9YK85o|p(zqa3Piw}O!D@0COu$IKK;+?a{%apJ2sCGV`E_r zVPjqu;o*Yw;fHW@X-IqPjOn5E^Od(xnRl^Gh7=&M-=B?nuB=++KIK!*zj-nuZ`T(R zb?!7L)>2A*Bhmb_+KJlDU!)ArQ;6sdjl?MLjWVMlQ?a)qYD*%M@XzRZeHo!~sMR$? zJ^Dw5vuDC5lUYDoRuXx)rccKJmTg1(08KAPUSEG~yCNY%aVTl#`0jsWOEkPW%rJB) zqo#89{MixivjrR-$t3F53?h=Fibus;smz;&)c?Yxb|cV1+)hIat2lL6I(K>%%3skG zrTy|0sp9ovJo{?wT#?gs$553HT`9d7lOoI;F-_CT8zD(J*SNi(?7AqE&`+nzgu-4o z&PFh@GxA%Dv=x(tC+(?JFGk-u`$2OToZitfTWzar@^!{sVMs-kbWN-bUYSfUYzKLe z+;dTZv=H2Ko7(J3hJRL&+3V5y;y-z|2k!DHwxP7?RC4qNS^7T5NB=hy)pd`IHv|vI zf|FwFPe5+b3bLCTdieYTUi{UoZZxjd0Poj&;i%3EK19;2(Kie5|V8;|{^X8EPZmvedw-&?VkI`Ct*t{9KR_iOI$ zxBqBqc$sr5I8!S?Mr3NaY!1ifg6 z<%Xvf4MUyc&tH8edBz{^V@kA~r2GuDQKIQqb9ou+oY_n(nX~EDeAQ7gqkAH3YT1qL zohG=IK{+smMFwDO*Fq+w@5sAq`pp)Fw%+=4OvfhVtnB_0NFZM2CL*3~^R`$D#U|=O z8?8*{!B0`8DTKc!deUBVQ6OQPt%~$>nko| zpRYyyPc&ygdzG#vVPQANS1SZ<`Q?@$r8h-(TTzbOK}H;{n$vv80LxMSyZvyEpd?YVo!o2R{>Ex$%ym{+5B)H+JwG5EV;37#Iqu#1! zvdN9auvJfG`{v}9!@kT9keUB(S=AevjkkqK!$PDkz%gxdpkX~5^;h201&r4F_Btv~ z+YERyu*ep>)&sv<7h!=PZi*BX8b}?-#fXbEE4@uO|KJqt4$t06_zfEz2-ihyHEfqE z#~6erZ?>y^V{IF3ety=KG#MO?H}jUbLi9of?Nap;yBvpmoEXBX5FH1Y^_y$o;gnv7 zCCSe@(`mt17>*#klDGvQ5!2l)4f47Po466v!I5)sssh2fp$br%@k zYT^M~2tlx@E2gs-kEiz$7aQVqvrz|xh28Nhp(L_up&cWIL%(f7whMdd_n@u|^^bgA zM&boC>sdzHA+?yazT{)xr<1(7bA8}qP&uj^$%0A{ksq{gM{bak&9-{{^f?7_&VFc^>x)WdiIJ}K(QIFzv*=i78)ovVJ&{| zaziB_X8q}Gyc~~ltAl$01F`kyBbYoy$Qs!Vy3d|ZA JV`^E{{(m}8biDuo diff --git a/README.d/05-run-scripts.avif b/README.d/05-run-scripts.avif new file mode 100644 index 0000000000000000000000000000000000000000..e3b8b8b424f0502cc08fc7932742e97aa50ce7f5 GIT binary patch literal 1801 zcmXw02{hZ;7Y-t$mWq9-oz9?^A~Cha+Of2jv8$yLOZ#gQ(jX17WYDHn6=K?A>{^tm zMxs=Vt+m%yTQStw1{I2GX!$eYf9AgP?)TmAyXW0|&I5r!%3)D4I3xiG199URu|SwU z7C?qMS?ODGr8R756!O^PhRXF24F3NV1i}HqQUCG(@H7sH!k!d7+^h&-B7%=ATM&qc zdyX@RM*;-m=Ww|O0EC|mJ#pl?MJVraGq(pxIInLLfr&VobpycRaa{cpfD4Y`q9hQB z3q5WGf%w$93C6up96$t46afJNE(#+F`Zm8RA1fe<;0O#pJQzddzAOTQkhzi!fWsn> zJ#KIp1M~1EgSlHBVndKo;vhlDg|m3G33Y>2q08Oi>EtqX@8$CN;ytqxuaWA|m4u!p zLes+#NA#u4W$Epyxa`weqjc-B=lv7myTFQ>JS$~7x5 zd-Q3#-~IHVi7)bUi%6%`@PVBxdm-VOO2-AtiVP}gmzh>4Z}dXLR*pC=hIpACIeBe& zNLqtdtR~&}_%SYk-_t^AY4ZFd79**~jw+iQcMr=$|81=eEhNmL>BJ*!{Ow9S)-+t!cOQKXHpJ=_+Ap?|4~|gB=t%^<6P@S+yH6eg)?;&{3dp_1%}qG zd_OkrCF&R1n2~xl?VJp`rbU|Yj zh(5KVdcR&K^%3Su$yu#bPMoF+H3L{jT7vZs1|eg4MLVB|&Bv9psvXFWeGKu7{p7L~ zw`eBH^G@}5_&0m@578XhBFl7f0|_Na=Aq8*9msJY0GA_XU4NRcp@}H zZ_{{{?>!Vm=tbNL`gy1!`FE7Vw!%qu+S8zc?-6Sc0E#|n}7aC^jb_Ynr2^YZC#v`IPKr}Ptk^| z?Yxu}wc_V1oZ$=#FJEbOhMoaFduTAu7MwigV=pS2=6CQnm z&Q41!ipn+kKrzde@u0s8>ZQ&qJ~g&8C=kAH5~u#n+N*GaBhJxYT54hGJ@qA;2K?#V zAgmn`cPF`=y0=!=Z1hw4yWL2J`^OAsMeuBq-Z}Q>tEe-J033c^dfJ0RnTi{EPAo;CE4Y9d#-+yJTKDD z3(eZ?Y=}`xXB{crznIg{-s~U+R~s>yr~bE(s9el^J=P|tRqC<5H+Gv>=qTN~Za@&z z1Ibxw*R{{{y&YRd`m(fMr@cdxfJzzJ+tPf-n8Q5T_4%6;V+38k7hA~>Ovh*_>HeVl zmk0cf2z%vgR*n?s{B*bk&|VgQCeX*cyAp5FAe-)qyg{r>XDBAgl4ew?3Xnlw$n?#9 zduy}YZbNO3|G5<0i0i$!Wld$mNS91&=ktwJ#ugqel)k6~FNK+)2Z!htn~84=)4Cc_ z_jPgcEM}~5AHJ7A>edW>Tk5uU?q@e*@Jnzp!!ZTJt^%7(Z(Rp#JGY$$1nD(KYiHNel9?bC=0rgh23|m9G+V(`24{D{rZw@ zwrEUHvf`2GV$rbJ5MgI0N`d<6aVYzVB)p5{2(?{ks1X0Gbhlad>)Mo;7|X6dE9KN* zffQ=PMCG<+_6MSG&Xk_G;p=rP2yfEdh~_(Wwk6H55Z< f0rP^B=6p`ZLaprrjEG=8GH{uaQqby)Bxw8#n%yM% literal 0 HcmV?d00001 diff --git a/README.md b/README.md index f33c2a29..e3165a3b 100644 --- a/README.md +++ b/README.md @@ -129,12 +129,12 @@ Now let's download the main scripts and add them in configuration on the fly. ![screenshot: import scripts](README.d/04-import-scripts.avif) -And finally load configuration and functions and add the scheduler. +And finally run configuration and functions. This will also add the +scheduler for loading at system startup automatically. /system/script { run global-config; run global-functions; }; - /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; -![screenshot: run and schedule scripts](README.d/05-run-and-schedule-scripts.avif) +![screenshot: run scripts](README.d/05-run-scripts.avif) > 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the > RouterOS on your device is too old. Check for updates! diff --git a/global-functions.rsc b/global-functions.rsc index dccb8b6e..db9eac6b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1900,6 +1900,15 @@ } } +# add (and fix) global scripts scheduler +:local OnEvent "/system/script { run global-config; run global-functions; }"; +:if ([ :len [ /system/scheduler/find where name="global-scripts" ] ] = 0) do={ + /system/scheduler/add name="global-scripts" start-time=startup; +} +:if ([ /system/scheduler/get "global-scripts" on-event ] != $OnEvent) do={ + /system/scheduler/set "global-scripts" on-event=$OnEvent; +} + # Log success :local Resource [ /system/resource/get ]; $LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \ From 638258000beb96722056f5a52b9b7fad2ba59180 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 19:34:10 +0100 Subject: [PATCH 915/988] contrib/commitinfo: support updating the commit info --- Makefile | 6 +++++- contrib/commitinfo.sh | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100755 contrib/commitinfo.sh diff --git a/Makefile b/Makefile index fa4cdcb2..2e3ba0d7 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ DATE ?= $(shell date --rfc-email) VERSION ?= $(shell git symbolic-ref --short HEAD 2>/dev/null)/$(shell git rev-list --count HEAD 2>/dev/null)/$(shell git rev-parse --short=8 HEAD 2>/dev/null) export DATE VERSION -.PHONY: all checksums docs rsc clean +.PHONY: all checksums commitinfo docs rsc clean all: checksums docs rsc @@ -21,6 +21,10 @@ checksums: checksums.json checksums.json: contrib/checksums.sh $(ALL_RSC) contrib/checksums.sh > $@ +commitinfo: global-functions.rsc + contrib/commitinfo.sh $< > $<~ + mv $<~ $< + docs: $(HTML) %.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh.d/foot.html diff --git a/contrib/commitinfo.sh b/contrib/commitinfo.sh new file mode 100755 index 00000000..21faf9fc --- /dev/null +++ b/contrib/commitinfo.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +sed \ + -e "/^:global CommitId/c :global CommitId \"${COMMITID:-unknown}\";" \ + -e "/^:global CommitInfo/c :global CommitInfo \"${COMMITINFO:-unknown}\";" \ + < "${1}" From 903a3f44a0b14cee3fb150aeea5c8f807b8626a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:31:36 +0100 Subject: [PATCH 916/988] contrib/html: support click on code block to copy to clipboard --- contrib/html.sh | 2 ++ contrib/html.sh.d/head.html | 1 + general/clipboard.js | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 general/clipboard.js diff --git a/contrib/html.sh b/contrib/html.sh index 2fe9ef77..39589dac 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -10,12 +10,14 @@ sed \ -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ + -e "s|__CLIPBOARD__|$(realpath --relative-to="${RELTO}" general/clipboard.js)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ -e '//s|pre|pre onclick="CopyToClipboard(this)"|g' \ -e '/The above link may be broken on code hosting sites/s|blockquote|blockquote style="display: none;"|' sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index da541579..861a87b8 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -3,6 +3,7 @@ RouterOS Scripts :: __TITLE__ + diff --git a/general/clipboard.js b/general/clipboard.js new file mode 100644 index 00000000..fceff85e --- /dev/null +++ b/general/clipboard.js @@ -0,0 +1,4 @@ +/* copy code to clipboard */ +function CopyToClipboard(element) { + navigator.clipboard.writeText(element.firstElementChild.innerHTML); +} From a61fbfb75ce42f5341ceb0bcbb521793c6f7f514 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:53:30 +0100 Subject: [PATCH 917/988] =?UTF-8?q?general/style:=20add=20a=20"?= =?UTF-8?q?=F0=9F=93=8B=20Copy!"=20hint=20to=20code=20blocks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- general/style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/general/style.css b/general/style.css index ea9b1118..191c0f65 100644 --- a/general/style.css +++ b/general/style.css @@ -69,6 +69,12 @@ pre code { padding: 0; border: 0; } +pre::before { + content: "📋 Copy!"; + float: right; + border: 1px solid #ccc; + border-radius: 3px; +} span.link { color: #863600; } From 4f778cb1c608e384bf75de267bdf9b7ea1facf00 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 16:38:27 +0100 Subject: [PATCH 918/988] general/clipboard: add a visual feedback --- general/clipboard.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/general/clipboard.js b/general/clipboard.js index fceff85e..30c31346 100644 --- a/general/clipboard.js +++ b/general/clipboard.js @@ -1,4 +1,8 @@ /* copy code to clipboard */ function CopyToClipboard(element) { + element.style.filter = 'invert(1)'; navigator.clipboard.writeText(element.firstElementChild.innerHTML); + setTimeout(function() { + element.style.filter = 'invert(0)'; + }, 100); } From ed9dee3c5f4c45da17d67fb685436d563c929ff0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 11:03:02 +0100 Subject: [PATCH 919/988] contrib/html: simplify handling of relative paths --- contrib/html.sh | 7 ++----- contrib/html.sh.d/head.html | 10 +++++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/contrib/html.sh b/contrib/html.sh index 39589dac..098ba467 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -6,11 +6,8 @@ RELTO="$(dirname "${1}")" sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ - -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ - -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ - -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ - -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ - -e "s|__CLIPBOARD__|$(realpath --relative-to="${RELTO}" general/clipboard.js)|" \ + -e "s|__GENERAL__|$(realpath --relative-to="${RELTO}" general/)|" \ + -e "s|__ROOT__|$(realpath --relative-to="${RELTO}" ./)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 861a87b8..656a63c0 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,14 +1,14 @@ RouterOS Scripts :: __TITLE__ - - - + + +
- - + +
eworm on meadowQR code: rsc.eworm.deeworm on meadowQR code: rsc.eworm.de RouterOS Scripts
a collection of scripts for MikroTik RouterOS
From e10455fb18ee82480fc5e115a658c356f1e806ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 13:17:17 +0100 Subject: [PATCH 920/988] contrib/static-html: split off from Makefile --- contrib/Makefile | 7 ++----- contrib/logo-color.html | 2 +- contrib/notification.html | 2 +- contrib/static-html.sh | 8 ++++++++ 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100755 contrib/static-html.sh diff --git a/contrib/Makefile b/contrib/Makefile index cdb9f4cd..f7043785 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -6,8 +6,5 @@ HTML := $(wildcard *.html) all: docs -docs: $(HTML) - sed -i \ - -e '/href=/s|\.md|\.html|' \ - -e '/blockquote/s|/\*! display \*/|display: none;|' \ - $(HTML) +docs: static-html.sh $(HTML) + ./static-html.sh $(HTML) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 55169641..a45ea93e 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -18,7 +18,7 @@

⬅️ Go back to main README

-

💡️ Hint: This site or links +

💡️ Hint: This site or links on it may be broken on code hosting sites. Use Logo Color Changer instead.

diff --git a/contrib/notification.html b/contrib/notification.html index 902d328f..a618f229 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -18,7 +18,7 @@

⬅️ Go back to main README

-

💡️ Hint: This site or links +

💡️ Hint: This site or links on it may be broken on code hosting sites. Use Notification Generator instead.

diff --git a/contrib/static-html.sh b/contrib/static-html.sh new file mode 100755 index 00000000..2c6f595c --- /dev/null +++ b/contrib/static-html.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +sed -i \ + -e '/href=/s|\.md|\.html|' \ + -e '/blockquote/s|/\* display \*/|display: none;|' \ + "${@}" From a64e9bed80fbe7c2da5be5034732ca1b87ca06fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 18:53:29 +0100 Subject: [PATCH 921/988] contrib/static-html: find static html files by comment --- contrib/Makefile | 2 +- contrib/logo-color.html | 1 + contrib/notification.html | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index f7043785..9417af34 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -1,6 +1,6 @@ # Makefile -HTML := $(wildcard *.html) +HTML := $(shell grep -xl '' *.html) .PHONY: all docs diff --git a/contrib/logo-color.html b/contrib/logo-color.html index a45ea93e..1d67b4ec 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -1,4 +1,5 @@ + RouterOS Scripts :: Logo Color Changer diff --git a/contrib/notification.html b/contrib/notification.html index a618f229..248565db 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -1,4 +1,5 @@ + RouterOS Scripts :: Notification Generator From e0b12a9050eeb1c231ace3b5b5186b34514e563d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 19:01:39 +0100 Subject: [PATCH 922/988] contrib/static-html: add badges --- contrib/Makefile | 5 ++++- contrib/badges.md | 6 ++++++ contrib/logo-color.html | 2 ++ contrib/notification.html | 2 ++ contrib/static-html.sh | 2 ++ 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 contrib/badges.md diff --git a/contrib/Makefile b/contrib/Makefile index 9417af34..ef0e41dc 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -6,5 +6,8 @@ HTML := $(shell grep -xl '' *.html) all: docs -docs: static-html.sh $(HTML) +badges.html: badges.md + markdown $< > $@ + +docs: static-html.sh $(HTML) badges.html ./static-html.sh $(HTML) diff --git a/contrib/badges.md b/contrib/badges.md new file mode 100644 index 00000000..24bd2055 --- /dev/null +++ b/contrib/badges.md @@ -0,0 +1,6 @@ +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 1d67b4ec..84365a64 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -17,6 +17,8 @@

Logo Color Changer

+ +

⬅️ Go back to main README

💡️ Hint: This site or links diff --git a/contrib/notification.html b/contrib/notification.html index 248565db..a0580bd3 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -17,6 +17,8 @@

Notification Generator

+ +

⬅️ Go back to main README

💡️ Hint: This site or links diff --git a/contrib/static-html.sh b/contrib/static-html.sh index 2c6f595c..7acf1041 100755 --- a/contrib/static-html.sh +++ b/contrib/static-html.sh @@ -5,4 +5,6 @@ set -e sed -i \ -e '/href=/s|\.md|\.html|' \ -e '/blockquote/s|/\* display \*/|display: none;|' \ + -e '//r badges.html' \ + -e '//d' \ "${@}" From 70675a9feea715d9e3618f80011d948f222ac35a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 19:18:43 +0100 Subject: [PATCH 923/988] contrib/Makefile: add target clean --- contrib/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index ef0e41dc..e755a1d5 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -2,7 +2,7 @@ HTML := $(shell grep -xl '' *.html) -.PHONY: all docs +.PHONY: all docs clean all: docs @@ -11,3 +11,7 @@ badges.html: badges.md docs: static-html.sh $(HTML) badges.html ./static-html.sh $(HTML) + +clean: + rm -f badges.html + git checkout HEAD -- $(HTML) From b97a434a9c0c59d9d2b0cc8e3856f243f52de8eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 08:21:36 +0100 Subject: [PATCH 924/988] Makefile: also clean contrib --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2e3ba0d7..5db0a303 100644 --- a/Makefile +++ b/Makefile @@ -43,3 +43,4 @@ rsc: $(GEN_RSC) clean: rm -f $(HTML) checksums.json + make -C contrib/ clean From 725eb834f439d3c7051a819caaa4eebcdedce06d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 10:58:37 +0100 Subject: [PATCH 925/988] README: link the long way in detail --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3165a3b..8ae5b421 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,8 @@ Initial setup If you know how things work just copy and paste the [initial commands](INITIAL-COMMANDS.md). Remember to edit and rerun `global-config-overlay`! -First time users should take the long way below. +First time users should take [the long way in detail](#the-long-way-in-detail) +below. ### Live presentation From 30743c0e87e385b5310d304bcc0ba46f02f05a11 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:03:33 +0100 Subject: [PATCH 926/988] README: mention broken installation for initial commands --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ae5b421..bdb06e1f 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ Initial setup ### Get me ready! If you know how things work just copy and paste the -[initial commands](INITIAL-COMMANDS.md). Remember to edit and rerun +[initial commands](INITIAL-COMMANDS.md). These also support fixing an +existing but broken installation. Remember to edit and rerun `global-config-overlay`! First time users should take [the long way in detail](#the-long-way-in-detail) below. From 2feaaf36b2725dbdd3dcbfb43538c23a175267da Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:05:27 +0100 Subject: [PATCH 927/988] README: highlight the long way for first time users with hint --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bdb06e1f..39404a9f 100644 --- a/README.md +++ b/README.md @@ -58,8 +58,9 @@ If you know how things work just copy and paste the [initial commands](INITIAL-COMMANDS.md). These also support fixing an existing but broken installation. Remember to edit and rerun `global-config-overlay`! -First time users should take [the long way in detail](#the-long-way-in-detail) -below. + +> 💡️ **Hint**: First time users should take +> [the long way in detail](#the-long-way-in-detail) below. ### Live presentation From fa64e8906bfa1f3f9bfdfcbc235fabef7076cf3b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:53:27 +0100 Subject: [PATCH 928/988] contrib/logo-color: add the copyright notice in footer --- contrib/logo-color.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 84365a64..e5bfb71e 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -56,4 +56,7 @@ a profile photo for your Telegram bot.

⬅️ Go back to main README
⬆️ Go back to top

+ +

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+ From 8a904dadf4cebe4a018b6c52140faba222ed5b80 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:53:55 +0100 Subject: [PATCH 929/988] contrib/notification: add the copyright notice in footer --- contrib/notification.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index a0580bd3..7a6ada74 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -51,4 +51,7 @@ notification and download it.

⬅️ Go back to main README
⬆️ Go back to top

+ +

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+ From b65f3512d058a8349bf7ce4e6458271e4a9b1029 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 14:01:39 +0100 Subject: [PATCH 930/988] README: add scheduler with start-time=startup --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39404a9f..0aedfcf2 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,7 @@ cleanup add a scheduler entry. $ScriptInstallUpdate dhcp-to-dns,lease-script; /ip/dhcp-server/set lease-script=lease-script [ find ]; - /system/scheduler/add name="dhcp-to-dns" interval=5m on-event="/system/script/run dhcp-to-dns;"; + /system/scheduler/add name="dhcp-to-dns" interval=5m start-time=startup on-event="/system/script/run dhcp-to-dns;"; ![screenshot: setup lease script](README.d/12-setup-lease-script.avif) From 295fa3144a43542cb980794ce359a50de5c5b667 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 13:34:05 +0100 Subject: [PATCH 931/988] README: update screenshots, with terminal window Started xterm with: xterm -xrm 'XTerm.vt100.allowTitleOps: false' -T 'Terminal: rsc.eworm.de' --- README.d/01-download-certs.avif | Bin 1869 -> 2761 bytes README.d/02-import-certs.avif | Bin 3605 -> 2021 bytes README.d/03-check-certs.avif | Bin 8047 -> 5079 bytes README.d/04-import-scripts.avif | Bin 3932 -> 4805 bytes README.d/05-run-scripts.avif | Bin 1801 -> 2388 bytes README.d/06-schedule-update.avif | Bin 2200 -> 3129 bytes README.d/07-edit-global-config-overlay.avif | Bin 5161 -> 6174 bytes README.d/08-apply-configuration.avif | Bin 2437 -> 1842 bytes README.d/09-update-scripts.avif | Bin 1928 -> 2641 bytes README.d/10-install-scripts.avif | Bin 2423 -> 3017 bytes README.d/11-schedule-script.avif | Bin 4113 -> 2991 bytes README.d/12-setup-lease-script.avif | Bin 7642 -> 4230 bytes README.d/13-install-custom-script.avif | Bin 4589 -> 2879 bytes README.d/14-remove-script.avif | Bin 1093 -> 1854 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index 0532ec3addc1b174c13c5edd6acc1294dbf36666..f2afeb545aa1e191f3e9382963bcdc172c40603e 100644 GIT binary patch delta 2533 zcmVVx^@fxj@{ETUPP`QrCg6)u3-=t(%-Q8j7*2ZI~%36X)iBbR8z$VDIPK*vbO z^x?IMK^v@alj9!mVu}?c6+Mc+Vu{}rAvhsDZ_k0ftIrid8S)SsjSUakEpzlRW^>C@@dZbY%E6<>9@0h15HL znGDstbi^J)dO*6pX#N^c3kg$&*X0ic(;O;0AA@yxlJC2kC1cu9exj6Jx$IIAfBqPH zy9jg~WdVYY^( zZF#P@*_44;awdAaA%kjY`(CEwDcq#|Q1!$7+t-MF$wc2gf;Xm1W0Pq zWHxCm@CatL|J^qYB*)sAlY71Zf0`p7D2`x*+FA@JzGnLC6n}$Krp8|Qo&hM_=%GKlivx1U#(%)O_w-3s|=fQhCqFs!Q+VG>null`-lFp9CaW~N!)0MXW*oQIyF zAXddw{VTJM6{>8?<=$LJcJuWxL+AB`!jKR2KzT%Js(e~Apyq>ze_7ZYYHZ#38w+{u z=(OsqgYx|#6FS)lJ%RzQ*v7=!AJ*X)uMGC*{jUNA+(uvUR}rtV30~i)0#D*B@}A`y zkyFRiR9Aw>tgDrML{qXVBh$h^>qbZO?|-8AexTWl6bXhxICnPG7)wtIBh8Q8D)&4s z+qeX-^~cG)U3fK(fB(qDi~o7NqlN<;ydaKn6`2MviU&lR4H|N-a^E)}z9URUYV$?D z&Gdkw5S@~R8IVLei)f0~)zq-jy?Yq@PGgaa>^-M;Z#bD7SWfK-HuO|Bx|H)RFjDun zE*%=Mx&euC`!)55Q>l71M(U9}5Q;0q58$|qI(`B5x{iQmJ&XD1OD(`BYJ`Pkir7ACNLLc%DE5Sj zIA>pYl7D3=f1Y?ZAvc8%J0o7Je&q)lhG^vLzD>sDs@~TiEv;YRBc=)^>OOJzb-a~4 zf{#hlH-V)H-8Y@odk6gZeGcm}-mdQp$4C}eQSXf^(8w!=PMD->6K$EK%Xf&u1Bl}} zM?0#n$bTxXNl3ww8|I8SC8o9r45n>ej?)jBAFq`Ce^~)ABBinoQA`+U;z_e;2Rg}B z%DB%m0^YYD|BCM8U%7NB#fsX(bm<*u)To`U|E*;S=*prm#gbX63O*i8(O|?c0{e$3+HF6^ZY3Vj3&|P; zGCDJqe+~)Em}x1{9I*+?UF472%#9yiJ3#%^8Z1f|M`1g1bKyhn_>jxQHM3T;TRkR2 zE5$Oge>@u$N>b4$)U&Y~3=k1WmR8b2lTk6o8jBEK?^{?Avf7xlHqIgRV>#=|`YfC4ct&MV2_fPKV z@f3NlHW>=5L1V6+681X%=*5XG7I|vN8j-Lx%SVF>s;%m#Y~As}Wi5o6yQqES`fz-7 z8b4m;(LzUj88bmL^ziZRDW)^5iMHOz#&-=63k;%)B<>TL^OZL2r<{YKT#i2XOmpeS ze-%^PNW#=|ETtX1;x;5#Z3*;s=)OGvoHW_?G$}8bQIeAa@oFv)n;p}Paf+P;>Kqr& ze}&CodX0aDy&{F&12w}`ou^}ERltLR9I<4FvS4!&(~0*8cMk;n875S7gWev!#_H}s zDHw~U2EwpeVyDD}evGnxC%7?RrN-NCf4Q`clDtGe;3bW)&m4E}hdy9VAfM@fyn3hR za{&VHYP1WPWIkVHi^NsCs)~(Tyg9v`Uc8Z$=HsTbezkM7A?4qGSY^7uT!atAQzE9q22VjzTF}61mL;7uRY&ii?;1_8xbKkU;3^rvDk`BD*Z2e^c;N zr=%QUEi!Q=GM3Y9WlGV?UHY}HA zr%Og9%T|I4Z_ahT{DaeK(lu!%vs}Q+r04g1#OtG}@fTSQm`a;=ST(7p z|F5!Nc?PM8>AfBQ@f8_{vM-*!iku1ZNIe-^LT3sA=QsxHZ<=+G%%MFOe<@E;cQ0*I zPa$Q)o$Y<}&r~MLQq;lwW@ePn^_H?{uQ5nM8K({xNPTTHUG$O7{CG>_toau)1TWwgsqTu!!g!+>MI-3b zQX)|l&DiY)nI{3nXc>YtPsBA9ru?;i|3kUR(?oHwOuAmeYXjSlC2O|5n delta 1634 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 EV9tqwM*si- literal 3605 zcmbVJc|4SD7k*}8j3xV$otYSln#C3=*_Dbiwn}4cgK02gXtSj(DO*WeY%!LU?1_jW zsmW4yg-A+fN}2=L0F8f3;Z`Lfct^*S_E+i00Bpkn^7o7*CtuZ$b*45uY`Ak6t)FxP79>14Y2<2 z44AfLP<(jc70OdWyni1~^ z)j^=Y`^1AB`iFNSzyLIXwQqHB^)(=7XJu;zUbHqS0IZGx=70b{KZ2i60D(XtkphCk zQX;}aLc;4MBt@l^YGrCiWmc}OEuM@tQ!8 zNTjfku$+j998OJ94fj9W>O(+W0MLejV$}htI0PmRS#1MUz&ZIKYxY|TPbdt|$Bz&| z3JQS*)ndGtfE|Q+G=iLX=QC=Yq$S^6Vchl)s5`s?c?i5@u!C#3kzpN zM8?LQi9dTTAu%mIBlFVbtSi}h`2~fyii(*fmG`QuYijH28(JT=wX-@pA9wZk^}l#I zFgP?kF*)^SdgkryyE*Qs&x>EaE-kNoU!_m!^PSmM+r|d-}DtiJ221<4}4jayt+ZU3ryZCh- zeA@gV`&*lshkx2w`$RygF=l?LA;M~t^xRlH_Ch3+p6gLwSf*8&k-dH zp|+-%Y=lYEM*A-RTKp6Ge)<}On80QIK^N|*1%c+n`O656A2Tqp90 zCA(_M@yL= zRi|`pK4u@ljW#;OT?{ye1{K+5$t=Ur3$Gh+Dpyo13>RX5evFtbUT&dYZWH}_ z$ijm~-u+BJWCzQ19|8~rTJjPxz&}P6fl)P7k?3D5N(yhX7pK6#l#;uie53M`v+nZdnz0IbO_1TlZWixpQOtKG^r}gpgw*)yl4C^Q=?kN ztv9ebz`fkK-7QTfqaEK!HF7!eQk$-xOtL`(qu0;oL|KO|z4AMAw8|yh6}FockZJs) z0@a$D!f(|w7@OKBby+{WGGN$EGwx>9v1{w#QCh~)KxLGy$;l62sGXiUoDV=5 zs$T&G2Z1;4t_rO(zG`B|c4stSwc03<(9-$aF5>l zyfftv%PWhz0sAO$#q3Bui=i|Ny^!RS<}&3WQIFLgv*^;r*=rE4BxC+G3{7*^r6UwbW;GR&?BPQJz z({<1A&y|b%2JYzXq^eH}=-djkuazWVfWVksWM{`uf)Xy0djM0`oB73uX}3f(XZD_u z)y)r>)Y|aC#;eB@hf|M;afIc-QZLjm3=~N}adw)pok=q1%6DwcdvIHEqnI4^R8w`= z3n?iFOW=RS>D3_#KoDuT;gg}hnAmd)Zct#i7j%qZ?m0f*bOC*NzeaUvaZd8Go{DZE zyJA=LoOQpZ@nyN0FZ!bR zm}y2td(r@sHw@Lwz{f$lJ&J=IwpQn{&S#U-D~nW;GohKWbW?%-CiMPl|};;<8U2 z4}DxXy8S2J1Tc;J`Zij6AWfzOm&>xh*x;GR-)DZ({+heZ@}gv(QpdF$YRk8)ux5|4 zw|pM_nOM2f9vrD<<}N#9v;9Xo8*#HI3@H}#KHuix0JVqcmaje#|LOjDVur`-tE^FG zEF>Y*C8cbp{wdx!Q%xgJjHa_GNFx&-w-GR~-`a4?tfBjbo{npGf>6RCR@8;-s_I@( z68x3zC`@wzQ{nf957VDbQ|=C_EJ}Yn!^f$Vr*1aTbV=W;jjnze;wvUnP^|m@tYF*%Y;eTv^u5}` zSqp7P$z!{^7d3%T>=pmg+SI3Awd%nN!3Y$z%a6a8%e1QKPSSCSsACR$pplF9cWz+a zi?@)QOHO+0loeVi-d^^c39CiLp8ip*-Nw{SO6)SP(=9Bpiz!gu-M%kMuYfF&^LCCa zb)*q9TbyyrG+qsz@cnW_;DxXi%p~`3!N=l)*kE~o4>QF z8s>knJZ(1HY!CJ!9~#fD_LuhdRjY6rbv@YnR#uSiKJwj&dmUJCWC}A*gnbS#5p2+& J?(Y4v{4c*$$>0D0 diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 4717b3ea9cc9436ab94be0e471263f601fcf47c8..1f03ad2c01bc115ffec79e9fd3b60259cfcb4e13 100644 GIT binary patch delta 4948 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 SVi<(%h1X<{``P91&U}FF%!w`l literal 8047 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 TzM_&$pcb*RT)gFS!jJy}s&{h% diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index a5cfa7bf46733ae385e5cb9c8cc55364724c0b2d..27380eba1666633b70e4c4fd2746d27ad2f9205b 100644 GIT binary patch delta 4593 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 bgQ?9x$twZ`r0uOWEkTfn#C1|g{lA+$UIXsd delta 3713 zcmV-{4u0{)CEOm6cLEMck$Fc2Bme*aM3Kcve-2S?WMOm?015^;C9*hd5;D9TOk@Jx zG(%$E-oB3{ms2LSbf~M6sV*<)?B*mwLa~`U^Iy2YQ|MIqcn0X=t`?_$d-2*`RhBwx zD3Kv-;sElRgMYegHa}ZI53UDHNw*gtZzxlXkc|taDqqL+j~fF~@W>!+Xy(%s5#E$y ze;MS)nrA#ePoBdov-AXW7z^Xr2zqo&9l%9tmh@KcF9ga}%a{AG4}23Ol-m!Y)PN_v zYrBtu!=rhPcM!pG*ZaAfK?){=M05M=~Wd zV)3ZnXHl_Ut_j5`+_0>54$`7(s2QJuTl^S}(Ta14&5?S=G!`~G7!s;x(4DrR2k-U& z^m=8L!?j|xWHS;%vA4S>7JTAA#qBRjX4Fh28SHXZ>}?*?=|<++=r$mL{}(HJe;VwQ zqLTzH6D{X3s54;AB%6MEvYurdtsNBTRo>7MAW(j&Xqu|KZxc6GC_xA&w|a||QQ;dH zfm7f~s(rXb{pwRIWh8;jHdF{*C-Z-zFz=m`rE}0E;4toG`Tg9q>L`R%dmjIJ-Ik(G z5?N^uD_ojVHC`JiHwovplRm!PfADV#ta%W&l}s1ft5RcE@_%(#zcdv)(p^BQt@FqhkyDJc4RWWiHG@i=>h0Ju7(d})I`d~21Q&lQiWcMz zQa$u<7D>_0{bw{EJKy)ve~Gnh5|W9dk4O~Uf1at|n%Pd(!@EaN={~UO<%hoTL)y25^B+f5a$2T*+JPq~*^v zVx1aPRw&z1-7%aombvb5QCDq#-9e6v*1rqn@#z!aYLd}-E@M{RUF5q$8C(CH+2xcR zGT1#%oacN8Uu{Q14!8!?nvyG+;8=A0PR<+BHocfyMdI;q?j0Az-zcmG#(Cco-@b+0 z&R=#K0!)o}B%7b|f78<{sMPBfw7sJw`jGY7%=z7-MK5UOhXR0R73JfnH&mG@0ohQ} zPlgVKgMwLCl9TwJj8kMwtL{^}K4L;{fN3>U*AH9kNd?6_COZ7-f+sr9J-)V}YWy@R zOW$cIa83S5Mkh;2lRkZ|Gk2JeZbafsXF~KnvD7LtVFv3?e;wNU)unRweyij9ZZ~CK zNB5kw#$jrW$mGlcU5=Ne7*0HTDd&V7o;P{mqYHzok7Nu<3_T zg@HihhX?`df8P*V$MHt`o;pP?4)`lUc21S8dTc4Vu(>M-w{dnG1}$wxyZ*mBLB<3= zpG+JEF~pQ;3R%t_UxsR4oF&Grj4f|r6%Hp}oDf1GKJn;Fz20o?*>|2Y9Lu{uQ_pMl ztuFKF8Sk%%$Dbzup{>CmijBWavO+I!PsY|C-+ZcTf0#pm#E!KEJ2nus+{KWwZxm;@ zVs~f#j@Zeq;C*X;uWu!voPJWNxLN;PxI`z zppBkU>ufFYO&0uv1ZCT}G5D1L3ZMT?!AxzxnV9-d^bQZD8F77}uTxK1TAE$qJ^j9V z4z)odf4bQjLms6bTnOI)sN`vkdM@}b5fldnNiq!#e6uO(Ar{R;Q-w=koBS*#`gM}> zwFh_iAs<(HN>nsc+Oq=S+6maF<^*dJvPtWG&g-6As9iPMC?B#2jH^d#VU-mw*Fb33 zGd~pdf@S{oW-aVU2R2#K3$ixau=iS;op`Yde|SyJDz~q>6Spql@qPkC5>D-#uw>KB^W(<1-!@(yK1d+SfKz#M8k(QJz z1MhIvax4e-lt$dC%}qJ}2z-^-)du5_?>=Y<3FYVH3wx{$%!$WA+D z+h-R75MYI)`cqoF{EaQ>o7{UWFIj_rKFIFC=FR~e-V&~N4G<%fpPLfll>2zfHGVJ> z{-Ul*h0k~&?Y$Kg)#l&5OlstGY&^xs_SEd7-C(Uz=Pvd+LGVJrK=P@b4-RL zF((Wj3uE|6Ao1jQ&*{@>@Sdi;n0o^+nMUh(T<<43Kj|$7p;Tm#0?@eQ=F=e*->It} z65J;G@&)L6BaT9y12Id_zDJ^Ux*lt0?~n7R10j-(0Og9 zsc}!WGJ#010-zNu9|)62xN)XcLWNA1t+9jl^bGELw9gwp9bvRqe_A+fF8lnZb+&|# zDtj4W%Ito|bqn=U>!l&!zKJaUPPBI_Bb-&`6R~E4b>r!tlkt7;3J>4o9evseKQn7% zqiY0LO^E|LcZNy;ICmn8+=7bvgXAFz`_PBuRQKUfSeM-90$mLr`lR}TF|;m9p)A?Wc!pc<;LBHzYnnTT=+UkemAV4&)Rp824WL-3)6vRv~-9=-;`N+Kurhw zHJy{=$o`_W1atE4G#I3U9x_8|Dzwhv$HM@9Dc0fQe;VT_613*~u*QK_8xu{|kyM*| zYK#Gs27cKhw)y>M7M~!(uGa|GknU|NKT~Qk8vz1v*Tv!MzJOqEnyK{0Y@|wmaKUO! zgAbwPrdYCT&KYOo00Eml0pi%KVI~`(;^=HZlyf3L)PL^m_?c|Ao4(CezShz|(ciD- ztS%mHe-U=<52k`*6kylE<}HEGe0gYZ@=Zm`hBP_s41>`+z}`{n_7G zts6<`_xgW35T(i3c~vJ}9BE}9@?lX6@rcAif7qGipT}4z_?VL*vRHhfZu@XCmOlt& z?~sIDcY!;6UX07+ga4Jv_dB=itch2h1?bWo+)6j5gv`@#7RGb4wf1y%)8nG717$UW#Gqyi18+iv6N)5prTfV%`@ZD|)%bidE@Rrx}(hj&4>nZ1@x#F0E# zJ8u2E2?n(NwY@@cM``M3JL&O|>$YTe+Wr!WMOm?015^;C9-;~5;C+9Ok@Js zZY%XFc_7d0#pkGB6Em!S#a)~lh14365SH6M=h720dESb9CGQ_O$MRdJabg8ZZIB&6 zBe+Hv9?KXR;8?SOFH}@&7&L)n6&F^&e-1!jXAfmAMkI(-UOtC}SK ze;vWh{%Z6DeCPh0<<UQ z+M9yU2JZ67Qb?7<8}~LSgu4ejm&s{XWzPGG*KhFTy1N%>_9% zjU*usKCCB%>_Pl{j)-DA9l&zSttn(Ey2-R20qwAw25TCzn$(&MKiN|p2&SG+SZ`N8~P5+*8Rs@qOlXM$+r?04`N7!4~ z+Pmb!v#W|67o98KOdc7-rZ8$*-v1$Z|2=_y zK;pmKWnsOiXR>qB)EN6zdB6Xwz>Novg@xjunYlyVGm6PP)Q3n~63>!Ej$-ux!raoS zdd0I><+uy=&s(ske`%@{j)T&sQvqKer>2*O%_tTS2MAc|mN9nG^1r?Z$n@C3Mlnco zT#WiRymL=0!{muAY)l9KKgLaqRt_@va&Px%oa4tBaFTq}^Us>MD3=t8hGYsQk#Eo2 zO!P3xzw>f_Sossm5}QX@sT*z=N!-;WYzAaH#vL7riLh2ce?JGZHpFjg7b8b)GQ%t{ z7t9D=>lp&OKZZDw#Uz;d+d+I}Ok?}nOuP|{h5|4%>cqsKwO9(CX z);O*YL1b$et*Lwk+p+^@g&|<~oHk+&P=`rva)vao$Pr*xZu2LCQ$(ks>j#ByD*=Yc z+)2!ho$Ve6e@o#$I&RKid+b2DA%n1ka-pg)ZQJu^W#TKBj9DJTu=7d74G#d9%jENI-1E za4lYJatAtQCNFryZ38>ZsL~hi0y=i$A4@lNbj%b=A-ot z=0I{MZ(y(vJbniDIRky}|9>gXy;)4}V2CGke{@*P$DMh!1|h|kFz+v9*XaRJlYsyu z^#V&Mu^vP7NKBNTRfdGLdIp;TC!gsMaKS9%G-?A+7YoKkN7vL>VTzwxXi7c}lE|WL zOBlpYy-IWdmAoY_TxCjO%wS49e_BNcda5Ui6Cw(l{~XjFQl_<0_Cg#KgU(j-1_S}2GwH?99{h0mbfXPJ!2Xa{0A>OsXFSh-0ocyx$* zptjCX0s!~S%C)AWK^?4#Hq!F~w6(YB;mfJGbEM=sU z;sHNAVJ7~t)$D%RBv`j%123JYrCOF|e+>U-dHwmvcOzwWyiSaGQU13ZgKs&lkAGO3 zCH<4o&)sFMz#>BVBK>`p^Op!2>r8NDVqfD+W_zai0S7Y;YC2ikILoc`lm;Eq?41$2 zSFMSb jyj?e1J*E;0T_qISr&$PYTkFY522fdty(5&e=+WmOiue== delta 1566 zcmV+(2I2YC5{V9wcLD|Wk$Fc2Bme*aG?B$fe+B++WMOm?015^;C2~C2Br@p>OvnV> zgQg@`=cj$4_&lOk)2?Oce#zx_y_IB2YfF*m7V_GBm=2SGCTq+1CWD7r3N?w3G`qRa zu)%bFx?dv^V4n2#4lMttDXL6V%qdfd@7}!wb4*=P6A7ATUTBNoh;mvCJLRX-o)*)W#6vVyTkj~SYLiERO} zl#>Eqy*iTt}i*>nTF#G(Ro6j`m+%z~X#*cJyWI_SqT+J{S}RTEW+ zc3JB$*`GRg>wFHZ)=w9PkI z&Ul7^rxSYl*zCkRzwo|Qkg4G{e-Ljk@Hy!N*AM`9%072sM$ox~n_@}w9ni_NIgxE{ z#fOLtK?oW@wj+SZv$@aKWO8D6f9;2o=71fkV%TCFBNZ~R2;H4XZe-b#Soyv(w8ZOp zt!+Nr8P=<45Yd@x%$!Y?F%MUJNv1KWnCz2yl*yO?55eNvetTWXz%*rqP2xZ7Pb{}# z9moaZCu{3@p=**zp+Z8TnSb0|%;uo(B1HQi5LvhaWL7Te%->JD3c%($Dv2tD!K3ua zi#mKH`a)Kp*!B|kEam0Dx-X?!cspIZPPq&$Z+wP>r;qsSroJ{er_uLwvQz4iv#4X= zpf4-z@VImvW_*_cKOV7Kie^ed z3H|#%s^pQv)xjDnqg3+v)rA5J|Bgbo&I)YF2ASx@E=ZhNg?grY_2uohEcAO55EV8^ zM3Pw5v(f>Wx1I14f7Ny_1F!LejXTwnViwI{x3&BQyFN%DXF*DbPMwZ56KTYzeH&g_ zJ;Rbgs)wvMtMf*E_=B99#g&jJSAar;O@JetTeEcRS0gmBYPiNWV7Aa>Ko z7r@4??uxSUa%&5YdKvPy((?5hMi-0^4xEKb2CX$r8hHh}zi_k2Vxe|)o%g7K^SuEs4ey->!- z<>fpIk2Fn(VX{vAMK#^$^ubPYxS1R~y<$^8clttG)|^F|ld*~_9JE|`Z2SK?I#{C? zYt8Ybnlo$`f3_)CaGYfjr3Cng?92(LHJYvpt&PsGXyqB04|!mN9{&&Ipwbc0cJ%ag z9gpvqW$dIBHOG5O5Jcm-s1oxZh`t&5>)KWkx<}2EgbCYThmX0~s`5aX-gsG=+Ak6_ z!tFr@0)pYwDbXbCK$0_`HNo`$F}d}4+F%wGyzvu}e}iH}zexU5her%Z96-W_dEr7D zy##Wio**iZNxGXUoYZ`3XN?kIE$zVjzLEz%u??D%s1ULPy8h_xe@Y%s_`{xh9|WBU zjCKY5y;(gX_t;j)=<$Nw1ISgy@2#CRu%B)sf7v|^uGE6c6=~uM**ybIISatV2(oWu QFMw%G2#188z*%8-C@)+FVE_OC diff --git a/README.d/06-schedule-update.avif b/README.d/06-schedule-update.avif index 7c96f3aa6f71be5f821c1eb1b78ef947e447a330..158e13f53d0d52ead604cd8a4e2bcf62baa190f3 100644 GIT binary patch delta 2927 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 Z1liSMOG(k=UcPsBwJVuijv$~is6Ydpm978) delta 1992 zcmV;(2RHb+7?=@|BMtIxWprTx00000001bFFdPSLX<}h^X=ag3CMwZU4t!&F$kxi+D1H2h^9K6*w9S&5Kz9#uq(*k+P=k#ay_#ovbD*1T*SLou zB4uEI>w?^7Gj9&u?o@wr$?_05q6D}*gWo!!Sw}k{uS zRV;w0Y-m3r&osN`;ph)*Lvrs+$m$|X?8i}m)fc3EWoIydm^V)2(+xL!?^~X%G(W(9 z20?d0b87?>U!Q;LNDH9J!36lcr>|u>WrRb*|I84HNAu6e3bQEgPSS#B2NwE~zdPc- zvc!9k0FfK9YR<`^Xxfo^*Az(zU})+(41olF5+n8Skjbczd4_TVr-c#I*q!R<074KZ zA(7CiNT&ie?Z5Q44zDvqz=h?i-rt#jW@lbQu`1_6g3k+Dl9Hcj6Y>RP6K8Wc-xl#I zC?yUwnh-A8;7yN>LEf7F0knlw?=sKXS7Z|{ESq&GR*s#R&8QI5Cm3yPe261jmhvH+ z%+8{MWk`ND2es3{@4wt$MWc2W9#UqK%7e0(%)}I|a5!q8@gk37NSO!`L;B`_)-z*@ zWMid@n=pbeIem}RrCdqYr-(PslcoG8#b%Oj<57klt( zi6~{K>=mh3_`|siDImi_{dcH;<5xgAFzLRg)-3tB%r(PW!l4#&N+I~B&(ks9<}E9K zBxG7aMy3f>oEv4ilxO$^T?>iLbA*3;&7(jF^OPC^Iw;ZZnxUZYD|{4Sn>Pz?^w=1F zWy45y>L1*9R;tT{gmm$|>Hll{0;K?X@VP|CsXnciZ>Yq*X!8XoynlIrjscJCiPiT< z$S-9VXA3PgD{z_us+B3!RCKdiN}MdG_16G9G_^BE(w89AK7BBxW_vxL5JhY>Oa$cV z<(JZq#n6&v0L+sSr#O>+c+bA^tNzAvMXa=K_NL@J{z3pJx{E~fo%%^!1&QPdt5II# zVPImfjl0(9lePCVA9!4U7%AX7{zR-gL>55=+NpL3C&`EblI- z?Du`gi??JN!}l3-q94rR@AveA|#GM&IAyS(+Rcbk#YQ8PFB?0$bOgR(Z(RF-%hu6red*|`phkgV z-)^M|c5%#-KA((41dV- zbxEI!KEV~1#K;GK9yDo7N`D}X`i@Qd*AxD5;IqE(t{(Q6@-zvLFd$AuNnUi-Gptym zh2)UuzrOQ$B&3dPeFhXxJ_nt&vb7exi$`=w$h==}AVu@=Y6Rf&o%d2Ww!mmB$#nDi zgun-%4tCvi5I^>px5IfUBve7t8RE$4{3)?cg%;ga?0^A(mW4H5q?9EJ2u56v&q;QnL^orgT-9zP&N6Xkb~f^~f2qRBaG(06?027+ ziEJrac-`rL;`RyWo^Y=!I5*iB=nzUA{lplp5Uq1hX?3^k|NKWv#SLN3_ntPDxvmXK zGX(h>+e6{t_={W$u9r|-aKlWKBV(0|xNfftq{pR&_-b6QPTQ72xZuV^zOzz(gwa0G zqzwa$Sw<;#4K@l1n{I~4bmP3nAA4XoWOnKjkJjve)ud{F`esmHE`t!nb&&54&UlTK|e#Kp!8imvvkr0;Kgj;ru!{Gg*9}Gb&c^_sRFX5JGgG=Zf zmK`q9`@LDwHr~UnTRgOeUZ~-h; z=%skR;PU_;x^@Do(_zmqrHdzv4r$psH zJCe5ID6;GL0qcZ@Qf{R;<<3dK{?=>+tAioCu2WqEf3 ze0h*4a`|Y}4YUqqy3Oq#YhwEx5)iAkLw_~$!Ot>zy=dZ1IyBzAacM(sACGuW@PcwW z`7$s1Vi5|62f!uw*G6%`ab;Zci-KHh;p-;fMCJfcm>_X(?U0x~GFq@LfBk4&m5W7e ze6R7~nB~ZaMo{OMt~}|u(JH=MZN7m=0<#k?$rvO8U^n;$g%bSChp#*@5obTUx{Zdx z8BEdV$)TicUh9yr($dH9ofQl}>eazht-l(2ty(?w81@Z{>L~`Oa8y4Wx zso**6iH~5=Tn#TlxZ_K}zc0C^b1A?u?gIPnyD;pI5wAKIO<{+B{v9=3+A#D<{`9Dn zik;CEBO{nI@p;JQE=0zfR6hld53uzUROpY}16oPSK7@v8fAJDf3UH=6F@Wh69+*Z# zoxAjn0m@%#ovz~hed9XCy83+>oyZx%1B$3*S|}>HiRfUZJEqgbKnq^($ejDBH*&{+ zot)GLCk3BorrE$wLW*Qw*hVTC`^#gn?0b^2p{up+Y3u%|Du$U^%EwVjnw zI2R|yz=v|{!+n;prUXw3CCi4C{|#|Dd(17$hp#4h(k6|s8}_jR6ZAwly7#O-WwNrl zlT>u$*N&XrpOu?Yv0a07NzSu7j_1`Tcc~b6#{;@he}^_=l~?Vf7auJ#U|?l|I!>q; zW6?I(>Q0?Xi=xks>z=g1=t45AlBSINgF0hKYbyR8OCbciI07XzLsee_+x?FqROf!e zf+NOvr-dTLQ0kAt0h$x^La0^z@*IOnBqq91htF|E`dmm*zseBo27a#;|MHVJTQ#37 zH_0{ie|`%*arc8(1$XN#$RZW65ztwX%j_JIQ@&~BT(E`ZUlHy+k=3( z?a^{1N9eGUlz1O_RzUNSTk7Pjtl5U31qEFke;DM26&K+xyEsktIS<18DyZ(-$W2^s zQ&+~8mSh1>VBF|N;~yQRs>hU|uZL2)8d+KpLNLmEI?;x@hQNj|Lnh`&HMSw2`#dQf zX0!0in80I>1_yob^ZNcW=$j1p?HbMDVJNc88|4*gZ`ARPh4sOnf}ce3RZx&|{Hx52 zf1spegvTY!ume9iSqX2^Y%Joee-)@<$h$NtU?JP6`V8Vk{^@xGFTbNP|oW=IN;>4($ibZ;CB?c=dX? zli}%a06p_alnyy}9MCH`R_|x3e;=_QDstc4_cvP@cQb^$@9u4DoO0F2+WeaLqS%rm z1waP=UCL4sR=u1HejVgXT&+9^I}lAdlpkKsDoUqPQEGl{NQIC29_g;a0kcXVOj~;k&ObX>Yi&~gQ!-&FGYg2l^__%ZZKwRcHH-4Me_y5ZV*G8{24Zp&uhdGxq1#}eFjsig(LF;nR-nWHZ|KF+0;GnNx;2}u`(-dd z0Ql@gXN=Di+;w%$hD4o0pkxr5At}Ic6jm7hDi%e@QL+4t*IwO8e*vP=mEjbeHj1?5JZ# z`QQ3H*V1|p+F@iXR^Y)x0$w~O_xqlmj!P*;EZ$5h{&G_M0TUoU0MCfuePq~5tE_)uA1QQzAQPVk1jnhbXs$09Q@H$2~qXVkw6oa6yG}lD9 zQgq$@$hgsW3JvY8-Q_Zv?Sii6ohM4>(OlD5yTsgae2m2ne=_`9)a*a~-H~`i^W2eT zKt)D*h7V|?vhEhu-cUQ&0$9gHXNvrJ#2k2`jhoc7cj2)5uPEwRNIZxdb~YeECK>Dg z4%iXQJ>cXKS(4`CQyU>p;>==6(X6wso;`wZ!#I}|*QS5Rlg_iG3t`h%c1vqwpC7|Q zF2RxWO(w>Of43^Hv{xmQN=R&$5(slB<8xO3{~9>JnYX_)<3!}PyRuolI9p6DEl(^v zh?l_7bH41x^w&8#^y!T&mI9HHFy6X3MSc#*_wP4EXC6iOiur zo*^LzAe_!SEJgkLh-)lj9__@sf{V5WtWB@abksb_S|oyJI1OjD$DvH=-ZAY`AP z)cbH^=OQ+Jkhv(=@S;VFtJ2`6(yE!7EsJtip=z-3kH#FQm;Jl*AT54??oHhP;w1JK zIuayof9Q^u(YW62MP&+po(f77h;i7sZO;-j&vu2$*_8GrJa(Y*calIXrc_*tg8-?SBdixI@5urCpY)*~|`dzeK$afQt=f9hc^(vni!Z7yEz3$tS_iedh<&4S!q zfBaZ@MOWFKMV2lN)b=FSC;aWV$di_)zMh6HZs|f8OgQM0)vb_OO({;ug9IL(la{$2 z%+MrIi=P7b+>Pr22tb6d#@Mx|Kp{&>?hu5V@6Lv;^k?9uO?)G5ATUTrKh;w~ zN1en`)3Gqr1@Fvx1EX{{A#N1T>6Rp$>}3=n`!RwDqy>dMY8ZqIC%3PnrPrzcT z*D02^TkWn|2sB`ZyfSiI`$$mjq|D&$n!m33?5x<3tvnzQU@gN%fsII%lc~cVe>*%V zvImWh`2f%#a^A*m6o&LR{MDNI6jw&EL{{r6&sf2EC30bSYw;PHYH zD5A%>`7hTGO+jva)Pi>b|4D#j^pIN{sSXL(VslrsV~GKMa4ajQIJeSbeW+5W}EXRwG~5g8H#ja|ZXz@sa0zd$7=ux8J%?WQnO z+u}eX4sZC%<}?&jcfgSlo?7QnKl@sMHjG)i?&HHWmA<&sO&`f=3`5NWe?)Mqxg+7` z!Onm@v%YuR;=LAQRLp(f$r!9MM?XG+>(-rFVX)eB%p5zplb>F*YDA9%%F+X`{v@q5 z(kJ{!y5g(J*+Ze^S!ZnA1jYhU_euZ-24zO340+!^<&1>)|${`bZ4H*%cOweMr| zW(g&V3?e1TvdrqRfBe+fXiy)%YV@0tF3uqdLSy41%<>zY9;^Vu{)I*YqS!vJqJLMg zu6X3Qk;f+p!&#?s+Q1Cp)?{bp4{BOiyx)Fd+DUSYBD6q7vlZnV$fmX?Cxmz^*R~=Q znQsA=#cj>xU=qEN<5J#Z057z23GHA7;;jqj{`i5BrO3Hle_z|3ZCc)y*Cs@`;L^>b z*BcY8J?KEq-gULem-z8|8X<}gQkXY>5lA~xR%>#u#Eu0 zqr5=s+Ldg*wSd1(W^zkX>eHzmspepX6`;eMVOI8~nk5kP7`$(*AH71!$08Qm-+&4v zrcmluValS3d7S)h%3xL9>4UOA;=U3QUR&@|{irV6e@BPo}|((UB><9DkHm5-$3dYak9 z8G;(zssU1Y>~8EHr{>L)=1RArSfsB4uZ96v@K`q@%WhXudEg+$@st30ZXJIHOMdbt z;yXxNe~B*S+2istpmueowi$Yjtj}m{rm2zaO1&;1exq6Pu908KEC3uT4=}FWp|T{w_X5YQXc8Ssd~?h> z3fZvn9WuYIOhHvC?=HpbTYW_l&weTz%B9y@ItN> zG(XotchSqNTWY1^SR>%=W*6e~T=-|cYwem`;oIz@HP7lu#bH00BUS<}W{w~=b7abnT(6p#!{}QLN{mgjQE7hgi3rZ?=NycME!~M{j-9r4E$f2xRM$ zuNgi?>K^D?uNvz(Dp28=fvV&XT9r*NDNI&DKZVZYOhVF0Q1)GLbr?l+N$x_bQiN-= zmk+?a6T0%eHcT?Aq*U;vgrf&P zuoO)}?f^ThOtjvsPz35ncE`9OVe}QE$a;(!Q_E&|Ae!KU*o7PIxC{=VDbuKu`&aiu z%#r=4Byj>BLJ_Qz5UtM7d%73x`Lkl#AG|QimTJoa)&I5X?o*e*PCuqKTdlWGVfW zT@gpojQgBxJW?2Sar-I5pbT-7XvO1W)Px!Hrq=$$P^Vrpm~*#>{lyYKQ-_stL6Ob)eU>TA zHsnZPY+u`afURO4<}&>_19`jb_bioOv$NO4p~;1vN4TnPgqGq~PSHOz-b6%?VMc1d9VokO-Q>v?n%4bWQIrSHD_=Ztuc5?Hk^K^Odv(oA{00hUYXgI+XMRae zT+cQFYYdYyRVe*E|Nm&wYtENP+X$N=j#8U(LAc_ZFKjc1QX(G7p+diA| zUIC@xdoqV{&HhR6JmB+fmxAkvU&vdf@?VbW%GghHG#)_sfUWMOm?015{S%1b{M#CQM`k z-85H4nt4SrV1HNCcz&VnRw!T_NoW^gXY9GxQPZmq4gR-gQ#z9>V9NSnG4B_P1TxL}2T^$6s4N2Rn@bc|yCkvpB;`6|fM ze|l^n0aRH*tVLS_z+2t^-N-@3H&CC4uKhbemm~QJhztJIQ>LM;?YP5`;McentcVxm z; zePPZ(=hi2Tc6xv!wu@H@w*v3ae|#d;ozWq_g0ycACBZmNZhz3_cH*s0$Z~*Uo@J-KJ;DFVYQR!}b15)`IXeBm(GA-)$5OP? z|G*d2I|idql7^Pi#)}`9TTYO2?1Of3d2-s9+3tfFxSi zQ_UU_4&tDr6w=t-7oc5gl5_bRgMh&>iF{4Cew6#H7CuFYywpMx3|+2aI5fJeH)(5uNKl?Tb1Q2SbeOtLb%+M8j6W4> zX8*1Q;*zS@tORod0m6>fOVbrAlBr}2XFN=%?%BRTgsXlL7sO1a%1HOBZC)^1S??lr z20o@7x{EKAk(22ftuU?npJ0a{hm`h{Op0Hy(J!knCFaS7f5%)OrEUE+<_$qfafP*; zp_Yc-HVqk}k^iDjWk%cKLK->7CI*Cnw_HeLl%Paeb*j))`&2o&jF{3i=!s&dV{(-U z!0LT+(5nJTF8ZUj=r;}0h4ZI}O$<|oZ|Uus#6Xu%z50#E4KM4}UvHAKVTeoeENo(| z^7c?krPJnof5*N0wXv?J&!X?@UEEhNl)+FQK!=D%lN=6_KU+Y$I|F8S^Nk z=_kE3503C)^v<0}jSyJCCLbc}7$Y7dg+lF^^ClUpf5fVuy{_@Nuj@PiOo?vR{}gdT zSU#-xJtN1CNVTe!)L(qCQECH?tTn~D*hoY{S9yU8$dX0VddN`+%lrLE&h3q7A8r;6 zy>lpy0!g_h8vY5iB8H|PazDyJj${`+SMFy{n|XVdUTxqsO>=-7PZO~AAjOpG!%*nj zyF(cCe>LE)NUh!Y`}U^~N*S+>7X_#ES_xNrE?Qq?$b1&K{)k73M=b@kO2A`la4s}m z)*zNHn#7!Ov8dEk-Ayhed=175V_}lYif6eI3lJ3NjcTG_58i;olJ0@r;Q1|l5$P@KFpf8ETCL@QsoSw1Tr)>wtoNvgzIksjb| z`0a5VDlj1N+|Hy0xkWfi!Jh}rpB=DcL9#MPV+m02YG|?QIyasV1JH9_4KlSMh0qDZ zu{y2QIP^Y+j~Fqe<(QZFW?kD`-u?67UO>n3#Sa-?40al!d%(ClfrKfVYbqxhYi%B) ze`9#!ZQ-3IfR67BR_K~?{|UU>Hu#rCW#dZ*^Nn4q9O-E&IUB0*DhqMO-}l+1h49r* zceYGN!0SIL=z1L>vk?Me7GB_dEp3d-^~OWyrQvS@XGi$x4Uq$ZYN~@a?H9dtG3Yb! zfbqPP&~rVDQm#=`b;5g)DoAisb7@JMe}TJCCR4gDDOo4!E2F-4pDj%Cd<41VW-UYb zTm}|CIjeOQXrx~W57<;?1gd~@(_%JrrUiV!z~UlAf%j2TyyEE-QE8+INwS=_dSi^Z ztmwK)bFBOx;ASrwXl-~EJ|ePl5STXYZ+gD$Vk?Mi(Gwz6`D8pr=Vo%PL>=|C9S7sqn~?w1H0Sk>0s*&FeN51 z=&LlO&Pp(H941As(zPj=Ox>$pf0ajACT+`IMM5!H=b~@+LKrM%w}O885xw=ZH~;+a zbKzKE@TM@qwu^#7hi=|+;Z?Yy0Tr2-m^{h}gV=Qw57B_KkKzZUSd^(-^ty++dh(V& z(|`t|lY>{M^I}R!TOYByc(L^S007;Zf(}YSspc9OvWgsI8m&DZ0L0iPf8pGxgnSr^ zGe6wJfvnmLu_VVg9;_qm|CtMNmGcI(P4cB@6sJ?Fs!JW}Ar8*tLXrjgS z?;`UgO?pCgH8c!0uvuTjf0MckjsM|?NB6qwlwj<-@)W$MDgz$}mB=xpe&T{e$sW~s zE8Yi;7d;a*z=|-78>~ly@9w~zOGjRYSw7DlRo$XS$w@8^Sp5J~&035Kk5I1j>v^CR z8FSwpgAD6ISqnSYKaza3$Nf>Uu7}c)QT^q8xfgHXpr7L7rw>j%e_1@OkoiHb3P3i6 zF)S0;@Gz14upYPYl+PwCrv7y(f`$+_>bX6M)Frc+xOTe7%$LD)9T0+Vn@6W!5A3Oq zHqGVMgbS)2uM}z-g}@~Wi+V1YI6aa(SRRRL9WA?IQzGR4$ou-#p-JJ_z@SeY!Dhg3 zaBJEEpL33jU`||8f8OfAvqyj7GwiodF#z4f6&_1ZKHRR`RC^sbP^!@FWTYNFAmY>| zR54Vyqduv-NKb=14eIflZ2;<>t?&<8p(faMc~KaKHD8?mhR5iTfw$~RKY42avW#C! zBgDsa6!}sG0%tIx%9a}d+(Tx%-Y_qu1N(G>r?f?XwA(<-e-eAML%5|Og2n(D?VnpR zLOw-ytZCcjz@DzP=h$0Xq!M!t9+e4Q<_8Nc$t2-#idUs6M-A3o`2%GO6S}e)o-nNS zERxDU-%UKI(^%WP2rMnd+d`HrlOOa7+m%GpdKN(ltD+A#_KeSx}>^`>SWf< z)O+3sH@J9;e`c<*=s+`SdwOO6aV=5AmIoZT*BQSUD`93vHZ2@evx{A zjYEQtG$-t2`Md{&EQ#Y$*$tz00BcY0WHxSuCIu93OdmPv!z=I%V%1z$;q&5HFuxqA zt3X!lae;lQb!(rR%Nvx-Nt^CiVx4QT%3_;}rz2Yoe}I4P(6bHQu(O zOwm}dW&HTULe*6C)_Sby=P)LqGkQth74ZK^Ils79!{OM=4M0Sk{tG3qte?_ww2yU0 z68;Qviu}hJxa%#g0=~IN!(jO%p>tuw`99;MI~<)O(=WB%RH6e#k5t;V#TIO;IR7g# z+I8WOf3Vi+0Gw+av~Zo0N+;@aV!wri5Lr>LEQn2`k0e-pLy%^DJoEO%JE2nIk~rUY zVW!zMQ?G1IVWP`O=b@(=i}zvg4-PDmnF6b-u&h6$foR%LB{`7Z2xWk%n2<(^*QXm} zZXn&tDAo;4Pvk=$2i)vNQ2I~eCoJt=R9~y|f2fgv6<09kWu&dhS{D34Tq4-dB}+^w z1>Vo*k~FT$96bDvST7|_Dseb7CNy4Q9+H&#!Clehev|Lz&IMu-XoIPnBf*Ax*>u>V zV5UT^ndwkuHett)RI3eE9F1Pc3Xz!;H^)MAAu$3FJQl|d;#hp_Jw{z5JfKSOpF$|5 ze-SJiT#TZ~mUD$3uz8Y7Y&1+Mv5rK&!T(QChPt4mv+NgmIk@&B&oiX36|t_*`=Pxo zgNa5E0jGsUnbE9Gigln04~3bffsNC#$~MCJw>xGzvExsMv(`?qNGJT>aV8b%=z-AE zv2&nUXG^oVT)!47zl%Xy$|P!9N@z|lf7qJwvD^NK+quI;XQ)Gbma9?58JL=%C`1i6 zsmEd7EAFoi9Zdrv$w#ug|I@?1JIyamCHvo*;nWgLnaS@OXp2jmAs@DFnw*EU2(PI{aIGF(|i zY!EmrEH1`1aV^F!D0Qdp)d+qT4+JoOXs-eJnluz!+w$b*hWC1^V!Z}o$DY&jAU3xb z{HRZk_#aUg4Jb#?;GS?!rA%y?e+@Dou50<=g%_uBGEyPpMAy62aLghv8#zwtHL9bs z`(_iw`lS?o&J?myAv<1qAgjS+fpX|(umxfbXXS2$zuuG29WB5-h3#~Fm#15P=pOoyiy+jM@zXQpIhY$vtL4rG<5RiqS4vjFFX$#Dp@tS{aF~0yMWmMY~*PW zdqxUZ6*RtUc$BzZNpyc(ppMq3LvS7*db~DN8LBol*UYMbZyI62?mbC(?UfE1ObSTf z)bA{_HOVf7aRNZc&8Jffe*sZqH*Oj_>K0~WpRu@37QiwsFJAB0W~cB?>H;kyeY95W z8d&!dy0>mEj&1`PV|r5^VyUKTe?)sCOa$l(Qmj&bHY9?f4+$^f64~ zeOQi37~QOKgiA`Gd;7yh2|2r4&G?w(B~ENBR1culnO=rm`PRO32R-5WktJPiZi0tL z+H5U-5iDA^aedzmJU|&t4a`quY1Z1rS@q3NA0`3Xlw{|9OKn{$wUXZ6tylg%LWRCm zx4)&P7``N3WD=OFe^N}+0fjVh&xHwS#ea$vdOvL7MFSZ&Y-=|ed9ds7e;sPNKI0FF zNu2Mxz?kh6Cn02LcU<5NyVn;#9=N9Ni6Y;)8qLLvtK4cFbrjWX96Csavl7GipF@lN z)z*w0t+YsrNWLi^%&+QZef?3 zq!MD1c=PX8`8TL3Y-~OQItSXAV5nC6=^F*V}F; zFRCV5@*BbE<6-%wq>zX)69h+;-&B=XOCdG>$V9XG_ite@H^F=zV$&#jEw01wnaVxU z!AokhaAnCPjC(STow2o>F*h4Wbu?e62yk9svjWqP3xn1c`!o?8OahfM%Leh`iMLjkK)w3v(xg?S9%R@o#VJw{IuiB?6R$ODi>VlO!Mf(b_J2c57+IM2E W`PLjlrK=j-)L(Alaq5asm(4Jzn09sm diff --git a/README.d/08-apply-configuration.avif b/README.d/08-apply-configuration.avif index b66af1a7ad18f9ee6b4958b1de8c5db463d58382..ab22cae3e05eab8ee3b2b878a726890b1fbb2ee9 100644 GIT binary patch delta 1686 zcmV;H25I?)6S5AFA`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951P9{>OVC~0YKW&i*H0004zoE?$u90e!<002gl z4FO1h1}AM~VRRAz3I;eOvUsc#GLj5LWB_4?7*N=CsI&?Rm<%8Xlx9B z@pIqbmwkpM{6Dq$b28TWdVG-gpQ2rwV1ZFz_@8{Lh|_PmKn5ncZ(qfKucTxVEsIGE z#wKHxy~Jdi1a}{85UgMKPj@!y`7)wG5=Wi-%K43mtD?feU~Ir zx9vcq$4F!$uU4gi9?Z*3>tydo@iulCjf0F=-(Y%OUv+3QmWDk(kP6*Z*=hWLn!gjr zcN_UI3W%hB)m;_E0MYC^RqD+s)QT;}K=Ahp{%@P-2MW7zIUPV93_^`|f4-ON$`_2m z3J^(pA}*a&Ruze%G5N`M2+q;17bZlxrx3e)M&F<9AuvHQyXVB!EMq+dIeg%RFmM@O zJLl}L*{p|Mlztn$olO`{+#9feFh&85<${X_J{?hDllh52QlcKIQEO!b(J;|FqTKj8 z2`G6$)zTo%`vA0_L$cY_wZRb@oT6S|Q7H^oSYIC6)y9*|h7xDf(AJYaYLemqlSXk# z@DrU9Q=^W{ux?C^P4ObW0g#0qP%{ z{-$nGb)M=|h&phW$tXm5*#Z?8$Fhf^B9TbBmRLa~7xON!lPYCp(0mlKj6o01{v$>& zn%CVwWIQm#giJfh``Je2=L#QH*_oaXDRZ&kjWr97)5v zSyz2Z)g&}b#5WJzOB-5$4bl|{&-X_9Z{9rh%wB6dY#J_1Kaw7+Pfe8~Cso6W7TFbJ zClxa4p6F^AyaY>p*X{$bQ?B;EaPu}eZ(%Qj(x_EW{xjgue&wl^1MWD8R z^jo_z4;ZRMCeQe5c$HQG?bVmvR~ye8Zepuaax%&^Bd*fp(PLqMp~BPYI15pO;2L>_ z@CF_ssW@DwYHZx$KU}D(_Q;o2!TElW37u?&9>DJt(MrKWe%QmlnZSx|+3vF`qMNX)Z*k?1xBM0$8f{bE0(+QYrbmoPr z8+_hQnvArRkImCsih2C7=0HJ7-(`uoP~q*lj2=o)4|PMtx+{P6Z)l%Xb2YwSU7*x~ z^OGM-zHhQQ2kPx37uMd%?R;9$;B7t%j04s}8TO*kkxwg9<4fDi3Y4UkftB}SFeXK@ ziTdo{vn7y!FEY-tbn>#JB1mZFI$H$WR=vypuKInDYC{x(!P`S|hyUQoJsPF`8wq7x zmsltw1Gb@$7#=6sFGhh4+s3b2{3IyR_X6UtRp?^gv=cgw8t|dg0+}Ypr3oBO=TbLQ z{C6=wC$cEe8QcvzkB;C+?Aoy*2d(dZeDGEDQSvDtpL_4&Iq&(N-#MJ$`Mf*;0Q7iK zaRPP>p9dg=VC0TA#xQQtKjL-+yT$EXVU zQK9l00(zSAL&7<5<^+HOfKMRDT!oTeD3@o5EdZdsAkE_Q!{nRDD`Y6)!Y%MO*fAD# z$MBGF`2wWBD^S@vmd}G7ZY1-C+^+)wP~`+ha^zRSmj?3%LID)r`2tQj6p8#u0T+sp zAq}7h>Tu-Z27Bkb6W=BG0-ZISg>SkA+5$GL{3Gj?y#Nc=xVX7M7s(d|K-Lc&0TzQ%#GtW?ii$WK zRtZm3!7D4{N$MJEL@HTVhf1bU^bE|G>d{OWQz%B(#-9y@lYM02xxVEIt!!W$yTIA5E+RX1=z(7<#n1~kKY?u1_+aI zN?HpSk;sNimKqr^WBzDmZDVWa=;Z9;y4r2c2JekNzMD4taRRx#9YOry$f)R;U9oYy zlT-E|IGFltTISKL?3`oAb5EQ-S9t!y#Y>lqu3fJX->AG?BBQu5SIc9g+wXBTnL3-FgO8) z)~93CS)PjQ2n`w|5leK)C@8PPEw=P}uNfeGtfXbY95$SS(d1<1B^hgquE!lbox5ptMRFZ!G}%}G*73boH^pk7bGnkV?@pG-b@)k4xKbJ0XWyX{=3)@P4HoBZsp_YX+Ih5fZ#RdLN*Po2un zcBZ^uS*r8yU4kTRYcSc)J$FN7Ea4Up~H(PO6Qg> z?|WuWtWvwy+BlWV5NU2->DWx7-VO|?3O1pil=>Yz_;dZ!J`K11w2f)QUG#xEQh+PP zTL${c_zvnFDO1pwy5gFfVRgfjk#Ui!3qaoSeDu`P8TfViwUtV&u=hi2s>`0W4>VKV z-lP>f6M^S{c7*JiI#9yd7z%BAe{y6MGFs41EuaB!apw8{B|PT*M4U~c>TX_$(z8EO z&zkHd`uHw8y5?R9mZaPx6x`dp>8rIK^NzC3|NjZLp=+>x~V@*hwCA z=VcG5I+^u`ca?cw^0K>Qnx8tbbBKLl;LD8yR!0HnVRY_}%!~wO%}N~eo^;A)b&Jw; zvIF7w!zLd}GiD^~dP{CxuyUcK3uy<~hr?PO`@;M&y!3#wz|S$2=-U&Otb*9Q_nl7( zM#T21DCadyIc>iacJ^&~Q8^^7Y7roWWY1s0F_>m9|g$(=x; z(Vy#dPmqri+xJb<>l5;WE|M!2pHt(F;oCM(3h?|yVMXJKWS*AGyq#5+rS66Y1j)SD z3p>BHhTF=}Y44Z}@M_BL%BpB>u8)@eBdOQG>fJ|gsTwIYU0%L!d@eWs<=QtbQPsYe z?qq0vyzQM?^1899#B9nndt$FgkH|rK(X94lM3Q=b<$z_i>koMyA8GN;#qIeax#Hjk zNymt;y$RR6g1+}RTDtT3ZQV0(XSNC-3C3P)mgZ!|oSYK94p33N^y^UDE^(ypp#7{x z4*M9v{g*8so26kI>UqU)({48oS8hz&(%}>;b-@_harKTIBTz`r^MuD?)A`Ddf4b~w2$=eJh6X~ znzKVqL^MiNcKOyakD5dEddYv5n0TFZ*Ge5+;o;xK>Zl$oToRZ=y?~MJNlBBo1%Y?1 zRVznAO1(aZ5x2`+ds)8hV&hP!qi^rly0Z*j-5zO+kIs=}7HVr5c@+Kf%6vZ8ri!%Q zT#|<+B@Go+=bK-};LE4ZS(~{M&)+xb@-@`6x4V|E&YqTh+5Ks}`=^=0!<(Y`GfuJ5 YsSidUC(c4dfoaqY>zTcCgQ7Ek0U)B8WdHyG diff --git a/README.d/09-update-scripts.avif b/README.d/09-update-scripts.avif index a31d60b3a0066d1ee68abbf79fd48aa6d77ffdd0..e713ac2c48e8902e88b1309c660128a9d47032f5 100644 GIT binary patch delta 2412 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 delta 1694 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 V659%C*l99!+jD6bz1FIc{x6~x&wc;^ diff --git a/README.d/12-setup-lease-script.avif b/README.d/12-setup-lease-script.avif index fb4024e2a730947774c6f165c7c5e3b191a4804c..2a8bcb24b00b57757e0ce3e70169bb29a9fef0a3 100644 GIT binary patch delta 4093 zcmV{2IVg*WVkR3oHxJDNq%NQBpShIjHR8(phIxKjxu2GdY zcrp}2*@B`mjt15RW`i4nR4#uyeF|2qnk4>z9l^~0YV-tr=l-1K)&LmDiQSKj(A5w( zRzGz~s_$L$Yu3SawEJ$zfCPfPw~fN{qXE|1n}W{?Tt-XV;<09o8-O5S=mi=(LgSx# zduS^r3Kr*_uO|gbEhP5v!+JP5lsYFcV@j5smyujF?Hqz?J1A>@Z+~x@X3xrOTP4hk z`MQ~_sUW~Y9mxL4=w0xaW#m`NQF3*EkD7Te5vzi2&VAMHOxuqgR?odHLmkb+Oeiw$ zWB2r?v7U8m{+Jl$8xRY;fhjP%i)u&2PqBtuw3!_fLiethf4;wNo!TPI{${Q@+J*91 zq^|1EZ7l11s})LWd6OtQt>3C?>v%~FUmfyebj_T5GcK}>wZ^F`k0!gFm}o7!=qq1wSaaavV*?p}fs2+WJsM-YO0|zf9yzm$9X|Sg`#u-pg);qP0FQOYC^fb1%#I{@> zl75ea&WnWYYL_OL^;SHW&Pr*2qxv&zlck%jx88PVUu`B_uw3HvwVm6X+G5ZA952@Z z$J7ZPsz_4Z5L#6ERMzepw8!qk=JJ(;6FID-({rjF=Xuk&F4CK?t$7B`JsoFkFFv%@ z9teH-Mv#I*FYUQG^)&UnCD|=D_g3&gL1q*PxHGt&@E?DV)?65%Rk5|Q<}zFVN*S;*MQg7cUpWdnT~*R<1KPqz|0iCa?9i|;n%H3F9gl%>8T;*1eVSwZUWxh{YW64 zqK`sVIjz4$<;9_Y>Q5+?MC=%>!i-{&y}oXO^4q!zuXhn*ODKwhb0P^RphHsxw~xaf(2f207{-@uOdoK`c#NwwdvuA=LK^*LroF zFm6R$h~bw`JxE6hvZ54?R*fCB%M7r*UoatFeTzBeH{GbMZvDThbjI`dRK_} zWc+oDDRm{#=}vx`7qaJVmtDWoPuB3y*I43P-XJRVn)hCNY^^n8w!g$4{Yh)Xy$i+} zJjxi-zaT|{S-WXvQo9wy(8f#OKJzY7<$ip9ME2O(!@mTT;oc4H>W|Y+P>CGaJ-65= zS0#!D**dg;lU2egut)ByCuMUtQm;7yd{?SYE!j^UJK^dL*^dANV9^b6rD&y90~ym> zw!OnnF+Oe1H%c0%K-7r=8|594Ny7mG9{paFz$EkcgPD7GmDiDNpQd&$?H<>FVK&Ft z4Go{{at{riY2d7{?eO(b_r;1GC$`eyd*MvXjqXK%*LnG;r3xEcDccdtG{b1Wk$dvl z*2xt@l5$ZmW(!z}tgH2G=FVF9k~jjHBjG$&{C7u_5sl$t!=+KP}^Eu`}! z-x{jgZX>hh<~I^w1yy>hehu5y6K$eo5z#2`tugp;vv|dKCoKl)n&e(ew_A>Isv@~u z{ow|G0@;czYudc-k;muzrm$63N*+&OV!){dB1+Qex3zmR;5n~#b-*Nce&o6qmN3?i z{7^(%PH?GIXo*T0z*Kq`*_?X~K%}dGNiKpW&>fVhNJ8myo>@($o;H@EYGPO*?T8f|`L>8b0(q7;z{%%DMI$n;6vG(CyRfBoH&byTA$wUj$+e+0`0yM@mKM~xa);=(Zu%@cN7kye3! zTB@LyGDs4Z0sTv{nP9iBk^r%G;J`CtnvRT1s($ifAx`P%@F{eaF3|~M~-fT5z~;Et!`^p zmKs||qTcWultwVFzlJ3tJRu_7bf@@`2XrW3p7R>WWHo%5bK!>|CPeX9Cz8^jwROvsgIbKw>3-A6GTp zFKLdu&=NQ;j^^}9)>l|Ldfkeil^fY!g87G@g1qdSono5LCYS`Gpz!iU&VJ9_D6Wld zOK5*|t!O$B?i>#{u#3W@_KtusE#~t=oOF$a1{xMYFj(#1%uV}zg{+ZY8JBu+VMAmD zU}Q`gt|+g{u5SZ>3;^2V=Q?(5EEK$P7(ihOkXKp}I zoza2NU6wz^jr{U4z81T>#U)N@O)qwTePI5o*dM5_CJ(=W0`r4egCxYP4ttBX_s`VU z4RUWLv=0`opvGDX#(Zk`A2e-vf??oPjcdFjN&J(2Jp4P600q7A0t7 zy$s0!BKqA2euYgN&8o;;Dg!moKyshQb)*!~rHx3*{ixisy!LK?{nlb!G{{;*vU&~T zMJpb*KH4)1B>Qf+%V4($-I~3|4H-JGDRjIV3)Y(T0G5&8@Q-0?AuH^L5ULntfE8{g zqNwQ9nCXgvvAC%py2*SI*IwN0Qq`vG6QDiq=zD10rHObTzwJx(b4X&vk&#+-!Jc&9 z#Cy8Yb-4SFc>#5QyWK2gH=*9yxGiKJL1JAqD#JMYDp*&EEu@G^UbnTRedznDsWA-o zkV-sYdCwDx7~U9HPaDM>^0lFtohk$?j#P{23D0}}NGO-F&e#GTx9MMD&s8dbrxdBH zK-w_mPdY2%MI0J#h_#}6kgZC>9fDI9>`u%n-j->4tRa~-p8apwc)BHssR$Q z#H)3jGABtrxhr=Y2zCRzBH#|fUd;A^cIzgX_)e8ZURfl@(tC{68dIcRC{;nJ#$QFA z6>?!0$0h;$llUxm)^2PEMM~R0!ETVBCGN%!0EHr|7~^@Bq9SL*OFGp!p5Jn(u;S?F z*kV-y$B&YK?_VSMsMqYWS7bWH;-Hq`RxP)h%LMz8@0){aNt$WLxaR*W3Ew-@)#oXMvE$o0k225t6w3l*BiMJWuYihp!F?c??p zb+$c!f_q8(v6^vL9D+l2xsw4TJFo9S0*kPrjuVdAKBCpPBU&n$j|@<8IHlna!CvK-ewT zg)~D5v5RW?hESaMR}`J`cM=e(=P^oyw4n@}5$Hm5r$F#+rdB@U*!N?@J!;|w9k%L! zyy*Ggl?^@@l8@?NXFo0s>nk$m8-DYyC>+grJL(30YmH8if~uAs zo6DXm&@3x=K!z|3Oh1QU+_4MVO?k6_K5}63-O64SUJ`IM$W%=;q`-H#HfF`+HS~0O zWU^<%lH$}j3iHOytnh(0n_I8=jKFxC!jS`rDZ9Zs{;({Jud<+Oqu-wEEH0!+`%wIA z$cQo^r%ZBL0DCIIZ$H_mFe^&7D+6eOJyM`J8+fBg3_@0W*yoil8^c*JbykXhHa})s zfE(nH!$&!Mddfq^-Vz%FvhsUc{t$`p&3le0=$^Ax?)6 v+AS19FeAg*QSdv|Sg72!8~fE5jPOf_euWYwpiY|EvXa>$X&ERH`H*M`yco$8 literal 7642 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 literal 4589 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 wpuiKfKv>d+invLs_GT&7Qn~jxb9$CF3 zK?*8GOY9^=JXP6>Af>lRY451YmajoQCe6)~d85QW$%M*M#o&Q%8P z{e>ZLjrHCXxqTKt4MNG+t~1{=iso=sp?uhAYz%+#bKl>W zeTF6cKehOCGS>Kde318_qFtI`fl*)hpM0u_({H&z1}3?0U&Vi~q+}5-i%AUSCt#sC zVktI_j7B!BD*vy|{nYqv82T~+Nfh@M>1RG}m*Q%JcK^H}w!Ap^_^D}&4F>?2NsKba zCS#So#AKQTcOPxzs*-Q*ZV!J*hx^ULAvnaY5MYF+)jOFoaT6pZX0=b+s+H~x-GeY_ zjUFEeU73AnK9vlF-Wnp)t^Kd*jTbUMDYDJIouBD3|5*3mOdSuGUCw2Fmn2cQ?Lec) zNMs?eR;7R*%*#ycWba4uHg*_|gN#?-V0v9&b!ak{hCM!z3f)!NY5aehzZ1uI8~HE_ zh@^hiT@}Ru(d;@^>dh$BiY>-K@b?P-Z=2@_3cGMQ9Y7rnLXCERzL)FD7mUFQ5J`F> zE}c|X6^WrS`N?(&&e5$GCPcZX5W9Ou-=FOvFhMfA=fu@4V?6~qeBgvIa2Z}Z=j^Z9 ztcP8cejB`zXQfvVUotKADt2ld z(X&l0;H^x&p#V|Q^TkBo@J$2%6{!~!sUhYcLvql~0!eEwR!e`5hX_u!`eQ1^d6Za6 zC)n}5dZ40uuaYFma;{gCA@BD+Y~4>=>Bi!&n+@5(R_9^cKuf>8o{r1t3%~tr&bFV$ z#9ZAfN=uqK6U2pIXdK+yP0gSDFv7%LdVj?WU3OEY6D7fmtWfB2uOb+^OlB<>?u=F%#9$zGnK5K?hpqGt{hOd$g3GRsh3wE_!>5(q@_z` zFTqwU%$ciZa}5uqxc|RoW6xA|5K|1NIR)7=4$p-47l6ed`5#h-9{ z(Op&CZ3=(B>|=sr*7uZBy)XT)P~h5{NfbvZV|3n?%JK2RVWUyjD#8{Svi&Le#fQ@; zoqwrD+BA|f+Y{^4??PN5co*4tBy-0qR?Brth7bFiubk)oNfNykJ1O24>-xEYmgc5W znFuKb&s^71I{L00b9Fqnzp&j<7wNal0$8-0BOHIQ=0HJ7-(`uoP~q*Xgm@zNMr*j5 z3>k~dOAFlm^EJL-U7*x~^OGMhrscPTXV`+1NHr zQaHk{SHEMjwEyrf1RQZO0Rt#&D&Fvcw;2Wdx|4gA4{UF4P|(A4Oe1@@6P+ z%x`}c6e4%4NSML@^&yHzqE@5lEdAUTP5aZG$KZ*kaOG4pwxLdfvUrX{Jn@!#%I&rh z_*YGgNDB7=$MP8Q^(kg5WL@EXY=fC@J!acBqQTw^ccn?@rWce7?XSgRU$j2;@k~jMlt~d0ATB55_C*>4JAtQB@!Sagn^rv}AoacK9taaW#7QZTTx+s{pQz1X00KW^ nZlUBO(mpI+l|vk;6sd5TzLR%_#3eJE?OJR!%^dx_XT;yP{Z1B+ delta 875 zcmV-x1C;!}4#fzNBMtIxWprTx00000001bFFdPSLX<}h^X=ag3C+=V7)H2&v#IDrm&W^4-C z^@yS?d>UOYEW~3is0zSkEO@i0q)InyO9lE}&Bb39*pz%w;~_J_Wgk|qzS*ss(6T%_x!Y65<6 z$DeXCk%bx zV(w6^hp@E$1>S7_Z0 zGh>gQJ!@nmV}=D5s>9L)j#DZplE=^6ifr$<1`bu~@KvZl7( z*Sf|W#lS{3Ld=orC;S8>Yl?oqbVO4>aL8*Ko)}V3rE5QHgIq{XnPnxrKPT_gdLLBG z^u&Rw;6mYRXnv&j?5H(p3nDnGQ21wBqb*8k$~=1d-agHmY}*H1e|+(#Z4Uh0$l2+; zWk@d{5Ci;7jq^uAJ`%$O{r%|)wW5D1DYr|g-N`V84?G{e)EAsBpzBHO28tg%k6EW% z!){#i3HFMt%3&U-@{V6wC?y>)t6(ZBDh+5S_`^;flJ`18!E$R7BP< z|?{58(UPgpd0flm^O{C5|GfRK?W Bp%efB From e6faf346c20b63ba1c0a137055e335e2e1761679 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 14:58:39 +0100 Subject: [PATCH 932/988] doc/accesslist-duplicates: update screenshot, with terminal window --- doc/accesslist-duplicates.d/01-example.avif | Bin 5208 -> 3634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/accesslist-duplicates.d/01-example.avif b/doc/accesslist-duplicates.d/01-example.avif index 11b3fc5f21ace72fe8f36ff62b9439e90cd39a90..d290a77133ff12670c3ea5976b4c613bbc443831 100644 GIT binary patch delta 3436 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 OPfh7{|WCGnZLt@_EzNFZoAL8!h0nhP* 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 From 6718b9078042fc8bd5a5b910f187966b96dd3c6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:08:33 +0100 Subject: [PATCH 933/988] doc/mod/notification-telegram: update screenshot, with terminal window --- .../{newbot.avif => 01-newbot.avif} | Bin .../notification-telegram.d/02-getchatid.avif | Bin 0 -> 2841 bytes .../{setuserpic.avif => 03-setuserpic.avif} | Bin doc/mod/notification-telegram.d/getchatid.avif | Bin 3896 -> 0 bytes doc/mod/notification-telegram.md | 6 +++--- 5 files changed, 3 insertions(+), 3 deletions(-) rename doc/mod/notification-telegram.d/{newbot.avif => 01-newbot.avif} (100%) create mode 100644 doc/mod/notification-telegram.d/02-getchatid.avif rename doc/mod/notification-telegram.d/{setuserpic.avif => 03-setuserpic.avif} (100%) delete mode 100644 doc/mod/notification-telegram.d/getchatid.avif diff --git a/doc/mod/notification-telegram.d/newbot.avif b/doc/mod/notification-telegram.d/01-newbot.avif similarity index 100% rename from doc/mod/notification-telegram.d/newbot.avif rename to doc/mod/notification-telegram.d/01-newbot.avif diff --git a/doc/mod/notification-telegram.d/02-getchatid.avif b/doc/mod/notification-telegram.d/02-getchatid.avif new file mode 100644 index 0000000000000000000000000000000000000000..0112449cffcf63e4f89bc46ad215560ff5a74cf2 GIT binary patch literal 2841 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 Y9icV9{#F+HI+QLMdDl}aIO9I}f1!IY&;S4c literal 0 HcmV?d00001 diff --git a/doc/mod/notification-telegram.d/setuserpic.avif b/doc/mod/notification-telegram.d/03-setuserpic.avif similarity index 100% rename from doc/mod/notification-telegram.d/setuserpic.avif rename to doc/mod/notification-telegram.d/03-setuserpic.avif diff --git a/doc/mod/notification-telegram.d/getchatid.avif b/doc/mod/notification-telegram.d/getchatid.avif deleted file mode 100644 index 779296915de91a9b21e2f05685e34a1539d9c73e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 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 Date: Thu, 20 Nov 2025 15:11:43 +0100 Subject: [PATCH 934/988] doc/mod/ipcalc: update screenshots, with terminal window --- doc/mod/ipcalc.d/01-ipcalc.avif | Bin 0 -> 2515 bytes doc/mod/ipcalc.d/02-ipcalcreturn.avif | Bin 0 -> 2205 bytes doc/mod/ipcalc.d/ipcalc.avif | Bin 1729 -> 0 bytes doc/mod/ipcalc.d/ipcalcreturn.avif | Bin 1247 -> 0 bytes doc/mod/ipcalc.md | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 doc/mod/ipcalc.d/01-ipcalc.avif create mode 100644 doc/mod/ipcalc.d/02-ipcalcreturn.avif delete mode 100644 doc/mod/ipcalc.d/ipcalc.avif delete mode 100644 doc/mod/ipcalc.d/ipcalcreturn.avif diff --git a/doc/mod/ipcalc.d/01-ipcalc.avif b/doc/mod/ipcalc.d/01-ipcalc.avif new file mode 100644 index 0000000000000000000000000000000000000000..aaad6167a0528cf308337f0dee87c076c1ae50b8 GIT binary patch literal 2515 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 MeH(b0sT?@*Ux_{N6#xJL literal 0 HcmV?d00001 diff --git a/doc/mod/ipcalc.d/ipcalc.avif b/doc/mod/ipcalc.d/ipcalc.avif deleted file mode 100644 index fe726e8c323ea28cda327d70c16ad80fbfcdac4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcmXv|3pkVs7ygFU{T33E>yStcLW+#Gam!e@Ar-?Ie9Z7+Moe24DU$8il77jK!h~{b zl*l!PA-6;^?$>c&GHaI|{u%$X=RD7O&w1bXIp+WXpdLhugZyK_Ab=NqB!WQ*BIqCF zj6@)L)Fu&6^5<*3&f#Xj<0sxGc z{0hL70pJH3uh#{^@Ppe2iZXA&3-HZ6kAI92;$j3L;^1T`2t`3W-U)O!qai%s z2mpd`Ug7^D1A(#N0V5(J!b1uF7{tW{bv^^g;UWl8;W$DpZ?hyI^b3zV3PMDGzQzmQ zV~1b@Nr!k}l@kN~NwR>LsD*ZwH9=j2`q?;J{BoecnCZoU@$rU&Z&bDEwOLs2Mk3-} zx{Kh|wFHkQ)I(~_eh*7;#IIhvHo-Tczw2%Rlkv~B|kQ|*F4r<{E8a4<@&~m zbsqiO$^HzZ!CCbdiqYDFRxgaO_lw2c9YdY;)dzoU3=bO%k2NdIap_;7suLYLAt`Rh zNg36@lae)_##1No$8F$Du8Y36W%wUmJ5c%;6rLWy@IIY+*$cLGXDQ7ATaoJTIY1wT zzbvDTULgzAWSdokG{e3pM zawum(f3(`cXWRRGy;P>cPRk_1K|8m+aMz~Y(+F1OKrzvnaWjQo$}xPJZ#c`SZ}Ymq zhW<%3hjRN@gJnqw8R|qwtf*X$rO=8+?Xde~_C{3McU$cOvR*iryf?2R;1o8~r){QX zu-Jf$k?!>gSqu;8nBKh;`^jBPJb(hS~ zrsqQG!oJ#wlu8Z~Q{x+hZhoYEd*D@Fs~H}{-rN*ES79kBxy@u;!^_Y%upvi=VkcA@ zw@9lew zCmgGUbu_ROChTr~Y0#b4%`H(F>O4C8oS9eSId5U7T_tk9uA~9sx`k2A%$F+$oD=m! zpYJ})|7N@Fb0b?u<2q~?A;AiCc)|Qpk+wsSQS{B3UXvJ=#Xj z(hSt1kum5coSM_#KI2^e`L)y5t5LLzO3+uH8s8^b_4x*Wm0j{CNTM7`46kWy zeb)V~Pp?{qlZDcCq{F-zEe0>F&3C(g=SFiV#qLn%(sH?o=wDfTk)^hdc!#aQg0eFz znfFg6?K7p@nyshT71l%_-m2t8vo&*HDst~WQ+Yd>Z|nKFE&F-5lJY3d2>JTDXGv|F z-+$4E$rWe};{3c`P(0%L(oU>sJ6pU$r2?I}D}ILTv{HW7OrHI5zL$o%((w+REAupf zN`Xm-XqKCo>_bvb%(#O3@&{JMSF>8Y(+)L6Yv$KElu}EMx`(*b!eMhiZF1EPPtbe! zR(I}uEL3+hYnN_?!W{duJ{1KBMkQUn;+=fgMV?%EIKIts>dT9MZqxiKnzG(m5~f(z zqGofVboH$LXpcTM4`dgw?JC=*i6859HrDx6$EuvZ_;PMtr7xD_j3*Gs2g#=mK)R~E z?4a$hbxK31Yu#If{7Gi>g%sMvI&%sqHrzL4R`5bfn)w=&x^NqCBVng$qfzqn=V)Hs z^Z9pBaESy(aa~H=#QkFu6%>Vm>dgw3iD%)V*+uK18wHlM@f#ytSDkG)viJ;fq44!v zxY{Czys3oJwn#6z+;agQbl5dcm?7tg3rJe8{!6dj=iZ~Ho4qqz!5Yc0uY^>nP!-qnV9D5Xy^zO`jnemk_eIm0*#E6oFWL5fuSHX zxdg@r(K(q(Fk|=%GD~v7a*RMyE;A=T8N_p8U|EXYj+$pHb-VJwVH%`8CE&gP~h zmIyI$aayPrS=?}Nc3fh#mEGqA%bn(BD&gO!-N<|KGGNgpL6aqstR0KLlreOP^Kyjy zDa*f^=woKey#4LpoY{Fi+FCUV;ZH)B&x}?K;+`Amb$-#`laJWBX3Bo|o!KCNq~Kie z>F1LEt9J9J>e>Ezlb_r7-RkS3{rnbR5{(x&hqn8cFIWHmRxN1NqfS}9XV-;w7W~Qz z&|WtCrE19Zr79~YwkzG~Snx_VD63(~(vb7vTkgzQpL5AtrkCZHh`_e~xP1)$Up|@z zs{VK;820E-@cb3#>t)Lr+N!0S+Khx`@?$J#G%=g`G<_;O?)9`T%~I~fN>i&$hZo!L zEs&jezeJOri$`Y7$%P(;j)wQ;y#D)anqzX|m9T;E#y$3HCWqAWT4f|GKX$_PsRNVc zug4xAJyxZ9K6-Z~UV78AiPos?@UYYZ<|2{`3%3!HLnUuQ_}Zcyn#$ zYu>3#FTa=lHdi-ONh;yu+qDvWYzr1h#<`tT+5J6cgRp9;_MEiJ&_y+xjrqr){+xVP ziB_4>DJ+?f;Rn9L2|#x1@ZZ z7pH{o`zUeEMZo5eNl)$HBZBOlyaKxp@V;r})RWlew>18iv`swU{7o?eQI@Y>R_)D^ z*Gzf;aC6D|O|4q*JlevQA2EMgAQN&o=b1!|v4HN)^;@KG-SJ*`_liQ2$g;$e6_dTq k<~uq}Z88kVkt#Vo>;1CtQ!d"broadcast"); -![IPCalcReturn](ipcalc.d/ipcalcreturn.avif) +![IPCalcReturn](ipcalc.d/02-ipcalcreturn.avif) --- [⬅️ Go back to main README](../../README.md) From 77dc0565a9a93004f28647b3315eba5ae92625ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:17:54 +0100 Subject: [PATCH 935/988] doc/mod/inspectvar: update screenshot, with terminal window --- doc/mod/inspectvar.d/01-inspectvar.avif | Bin 0 -> 4232 bytes doc/mod/inspectvar.d/inspectvar.avif | Bin 2838 -> 0 bytes doc/mod/inspectvar.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/mod/inspectvar.d/01-inspectvar.avif delete mode 100644 doc/mod/inspectvar.d/inspectvar.avif diff --git a/doc/mod/inspectvar.d/01-inspectvar.avif b/doc/mod/inspectvar.d/01-inspectvar.avif new file mode 100644 index 0000000000000000000000000000000000000000..1be1358008388ec650c82e8974859237a0a5846f GIT binary patch literal 4232 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 literal 0 HcmV?d00001 diff --git a/doc/mod/inspectvar.d/inspectvar.avif b/doc/mod/inspectvar.d/inspectvar.avif deleted file mode 100644 index f1da1d4d1bd2685dd596c851d4100623463bd455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 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 Wpi-Ml?@^$dcvS}^Lq&v)tok3qyD;GZ diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 7daba153..e5c5629e 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -33,7 +33,7 @@ Call the function `$InspectVar` with a variable as parameter: $InspectVar $ModeButton; -![InspectVar](inspectvar.d/inspectvar.avif) +![InspectVar](inspectvar.d/01-inspectvar.avif) --- [⬅️ Go back to main README](../../README.md) From 2f4e83990a4133607a80ae64cbc1b6deaf975a2a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:20:44 +0100 Subject: [PATCH 936/988] doc/mod/scriptrunonce: update screenshot, with terminal window --- doc/mod/scriptrunonce.d/01-scriptrunonce.avif | Bin 0 -> 3072 bytes doc/mod/scriptrunonce.d/scriptrunonce.avif | Bin 2356 -> 0 bytes doc/mod/scriptrunonce.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/mod/scriptrunonce.d/01-scriptrunonce.avif delete mode 100644 doc/mod/scriptrunonce.d/scriptrunonce.avif diff --git a/doc/mod/scriptrunonce.d/01-scriptrunonce.avif b/doc/mod/scriptrunonce.d/01-scriptrunonce.avif new file mode 100644 index 0000000000000000000000000000000000000000..461c3981d0e2703ada931454c5c99030b35f50de GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/doc/mod/scriptrunonce.d/scriptrunonce.avif b/doc/mod/scriptrunonce.d/scriptrunonce.avif deleted file mode 100644 index 27ccd41fa5541090b5c12e9f50c653e14f6f0e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2356 zcmXv|2|Uw{8(-#_l4~mW5#?%*5JGb2%6%(iuHTFeGs+RuYZ3`_i~`+vL1ul z2=u{v9%&4d@%KiB{J#W&FaQGkUwwoq!0W#?oEQKb_*Xl|$f5uWjX3HIL7-y{KgytE zf*=rt5g-`=2>N^buOi53e3*`g88e zuoNTNGlClfL;!yo2n51F4o{r2L7eyz1A-#ZsE{B8DuS{3B#1SZL7f3Gfu2Vi!x)b- zA7hGVW_)!v(AyKs3p&oOaqiV+l(+??R^P_BsTlw>#_cIymEbt z71-@Zoc#ymR1)q_A60I`qe;?AMmp?3$&q#<0c;fca`CB~LZ?%2yyHmSp=iRtY{)0! zzT*X6D`9f$*SD4*IkN04E}UZQQEUiLJ_?#uXcPFu_u3@Fwc3Kra#7|h*2q|9}OJalfNELedTbgmGst3eUn3^@E zIxCitVYr{L_D*F5WUCHXwVoga6o@RuvivNv)Fy8F)DBb*ch2e%6 zV=dRH!YZrvw@z5Ske<{wThC-kOY0@C9d9=gAcxF`G)9ArI(!Cv5+brXxjnQ|+&N6D`{AA~;F_FhlG}j}{ zR;PVDD8xYQcQ`bs-*2;y$o_@Zu5dV0V{awKIfdhOokk78AwEFzh+_g~WFhzpCIW~?|-FT+O0O9S~Q zLiI*nqB*PGTALEvU2Wjahk@W3p_P*=@@?yH+ZS~9WZC5?J?$a(*N1gX7h&a3-x4LC zwH>0{*!XxVxaMR&Z8z>Hk6xp>oO3-dF*cziuoJN9CEb2}sP@;E-$PBU@K(#u3i7lE zgK0&rPnqe=cQz|0?cDt;d?5Fs-8+2!3Q#UoIMGDvW()LyII-z>xykvZf+!da%elr_5y<3`jw2( z56eWv5LCimK4?~iD5yPP=UZQ@ns!144#)UO{@6_4K0DWmPqf z;aH1%oWzeRuDlaGC8kLZIk4MAZIjyRaW6qsS@QK34^16kC(cA1_e()eKr&(Y&qn_+ zAv?oa*=#DoSxU;&(Xm8`jCWY%31q(9GoBYBKJqF`Mlm8Pjyd=TbJDXgWAyibfe+|m-OLCXr}+Ad}@|?)x>Gp zSMi637MY^l*b9;+uhX(=apo^|@XVd#BjW`=x9nP)bp22Jb1bcDR5y&K2*c;ft4@5W z=_tcYx(qgJJQ8>vu{Y8csln2pKpzrL+wK-EDDk)j-ZG^hywI>i|BbQ6`RG1vZ zeMRaDaUZHy4`#+m&Yn?z^*M6Qq|WtP^KO@FJ6r!) zkq42`82eK?pS~DpzPHUq5Zl_(c_Z7EmlK?eBXj2OrJTMKc!l2UGyi??^6gqIdCk66 zGyVY_h;HgtiHu98bvy+~i^D&VyUCUdb*@u!U};Y91aDa$DBADNj9j!Lncuu8oAZfP znAvIS^EIPcb-UGc=n&YwH|U>F3%THTR3n@KdQ^g|Rq+k-YG-xqgsSnOhN-qyp0?SG z!wh0N4+=VG$!@*n2-yat^AWt%W$R0i=3IV`XCbL9v3b^HufbYgfiK)++F6Or!B3iR KdXs}{75@h@^+E~& diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 1fbb697f..db861bbe 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -50,7 +50,7 @@ The function `$ScriptRunOnce` expects an URL (or name if $ScriptRunOnce https://rsc.eworm.de/main/doc/mod/scriptrunonce.d/hello-world.rsc; -![ScriptRunOnce](scriptrunonce.d/scriptrunonce.avif) +![ScriptRunOnce](scriptrunonce.d/01-scriptrunonce.avif) Giving multiple scripts is possible, separated by comma. From e49f68c1f23a0f154ab578e8d3db7860ba1d0b30 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:25:01 +0100 Subject: [PATCH 937/988] doc/mod/notification-matrix: update screenshots, with terminal window --- .../01-authenticate.avif | Bin 3870 -> 2672 bytes .../notification-matrix.d/02-join-room.avif | Bin 3745 -> 2604 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/mod/notification-matrix.d/01-authenticate.avif b/doc/mod/notification-matrix.d/01-authenticate.avif index b897943b1fc7d8c7c0ac6a9f225733d24dff9e37..d5b80256da1b77fd66351b3c19654a9427d70135 100644 GIT binary patch delta 2522 zcmV<02_^QP9`F>9A`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951ST>t<8C~0YKW&i*H0004zoE?$u90e!<0035# z4FO1h31w|$VRRAz3I;eOvU;o%GSCuCWCGZ3EA=XQAkXW?=cr#3Gpv5b%Xdf$v0xN= zx{nP@p8!1}o)lZi$Z#oD#pwsMPJxhz{sBqI!*~b05sAoy*ofK&JF`@)GLFldBv`So zQI$7%G89AEf}$~w2G#{;gByWVE~P;dg)_Z>5b4=a`$?qT|?>gQmUIWoi31ftQj#w z+7}%A%iBR&Fi^KV?PWJ9y=lNiyfxB9^`zbTaQ*%S3^^3Rt*q&m6@WeWPpBcyDuB-1 z!MB4@Il(a(^-_x^!Pfq#m~;~$w9iO?l#uTKDALSOn$X0VZd>CzS^H+8$L&=%T1cto zUbRr+*wZe`S;Lq8FCy76((|c4Dmi=ZMC*|_oRB79*p8b0R3@#Q6qxo=6jh=DPHGhd zN%;%pu}NLkp4wT~_g6#zk#yMQWAg;rT+m$uo~_Mkj9-{?;q$N`(Buc;A6TV-8TQ-0 zW#pJRH=YDD+A|-rIRl2R*)u#l(pxvCn4GaHd+aK;d)rZ~nPN`fLOInq>~?O5K~Fkv zEcmCKh(1?gBr;mfTB-zER0NWIhwp>ZbIrr-)Y(vz!RnuU0NAB>et+jqeRQ9j9I(_o zh-oE)_jkZgtm~#5OWZLh{Vwl+EL<^Ey8Xop49EOU{2=^xslOQKwY^E9v-S#V0)O@$ zTJXLphr626y8aPhV$2!j)?B*b6*E(ekF;-Km=Bh};Ea1#BR3^94Epyx=}WX}{;=Fm zC$8hK&1?cm*ZO3~_9Im|;k1;@eE1BI(ol z8kr-E8WdWueQv6$;gt^y2C4>z3)*$JX~I)*hg@$g(s{3n4B^oSa;DIm9d8~?Z>>Fq z9cVns)gR8mVE5U9(?*Ru4s`g&tNRY5~UDw&*jU4SoKmZc)hN_9eUsCV*+Bm0B6` zh2$;~R5!qa1EvCDR}cNr!H6&zaz!hD@KaN&@@(1$PfV<7*5TA3qwRV*zctJ*(dWLI zD5vC6NV{y@OLAe(7jFeJM1j!i@zz8II7u}dVnTzr#<;Yx2Gi1iSH~CMWUc${Q;GR_ zR%+t{824#u=@S2ccD7vQf@$x}8iclAZ^ctf8cke3C;Di?PTI(zxdk3j6uUR@0tT58 z2w{ifDy4qSD7xcm(CEslhAVk0ceX&UhT5mk-76V`;aXs| z3abNS;at4MlnT>-jceRG1lL);;z=K-nc%+|RyS((*w2iXfh|Y|fOJbQlg?IGobqEm z%=4kzaLE=f|D7uKKU=BLHi`*t$=`~B(Eglwp=S8#I(F4@KZ3`lIYQzM8tX(#Bm3MOd6dk5f^o*P4Odsb->BEBSvUWS;HRC)o4lU+{sQ z&^SZ(&C8vq%LCei5^YvQ| z-5oeOnBjX=$u~SxW25(56~9Hd=Znpbu;H5bt-e%xTa$s&LkyU9lgFP(-3Yhq}(lx zDtQ2ED*S-Bkchef%f_h3__W58skw=IY2VpaS5P%%_&9*wMs|B%5Z180h$cOL z&w+15+&}S@RMC61xS>T1!X0!@g*xU3<(FJ%iwJ~#4`(mw&!KF^cLlsN3AiZc-+t8m zF{%N=C$S(n?Nih9`XOn36ZNUDWji70hUa=;ov3FmkD@gZ1+~ecw>0k?4O&*eL;x%1?S|DVl=A k8d0_j@^cat>R5mlI~Ha{vyTR7UpikYnBGl(YzzrTa1N}~U;qFB literal 3870 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 U730Uad4+?KN3=Qa{QeI9Kj5%V`v3p{ diff --git a/doc/mod/notification-matrix.d/02-join-room.avif b/doc/mod/notification-matrix.d/02-join-room.avif index ad99ffde8e4a5885c1c44d361beeb4927fd694d3..20c4e799a41fb361dc107f77dcae49ca26214ca8 100644 GIT binary patch delta 2454 zcmV;H32FAB9jp|PA`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951S82|tPC~0YKW&i*H0004zoE?$u90e!<0035# z4FO1h2_bD{VRRAz3I;eOvU;o%GK>;TWCGZ3EA=XQAkXW?=cr#3Gpv5b%Xdf$v0xN= zx{nP@p8!1}o)lZi$Z#oD#pwsMPJxhz{sBqI!*~b05sAoy*ofK&JF`@)GLFldBv`So zQI$7%G89AEf}$~w2G#{;gByWVE~P;dg)_Z>5b4=a`$?q9LVuKOd&HWzDqHB9gCe%K!H}Y|Llb#ZrO#-W%@Y4alptY&RtTBCB)>i=pi z-aA#k2Jx6hIT4$H*LiNgQrf}19d|aM?8Q&b8 zb#Dw4ZV{N~n5J!6U0Nl2xbWQY&?iRH%>J0{Up2^E5y~|B0;}4~(n9cM3cPrZ=?#K_?OyzJDxw44JV?x>L7Yr#;RO2jb>IPqyZ`?Ut! zAk7DEL=T3Rekhk|eAp6nOd0!s0kJM&Ca0j1+Xy#N#V#h1^@<_pku<`WN5Gtqw$!d} z)dG@5X7(VetHL2*2pvop9hZ2A1u$L)|J0rkLc{+Yd`MD4ZS_F-m!Q<-J;eli2c43lGhI zdD?|bhqEmQYW6J<7XH&Zanf1jQg)bTzYiAglpYZ#^b;t%!)N%9!@U%K>pbINXU!Z0 z++P%a$8?foyFIctVkRJ>VCfSuATllOUs1d5O>;3Y|Gw{y z8sB^gEh}PNN+S%zr-I3U7n;h;a_R4T4;eeQW-oH_UKh%oF8ne94TOdwKEo(acRH54 zNeR`{tz-o<$d2PCU4~AeQW>3A4&!KJDH@Ous8ixn82lB7ZnT3{>#Qg)SFdc9json< zBA_;lF3Gv-DM_~W3_&q>V&=kjNH=CaFwyjo;W02^Hdr?zmR z0TboWvwp`bwQbp{mes}O{-{f{CiJ6^cphMN6aC~iV3i;b==^vX4GV@z<+#PXtFr8{ zix2rgyNlD+7_CLEfmMRywa>U*Hx@TEre9Rzjx2Rz1x{|FJ{epP4GsL zGFnNHaHjUw3h)do93W|&vN?Ax|Bc4$?RSH%j>dobtB( z3QsE5VbY60QPORRlk2Q;Nz{uiBDE$GXOcoA-uyNIU}G?PM|S8&AdnRdX_c{&l0flG zmC4MDlh2jOVZT%>Pzat?s$qtmx_4>o5W-1xKvA> z8udD^Wh!uhZ;z1r$3BJ+_De##>~Ie0a0ZbW;8r!%S~GB-&|ObT>#^@f{_R~|eVW@= zCuMhbPd3#RTqq-M8Kw_O z5QKu;N_MTMlR$X^(+wy^HH=;+@1ie% zZ`6*w3>H)^R!pU?_*MnaCvHvuH7a4l*sg}}N>8rV*vDFS0jO20Sd=(zD7kTgcWGn{ zz=iSH@`KLPnD@WglaBb@)Tp}&_Ei{IF+X%g zW>3noDQNEmmmCRrH{TjveB=T#L!tGimM9tE5#;SAXg#-ei3bmvATnlQ3IIj(_p)D# Uq-Y@J-%`9eS6JN$d7K_Pho`QO2><{9 literal 3745 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 K&!ZvF6aNEFUlig1 From 699be25b64a8b67a99786387c8b0407f7e939590 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 17:05:46 +0100 Subject: [PATCH 938/988] general/clipboard: use textContent... ... and avoid having html entity encoded characters in clipboard. --- general/clipboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/clipboard.js b/general/clipboard.js index 30c31346..cbcfa4ad 100644 --- a/general/clipboard.js +++ b/general/clipboard.js @@ -1,7 +1,7 @@ /* copy code to clipboard */ function CopyToClipboard(element) { element.style.filter = 'invert(1)'; - navigator.clipboard.writeText(element.firstElementChild.innerHTML); + navigator.clipboard.writeText(element.firstElementChild.textContent); setTimeout(function() { element.style.filter = 'invert(0)'; }, 100); From 94514a7c75badd034c052d566f15a530243b6b9f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 10:35:34 +0100 Subject: [PATCH 939/988] doc/check-routeros-update: update the forum link --- doc/check-routeros-update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index a45e0751..09458c17 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -31,7 +31,7 @@ automatically is supported. > of view. At the same time it can be source of serve breakage. So test > versions in lab and read > [changelog ↗️](https://mikrotik.com/download/changelogs/) and -> [forum ↗️](https://forum.mikrotik.com/viewforum.php?f=21) before deploying +> [forum ↗️](https://forum.mikrotik.com/c/announcements/5) before deploying > to your production environment! Automatic updates should be handled > with care! From ea9e843ae95b7a4cc64bb504a135d7a420bf9c5c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:07:00 +0100 Subject: [PATCH 940/988] contrib/html: add a class for code... ... and make sure the notification generator does not suffer strange styles. --- contrib/html.sh | 2 +- general/style.css | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contrib/html.sh b/contrib/html.sh index 098ba467..03eba23d 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -14,7 +14,7 @@ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ -e '//s|pre|pre onclick="CopyToClipboard(this)"|g' \ + -e '/^
/s|pre|pre class="code" onclick="CopyToClipboard(this)"|g' \
 	-e '/The above link may be broken on code hosting sites/s|blockquote|blockquote style="display: none;"|'
 
 sed \
diff --git a/general/style.css b/general/style.css
index 191c0f65..6f758032 100644
--- a/general/style.css
+++ b/general/style.css
@@ -58,6 +58,8 @@ p.hint {
 pre {
   font-family: fira-mono, monospace;
   white-space: pre-wrap;
+}
+pre.code {
   background-color: #f8f8f8;
   border: 1px solid #ccc;
   overflow: auto;
@@ -69,7 +71,7 @@ pre code {
   padding: 0;
   border: 0;
 }
-pre::before {
+pre.code::before {
   content: "📋 Copy!";
   float: right;
   border: 1px solid #ccc;

From ca487376d6ef71302a1c15446ae178e12ac7beee Mon Sep 17 00:00:00 2001
From: Christian Hesse 
Date: Thu, 20 Nov 2025 22:16:40 +0100
Subject: [PATCH 941/988] contrib/notification: use rsc.eworm.de for default
 link

---
 contrib/notification.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/contrib/notification.html b/contrib/notification.html
index 7a6ada74..baa659c3 100644
--- a/contrib/notification.html
+++ b/contrib/notification.html
@@ -31,7 +31,7 @@ instead.

[MikroTik] ℹ️ Subject

Message
- +

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

✂️ The message was too long and has been truncated, cut off 13%!

@@ -40,7 +40,7 @@ instead.

Hostname:

Subject:

Message:

-

Show link:

+

Show link:

Queued since

Cut-off with percent

From d4979146f99a9171d71d50c0940e2995d7b83fa3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:19:53 +0100 Subject: [PATCH 942/988] contrib/notification: disable the border-radius for logo --- general/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index 6f758032..c6b279bb 100644 --- a/general/style.css +++ b/general/style.css @@ -41,7 +41,7 @@ div.content { } img.logo { float: left; - border-radius: 50%; + /* border-radius: 50%; */ } p.foot { color: #777; From 544e8094de540fb9953fa5f0d2eb4f0d89ba7eb5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:35:39 +0100 Subject: [PATCH 943/988] contrib/notification: increase font size for heading --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index c6b279bb..25569bbe 100644 --- a/general/style.css +++ b/general/style.css @@ -48,6 +48,7 @@ p.foot { text-align: center; } p.heading { + font-size: 120%; margin: 0px; font-weight: bold; text-decoration: underline; From 1f6c43d5ce336b611d741549acba1413551548d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Nov 2025 12:19:09 +0100 Subject: [PATCH 944/988] check-certificates: show lock-with-ink-pen symbol in notification... ... also for warning, but of course keep the warning sign. --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 3300bee8..93641eec 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -231,7 +231,7 @@ :local State [ $IfThenElse (($CertVal->"expired") = true) "expired" "is about to expire" ]; $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "Certificate warning: " . ($CertVal->"name")); \ + subject=([ $SymbolForNotification "lock-with-ink-pen,warning-sign" ] . "Certificate warning: " . ($CertVal->"name")); \ message=("A certificate on " . $Identity . " " . $State . ".\n\n" . [ $FormatInfo $Cert ]) }); $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' " . $State . \ ", it is invalid after " . ($CertVal->"invalid-after") . "."); From 1ac0147fce7c0f7a31e4b2b1d802e8daf4d6f1b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Nov 2025 13:17:27 +0100 Subject: [PATCH 945/988] sms-forward: mark every message with an envelope --- sms-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index feb640e5..161ae6be 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -68,8 +68,8 @@ $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); } } else={ - :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ - " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); + :set Messages ($Messages . "\n\n" . [ $SymbolForNotification "incoming-envelope" ] . \ + "On " . $SmsVal->"timestamp" . " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); :foreach Hook in=$SmsForwardHooks do={ :if ($Phone~($Hook->"allowed-number") && ($SmsVal->"message")~($Hook->"match")) do={ :if ([ $ValidateSyntax ($Hook->"command") ] = true) do={ From 678fc3307e9858f7ada84f6bbf0264d9b6758cb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 09:50:27 +0100 Subject: [PATCH 946/988] general/style: clear floating on hr --- general/style.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/general/style.css b/general/style.css index 25569bbe..3d08f1d7 100644 --- a/general/style.css +++ b/general/style.css @@ -39,6 +39,9 @@ div.notification { div.content { padding-left: 60px; } +hr { + clear: both; +} img.logo { float: left; /* border-radius: 50%; */ From bc174d7f1ffab55832d558ca78583a58dcb92ea2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 09:56:40 +0100 Subject: [PATCH 947/988] general/style: add a margin to notification when floating --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index 3d08f1d7..c3e86901 100644 --- a/general/style.css +++ b/general/style.css @@ -103,5 +103,6 @@ td.head .bottom { } div.notification { float: right; + margin: 10px; } } From 84c49c0f7e5710a50bcf047269cc021c8c4abf04 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:41:23 +0100 Subject: [PATCH 948/988] README: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README.d/notification-news-and-changes.avif ----- >8 ----- [rsc] 📌️ News and configuration changes The configuration version on thyone increased to 138, current configuration may need modification. Please review and update global-config-overlay, then re-run global-config. Changes: 📌️ Added support to send notifications via Gotify (gotify.net). 📌️ RouterOS 7.19 is suffering an issue with certificate store. Fixing trust state for all certificates... ----- >8 ----- --- README.d/notification-news-and-changes.avif | Bin 14861 -> 8680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/notification-news-and-changes.avif b/README.d/notification-news-and-changes.avif index d91b8a085b061f256a8b69d900cae6894157034d..d2e8aa7fd896c631b4d0ffeb9e9878c66eb28f00 100644 GIT binary patch delta 8523 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 Q)r+`k(1qTlNY7eqmV!Z From 9ef3ba5479fca6a59bf1e825ca5c74c1d3e408bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:36:36 +0100 Subject: [PATCH 949/988] doc/backup-cloud: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/backup-cloud.d/notification.avif ----- >8 ----- [rsc] 💾️☁️ Cloud backup Uploaded backup for rsc to cloud. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 Name: cloud-20251124-092255 Size: 180kiB Download key: lteX51vlEnrV4OSXfUngu8d ----- >8 ----- --- doc/backup-cloud.d/notification.avif | Bin 11629 -> 13346 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/backup-cloud.d/notification.avif b/doc/backup-cloud.d/notification.avif index e533908f8d90b0340e59488c269e70775649b218..5918a6236f526ea921ec5b43fd534b10c826a257 100644 GIT binary patch delta 13225 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 delta 11517 zcmVlsPIfdNb2JEH_di6u=ZK|K@9i1`wnG*9DnfewxprF!bh$kAhj8XrSMFZ_j zW$Is(N8^6*QMrDT#8`e3XXCsaNAGP)Mv^xh1#me@c$OR5sPo89k2ANAXmXD{H5=3v zV=Fv4sh7(&1pQd}WNFk^Qh%RU z5Ip+@{l<6Nau0QklEczRe#2%lKO4A2w0247wJpwKAr@A zsq>gQL)vYnOzKI$!H)nnI7UGk=fjH|{%@x&J}HXVX=g~ZiO7^>lR5mbCVzXFEs#>5 zm`0>Or(4WnpbO;;E)XgO4=fz2wQxjO;5m`)S-qce3#iyJw_ju;z*Fk{X&ggUjPRBB zp}GWB0~WxVIXWq*RL+7WKu_r`4dEEiOS_2Bu1)eXYDARk8`fndV*)n^>^TaOw|XFY z3tC6~u*W&Ef7W5?kB8FJZhzF`1N40*f&!NzvSNQx%lPV@R|h zU0%az!XI+ziz+&!5EW$QDcgUU6&vmPPrca98)N)ZQev3 zyTkFjvc}f^$o3D4KB1_k3rMnsV_;SP8jZhssbJHAh~{_ZrbrLG1y?Q`5{}RF}0w5Ob_StMdBZUEj6>UB2VXJqo7O zh{g@w@6CeBDGChY+3_wK`}fx+L5NIr$-*;^uaQ;dJT1vO%C(DUfp>()gs zPRT3#;ESA_*4{9R7+dP7S!DdD>bmOR6&~iZK&kkt4oP3$*_(!+6CM$6%_$Pf7`dAi z_yA$p6J$AFrJO;IDmCw~lt)!~hZ9!Kg0z}*P03CmjN{0Bg zx6Tlb>wh#bGN~iB>hutZg7IxnqVpfR(1G9 z@7P(|Z_PJzJc4$tU+A5`=Tz$vZf1{N%+Tnt3MR-E;<%QfEhjqqk<1)}Qj*GtPh+|DRM3vdX?W!z)Yw!5@sN2&ir^@~%nC6UT^MOv!5@>@;ZNZ}GP(s4VZ_<%g zp)I%H(I-RLreSoAa4BCtU_|}+$@?gzUL#j-mAm#mCGm`@s&sJQHs4Fu6=og!nzq?x z%POj~UEv+4y{q$27k~s+-Vw?nKqHR#eSgPDbfNqFE>Vr3_LC%+QSIHvUa?+MxjrxA ztlIH8M<9O5Kta!n$T`<5Ih9ddGhj@zzb1hN`K504_R;OHJu+x=#+@~K81AkQfTF3+rw>U1Ash+Rq;IA0SsHT(FLOSq~isDB$n z@qh-#%l$^3R=qVxXSLZ}*cZ@**YhNPFa+|ivK-T5cuOB53`UX8ne$4$y-eSv`v3j@ zGXM$V!xmvTt4Vez4}g_!vTk{3nrL!F;;u(-bT`R0jKLF9g<3gJ#s2z+uO9x ztm{{fL>>`Sw0J>n21NyatL@g)BU4j>%S3D&GQdpGGa=k!Wx6gG#8X_F7k|li1voRM zn+0^!?o%@H88-Ud*=8YymZnK>*v2rnB@?x#zPdgus?<|(G-3R5#ip^A&%IBCOx; zX?fS32PVLJ#(&d6`DbMSJeoX)Tv?6ulP4GFc7;9gL*qh(<1Rcr#IG;J5;8}?<+5WQ z-PDDyFCqEAt@ty{D1aiRO4}@#OFo}Ukrn`zxLgE-vhqVAnKT1jwSNs;lqxnn`j+vf zWGX(C{Q)Y*(xq~1(Q#HOLV88cJ}U`p_6WzU_vX6nJT?%ZQT1H}>yE=!v948iSbE8LH-5MvhiE?28# z#-dIJ!uN$5!y)nlkAJ-kEXSOFQu9MpKgLMUg5_Ej7+KN4@Y1CvyjL}>nY_(G?+4=H z^EKXE2qC}z^_-yg%2=nE3#N{WnEA%6YR^In>yzUThP$*6Tj5AU!F-QW%<7LEieFp; zwx)C1-t%?37ZZ8)^a&(^<)K=CtLh5hceJP|_mb6+%-mov%70&=SJeqtN>=WvSDXWx z^~F|Z_NA+zbCHF{`hw_ytyAQg@OxelbWk$a&HV_gc;GlZBV_#WX>P|9>w6^}o-cME zZV+<}`IE@3_oSLb9-El+08&v864a%RUAIF6qZyj`au7tR`t_+W=RNyo+LU^kTAK%y z3uJGn@P3lnXMZ1bFN@SGJC5iQR-HdT|2XV!`WIaQSNv!kAmt--A0S^Ao%X&IdYgID)5FG|w{;F5;bkx3HhiFyh2 zYZm($k!H-~&Z!oOE8AWJ_j8B~Ni2A2Qe-9|unNp!QzY1o&EpltO$lnc6)A6%U#)3Y zD*lshHh&!OjfGu$6JfmNpp&&3PC&#p?n3f;Qtk3rSoTeUGQc!`A!7~hO;D<9DZ14j zbPY!eb+&euGa+4qqcq*}=AHsc4Sqe?k?tQAsi@oc@-TuOz+eiyboV%&5&`JfQQykC zC{$R|opvYULGo4DTw!k6L<8_!dEpM!H;T%tKYz}j&^g(sDK(>VUCak4_5J4T@suo` zRLaP#fBW`Y%^fAsxIHVhp4`s8XR#>e5&FhhOY9v5`44us>~tBT5Va*;|?wg`iKj$ltMonxt@YOE_}NG z4}_M*P^t|+uq59~SJLpB$%%m5wuYU~D-JsrK1VgX&LU$sXX?6ZqVxqWRKjwD1%DBh zt;4Y@e11$-ox^zy(vzk^+X4II#`Hrp0#&xHdLdw3t}7tj^PspUr^0mpZk7u zK~*+M|8Z``gV1j=m@?XD^oTT3_1MgV-@vK4qyQjx&PI^0ABGD!B7O&@L4-LGTn}qr zZ4O&cnlC=mD8p`WknQ4~?<_bRf`9z7`b-nX2)`C%G8DipQui2%)(hJ zbBhC8mBeJ1Q$Y0Gp|`OmKgqnkKU$%BV6F^)OlqS3xF3m!^171N74j@Kh4zS z{K-8I@>JMDIUwqfI`I?HQ6C~PZ@1*{n@hW!O=TIwz29H$D;FS&m^C-RXMcpiOSmw* zS>Y!CMT4N+rSWd)qO9*rOR*lVCX1CV+c&=c zrV4Tpk`j>r_EZvbZJ?WW>wg2+&q&LdQe!`$(~O6;8|a~aN^?u)H#E8}Pe4d&bHD#+ zz@eFu>JY)Upoi$HFI3F^z`z|_k*9#p$Y2fI{ec^WbevL8u}3a^s`M0CI6c~YOnclH zQpfnWzZmB3Wd}_wvru?~>Qo%gEkDw|Ca{*&&DreP$-mp2>Su~F(SI`@hl2h}?JPze zo}d~!*WaE?+XQIJOmN<1h3d7jy1sQcf!;E-WuMuQWRG3Bs3}T%%=F(6+D*S4h~Hz$ z7sfcIuyB9kOL%Pqrz-GkSk!U#K0=o!ZX|eTcwzuIj>`@WxEx{UTml%MQ}eeKgU_1L ziH%Jg#;m&aoK=T??|%ahn0U;dy&-G*DD?K$D2vN-P!gMz!8;P09Yfz*rk2~e@oFg; zVmM#E%lrRTPG?yqRYcK*GVzr%v27SHSqole*Z>8%BCg57>v%3a`RuMg|4|ToA3q{R zPO$j_WdT*EDK1j++2oh_Wuw)ZPBWBeX@07g#D8YftxyR%1L;Qbq}Jb3 zw6AgatXsRCQ{F2il78wZ-}x#iUt)Pmiwyma)uG0aZLkC~i65sUNW(In$uy&+190MA zk6@Y|GjPJX!PsJVifsZrf}z%*EHWS~cy21aBrr^gQe$Wxq+$|740iE*E)!WfG|D3M zf`3vPcHGD_Sbrm$ps8MXbvqNEE2q+wDG75iLAeMFYGBe+85~S2V>5ybS(JW^4T&P) zmz>Gx67i0_QQAN;4B)E2|NqS`mfdD*iPdA!hFmpuTE*JQi*_bY4NUk9@1&>ptb`t$ z;6{ZCGp~c@gks0Z6Xq2uU;aj~*dU=!n~d$1UZFD48GjtyP>ADnYSE;krJ+BZaP~i3 zT+nH^=*a~kt0PiX79@VYdtzUXDWSEI{RwUrj5g9Jz&46!f4yE_BHak4%Q7g!2+&wsKm~z4u(|pf?=8bAJU$L$z{5QmQGJC`88zYpx*0)qKDUSHI~} z9{3y7Z3LfzXurlcir{k=D%8M;SU`h%a0(ephenji9DEJfQS}++#aWY$0QoV#fgoN> zU;a4)H_7juF&8DFUitg+f!|lAlSUc{Ql;RZKyhYVZG~)8{S><3GzTJKzyS6pMSuFT z$Z#t{b4INqMFCW)sVphew4*{;z-fR1f-{I3fX96HB7P4rM423HyB+Uc@6?s2Q{{LT zH7LWl*pD1Vw$sc+7ZNlVHk-(+k2QF_N?6yl7Sze?lipdjbdMLtp^R3F8mG`&`FH~8 z%s1ew&zZf#I%AcOO6Onpbgxr*@P8ipIxZ09IHD$VGzg9Sz5Ug{Zs10g8S+r-hNHf+ z?K+>~0LyRJtO8{{#EtEqQf@DZzA&FMde_%=D9SKul_49C=0)M|VKnn1u z8n*@3><-6&(g@zBN+D(_mpjs6Vb~+N_#;n0;#JgUH|lmV&ZFF+Qa_L8SyVqza5A;e z!7%9)S<=ZA(l5MvOF^abUbwGY$#UQF)R+I-9y}E^tjK35R-m!GPW1WYXa{)^g21co z5q<&Y9p@`yI#ZQc2(^{VF@I#4B-KN=`_l^4Q9qY^el6;>8x9wf0aYV~q>q;QX=y0A z>tWtqPxXN6Qs$o@lapZ17MB9s%q46!=_lXD$~GO;trnwSw6#bW;WNejd`Iitq}GLp zF-dDx2TJ42r~y4BLEfoe>&vYm@v0N8&2+S7@R|hQ*4z;3^Tc@_a(`i3hZW6KWg$sK zIY|Lu2fkgR%o(QIEZpiQQT59xsBpC#2z-Qc4J%#EGx_*1N+Ze;ah{C|v7GRD1Hc&K z(N>)?8u`=VLV$nkIq6n;y-pthKdV0i$&LEQG(bFGaVN9TAb$-vfeBaUS^T_xus=%; zo+7C5;0BW^!k; zpSsl|3nGdnvfk|1@A;%IQN3wgEDH!aw1EI1$q7z5kR<-9l2RLrpZW3JTRoZMf9&bq znJWsrlmtsQxFt$=&h z+&~@1!Z4sf0Dl#T6TblDt*7>>&ok!g{V4qw)iKQ=sznjM{S8SAuGyS)B}zRqN(Scv z;pT*8;`IU}cYP_Vh+7`dsB7Ml`Qi}F+O=;rl@BTt!|AMLILsxJ0nn4wtrb-5D0h5l zXSO56qI8OL#&cf3d#}2?7CVYeR|kYJE<8%yaDaCjkbjjXAh03elDh=_|AFI5m3lBGzeERi+`?buntcqI-d6t+m7cW05!lvD#E+t4+I|Sp9 zW=I#H)u*WZ$aZJ8d9q;~C2lk#lwmu?(OTm1p=r#hzFz`*K>dR9?^;u!d}UtHgaHXV z(bPZ*EPpz}M|1`*UVShT3LSm;4IQ5wf-Wis#hU;r2h?pVp zD6|n)pruEDJ{E1QHz3{@t+Apoc~K9t{~=`~Jhes4+sUP6Hi~k#^myRp-f{s=&Abcs zYhpNG&c>&^LHW``B$R?USA7yT7SQikEzET0F_9#I)7~Phlb@dr_0Bk_W40O??f*g} zuYWwSKF89Y*1xv+{>zDQYkebYFK}Ad(%+P|>@RS~F8_D=8K=CqBT$jkaML;{nUn%FoHd7 zp|AFFh+Wys2biVpxpIvc61Xi|uT%IGJ+kGe~-ms3a^5ca+*XIk&PJgT4 z0YY)ZW7<5r16O?gC@O%Vbr7IPbZ?`9JQrV7E1dq+F1#Vb-uO=-$MYV!_pY@6*|CGn z%!sp(SgH^-CcPhWR9l?Mb_PtNsMNE9o+&2h6&yRMQM^7!FR>D8*wH54T$~7`5AW*Y zQVGY-eU!%$VIG|D@?#5i3w|OFyMIFx-!-*Uh_au3DeaqBbk_{dI~SOf+ehOUq_~5S zf(>Jx^{k5PT2;tY<8a`V|NCCVrQCL6o4f=UbwbDOsP_2L#%Z*A_+B7Y3Cw4@oS z=pFatJED736Rvu8`}}xp6VbAsPJMdZWk>6X%LO`r8*So zzT2WBwbh&xr+~Z8!eoE!9Y`A7&451tUCc{k}HtcDKni2i83rl1Vm?3 zUvvLc=STg(6kuLBg1|^nKz}V|l2ym<2SqLmg0oxJN~i%;d-zJG%Xk~kBN{m~=5L0t zAp*|OE&k20e{AIdT>I6=TC{-{fgQDYzV#_=sv%Hjb@P_Qc%YJi4$%i9O5cuUki~%6 zY#b5p@k?%Un|Ar>J3P7Jy>GK=nxjb15KMmT4JqHYRnZ{c;op?QdVhZ+sb-WL?eGpb z{9GhTk{J`|ibDA8%958Ob5SNUifGh&YeI(*JbI>(AcYJ>CDvmLamvYg4?=CF%Dd)b zQ~XGm&CH^z3gl1UI2olEU`|30x>y<$l$E{u-O~Osd{QP|ry3`t=f6Y9ijd-`%kU|Q zKX7~HrPlWtrj`8sT7MKK2KGo!;?3#1e9~Nn49n^^6#fMOVf#UMyDdLZWl70pQ4qDmi@pHL@Nq8G?HP=$aN7yD|!7an( zuaTL4k0uW?@5LA4$=L?j`nxfaU>Mx%^RvHMv7-O$7X&sx!him`G==gz+tBjgT8RLa zA`e{B>OHuS54snAN7!{ms*Du?6L}9Z_4ObC5*C%h7iQB!7LG31dagbI$VRe*(Jva@HVM z00RjDMyFL`u|i#x5j}8v#jF_Fpx`CG*r0LlU)|I7W|}Z8EiTKIwNeN?)+4AblbYba ziL=XIHmN}D>D&%?2QXGX{Uozh?h=B#Ao1@$ea1PfY-O2W=sRPq-SJfyqdo-mV2mKU zKxYiC_j_Iuq5z1pSH_Goe^tdak_{AZxeQIhyOw2ucD6 zsG(BQyz?Iq+;fcZ>Dg;Ded0C~XZg?K1b+_fbe*@w6WF(i$_HM~OCtn@KQM#*KP?gK ziUG3Ntt448rVe8oxT8-chBjv#J9@j7T0^_bz8x~{T?y`C(f|M>zxQPGKI~WZZIF&0 zD^;yQLvG;ua>6l(LBG|T@80LFKV(msQ=eyBZ$j;$-V&0j=H7uVsNC5NaWv3Ik$+1c z1uGKz+N==?AfX}ir#`8Q@I%@JppR^ILXN+-sEDSR++C6`peAjou*FN{inECG ztWHtU4dQ&|#dFd;;t7tW=2+A(Wq(Iqh3X{x-ql7pm3H3SGMNM4A0yekGkx`|y-7G0BL2@QMc;S%v*s?=}0bhG4;FTirsl+JBO zB_?;!1?P7!Cu6bbjuYBRHS^DEDM1B8G%fxo6kb29zpSUw5cDUrU*Gc-9e=V1IF|nH zITA&o&E6KvfExY)ma|r1E12lpHA#{A&JM~wh58?FC35^GWCvl zi=29wo%)B9`CvmmF&*9&pMQH%M|S=GmHJI2`kZer(s?^O&HXgQEkSeA5PKW_g*Dra zq9-A`YuYsomI~7d`(pZk-n4Qo8$ZEF2J+su0q&L&4{EysR!fZyUL-|Do*-x!8n*aM z$X>H1c8~LV-zQ;-ctvtLoDe@fd+S7K6>6o3;=ZIe)>xdkyvl=O+Ig zJH))YY-l=4JxGe$7@LoRilD$8+IV=CiZ2tp;nx%3p?5=v_zVhSKMvx! zST~*fI`H86W-!L>j{esAZAwa{gRK^n|}z!pUpv=5~n2|7jTk}Qr~?*j?#=U?bc?}g=C=NJT1cVB`$o2 zfGNn1P3!4Kg7x=bv_v#@E0Lep!1hv!>;;5TW^i-IH8^Cuq>HZ-APRQz;B)SniTvxJ zxZZ%hA1x$0a$DO&zMmfyp*{~kpPifRzmhtuxYgIT(^Mc|a?)ae*Xvmjx+Y9$7-30`9fv#(Y>j$`1yAe>g9pFvHX?aS zx4nILm~%v~W}S7z0&K2s5X5@3jwHnLAFvZ z8d7Uofr@1aY)%Kn<}BEiol8qU15;&oC*iCeIG?vB4? zjw!TQN`FGsFoq~$$p01>l15d?q?0i|&@=D}lb(Wht_n;nad-ZNy~_$r@`zj}vpKPW z2^@MiHAtzLH{KeSM{&eUGz{_$DM5S0WBtM_n#|D}XriL8Ne@OY=R2#}eeu4wN&z9~7iYx!w}0}mtRPBDVbY{cI?0(iybyG^29h@v zLLwgQ@11X%D|T5~FpZb{3p(J>uR9q$NZAO9(f^5>`i#+32ek%Cn-`XrLib7a-eCS?#&GhhgSIyrtA&Ofhlb0R1^pD zII5!5Dj{9Pt`613oP{V{pI-S8? zof)7MH;q6-)MTFhEC?&(+$RIkKHZ^I#(yWg=$W}c_9krw$Wrl>bZGFeGX`9|DeSY> z@8x`OZ9l=U9o>&hs&D8)L2XO#42PJ03K)@QH!Ur=wZtE0rBbA4(}1=3ND{dGyWkia z#^&F$%Yj)~VXO;-v-~+Y*Tjo$x6L-2C{K7rf%MQQ0u`4oI9J$U7Q?X0&OYqQM1KmuMvKMz0jltlK_zI`|p$bE179g*9MG&RuU*N$5FqU^Qb`7C_BdBn6M zj&LNtxvThSiWJKm87r3*3NI2^_$}u7PIyfxPA%}$tgd2_|g<0Z^izlTYs@)WFHnr zq9h#dlZqfSQ^J<1aD)>J84qsM!Y>aoYpsBp-m2iTSmsFa@3rQ>woy&9G0O_19*3Q~ zM$k?yxFJOCo=3FeT?k9pn%UzI57;EO0Xnxr2-El)J*sDX24%fNmGJdRXMGgi>4}*u z%D7f@GBYSfz(=m@!fU$j34b7AzHNFS^ex9|>8Gvd8jg#Q7*We)2&g+3sZT1Oqxj(GYY!0zeAAbDdT;M|2=~agymX}7Hu^V>bQK9)Hmit{qRl^>X|^!(GiKo+ey%nYsVasUBZ5I5s=qDw+$foE2enCA)T( z!MnLw#0ikVpT8+QY Date: Fri, 21 Nov 2025 23:37:01 +0100 Subject: [PATCH 950/988] doc/backup-upload: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/backup-upload.d/notification.avif ----- >8 ----- [rsc] 💾️⬆️ Backup & Config upload Backup and config export upload for rsc. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 Backup file: name: rsc-eworm-de.backup size: 372kiB Export file: name: rsc-eworm-de.rsc size: 377kiB Config file: name: rsc-eworm-de.conf size: 3.26kiB ----- >8 ----- --- doc/backup-upload.d/notification.avif | Bin 11776 -> 15905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/backup-upload.d/notification.avif b/doc/backup-upload.d/notification.avif index 83cfb18aabeb4cf7725154fd08a50663458d7863..3bcc1f4d7d51213235a240b7e1bf674ba4d6db73 100644 GIT binary patch delta 15806 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 IumPF1*iF}qXaE2J delta 11666 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

y>~BhrpmAV_~8K?;QJ4Jg#al~fTm zIMaFCVo|hci50_ei0$qw78LxJ*sdG71DO|QwTm|Bb;~%@wqTCexgB}Hq+@gEtiy@` zjR_WsuaL>KZr6s`)Mi;cBT_n*P35+v(v#*s-dmUhX@)^V22+x}as+^8&t6st5%BEQ zMXv0$sB$9d-QRzFWvlP|-MISW3}bQ3=RZrKZa8wnH2U+K0~mi`@#7`!ZJ3cjP>qu_biX3ZV}YaltfG%7Z%{gGM)XV=5o3jNG$>;ZodoH}q4CfCL+jC`%r5U%;L zt;dsf^mV8(eTuEI4FzV12{rx#Cin3IHT!2r&O3u=XgD8p5gwb?Q@`4qTDoX5aq3f`t|L-A3V9kL*9G;Niao9SiDU6uy3G0(6@?*asGwDCe)8&S!MU|D4V+YIP z0{s!OoODJTu4p^AlMCbVy<9H!`5N%zBkQ=yx|HQVD0uW8TEzi<1l3v5v5VbdssNOr c1A>QXZ}%nZXP$&}4L)eRUkp-e#9hepNspeM<^TWy From ac6aefd34c2070217ecd296745e8d9b93f7182a0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:37:35 +0100 Subject: [PATCH 951/988] doc/check-certificates: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-certificates.d/notification-01-warn.avif ----- >8 ----- [rsc] 🔏️⚠️ Certificate warning: rsc.eworm.de A certificate on rsc is about to expire. Name: rsc.eworm.de CommonName: rsc.eworm.de SubjectAltNames: DNS:rsc.eworm.de Private key: available Fingerprint: f21bd7e64eef82b963938fecd07ab0210194129d7829ba08c2d212d063f3b07c Issuer chain: E7 -> ISRG Root X2 Validity: from: 2025-09-09 13:30:10 to: 2025-12-07 13:30:09 Expires in: 1w 3d 11:37:06 ----- >8 ----- doc/check-certificates.d/notification-02-renew.avif ----- >8 ----- [rsc] 🔏️ Certificate renewed: rsc.eworm.de A certificate on rsc has been renewed. Name: rsc.eworm.de CommonName: rsc.eworm.de SubjectAltNames: DNS:rsc.eworm.de Private key: available Fingerprint: f21bd7e64eef82b963938fecd07ab0210194129d7829ba08c2d212d063f3b07c Issuer chain: E7 -> ISRG Root X2 Validity: from: 2025-11-07 13:30:09 to: 2026-02-05 13:30:08 Expires in: 11w 3d 02:25:23 ----- >8 ----- --- .../notification-01-warn.avif | Bin 0 -> 8798 bytes .../notification-02-renew.avif | Bin 0 -> 8792 bytes doc/check-certificates.d/notification.avif | Bin 25274 -> 0 bytes doc/check-certificates.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-certificates.d/notification-01-warn.avif create mode 100644 doc/check-certificates.d/notification-02-renew.avif delete mode 100644 doc/check-certificates.d/notification.avif diff --git a/doc/check-certificates.d/notification-01-warn.avif b/doc/check-certificates.d/notification-01-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..e32e54b365c4d55cc65399b368ad1681dabc3eb0 GIT binary patch literal 8798 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 I*plx51DQ0%FaQ7m literal 0 HcmV?d00001 diff --git a/doc/check-certificates.d/notification-02-renew.avif b/doc/check-certificates.d/notification-02-renew.avif new file mode 100644 index 0000000000000000000000000000000000000000..9ff1400a467198c11b9924a83193cc02dfff5be6 GIT binary patch literal 8792 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 G;{O3h1ev4& literal 0 HcmV?d00001 diff --git a/doc/check-certificates.d/notification.avif b/doc/check-certificates.d/notification.avif deleted file mode 100644 index 7c250da192f5f0045edba36cc55e0e7246cd75b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25274 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 LpG`Ottk=MR`F=Nx diff --git a/doc/check-certificates.md b/doc/check-certificates.md index a9426dba..b8fece01 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -19,9 +19,10 @@ Description This script tries to download and renew certificates, then notifies about certificates that are still about to expire. -### Sample notification +### Sample notifications -![check-certificates notification](check-certificates.d/notification.avif) +![check-certificates notification warning](check-certificates.d/notification-01-warn.avif) +![check-certificates notification renew](check-certificates.d/notification-02-renew.avif) Requirements and installation ----------------------------- From 5dbd419d1a4a938a730a62970a026a85fe47a110 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:38:05 +0100 Subject: [PATCH 952/988] doc/check-health: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-health.d/notification-01-cpu-utilization-high.avif ----- >8 ----- [rsc] 🧮️📈️ Health warning: CPU utilization The average CPU utilization on rsc is at 79%! ----- >8 ----- doc/check-health.d/notification-02-cpu-utilization-ok.avif ----- >8 ----- [rsc] 🧮️📉️ Health recovery: CPU utilization The average CPU utilization on rsc decreased to 64%. ----- >8 ----- doc/check-health.d/notification-03-ram-utilization-high.avif ----- >8 ----- [rsc] 🗃️📈️ Health warning: RAM utilization The RAM utilization on rsc is at 88%! total: 64.0MiB used: 56.7MiB free: 7.25MiB ----- >8 ----- doc/check-health.d/notification-04-ram-utilization-ok.avif ----- >8 ----- [rsc] 🗃️📉️ Health recovery: RAM utilization The RAM utilization on rsc decreased to 75%. ----- >8 ----- doc/check-health.d/notification-05-voltage.avif ----- >8 ----- [rsc] ⚡️📉️ Health warning: voltage The voltage on rsc jumped more than 10%. old value: 23.8V new value: 16.2V ----- >8 ----- doc/check-health.d/notification-06-temperature-high.avif ----- >8 ----- [rsc] 🔥️ Health warning: cpu-temperature The cpu-temperature on rsc is above threshold: 74°C ----- >8 ----- doc/check-health.d/notification-07-temperature-ok.avif ----- >8 ----- [rsc] ✅️ Health recovery: cpu-temperature The cpu-temperature on rsc dropped below threshold: 64°C ----- >8 ----- doc/check-health.d/notification-08-state-fail.avif ----- >8 ----- [rsc] ❌️ Health warning: psu2-state The device 'psu2-state' on rsc failed! ----- >8 ----- doc/check-health.d/notification-09-state-ok.avif ----- >8 ----- [rsc] ✅️ Health recovery: psu2-state The device 'psu2-state' on rsc recovered! ----- >8 ----- --- .../notification-01-cpu-utilization-high.avif | Bin 6481 -> 3680 bytes .../notification-02-cpu-utilization-ok.avif | Bin 6797 -> 3988 bytes .../notification-03-ram-utilization-high.avif | Bin 7527 -> 4253 bytes .../notification-04-ram-utilization-ok.avif | Bin 6637 -> 3703 bytes .../notification-05-voltage.avif | Bin 3829 -> 3883 bytes .../notification-06-temperature-high.avif | Bin 3519 -> 3659 bytes .../notification-07-temperature-ok.avif | Bin 3727 -> 3839 bytes .../notification-08-state-fail.avif | Bin 3474 -> 3142 bytes .../notification-09-state-ok.avif | Bin 3531 -> 3266 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/check-health.d/notification-01-cpu-utilization-high.avif b/doc/check-health.d/notification-01-cpu-utilization-high.avif index 326e7feddb23d52c83f43050e15bb75f29b6c6c5..7fbce3ceb0041bf5606cba307c143ebd46ee4386 100644 GIT binary patch delta 3534 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 ILtHYMQ1-#8O#lD@ literal 6481 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 A>;M1& diff --git a/doc/check-health.d/notification-02-cpu-utilization-ok.avif b/doc/check-health.d/notification-02-cpu-utilization-ok.avif index 811ccd700714ce29abe0bea3076ad0fe87c6f45f..f8e91a3a21a8f528be3a27ce56e2c8f2f172f4e2 100644 GIT binary patch delta 3845 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 HO8Ng~2uSB}2Y>&( zpYFZSeeS2b&a=*X-@Vped%gS2002N|yqGOaK6r27zUvP^UkW{K-%ti1mHR{SFH+UcN`p4$glDApb`Okyh}5+T8nn zAqCXU`mY9v{#MW3t^OQ&f2bYQ#mxl~RiQ3c&WK0^b$78wM1&#T_tZr=o(t3mdcOij zLqkIZEDJBbMVlcwN2z+0Ua_|3wiT{T0 z>p)0<^$AB{q`%>}7zlzev_H??^xYDG_gGOy5pmF;K>^@y4tNBhp`f6mAfut8qN1at zVPFwqV_{-qkrNQ&5>Zpo(oj=SQPDARv(hneF;Y>niLi6=@(BtG(z1$4iSkQw3kdSx zHvyreqhn!Wkzr$#@zYb$^Z&Q)t^>eF0~kOEu?zqbJ_w8ty88mqBIZN}{jtBK+zSOm zkWo<4&@nI(1$B7$Hw8w5fRT|Qh)V~(MC1VoJ~9D4pDYTYmIW$FKnT9 z?jD|A-afv5uR_DZUq?hnB__R1ewUJ(mY$biP*_x4Qu?8~rnauW;d5hCSNE5m-oE~? z17qV8KPIQ9XJ(gIR@c@yHn+BSejgp5oSvOuTwdMly4U%4`%Bq>(uI%Eg#>|sA*lDd zKuF&A!to)<^n54;vRbGXu7nKyA!tN$3At6B=!^o|hs2g{qZlMig3HXm@1^}w_FoeQ z`yVO$hp>O@ngy`HAjHQ5;{(#bi8`w6*uJ0y>PzwYH6PtXD@an*4;tbz)lm5N8XQ@A zFRb4&cL3kzcngC-9&}-H_oh@x>_z2|fblTxh35j&S8X!5lnLju9duW5LrlV7g3z~Z z`8}GorSgd%AE=CQ3H}+`*v90VbLZYMPYK}Ev!LXCr8+SZCOIebW$a<(X8jyP*LAF*uI{q_6^C8|? zzYN1{$=n1FnUjW6n~IRg4WpM4Yv%jV>$e=bw}A>bVI-KzxebRsUtpqpWyW%FBQ3mv z`uU$%uBz0<;f30}R`#_71(%P2m>1HiABEvmwRKJQsYZ$V=6i|{EkR&u8O=@o+_BXL z+9t=Aq%IzvsfNnJDT@IV|GviSTm4(mh3DK;tkNq+< zFHyIlYK9zREr(KNJG&gJkR2AakGFks+I7qE?ICS_2$P;SgIwXcdtxy|t{KMmHbrl4 zvH=9t$H*xClt5rhodh!>!wjQ@siznV@Z$-vx{Uk&cE-nC-kM~RJ2yE{9?NZdmRHJ6 zTHMdaKqI!hz?|3dvSatN$T9eEr7*ht?6+}-=R4DIO_2)vb0-MRv~&(qH1dEdZP+vY z7~@%IeLW6~PDuUe-1SeLqK3m-f{66l{;!#iXy{ZSw+bdS)HRg6y!vLM@c{SrE9>^w ze$;GPHD@d%$udS#uHg+Dzsy&c)=KLNur>TSpJ#dy6T_I8;C@u{-XL)YJ|At{Nd;I3 zBUY)k)@O67xNo}IhY{N|iRWw0=CAS&=8#s#?Ho z%({6meFG!Sj~&mAb~5QT%Az}9$_B2R)ot>=9>x@eVWNbN$vN{&P6gn5CPvNiCU$9F zRTV}Swz^Nrn5g^NA@xTS_KakV_t{4{^&ODlt$7EOqu+ddB7hU4w5pDtMq!h(LMbu$ zqP2;Crg!-5wTUxRGJWbQ7V032P}!Vz2;%qaHKH z@BChChekTQjPK$>HBsq1CTp3|_7+T*QghLu#+q{_Dc8kfA+IQ4SVf4D*C0wreTf7@ zRUsx7nEhU#G`%tT$xI$0nPXwdrfYxyY7R=hZ4O2?Wj6P8nB&~*^s3}x4ZpJ?y-HIp zk{M^J{vN!6=_kbX^~-&23(2JlfR-;$?BIv)h~#m5q()C^|8^(#lBsKS+qL;f8FI~o zfY%kpcfhk+wj8YO7ZZvBALSN3fN%NrD!aQO8jFD+;UzU8EDyIJcK~YO9RP1?R{(Ts z6E8P{>f}pl591a6c-l*y2hxbrBR^{~p;bAX_c2Pi@cLct-+Z_w0wvK+l4>VRyslZb zUU`ptan zZ*60t^CZ`^P#W_@P1b|~CkgjB2fbM~FvG0rbNPjrO-YRrOyw@tqGYI4EYf8f))S$b zGKG>q-DK!RH!G%&$}rf#JijO!L-B23axJBvO9y>VPv?dwi)-vRnlk5E`s?Xpu&lgH zq;UKkcMTA?Dtr*MnWv6-R39*$@P5Ym5&U2S8sjNl`da1+|oO;4?p@x0n&X^q{#L+kYc@ zA*g5HOYZ<#&f#nL;;PcW5(Oe4=wBQC8_|;a|Be3}mm~E4!=mYYf#t@IFDy|eQEvKX zD=%Cy=x&Apz(5yeE~apxqt6-R52aFjjx^_#2hEttH%xyxCoRsHU81X;p>lVHS1%Vi ze?-1qNye$UQRHxUi{Vw5d`U}ZB$>U~)Ip$J7tzuvXyo}!{pu4TKa_A=w_|$zDL+an zva;F8)r)U504=PDsRmhD-%y2J>E~l1!+QIrUZHv#kytxpUNHr%UCDU0>;cLkiM9^| z&+fi(3pxJ|RTdX3ur!#JBgC&(eZC#XXGVu?*Q${AJp;1uu=25c&^DM7lj{nW;wStB z;_D)Et6Je*{-elsB?1#lnXhv_=0s*vCx;%42SIfMi@4f7Xfvz5`PNeua{yA=9(tU` zb~zPmGYU&G?~n?!Gd7EQj3#XSp^(sVuusy%k4VVf`SB!0o=jBpQ&w5n+xJc_<(Cn+ z1l}n=aqPirjFp2-x{pj<)gUo3RGqZEUxSOU37w|)_{xwgvfhZp}t?e1JhdJZmI&sXHonh97^PQ2$`}qSA z2AmWv%0$BCnjmb)W8<@R^9sMpA^Ug11}K_?Yl z-H>bRYm&n2(sZW5?JdpSs2o{tpE}2SXu68Gf?H_!J~XIa9{x1t6V#_k@tamMKRsX` z=pATqzvX_oQb@8=%SmMBe3D5lY9>=vqhfmDg#W%Tq zs^4-M^h$RFC#aKdXgD0i3wehODU2AL81r6N6#~ZZtAYfI9vz%<KFDXj@JoHIQ_rlwftEG&%Pv z+P(-h>~h$|IHpa5&IVEwjp-f{9;`LG+U!1qa$QQD^i%uv_bIrpknYwp{eax9 zPzcgI{ZkaJ8=UNxYgp~)fw%b_1s5Vqw2-DSO3$g}u0WnAaV2DIMPpw|*!{-5KA2M^ zWlXnfcBc)ul^x&)Ebg>|vesDNYWO4+1gmQYF8EcQ5G3xirM@+Z+lbFB7bS^W&p%4y zkdKa)f6++vsECeCsIPQU*eT7QuSJHCf@*m08%=w$7NLFEL{OIuI^#UdOi_M%HW9uapx%1if(`FaAQbK>r0rv;0GyqXB%k*}lGc8gre!Z{-GO z@A1c+P|HhrPpa5@(*&(wmfeIx!36E#eCIjQ6`o(<0@@G!)54{N>59x})W}KRGY(kI z{>VO)hP6`_k8HzCc7H>yic(r%oVV-&XY$*O)Vg@^!`??%(&Uk%c2(Yuk@Wp7 zzq%6CSZX{jl|k$4#I(4blrEWdi%65grk!kI6`DnuQo9TFgt!BN4b>a+EiXgITZ=Yg zpQl32a#PylNBdh%*OJ;a4BL8wgi=1e{j6rj{5s9U9DOvwY%ux2uD6`eQi)jc^@+%P z;^THHl>Ms=!L4^GkHV{?D<9FXh-jipEzY5=B|j2PuS&e03#i|uV3Lw#H3gwtQ7MEE z=CR%RQiU(kLmQu;Y;qS;!{FnKIIU$*&`!cxXd*!;_UIC>#5bmT7cWcIk5X2!i-@mc zi-v^{ipxlapG}2~<}8=T4Oh=t*X{&Tn+;9yf4Lj6bZFj{vDl0K#gq?YiC0AVyzXUm z?b#9^^H`GJ5?x1Tj(W(o%y@QZu4(F0jQBwj?98ZuuPYZ zQ@Ks(;73LJI{ToxDb~ngiY4;h3}yWU9YBu$f__qwt^Cc42jT3UyFR@NY%c$7v!M-ktP) zpwK#8Sxfx7Qz3v0d4-u0BbN=7C)4 zxi!JZgd;1R=l6B<$@YVh_ns75j4H*bpW-z5s6SQLp!>(Ck3_caN=4EP3cxX>*R3~4 z^IQ!oEh6H)IQ5RT8+l)MyOQX@LcI==TpY$Nrdr6M9L;v`a;otQra9CTS>W=4sKr@* zd>WQ2Mg9X+o|?N{(Td^1ZsrCeu*s$xN-SoXO_4MRE@r2ifK8;!h}(^Yt-= z_I${(H0r$1X1`|ZE*a>YW)V$FEcd~-`baw(N~s^*5Oqd5Y_2s)sV=>wPT%S{1o=Ui9FiTY@Cy0Q**Jf}`26>@lP(FB?YAKK3g5O(%&K%*2OUGBdvibDtchOH!C2 zpFq8v#p7La{Tc+_UxCZ@d$H_E@rIr9 z{D=YJ-uSor(I;Tny(`%JsoJ}PcKWI%ldZr>Zhj4mqO}M6v%331EQhU!{hq~2+UXnt z>EOej(=Q#rTWT~%e<1_34V&VY*dRqt0&djhCAxVJ6p=E_m>twp9nkiP*%QA_v=XHx z{H8JbTYILjIw2ej8A9%g1`hDel(l|~M@&;6iiI(z z$p#P6E->7n1>k6FmYU}lDA3MxC}VYOwb*e%GEp*Lz8+X4ju~Qi+5)_8#IkrIBZEjb zsHGxuH1hq9DjNgyok2Bteq8zlr<^0Q4&eD5qaGhusW_fnJ>)*uYmZR{W+!O5@J^6k z<#BW0SVDCO!zY_a=R2Y2jRHcfhicUoi^2+#@jA`k*qGJPFejMe8*a91D;cmtl@}j0 zB-d-{OI?}4ZMa)ynr5df8=#2J!Xn!LllKVe7>=zj*zL!}<=*-H+tA{?Jqv zC#Hr^3~V1#0%NhCXpspK@EAfIV7K%N->#O!y3ap7f8FiuGadj5un$A^6`>_E{VDot zC6Yo@I*U`p^>kM<3ti^SPB08^Rc2$tFOOP z&u&L=Cpcqey?$yWViwU6+&Oc670$GmGw#q+4xYr#xjf-*8MwNr%x_>S$}J|{dZEM{ zU<=RE`&M7At3sKja1bKDu1np^k83e##%@>;WgJ=CH&QTh?G_$)9si_0>?rj6m@aDb zLD<4(=LpLJfTlbs)-fNg%-^+xPqm|HN8{H6cVT2>CU{UWyIQxEUUysyRWO^)W6*g! zQDDIorfBNfl_TQJF7&kM8k2>8;g`;n9sXsWM6E$Qs*>Z!Q$;5My3?*?+r-$|&go`0 zbEQu`RfMWxwVo=Uv6J*euJn!lC}q5rcMOsnOo~TIq_y|=I@*|0Q=XDUr=y37xELSfbmQ^)F zLGRos4pt|hg(kWc+Eh)d7~*E@JG$NlHAJ_^*6+0y2|Q%Bhf*@Dlp6{k&J`K7K?wmG?UQOZ+ z9evNYr?Z{L$jI9eNt(< zxZjv(`Ckle@M@$`gxkJ1>DC6v8=GeMTJF|uaJ9f?k_wsQ5`>BczcmE7;y0k9ybz1M z9DAeI2mItyg>o%y+qJ9Gt1aMc8Oeh)2#ihW{p5zcgn8EVJ{+?)O*X%3XAa;#7x}&R zpaizW)9AJ}^5JQ6aF@BLvJtZ6$T(>v4+=*gm#_aD5bM$vnyhtXqLWKQ zioRa{tRNLTw>|%_uN*?{1z1~-I5%3BDcN;r*d@%PV4TnoGi`n!ldT86h7ZkNL?NZ< tGB)|@xRs<@zd+$JBMqU?UP&TVU{NO!=cVvc?xa|Qq7(~g?$Z?F{Rh`zPnrM# diff --git a/doc/check-health.d/notification-03-ram-utilization-high.avif b/doc/check-health.d/notification-03-ram-utilization-high.avif index 59155c563e96f10d48e4116d034cc5cb7840d51d..9015b4a318625c71b066b4aac1e806dd23089739 100644 GIT binary patch delta 4112 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 diff --git a/doc/check-health.d/notification-04-ram-utilization-ok.avif b/doc/check-health.d/notification-04-ram-utilization-ok.avif index d995b9a198bf3de91e117781f89535c6f048f343..8f949ecf50cfe77f8ec077962d31c4715f70705f 100644 GIT binary patch delta 3558 zcmVjA`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951WWB>pFC~0YKW&i*H0004zoE?$uAOU2P4FO1h z4Qy>>VRRAz3I;eOryOh&GS?bRWCGi6qG_Aiqga|g+dn!ZpQvDt&!h0F$7=%PfwW_l ziS;bmjgh$sR zB{#$}skEz#P?g)AvHY997&OX$JGuaWdzV19`I&Bd4G6Pnq4cKonq?jCYALl2v-Ukg zfF&Z|zIc{-l&687Y}ry1ScuYVoI5O!1&^LVaePtI;5H0TdE^!xX9jBd$Cl+d&&s#A zpUOoQKTBs#JTFkK%TrGAny`O)(_?=SFt~!do=LXMS^dGC7kEX1&X&Jb@HM=DS-{+c z6%4o2PfKQWz*TBC;#^s4pac>#^!7eQ6}fZGoKbc_6d$%^o$GBa^3o3voAE@{!i7J?E%+FtkwA32s_pg^0Nbw4ozc)xO!Wqn6H<}m1+YPmN z84*@chw|HCe*;Ea1do+mF$v+T#rURyJNf$+BfYLtj`uY_jBS^)G88XMy9R#rf*z-k z(ao)&8(Y!DDum7zwSskjD(JsPKj@`46wuA=6j@{cTO0AhkHRcqa7@RXD5#B0Sr9mL zP@4Lc+X#M4Bit}qFo*xAKdLca6~sd5D$APS^s(c~O>>3Gl27k+UrqJAh61VP5n8z{ zSE~J$VT8?=^*9xzkF&USrhOW?}ss$i* z)HAxpV*hZP`1?$Tv6G1`!KL2JCk89i3@7kQyF7;E4{C1O(L z?P+=(l0vl}#urZ-!(*LHWVwU6r@D9x_0nKUUETQk&}sCYC3sAr`Y@;q%j!5S1Rpyk z(gG6GfZid05A@4_etw>^X2(Csp^&6qzE{QRmY4X{Ugfx0qDY+wdVNAM$Y^o>&1_Bb z4`R50nXcAk9lvO-_x5;9I8fYe6P?%Efk!uCGx3*lncqa(^-*o7 ziG{9Amu}h=vL<9f7b&rNDLixsfb#$gq1dgm6;_+u5Y4~UNVsiFi zLqtb=G{HdMdfQ3_eqn52=B=}x$GaQiE^7{7K6JTvVh`G!NB>c1$+KJwohF&oa=Kez zn_e&3&4+VZl83Nr7*s8*b{hY<;#CmC6>hU( z29&$_nv~3c->>NQ5`n16G{5$hRe6e(Y~YvJgc69yt&bRN{oUU~&4VJp?Nf;R;wt0V zK#1)Z_hj**w!-Ez+UPeJhOlu_MbLua)Bj zgYba+lA+w%{ivdJb$E`1e`ouM^13S}#xztAy|hw)><*1AWoj-8q3yk&Zno=rJY!pO(+M5LJw>FI*-qkf$cphpKM~$xNz*z0_{3)F1jB~r%T{Mf$m_+@mNc~ggP>F2j58vTTRlzpsA;S zT*co`&@AFX04`UtOq>X~s`xjp5Mx_ElZT>feT^ioVeJ=~ES@Or@6PsLmb=5YZwvv! zXJRoQo|Y(SA7pHnPWGv2UBBVp@Jy`xLzLLHi%pT{cQcFl42gzj{>26C+c9HKf@BLS zZ8@xogKQj;$vOM~-b+~?9~Yb{>q4G?Kc{GX!2P)E?Yq!xT=zP%q7D$i`z6M zUiGZckhgglh$%QQh1#GQr#5~o7o({x1E&jU64~oVOp0;7GmI%jj9-(#zzC)6Z0&=^ zdSNxIsFExtiSW;rOO1Sr60#skr@b7>I@kyEzC}8$;ogP`&|G>cHg+Cp8&ZXT{sDk- z4=4bFh&j5&GhnffRoD2I_W!8o;|Z&(Awlbw354ZA;_lvhvSnH>l^GNbzeL!AeDWC1 z8AB6Aem~Vl1`&vPDz$*qN7=g%Go=~>^gH?P+@$R8Q_4o=acMjPbzx>&1bKrg891tu zqLO94V0AmB8HTy9n@Mv)DR(=6laoLL6M4@q5rig)W0Diw2uV7;qcg3eo$sV>LF=>a zVP#V3Q)wcoRjwy^uN4F~a3PENph%YrmRk}4(+w0_U=H@~YBmB99C<)Mb%^+>q*OGn z_QoRz#9@3OxuliV%GnQ|jA-r1xMIN4W&qH)s9K^;!e*aEr|Tz;$K2n4u3Vz^L3LSY z+W?#PZ-|Wc`PgGL$)fYkgOeD9_r~-E^0Ns z(-RLVIo-aG=VrEa4@}9iS9BU*eT+^xcJNJ+-3cmuL_JqoDg>sje5lcL>`T`x|$?Kd4G=p+>0ktSDlGj(XYF9kSq?+$|-}$&l?4B*9UExX*1$7gLJs zVrZu;n$q^yk(r92D&jiVZRQIe4Gx7fCPdzxEnmvj8>Ahjna2x%@r_@$3lc<1x%cslz7$pZ+1okSRUkS#xkNux6ajs3Z1F!HU5(Oohbvl01^X zbJiAD>3{{WZXRpr5yy!t>CbQw2}H^1P}}XyTUb{EIa!%;uvAE0nK7@N45!x59l6Ej zG>1dZsale@H8vK12IA(tHoDxqj)W$~YTQ%YQ)me+e6|CH$ysN!tT{M0gR#~H8>`o9 zqASa+WkU_P z-ql7m666PxJ8m+6newy39!Wf@hc@km@{xeoPCC!(i_Fr0k(Wvc;V>#P`dWiy-y>=g zXrHDKsk$6Q+I9ks^ibQA1Ube~e)Wzvtc_ss6z-E&JrWrt^VQOa;lnP0nynJjFK6r2 zcYmHgM-G#Of~8ar`E)m{jLaBV{`;ME^zy38pY3jr&h2Tu>FB+hJ3D_HBt@wM@+ErP z8@@*M5jn2Zkq5KjbbKj5INMNo`dHQ4LKLL}Xba5pt(S~B=yNze;Hw!JtpcKH z(*(o^y@=14iMjKM74b~FFiQF_OoAXr(1)+znHq(E9J0P*?0>K~Hcwo}HQ!N*8xom@ z@a#Q~3Yy3x4_R7F{_i_L8KA&YpM5qjd*|oU<3ISM-_v526_rUe8VVU1z9$-QI&y02 zY2l8A56^=uw16wN7@UElp;ua|Wd&MHoJPVg6e^nwbX}RNB>fRuZBMPNvi&yZ9lz$? zOEw#S?#M1`5=I#$8rU!3TZ{d)aW}hfAnEP7~dI>0z zCm)%I*&>}}4WDLUH*D${A^R&ThHm#|D z`U_?ly!MFmX7Mm8Ek(f)TFn@Q z>Ku+`g^;Z)3uJAWytGT6J6E0@coqN3xb6k=hkD$OSi03ZRV zjl0Et4q&b3tla;J@1rBc@}F&RVGwudpBxDB&k1pKwz_As0DuJCpCBAt z4*+n|5&RDW836z$9D$`F5T`$r{K-%vh|PV;{S6CGUcRT!j?RAup!oL;A}!|)vAy^E zLQ06M&0h@w0N2Xe&FasS_mA2`V6HGkRDr;(oDq>2;s&!pM1&#T_tZu>J`Cawxj#Y1 zz`#HRYzt4mry=wR1OP-<&W^55R*v3?VQ>JnV8js_1O~OZ&mjy1fKWh4p(p@Ao(;9O z__G=%C3fJx4Pq38gMnKB<2z+0UcJF_~B>%wo zbs(g_`a~cw(m${ZCW0Ug@pPKqX}0lSU)bv_NNcA?6QxRfxeP^P!XE z`NSc!fTin8FeWJ(IRz!l16H<&?1GPkghfQfp32I}D<~={YiaA~>ggL8T3OrJzOaMX zySaOKdU^Z!hK7YlL`Fr&B&VdNrDtSjWfv8{DS2C3R$ftCSKrXs)ZFs1tGlPSuYX{0 z=(nWyKg@l5FjDmiz z3xwo#FPs1cm4Oe9P+Ak+!i9*DKLmqV=2hW`PB4?e^FtC#*9lBgX2BJfqkCz8l>PUF zz5HJ(`*&ggp=%z%Mg}219x?$S37kk^$$Wh~?r4*t-sEMcT_ZH_Yw*@wd^a0 zp3sCdN6bwdKuqbrK?5fpN*9!H&r}z6pP0ks$b8j8Y%tOT#AX@HL-9A0VeF;d@%B`o zXdO6mJU(Q8ADHN7f{&8#51{8?z&YGBY7%bo7o+ zeCpg(jPIpze#Q~%!EQv$*F(EL$Qv)r)}TC`4M|Xe(nt&tAFtqWh9PlP#D9`GidbLw zTTjsn>Jqj|_8FX2Z;>fcpIJ8>(E32eA?>^p8;#;JXILMh&RG^^W8}0SAW|-$w=zkW zb%v#p)whPcJw_``?rO(zQ6esRuJwwh)r=wC1LXl3-rwsVh!D!menh#}%cZxLSTyAY)f!95;WV zBmICk6TZ;fs^&^^WILKn-n+0T!Nu(sSr3T8y*>$@K4!S1c67T^8GoELi8vC}Mk zjC{CSa0g&a<>)u$hQA4Ub8J9|Li(dQu>Cc$KDS0z8v~NS7o6mZTtdr(-~fqjzg9DB z1GM8R&QLby_nrA5))V6Di{aL)-Y9PD;v%i#f(TeDhLhx@ppjK z7qja#_R#_h+#I{caU>?wEO>i~VNs`>z%9WKs@stC_VZoMzt?i8#c+}dNUqRKv~N*3 z+yQ~TbcYFBODEV3cR;&k{nr20Ri8Vc_c4~LuzHOHmG|D;e7 zw|Bsd?X7lxw^3eWu+c4n-y_p1d$ME0&Gr@4mWIRWSEL1{MnU#QeXA-_8#>)h6y`%u z-%I$skL_;%&Hd{RIPH{7vqxhpWcsBF&h&LkE4RC)Z)s_*t8F85Om3JpufoFUO4DHy z84&5WGHkMZ(U>t{S%>fWDxp1*gpc`Dv?y4B5vs$2c~snIV)aSeQEjijYAZTN{E^{5X_HjtC z@1aCXl^7dRSn^Wj&3BZSJLfTnt!jQ(YsaevSc^HV5KB!M!2UXpsGd;lYCVv|H3lfP zKOa6g%S ze0+NcG+j){F@|2h(7pp+r)}Qc0nSIo|H6u5Q0NxKN^elAB@eEH;{T3`H9-H;=wFB& z@b}WcUSI2MTSe^bniu12%Z42ZyVGJtWMtjq;Q zYntpF?i|lAT?Zq(DngpNL|HhaNEV*zJw0@iiJ+RvBzOk1MrbARPSpHC`f2gQM!z z!QMmGEHzVC_!m=L-=$0MVy%WeDy%p|4=!uw{i*zk&oy&Gcu3n}Xf4Iw&qUaU=&|Co>BkXM$I=ik5LJ5+zP*6KKK3mnWe=ZJ@1c-u zX7i{>oi3^9$l#p3z|1CDFXxe=S5>{B|9M?deG+qVR*rAi0@-AHPa2)Kn3e0KDViCf zgjp#zZ`5iA%&oV)e+a#nS;hPJ1D|==^?=*SWS)Gpujd$hMUl(g>(&b^T3NiQ=O6JE zZW19ck*7|q%LmtA%BKA`;yU_)KfU_Gl}qVtn0hN{f30yNck4@N!8YH|wQ3U&G9%7` z?Q45#a#bm@rX&h+ks<;GLcL8>h<)*1~%^)WN#b<|Yl|-3#1N;8bbVhSL(09a}xj@JiZNC0sFzXYKm| zJ4y8ilxz4g-Mes69A$;qc}s{pexoQo4tKIy^<9;3@xoZLZ*PlgBxmPnt*P!@Ry!p;U3zfKiTzC14oOQS{iUxVMj3R26{E?5~ zvRZm!*t_Qg5?G-2fJG+X$vy`U5-#azeZhTXUut{tQ#4=Wy>KN#0o!gl_o^$x$+6Kf zT;kWKH03@c5>prc`?C>^ZFq5%Tx||>nq<;8nl0WN&K}GZ(UCeP8rTiDhC7sNRUWAH zx}%{_gMLk#j(z=sYT-n8&E}yFZ&>_I$r~fuS=;MS=L5$LO*~9c(`tz<7HD7?b%E&DLi2>|qZ~()GWdTUE8P__;7IPC%A! z?uMOmv{_I$e#au^yfHW;NvMpOJVC2TjW*4pW8Mhah(Gu|c_I?lJUy$zLYd^BZBtzW z1~%^0yqsj;n)kC~m5$E{hg??^-oO5jmslBT1yq-vs@Ez9I)J&gb-kU z8dtH?tg-XB3HE>RMC7JLP|)hK!=n&u=-}D4*(EJuYaCX3{s%gbFRHvAFHs@H^Ek~D zbty(H{oCL3G%;%D@{~u}_2-baMlu#p^}i8aytnj->s&?FPR*Tz1qe=NOm=vqvaaff=^+O(!*P9!B(J24a=ha!|Z&AVuhoLo|R!S@%p;2;J z-jFS3H;PJ|`i!$5EG+n$2QDg6XLZ?qkb3#HIrBDS|BtnZ zhy_J&?C3pxvVwOI!DMSu%%uEBP@4(ds&Uy=gT&*in)pU-1-8ZhE(yt)=!timd8C?`v%^*Pn2=`0o3TRc#fB9wrNmfw0 zJHGf;cSE^EZRR5710b;Cia)nTwN2^0#OwE-mt`M0)s9(qwYEP8;4~<#w4Gi+$>Xqc zElS6eJP)eX)PLhkDGqKY#pE-AcA$~!FK6vl} z+lo6i>q%`>uiLewX>4-`$$8M{<`-UV?avhQ_H=1UUluHXB|K1=%5+(?lY5NL01uK0 zc!=t{$?vJ&rk-)iDM8|nqY~Tq0j?~vqU<>@)zQCfHqOet&r;K|uJ=%t`{Ww=EGmXL zc)GEEvNh9ZGC>xi>cJC#MWHHQ;qp*^*e`YiE0R0#^ZJ@M9CRoikJ&@YI!p&a=Tzta zfxLxJ$;;DNA_QKfl&Qjoow8d$jcX~$eeqy8WlG!*>oY*`%ABHSB0rBbai0duA3rYZvbRx>3%Uy+&ZG zVW}7V!i`3sh1UILe@#BsqKd9|f#V_}P?iHfUbRK=r~0 zw(t(y0H)lk))+j4ql9MF#xDxljEgwdE0QS(C$|SR_AC{@PtNHCex|_QNVF+fGRfa4MQBX4SW*ZvJ3je72>a|w=Bj$9n99LKvY^4zw4I3EsqZ03 zHjSkw;<{41jqS|vZFQAvLy)FA8p4xw3I=2PsjjRGcr1~{gef|eiMxMlp;aeoZ^_E0 z`zVN?J^D<%u9s#h|CGJ6U`WcEZW^pLCKS1!G=6Jg>Bj=pw&Y1csy1&RsE=JKTh{K z$``&87V(hh_{(qmAQU{2+CV}h?{^k#nndJWB9oDmZ_WGku`%*Zw0Cl04_{MZ#^WU^ zVvmTsTp7&y*03g%ggg-z-|esTn!aNTN$> zbG-kRWkYOskUckZ7?WfKm+PkBbJ;pvHEzU)JhOz)pQz3JI!EpIUG*#e_<{x*sZl68 z75o%bb1sM`QNUgwETEOpwyCeCCXlA!U#&#_Gp|t5CAy*QqlgRMwFVaftH{b8h_ZG} z@bc3cFTdB2_FMTIJM~J(-_@=WjGk#@!cD6ZGpv#C2%P)tGNux!-S@Z8I`%?7Wc|L8 zU$0kCrqeQw?s0+0Gf=2xZCSkjO=Fu$ctdjh5&0%+XG6OY6q1O47euqOTxX;X zCBQ)p+7KHWz03NFRmykB3mQ96hR2dm`}u^XK1hAE`9IvI+e2^gP#m*+BZ^9VR@YDvpYzI24L!%`MDHy2e@w%FhuHf`y#r4p^&iH+ z>RUUkPw~c8nF+I9_*L0lhxxEWNK{{ag+J*Y8c}h@`-;yJNVGLwT}z|o!kAIybP60< z=;RxwB`pt~)E!E@G)?vd6Qv_nHYgD(y|a8L9tD?N-ay*lA5gr~o)aQnS5(;j>hdF6iH+>V`7$0l$Gn-W|!W+ z_p)wuH0k)y;j{V)|K)~Ocsmw)>-sQblN97S^=?CdHF#k2k#6=x69xjG8|Pv8ghTXs z!6;1uEqZ>uBt&OVP(~r8Ut%=?d!}aLGi^*_F_(Y5@061m`c_(G+fLNDU7tH=ozj1p zJ82hYHSUBHaoXs)Q(rCE`21Adb;Kqp08X&b8kmJD!jc^(;F}@DIl1!rG@n~-NQozT z{66!4-=67*j{A=}LM3dW&Yj4ZR47uomu5D(rXpx)T&&l$yy=5c3ID0g053+sm(c1& zU_$AL-Fs$`H~o9A$dTj#D~pS|es+3!510v@n1c=9awY=)r{$GJi4k~oHRhVfmz3_p z4h6s<;mQz5?N_9wcUa|MNB(^{TeW%QeID3(d;bs z*VhKHyDiBb$Qc&Fd$`Z0XTOiUcPhRTr$3jNoe$ZJK|1j$&b!Nad;<{H^NZ*puML^Y z{|_DzHZ?8zBvB8NzSn-bAbOMuL@9K}S;x_nPK%4B+at3SzhSRz4$ zRiHYwZ^sDadh(In#dvYKRPFNKzf@Q+Hu^9a@_zuU=5|p`-K;zGkn%qAp%q+Qr>o(v zL?_8vHwy;3WM}duVAAma1s80awQE!6R zuY8y#xyFq-nC(`7-tUrEIl=S0E}+cwDKiVC|H@sM)gSnE_8YM)^6a^P?tuCpXfsKS zQ3yMaX=^*WHY*uOOyY2wt|yNT`|F3@Alewvs-p*AP-S@`^GTFsoNV3FwP7~mcajMD zF~5{e^}-m4#RT6?neOtsKI6p#NXTcfJ)iuTYJTwF?a|V?Ngu9q_n@%`l)XPjv{Wcf zf-#);X1VnaiiydXei#UU2+jCl)#+js`w+rql2~=fgJa%T51Ww0zHabG8b&H!)#tNo>TX)Tl8- zhmjWHp2vEt=QBFx*yn^u%kWc5pf+Y{M}!t*?5tzbC(>OXAP?EIO3O)!Fh*RcObj!z zSnF2A!o3yLu^(=K4$MHbA^VWvWUn%0bAj$3%!BJPD|vYdbv}xF*n^!e*4yqgpw&~; zSzo^9e}Si9+#xu5)oH27IQ!KcS>rZQ)v4T~!~dLqA7d9Ngu5fxx$6Xt;BoN98TLVI`0&~gzsl5q1>KF0imZjA}O@>%^*%i0Orh78iKW&+KcD5h|qBx>P!8bsaRVI^clEhR9x&Q`VO0$|ih zs|J?b*T=_y$x+KrU7t0!qX(1HHWPqo(}Z69*1vis2T3y*k2M6Awgv)uKOfK@ED8vuGRxe6nrXScm(R`~c_2!T6(%kzz3osgpNiJNV0O&)FXYVT_)EZ z!7cNDQrEmrU$~^!8TPwkNNx2*2oq*>&peC0I<_A1{= z6yPO?LxGD`cvt)tXi~erNA=(-AAiaa=TM~?;{UZ#YY6fh6P+P%bkO`9<=kcdv{dnb zph#?Cm~A6L^`FSW&wo z>Z{>zhL3m(uKKjWDP>msg3yC|o3C$59eR74nfqCcg_3H)48YhrP?nwegS5K3CNkxffRGGJ@pU<1JZ7sBBVQ5sP)}Cs`g%m9fBZd zrg~~k%%q+lW1O_m2a^&4HY%gSR0^_DAXF_EWh*UbHm_TPB!^9De;9p`!+uvt)Cd~s BDh~hv delta 3629 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 diff --git a/doc/check-health.d/notification-07-temperature-ok.avif b/doc/check-health.d/notification-07-temperature-ok.avif index 4afed02da806b192859d23f3731281d50ca209a8..8f509e8d8f702695e30baa9f7af40eb33100b789 100644 GIT binary patch delta 3638 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 IzJQm)Fn6N^SpWb4 delta 3526 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 A-T(jq diff --git a/doc/check-health.d/notification-08-state-fail.avif b/doc/check-health.d/notification-08-state-fail.avif index ad049ac8b2c29635a4344a33be929dead82c1ae8..8ba7bb972b7eb6388630d2b711071cdfa0debdb0 100644 GIT binary patch delta 2936 zcmV-;3y1WQ8^#!rBMs|qWprTx00000001G8FdUInCB{#$} zskEz#P?g)AvHY997&OX$JGuaWdzV19`I&Bd4G6Pnq4cKonq?jCYALl2v-UkgfF&Z| zz)ND?Hf@oTn9DM1&0tN`)v0@!!M~4gPC5DTot3A zyYIm{%&~$&{4y)ZymUh7jxG4}V_0FlICL)rfpd$BGf~4G0lx0WLP*4aU6IWsc|%wt zLc{ar9gTojQ`I$uIj3uVLB|Yw8c5sxCIwYhpBx_KM5hb!9U85V-<8Io+c}lr_lN}T zbs^)>(TCEz^b$=h6*>@`q*a(*Y9tkcwCyeYR=>R`@K(DO&R+$g0{iN;!r;$?pD^_( z9mcEFn9j!@010ejru-L-^e zM9_My5Tc?t=T>Ut%g{dbxyt`lER#`SpLS1Zw}Svopj0YKsC__yAwJ_*XlnkaI)P&v`);3Z0wd7Rzdma z<`cdGI!KM;E7!Jv^7&e$SH_85z6v3}r&doEnvWt}OfOJYN)OWziw@zx5B8gFx1CJ+7#O&<*WS5_zAi;(CT-PwwJE4jJ{(7K9L|jt z!90A^AKns;`Xkra-RmlhM=u~kx8(UVpUY?pgTo~U+EjvPJBs|PwI#BI}=nefsY1ckekX?D2~f7M=9TT z0ba{ER_URY>MZeD{!OC~Pq!zhm%EXALRv-)F392>dPPrhLL*e!ck!8ZyC#A9*^Bqr zk0^MWD1@<}loqY*bFh=n3nT8G)eWlt z_82SMephD zuH^hS`v{Vn#xcN}lsAbg(iWBv*47dwMqtN(Ov4Php+9tN1?%LT@?l9D$10FEjE`4> zNuYf#)gY5a0dL*uw`jT6+|)y~OCRx;Xcy`lv3QHmm?5Neg1_|l!q<0BSuODfD zU1$0dNMey90rwwmc=D+dYF~W&B7o-RKw-lqafG!-M)6ckylb8?P>N=^&M-T@zf5d) zyWP{)btUU^?tPjtcVw*;#BEB~S0VqE-bChMlTq<5?A$7>LciN)N1g}YU&AT|v|8H* zR#9#kZbv#uqQ0!wC{x{SA)k-eed6SQoYe`jqw;IZ< zGjFFjq1-2jf*}5=T|#Y~Y1;UTSt95m=_)`n`#bNFjS}}6;(!B3^Ir^-QusWd!e5H0 zv253OjQZTTzm{W-CPPGq%afD^=hmrf!q8IK7@`TKXd7OgZM0g=lh?Ah;*h7^{YlU$ zqvCUrR-Q1o2-|8jqmRXE=zj-)q-X*E_yE*Fu8Lrk?>(-mkKU?t&;;>_-9pVWTZixe>PrfS2QT=t!>Oi1k0le93jF3eEUa{Yg?T|JMrQ0m zJoc3Bm|64=2Z?NY`~=dUy|wzjS~_aHgo_j1C+e8be|m13dR~z=+s^6v;ksp4GP{N@!lSNiuvo;sg9i7yW2^&higgFYr=|&XcJzs!&SBsZ zoP3Ky0-r=!VSoSjl?^y_+4s?ap&BowJ}wMXp!@5Lamh>(;{FeR;`7G^y?u~n52n%u zeexXGN_T4Zu~frqrwu{8$*hQ7m39nY$S;36Sn$7Yb?==fnVlbI=6kKNzDca{VMXy( zt{(Os$Wn~sm*||H+3ND>4+?IpG}^g1S=@n2_C-@ z&o4S)JtVte}u6X#xe@Iv!1v?`M;PY!GcrEk=Wx(P}NUVXJ_-A zge&46gep69RpiS!P1287NK2JGRe|Vm)Q>t@@y0orG+_RVTRJF-M%_fp-x5e?w9#-P z5foQC;w4@Gj#3jA>#Sgcn&BAMx1Rbsxi;` z$R4z&=tbS>t637v!YYSD5b-kslIwhd5YAMt-a@Kh3n=ZXvpbizw#3IemcxU(9fQJ~ zhaAo-5TkE>{lj{lc*khO4LU46{Az+v!_*96;QF$@9O`|lfV%%3xw+{~vxq?^)vOpq zkfkC|5W3P?(|mpN737DQL5K}=H!cn|PCHZ!O3GCMIB?qmw*&{sWS9A@ZdHcTrkJ70 iI{sXQ+I<&VG*dH^(09KeO;0vsHP<$^ssw*{i?T2kq_8^x delta 3272 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 L8cPa&?^OSQ-HJ!q From 3926d1207098633cdd2a30d597c8fe2af350825b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:38:53 +0100 Subject: [PATCH 953/988] doc/check-lte-firmware-upgrade: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-lte-firmware-upgrade.d/notification.avif ----- >8 ----- [rsc] ✨️ LTE firmware upgrade A new firmware version 16121.1034.00.01.01.10 is available for LTE interface lte on rsc. Model: FG621-EA Revision: 16121.1034.00.01.01.09 Firmware version: Installed: 16121.1034.00.01.01.09 Available: 16121.1034.00.01.01.10 ----- >8 ----- --- .../notification.avif | Bin 5077 -> 5723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/check-lte-firmware-upgrade.d/notification.avif b/doc/check-lte-firmware-upgrade.d/notification.avif index c440da59460bd6de4e5958bc992c5e4d1fa45cb2..2c2f692d5e473b0945a80d115f03b438ad73aa38 100644 GIT binary patch delta 5542 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⊯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 From d60ee59e77b8d01d0fa3fda218b5f28dbb3aed1c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:12 +0100 Subject: [PATCH 954/988] doc/check-perpetual-license: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-perpetual-license.d/notification-01-warn.avif ----- >8 ----- [rsc] ⚠️ License about to expire! Your license failed to renew and is about to expire on 2025-09-13 12:12:23 on rsc... ----- >8 ----- doc/check-perpetual-license.d/notification-02-renew.avif ----- >8 ----- [rsc] ✅️ License renewed Your license was successfully renewed on rsc. It is now valid until 2025-10-25 08:42:46. ----- >8 ----- --- .../notification-01-warn.avif | Bin 0 -> 4044 bytes .../notification-02-renew.avif | Bin 0 -> 3944 bytes doc/check-perpetual-license.d/notification.avif | Bin 4004 -> 0 bytes doc/check-perpetual-license.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-perpetual-license.d/notification-01-warn.avif create mode 100644 doc/check-perpetual-license.d/notification-02-renew.avif delete mode 100644 doc/check-perpetual-license.d/notification.avif diff --git a/doc/check-perpetual-license.d/notification-01-warn.avif b/doc/check-perpetual-license.d/notification-01-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..fb6b56ab49bada738b2ee356b6a70d890c330d54 GIT binary patch literal 4044 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 literal 0 HcmV?d00001 diff --git a/doc/check-perpetual-license.d/notification.avif b/doc/check-perpetual-license.d/notification.avif deleted file mode 100644 index 70ca603d4488773dd8a476ced8c89506407b95ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md index 0335fb54..a32c4c3f 100644 --- a/doc/check-perpetual-license.md +++ b/doc/check-perpetual-license.md @@ -20,9 +20,10 @@ On *Cloud Hosted Router* (*CHR*) the licensing is perpetual: Buy once, use forever - but it needs regular renewal. This script checks licensing state and sends a notification to warn before expiration. -### Sample notification +### Sample notifications -![check-perpetual-license notification](check-perpetual-license.d/notification.avif) +![check-perpetual-license notification warn](check-perpetual-license.d/notification-01-warn.avif) +![check-perpetual-license notification renew](check-perpetual-license.d/notification-02-renew.avif) Requirements and installation ----------------------------- From 094215aec72a796b345cf4af57ef7e0c6ed15d18 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:33 +0100 Subject: [PATCH 955/988] doc/check-routeros-update: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-routeros-update.d/notification-01-found.avif ----- >8 ----- [rsc] ✨️ RouterOS update: 7.20.4 A new RouterOS version 7.20.4 is available for rsc. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.2 Available: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 🔗️ https://mikrotik.com/download/changelogs/stable-release-tree ----- >8 ----- doc/check-routeros-update.d/notification-02-neighbor.avif ----- >8 ----- [rsc] ✨️ RouterOS update: 7.20.4 Seen a neighbor (MikroTik) running version 7.20.4 from stable, updating on rsc... 🔗️ https://mikrotik.com/download/changelogs/stable-release-tree ----- >8 ----- --- .../notification-01-found.avif | Bin 0 -> 14735 bytes .../notification-02-neighbor.avif | Bin 0 -> 5737 bytes doc/check-routeros-update.d/notification.avif | Bin 6392 -> 0 bytes doc/check-routeros-update.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-routeros-update.d/notification-01-found.avif create mode 100644 doc/check-routeros-update.d/notification-02-neighbor.avif delete mode 100644 doc/check-routeros-update.d/notification.avif diff --git a/doc/check-routeros-update.d/notification-01-found.avif b/doc/check-routeros-update.d/notification-01-found.avif new file mode 100644 index 0000000000000000000000000000000000000000..54dd2df66c89607c0006f0668dee71f9583fac55 GIT binary patch literal 14735 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 LPN7#I8tVUluxYg` literal 0 HcmV?d00001 diff --git a/doc/check-routeros-update.d/notification.avif b/doc/check-routeros-update.d/notification.avif deleted file mode 100644 index 50317cf7722e30986a49869f3e72f8983928e74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6392 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 to your production environment! Automatic updates should be handled > with care! -### Sample notification +### Sample notifications -![check-routeros-update notification](check-routeros-update.d/notification.avif) +![check-routeros-update notification found](check-routeros-update.d/notification-01-found.avif) +![check-routeros-update notification neighbor](check-routeros-update.d/notification-02-neighbor.avif) Requirements and installation ----------------------------- From f77cc07338104160d07b3f5a4c7dce17f65bb31c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:52 +0100 Subject: [PATCH 956/988] doc/collect-wireless-mac: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/collect-wireless-mac.d/notification.avif ----- >8 ----- [rsc] 📱️ 02:00:C0:FF:EE:00 connected to Guest-Wifi A device with unknown MAC address connected to Guest-Wifi on rsc. Controller: rsc Interface: wifi1-guest SSID: Guest-Wifi MAC: 02:00:C0:FF:EE:00 Vendor: locally administered Hostname: Wifi-Client Address: 192.168.1.244 DNS name: 02-00-C0-FF-EE-00.dhcp-guest.rsc.eworm.de Wifi-Client.dhcp-guest.rsc.eworm.de Date: 2025-11-23 15:30:27 ----- >8 ----- --- doc/collect-wireless-mac.d/notification.avif | Bin 13378 -> 8301 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/collect-wireless-mac.d/notification.avif b/doc/collect-wireless-mac.d/notification.avif index a2833f095d53748fcf3e92cdd44e5469f83f177d..4b21b2f516d84a8c66ebb6f6fc85b76a7a9679bf 100644 GIT binary patch delta 8137 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 delta 13255 zcmV;&GdRrcK*DH{BMtIxWprTx00000001bFFdPSLX<}h^X=ag3CW#=C@5D?I5GMHu&kO77mVL;taN^cVJ=g`$*Ov;{-_?prw zd(wEXs!3##ieZeb-YMlfLTAlm^93{VR9k2*)XIr2Ov$VG-RW6`o2)9@jtvnU3hMZw zNg{MGuu(o^zEWP)u2yp+Mu-?Vn-ZKsXT>Dae-eF%3~q*%I^|;p;bBr_>JoxS@y5;M zJu6B<@8Z~ru%tt9#e;Q?&}kTh9TdqU3&9W@W2o=gf-z|ATY!(+t_~3F(E=tM*>e|3_8*g>u|e+aCm&FAvAaKT55M)r@zmzvN|3K3S>Kpdk< zR$`Sm@q4!VPfeYKmehlnBj_cMwtirdzV*<>R>tqf;`0@X-{`krQkV~ko!s$GHBLWQ z%$w$8ZMP-KvfPcx;{nUxF=~UtjQZs@n1p`ziSY5bPO~6+B!akFFwS7uIpI&Se+2nB z703pNDZ+*=n+wd|8B(nYZFov6j(}H9umda5B!_B=QqW zKi-Fkwr>W_&X*PkthzTEBR=_4^xe6~@+rJCK-k42BF~6A($^${H$rNrw*%I;Niq%p zpB;YYO0*J6Tnwa^lqK0ke>Rev%oPu4h82vNc6hA&v*7Dxo2%$T%D%mMo0EF;-+9rB z;U(Gf%4ij1yG@nT(MB_RuJly6#7Eoyafk-jFGF~<}{k9r$UxFxJKb#J5H=An~h4hds zT9d`>!r=)`)0AyCN{I;NGE==SjYOU_4GtHCId!*PgSZ-08~A7HSVF5kvRBiwIWtU& zZao~WB{^z{W$$YOeOMCCayyzQ{)^wLkJn%?#G(V<`5k<(f9~74$rBYP*ERHk5yzq# zxI3LgY-{4xuvLoYfq89>zpV1Gd-o{z=t)9SgP+zIp_1~t2M0>_1)q4Wcxi%1d(HJ% zMLTeda!7)$bA8~dL)o(w<7f}QFV91tIMEC1;0K}mKdvq%XVzuLBT)IBV}1A32^Cqo z(a-5oHed9bf9i#)NWxE7CNTG4(G?-@i#lO9{~sAQ&BE%h4++^e!P~RD*|dks#nUFfBIMv@00Gb zGkq2{1W!33Cgg^%Cau=_va0!)a9%`mGgYBWh*k~;e|Jyqvd*f~gHj7G(=F#o-B^oAJ}!mQ{5tJsonXW3eTqT7|)gN9Sl;IIi3wnEMqUQ-;CJPLdf>|o+T z`Qq)aaPRyhln+tB(Xbo_d!XGSNmX(szMk+N6nt|3%g5V!`*3?E>P~e5x0e8hos#9Z z)cFyTe~6=Gnjj0m$TM-Wh}bWawhGpX|D+)`pwESvA{~̜Rl8uEE)3+jliC*DMP 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 Date: Fri, 21 Nov 2025 23:40:08 +0100 Subject: [PATCH 957/988] doc/daily-psk: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/daily-psk.d/notification.avif ----- >8 ----- [rsc] 📅️ daily PSK Guest-Wifi This is the daily PSK on rsc: SSID: Guest-Wifi PSK: 53cr3t5tr1ng Date: 2025-11-24 A client device specific rule must not exist! 🔗️ https://www.eworm.de/cgi-bin/cqrlogo-wifi.cgi?scale=8&ssid=Guest-Wifi&pass=53cr3t5tr1ng ----- >8 ----- --- doc/daily-psk.d/notification.avif | Bin 7040 -> 6966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/daily-psk.d/notification.avif b/doc/daily-psk.d/notification.avif index dd0b1b62520d0c3b7d5aa383506730fd0a9e0e7f..79cfc3e2978889f740021b04421cb8e8c2ab0388 100644 GIT binary patch delta 6795 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 delta 6876 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 W<~l?3K*WXv?KVSdlqL0h-?y-TW@BLh From b6e72f9a9f03818739271a5e59a172d2735d6318 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:40:31 +0100 Subject: [PATCH 958/988] doc/log-forward: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/log-forward.d/notification-01-info.avif ----- >8 ----- [rsc] 📝️ Log Forwarding The log on rsc contains these 2 messages after 00:01:19 uptime. ℹ️ 2025-11-20 16:40:25 system;info router rebooted by ssh:eworm@10.10.0.37 ℹ️ 2025-11-20 16:40:27 script;info global-functions: Loaded on hAP ax^2 with RouterOS 7.20.4 (stable). ----- >8 ----- doc/log-forward.d/notification-02-warn.avif ----- >8 ----- [rsc] 📝️⚠️ Log Forwarding The log on rsc contains these 3 messages after 01:23:19 uptime. 🟠️ 2025-11-20 17:35:48 dhcp;warning dhcp offering lease 192.168.2.254 for 02:00:BA:DC:AB:1E without success 🔴️ 2025-11-20 17:35:57 dhcp;error pool6 refused acquire: bad preferred prefix! (1) ℹ️ 2025-11-20 17:36:25 system;info;account user eworm logged in from 10.10.0.37 via ssh ----- >8 ----- --- doc/log-forward.d/notification-01-info.avif | Bin 0 -> 6833 bytes doc/log-forward.d/notification-02-warn.avif | Bin 0 -> 8622 bytes doc/log-forward.d/notification.avif | Bin 6178 -> 0 bytes doc/log-forward.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/log-forward.d/notification-01-info.avif create mode 100644 doc/log-forward.d/notification-02-warn.avif delete mode 100644 doc/log-forward.d/notification.avif diff --git a/doc/log-forward.d/notification-01-info.avif b/doc/log-forward.d/notification-01-info.avif new file mode 100644 index 0000000000000000000000000000000000000000..6d25467bb4c146e5e90d1cd237c3f2b2484ca381 GIT binary patch literal 6833 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 literal 0 HcmV?d00001 diff --git a/doc/log-forward.d/notification-02-warn.avif b/doc/log-forward.d/notification-02-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..ff61c0c0441d1cc43df00afa6678030f6ee08a1c GIT binary patch literal 8622 zcmXwdWl$VU)9vE!5L^?S#UZ$Ba0nJ$7T92mySuvwcekLy-Q5=_xNDFAH_v

#6C} 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 qJbFNJ literal 0 HcmV?d00001 diff --git a/doc/log-forward.d/notification.avif b/doc/log-forward.d/notification.avif deleted file mode 100644 index a0f9ab339175ae768e1e791bd701a2a91dd5bc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6178 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 Date: Fri, 21 Nov 2025 23:40:48 +0100 Subject: [PATCH 959/988] doc/netwatch-notify: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/netwatch-notify.d/notification-01-down.avif ----- >8 ----- [rsc] ❌️ Netwatch Notify: ipv6.eworm.de down The host 'ipv6.eworm.de' (2a01:4f8:222:1e83::80, ipv6.eworm.de) is down since 2025-11-18 11:33:18. ----- >8 ----- doc/netwatch-notify.d/notification-02-up.avif ----- >8 ----- [rsc] ✅️ Netwatch Notify: ipv6.eworm.de up The host 'ipv6.eworm.de' (2a01:4f8:222:1e83::80, ipv6.eworm.de) is up since 2025-11-18 11:43:15. It was down for 10 checks since 2025-11-18 11:33:18. ----- >8 ----- --- .../notification-01-down.avif | Bin 4193 -> 5126 bytes doc/netwatch-notify.d/notification-02-up.avif | Bin 4744 -> 6057 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/netwatch-notify.d/notification-01-down.avif b/doc/netwatch-notify.d/notification-01-down.avif index 894fb23ff4c3fa227e797d8ec03801bb59a61bd2..2257a0d3de2d384348884cb48fd8bf753c892e6a 100644 GIT binary patch delta 4936 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 Cp2T$k diff --git a/doc/netwatch-notify.d/notification-02-up.avif b/doc/netwatch-notify.d/notification-02-up.avif index 9021a93b9c174db32c78586d4dc3bf0f40ef6a4f..4147cb7779a06063d8c6526fa8a6de515f0deae9 100644 GIT binary patch delta 5874 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 mWWTLZ4y+F_y9zPRMy@pg From 9db7f4494cfbc77697a9a9a21519236cabddb9dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:41:08 +0100 Subject: [PATCH 960/988] doc/sms-forward: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/sms-forward.d/notification.avif ----- >8 ----- [rsc] 📨️ SMS Forwarding from 7277 Received this message by rsc from 7277: 📨️ On 2025-08-20 01:01:15+02:00 type class-0: Welcome to our network! ----- >8 ----- --- doc/sms-forward.d/notification.avif | Bin 4619 -> 4966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/sms-forward.d/notification.avif b/doc/sms-forward.d/notification.avif index 01eb7ba6713a1bff1b0e55e5c730050724a21477..14764a3cb5cae91932b2e9326f7d7e5d7ce20630 100644 GIT binary patch delta 4774 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 AMgRZ+ delta 4426 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 QO1BPWb4(1-z}@Qr;6avvkpKVy From daeb173dbcee7384a6dfa9fc45a1c1da1df3ba1a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 18:44:52 +0100 Subject: [PATCH 961/988] doc/check-routeros-update: add screenshot from terminal --- doc/check-routeros-update.d/terminal.avif | Bin 0 -> 2163 bytes doc/check-routeros-update.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 doc/check-routeros-update.d/terminal.avif diff --git a/doc/check-routeros-update.d/terminal.avif b/doc/check-routeros-update.d/terminal.avif new file mode 100644 index 0000000000000000000000000000000000000000..af950593e0d63d10e532d01a32b54a6fd1a4d1b7 GIT binary patch literal 2163 zcmXv|2|N>gA0MIIjLG9%(;Phsxz7^0=bTZ5nQPi?W|muQ6tDI0qDdnmMM%j*2cFz9 zDfdwbLp0||a=g>~d4B)T|M$KApa1U%006*2#ArN{gbo65>IkvuAT2B!83Z%eGUr&! z*gzukDC5+rkN^zf{}cegqfx|v`M)TFM-#EX1sA6)pfNbqk+K8;xH#vi1Gpprfa87~ zu8Ky7{T})|k>Q9yZjODVkR(kl3mgXbdsZkKPr!40do&(}Egj41OqnwdF`tz_8e2hZ+jrZQETu>ZbvoHXXaS41?+)71oBJM zxC5EA&@k>Gsq(UVo{Zs>SGnKdrH0r5d5tRPu`o*pflJ`Ba(Js5-(l((kDrauwM<@R zvo~hFCVJ8<%T3eWmQgo*)!&`#8?{|_+G#Pc{!o-xW&1w(9_{Lct@jjYS_>L=Xw-P% z5`?fXH?y4gHI?dts9evFb+3T_60cRoOR_55B=><2iaxrYAK7hLFh!CjqY+AF)HTm8 z#mP^^1B!#DuR>((xv_>&<5lw0`Xr!>X}RANFnHfb&YJDpmA>`Im)_bL8Ji4B0aJ#W zFtw#mlq{F9pLN-6ia^FMEwr>I$#~tlEG3GYg}6~Y+I8c4UeTLiVK|TH>iRn|MhoDY zf=Jocsh?N2tc=;N{fqDcUDsVhX|QF(c0$$);ve^Up8%nYamR<`(GG_&rfi0)-bBmv zGPXk7Ox$W4ITfDnS-K(hv^)CKNquwvmtqTiefr-A;{`}FHR2yuf*Jj}Fh8m^=~5h( zahAI!MgRFzm9Q=9jp6ujKYxkM5$|?N8|{I4nA9kd0t9CMMSE^8+nUv!@(NRNbBf(K z>^_-)YX2MAOv@3a>V;_JJJ0G33))&+n{T)^@fI<4c&C5Iq6kBJE}~@JW`9Dg(X15Z z=;@k;-^uhQJE%d)Ah1;?f(5(nTjhaWE%Lo$wE}g$WLHiX*BYF>Wn1-W=2Z%;&VZQj z_bRMVH+uYG%sGCYD8$&DND?)*&KKn+ob5@gk;5wUuqr-V2 zL*#putWeRp*hlFd3!eT@E6({|@`?q6W&#ja*<{F@UAun9e0|FjxY-i2nm3PD?abj( zOVbppSN~kuI&J)MKZ?KRFiz1H|#_Ck0CtrQws(&FAAx3;8rE07hxBjh=~!Bp@Z z>Pl4{xaoXq9dN!oYCyuZN`i%p9Es0y>kn5iy^%YR$^id8}&L!-($5eAW7LYd*O_h zxdT>3X*0;Q{=J?5=TX*(>xl0+9ZF9ad3lBr$a_3|+Buca@R^g&`p8aPF6`}sL&t_t zy;bJkSAWc>gl+F!A3AvQ>%*l2KI0ZI<$i{bF_)utOfGCpr^aFBhvHyd~BdIp}d}Po;tHqvEYsr<~;RS{BKFNw`h zg-rg2B0#yB1em$TkF9o?GW$aKq&abu_TTDzzVD%2bthFjfW#Lfhw;k8n(g~s1F@&6 z{VSBNz1PBtmo+H#G5b|DyO+1G312@juj^AXr7szqSTm*m>Y=@XXHOvh5WX6beVx^& z7fV<&pnHXw{iQSE(peQiLh4Mc35MJdRWJRX`{S;3E=q8J`{xEJ=o6(sWOi~p_? z_7hoc%i5-hI^J31(h8Ws!?X`7bT;-%YAM3^hYPjR*povFjZwTEBAcYs+m);A?k1x? zsV5ADD1Fs`cJ6*T4SyuS_+d+NCWJVh|B? zn@8YIrB|DM*#^SpCL<5hb5Oecp-a1elO&4)(3>ieu}t|0f`0J+ptWL0zVG80^s$5l znY6;!1p@2QXFn?{n~@n4V&5ok0<-E5Yx`xO=>e)L>Kf*qY*~qmNrA$98kC0EBf*!bd7k>^&>n_xV1~c7jWc&@jSt<{>rywN1;&XSNkfZZ+pZ|IFNS SCOnxfr6sQzgDUsdo&N`(d)jLN literal 0 HcmV?d00001 diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 516dc624..029182d3 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -88,6 +88,8 @@ Be notified when run from scheduler or run it manually: If an update is found you can install it right away. +![Terminal](check-routeros-update.d/terminal.avif) + Installing script [packages-update](packages-update.md) gives extra options. Tips & Tricks From 1f11f72d1827748e62c5cac885c5e9c5afdeede6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Nov 2025 08:48:35 +0100 Subject: [PATCH 962/988] global-functions: $SymbolByUnicodeName: add special with magic --- global-functions.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index db9eac6b..412bd0b1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1672,6 +1672,7 @@ :set SymbolByUnicodeName do={ :local Name [ :tostr $1 ]; + :global EitherOr; :global LogPrintOnce; :global SymbolsExtra; @@ -1713,12 +1714,18 @@ "white-heavy-check-mark"="\E2\9C\85" }, $SymbolsExtra); + :local Magic [ :pick [ /system/clock/get date ] 4 10 ]; + :local Special { + "large-orange-circle-04-01"="\F0\9F\8D\8A"; + "large-orange-circle-10-31"="\F0\9F\8E\83"; + "large-red-circle-04-01"="\F0\9F\8D\92" }; + :if ([ :len ($Symbols->$Name) ] = 0) do={ $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!"); :return ""; } - :return (($Symbols->$Name) . "\EF\B8\8F"); + :return ([ $EitherOr ($Special->($Name . $Magic)) ($Symbols->$Name) ] . "\EF\B8\8F"); } # return symbol for notification From 7caaa6232198ae3c0376b2364c39d9d4372c396b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Nov 2025 11:21:55 +0100 Subject: [PATCH 963/988] check-perpetual-license: add scroll symbol in notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-perpetual-license.d/notification-01-warn.avif ----- >8 ----- [rsc] 📜⚠️ License about to expire! Your license failed to renew and is about to expire on 2025-09-13 12:12:23 on rsc... ----- >8 ----- doc/check-perpetual-license.d/notification-02-renew.avif ----- >8 ----- [rsc] 📜✅️ License renewed Your license was successfully renewed on rsc. It is now valid until 2025-10-25 08:42:46. ----- >8 ----- --- check-perpetual-license.rsc | 6 +++--- .../notification-01-warn.avif | Bin 4044 -> 4105 bytes .../notification-02-renew.avif | Bin 3944 -> 4021 bytes global-functions.rsc | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index c2f0dff0..a88498d2 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -42,7 +42,7 @@ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "expired") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License expired!"); \ message=("Your license expired on " . ($License->"deadline-at") . \ ", can no longer update RouterOS on " . $Identity . "...") }); :set SentCertificateNotification "expired"; @@ -55,7 +55,7 @@ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "warning") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License about to expire!"); \ message=("Your license failed to renew and is about to expire on " . \ ($License->"deadline-at") . " on " . $Identity . "...") }); :set SentCertificateNotification "warning"; @@ -68,7 +68,7 @@ [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ $LogPrint info $ScriptName ("Your license was successfully renewed."); $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + subject=([ $SymbolForNotification "scroll,white-heavy-check-mark" ] . "License renewed"); \ message=("Your license was successfully renewed on " . $Identity . \ ". It is now valid until " . ($License->"deadline-at") . ".") }); :set SentCertificateNotification; diff --git a/doc/check-perpetual-license.d/notification-01-warn.avif b/doc/check-perpetual-license.d/notification-01-warn.avif index fb6b56ab49bada738b2ee356b6a70d890c330d54..aa36e45f11191afea75960cb8fd5a79db50f0ea0 100644 GIT binary patch delta 3314 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 delta 3253 zcmV;m3`+BfAj}_-cmcVQd6f~tZDe6|5&#MYI3=ea3=%S|vmXI80)L$EoRdP)Er+K= z_^Y`I!-0~X+#U8v*wKm=V&u@1{Zna=>sY^`#7AaCHhAXFZ~b8)%L+{4-QnUnH5$Dn#pbv zQ1|2m*4}*Hjc`=je!+?NnYOI@$+^lix`fQIA~ni730#yue}5`tVWNc$Yp^hyRNHFj z9_l(eVp>gh;&kY7*eFhOhxe3(aMKPR+O%+PC@xj(rB(&AHyA7Uw z45bPjZAP{t6+Z+oz6T^wwDE{(Mz_Oy>QJRZuO@SXFOUB5y=6uDj+rSKsZ(H<}t)zJD`RK#r^P;nz@+zr-L5WG?GO z%q(nGPSXmq_1L$ApX9?nj9P7ATKX&jSVWGEV95ypD2ba3VuG8tUr5XDz{PG`%lOYK z8ni9KE}-9~AQ+rH>+$N-!236Jz25Rumw7%0>xhR&v;R&%R(ERYpr89vTZPo1qzemQ z8V7&=!hdA4laix$x?qHUnaLc?)_Lh#J16V21Hzlt z=OKr@;G5`8D`*DkfHn;&Cyb8KMAA(hZR*VhC6VLma`E*QfD;aI53wBkj!^}1fJYVM zj6z0h_ic`Vj8)I*lC@pPVWvM%c#)!erQcdX4u5?v10LI0puPsEq7Ko!#4MmhM^-p@ zyxkc(a4B=^4rYPa3fF;h{zGOegNZeb6(wB6qNQ<%Ob@)>q$-P~4#yhswlH!UTGhQx zU^%}6f`t^bw)*de-q6 z!y2Gvm%9D7Pvn)9tQ(mTe&Z|VvauL*_`}|#f<^-p`BPz05&Re0@Lw!Qk#6M_g=nk2 zSmhXuQn(kQU0?eRx3d&!5gqK4m@_*2?+zGQ?Yy6BLE_f}aEPwFnO%W}!W&1$5Pwgv zxJgp2G%=eFHDPsrG~TqZox;qe6YGMEp5K!+N_P!lceM*R z{^?W(J=YLH_V2N`e(au}4RK>=X}4I0qMOzGdfK)1{C^!Qp)%oSAA9$l*I1AU0*g=@ z$wT6jY0Z<$>h6UQ{Mn3BQG`Z7zJLGX)B{e;1w+mItGIRj;s|5G)oAR_Zg_dh=hle^ zZ3dGq^T}RJ_lSuyn=tSp6X{9-!kP&Pzm}l2)YSgln>Wno%EfNnveiA!#{0z`q#Aq1 zFewV&$!Yz&WXsq2Qgn3y9MRdofZeJ`pbd)+>j;lEqw+nVA?Bb(<3dPr(|?gNtr$}L zT9^VA)+@zvRt9!RBcMmhxtn#C(G0y~0Q-o)F__w|Wd z&^nb3_e4po;GF0Lp5J@vNFlJ+!_SZhL0VBw0TsXFgsf5yol(eo>l{@3v-I2aVLD{{ zgf3WCheErI>6pRSEqkV$jen8Bs&gRX{|;nJeBlA2$xO^nq#RkZqml-H73PQA{ot1( zMj3rs1vSv9$U~_*S+pydwh1nAas(OwaP5E@ z3l;gFb8kV8jKhj!uYUs{I2NxXt!#W^_VIY;j#Fte1vL3Aj*Z_If$uqIBUKf(IUF+X zc2o|U<|#~)RUq|N{+d1hjM1w)-J&aM?pESL2+dNU2LZ^ld9uD2IL}6QGTV1mTum;` z__m4PXYOqmWrXj(f<)I*qWhPV4EN1B=@_w$NM;@xzHkYXntvTCQjA1-WTAL(2w*^T z6z`=boBi#!*Vize$X_{eA3IFxJFk!9H}TX1;S)fQ)NV1)EvN)~)6AX`TrLu@VFx%H zh!M!iH%e>oR@@(nRJ@i-bogwOgW$6}UU@d>mZ}lwCIb{wQACiyST;5k9<8f`<57-* zzRo94(PW`>iGOTaHpDBt$^+^44)ld{Z(7dSABd;~=@*YBu*4s*X*S!q4{P4tC6YmB zY?h~yyC@|Q&TTBP6)uUo7t8(m&j2(Ahj*V?{uWT6bSUj&o&XTup(^c}_VnfEmh?bj zi_`Ol!BNuNP0*+kN-}-w(}B~uCj{5yQn~jfIm_1mlYgx0do%tlj?)b%u4xt+wh#^d zL&ma}6jGu_PBNiKX&m;K*44k-$;#1MU)H(nm!C$UM;qvhO&8l;<$aa{f&i&It;5Qtaxv_z0^}Lqkv$+&jeKN2;B2CCziO3YSLm~ zZ@%aWJ%9a`zfy>tg|mJh4=Q~e2Bp8>-8W5h2;Xc8515zZeF}F#+8db|QVQ2E&p=!< zr?XYb9d*M){Qef$|4*r~`$*zomwNDlN=Wtm*@E-MTS0?Y^rC!_e>c1aHq~aiR}08A zuDlpA2fA7y;tWV9c)dXOI*jYw!j$7s6lmA5&VSln`MxTTvYW)F$ScW>!}@v8|E8ga zA6YS93`JtPY{SC9ag*d_%mb?$UAw0Xy@LbSO8Yu+ONITA9b7<|q8;|k#U9ejsM!gp zm|qcz-^*czf5|OWga|5ioTP5v-6*vmO zlz%93dQ%P>RmRm5T$Sf@qlClXoA$j=Sq@gBi_R1v06Oo)volGdS-@dWopW zWgMO;enHo=hh3_!Iy^qWlG-aCJCj4JseFt;+Q$DfvV6Pzu6IN2Asxa&;wh~ z=;P`g7&tC>pWtPrW&5LP#;-whmOfJL%YT%`9~hlg@Hb%5llq*}kEi+L%?E+0$t%}x zsB3@J;Y04l!Qy7%*ORBbU09s)9`(WVk=$dv zwoBPS9n}OJ)G}cv!+Hf~D4Kfq9q!9}d6oB}XWzW;sn z(V+Qg{)j>KmqIPIHFu9Xl^DjZzqR_v`};Fs)*4s)VX nLE2_%r=8MZVXRk|+aD9q<$ziPKfzR9)l zKo5vdzz$rbEtu=I;rgJS7`Mv^mEAgL5$G%$n6JTi*!mAct57SLP9P4#!+b+dwHWN- z2=MHbgY?%dEe!LhQBw=*1o2&U!Vq=}3L6{NCe4k)uf-nT9t2zz08luVS=t|`x8gN^ z($tSsgVKEWytCCOpOb&}!CB*8ZzcB@^`X1~j%Bd`$V5Lu6k)5miK%MukP2q<9Xgba zS@3rRZg*hf2!?r%0 zCv-DPA#lr0?!uT&NI5?Im>j^T5|Vw?UwTc1elHZkeqM};BOHG-K#2a{McsK}*IB6G zcPTF;Hqtf`a-`Y+)q~1KK0_`)Q`6}MFW}-R5)Dmj z32nG{&!?As(rSMbB`V@#IS4~2xfdas;)?#Na->+w%7hQ^N33FJ=m*UaH0fDJ2Lgu$ zsDTPLT4fX(hp!AOLm)MN-Y2&+X=9puc|!S)%pE3mT7?j2kq?#Lz}^RH=LMAmgl1Y- zm$HA0c=A%8)Xh$Z!D$J`2&URMM2E(>ncvjeum&N%3Gja+i8l3l1Bgl(y!~&)T0#;@ zDukH6ZV1!b!9Y_vR#zc77mDmwl5`y_Jg*jQR!ldxM)WsU_$NUx2e;*m-Y!tK-uH$* zK~x;pSNgHv>dO)h>L2F@ifg2vrTH;xvexLCxU&ghH7s&p z`pkJ-)LVaZ>;o+p4mL7RI`;3Y5+QshbS2iD)IeUyRulQ7DHp4~3haz>bXs2zL6BjR z^&V*V&bpD)#UnB=TtjHRqK|X+q9zAPewVfn6sK zW8}xnD3}7Zkv;L=T-mrpA{Ps5=BN4itLk%tQH6hPEo-LHp^gSHsRf}n8COlI^NC5) zUu*`(`>(mAA6--H$_q_fpopO=io6ry@Z`VW!{kvQye9{2qCVfB7HU|-cpx_Z- z8#R{1mCzYlOo-papUaE=3=}FfTEeRxh`{V*n-ewx+ z!fsaY<>Gm~y3`p2RkhITt~wNOIY&PAzNi3*H5ug)u)cqEwpp0dlH-vCl`IbgS$Rkw z;e@j1^8P#I7bPKgtkf$jzOVTdL^i`Rye{SP4sIYQC$3D}E|^F*)|YehxKJ)lIf2|sk5u~3d<%g&G5s7_)1L82J@_RjA>%)eiskaB?1y>#*ZLL{ zjEe|-)*OPpyTRp3PD-=H0KuEU+i9*8Dg0{7%DV|0Q04nEcCaO(dA`MOZd{*T0R)+!ySK%buMx` zcg0VNWL!;F%AKcz#R#J-YPD4UeX?7otaX)=CJNWFO&7-uu;41pSPi@Hvg{>&c)H*V zQanoSJ)9UQ+qqv<#M4Du`3Uk1B~ubYc={7m(usYqLiB)ZuN`N^dQ!a2v@zxQ5sg*I zr^V*>QFLLeCvrP{`Uw7m=-Yq0)v`6b=){AA#0T5nd7@;bD6)R>3^Q-&{?3Rz)REK2 z;;OYnt^~&m)5-oZ%4_Nk!*;YjJcCmwD3ScSq^X$5i<>cDD^HTmN4^P88T?1)XFt7x z=>uo>o?awsFHnmbh<-N)wUPd-x7$|@6H91#Rzx9A! z#kPp8^=?g;jf-<$%g%c(Ub1WyV6P1{h=}`~FURRG&+Ch+PI~8lll!t6G#&f(1pGrn zM02~Ka88p`OVSQ#;watZJWZ^6QQeJ5H_80vlyIix5BxK8znaRjr!j#2L&>*}+(kdQ z#|g!KYMw#w9YyIQ-)n!L=Szx|ddsmy=_^x^K*`qMqrW?p|Bw7|^Wh8#eZcMWjTsXS zKDbuG<24Z!B6|_pz!08%LewBVup9Ss0o$akrdl=1>lZC&y6rIWQs|4yzMg{)h>4i4 zQS@hOn8_L8KQRIiE3QxvOZeFdVU=^mez~N^J@g2kL2LqYrRRU;@(oiqvg{+;NBHWm zxNWWx@BQ>#d5GYd3P?A9yApHEq0XChR(;4#o0*0~h|JVWq;*1*OH&Owa5Gm4*+2%g zbJt`L31x(!b*pGOlVnX@XhtfF)xb-A&P0`=_prJu-r=yq7zM!$^w8G2gv#ALyZ)W^ zFk9k1u5KXAdA5HH6W%ukqSf}QpDTK|8!i_a{$Dv|bhAhF9X`>V7`L&wWfBtro@4xmZM`#Th&YCB0qIKYuwmprP^hk@LAz`NIW;iMuK^T4E`Aw*zocc&e{$3(3P0Y=xhH<$Aq&QKD~{fnpUG3 znS$5&{7lmG4i6z`j(Tgab^pIT8o&AkKbd3IndeB@oqY6S(Uh<#gSHTFiML}nhK>%co zlK+BHvu$KDSoi=35-%K_T%l`UtNrpZA6?wM;4QcAp;dIeC%}!g#L0o&&Sa*PGTy_n zG%rL0@=+C69rmc^kT6`M34-xt{llZ?olH7*@#5UdLO5H*w~=g}e$dv{Pl3++o(q4x zaM1p$#dmA7zC7-<&3>9$$2U2eMbnS#Lo#xRG5e;W40S4;{77$s`W$7w>I?59~17_>`vPr=r*^d zat17DwQPH4l+VNlP>TP;NeS)zqFsNf(%1{1r_iX$B>-IA^}3k>9U|?8UaaCPbZp4}Xy%${jp4_szrMcycx2c)W;3 zY*z-0Vp}0Co_bce!$Zto^BI$~u=ga#3!C3`&8^;3xofM9?5$4p?ftC>z2EzEHu8aJ`F{48#U(tAT3g2VSh zDAUf4F>ms5<{7m>gJzus`pE_uF+gyYZD>B;`Za;L-7VPMEG8MIw6^-Y-nETemi$zz SW482}fv&9G?Dwa-2i1_lC09cL delta 3155 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 tE|%W~ueTlFXA8G#69oY?%Up`8*lK*kM!uRM Date: Mon, 1 Dec 2025 11:25:00 +0100 Subject: [PATCH 964/988] README: add missing space --- README.d/04-import-scripts.avif | Bin 4805 -> 4813 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index 27380eba1666633b70e4c4fd2746d27ad2f9205b..c09949ab604d054e2d3d2cef93faf466e3bb0216 100644 GIT binary patch delta 243 zcmVGHHeuB5)!`^u`ICf{patH(YybZv9onpVOe!uY`)F9ct#T zI*j5LkXT4D;4*(S?>Qer+I*$-;Qu}QGK-}fDL$}Iu^5#pqV?ic@Qaan=Fwrj1<6lw zBfWX9Prwvgnf4fn!ceb30Co}{`KmnG=7Vn?G(PB=GD|`TdXOnkIhMJzLF8{`FEaN8 tW^tkXA3eE2DXf0gKL#FcmcAJd6f~mZDe6|5&#MYI3==ttP(P%vmXK95Pv|Kv}*>`Dse{r z!Yyprgb<4s5F#FL-stO0*p;FNSZs6sZ}4+&9BeBhs^#Kkj~iDlEQlfb?nevOz2bZn z_Ol-&ML*v|s0@&CDm+x-K7`6tmOhe)dwPNXz{pIqhUt#!?2)XUoF2Ea|CnzG!Vp=! zRcl}V9Vf|59;W=ir$_?_1Rf%$J}Q&oAtZd6s9hLFlM<+%(Cnlhb~helwtnj|F@`iv lL-(7Q=O=+C8zh6N%|OX30tBS(tu-w{kcY%|Qb_&3n>?&VYhVBX diff --git a/README.md b/README.md index 0aedfcf2..d562ada0 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ date and time is set correctly! Now let's download the main scripts and add them in configuration on the fly. - :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value]->"data"); }; + :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value ]->"data"); }; ![screenshot: import scripts](README.d/04-import-scripts.avif) From c0678f0501dfccc56b692a64439b4bd1982149a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 1 Dec 2025 11:25:28 +0100 Subject: [PATCH 965/988] INITIAL-COMMANDS: add missing space --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 374f7165..e580bc53 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -41,7 +41,7 @@ Run the complete base installation: :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ :put "Installing $Script..."; /system/script/remove [ find where name=$Script ]; - /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); + /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value ]->"data"); }; :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; From 240decf4195993dbbb05dd39cdabf0e2659a18ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Dec 2025 15:43:58 +0100 Subject: [PATCH 966/988] check-perpetual-license: cross-mark on already expired license --- check-perpetual-license.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index a88498d2..ff775c3d 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -42,7 +42,7 @@ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "expired") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License expired!"); \ + subject=([ $SymbolForNotification "scroll,cross-mark" ] . "License expired!"); \ message=("Your license expired on " . ($License->"deadline-at") . \ ", can no longer update RouterOS on " . $Identity . "...") }); :set SentCertificateNotification "expired"; From 830693df79df83c6114e3c8c5878a471d1cf43eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Dec 2025 17:39:52 +0100 Subject: [PATCH 967/988] global-functions: $SymbolByUnicodeName: extend special --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index 75eccb9b..4bd7128b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1717,6 +1717,7 @@ :local Magic [ :pick [ /system/clock/get date ] 4 10 ]; :local Special { + "information-04-01"="\F0\9F\9A\BB"; "large-orange-circle-04-01"="\F0\9F\8D\8A"; "large-orange-circle-10-31"="\F0\9F\8E\83"; "large-red-circle-04-01"="\F0\9F\8D\92" }; From 28b00e23a17b91243628b95d50b76bd4867a4fd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Dec 2025 12:02:29 +0100 Subject: [PATCH 968/988] check-routeros-update: $DoUpdate: drop message... ... as it's either not shown anyway (when rebooting already), `packages-update` gives reasonable output, or it is simply wrong (when `packages-update` failed). --- check-routeros-update.rsc | 3 --- 1 file changed, 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 8b80ddeb..e5b2e181 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -39,14 +39,11 @@ :local DoUpdate do={ :local ScriptName [ :tostr $1 ]; - :global LogPrint; - :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ /system/script/run packages-update; } else={ /system/package/update/install without-paging; } - $LogPrint info $ScriptName ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ From 6e37bab48113fb696eca77a339911d6948b2d411 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 8 Dec 2025 09:31:12 +0100 Subject: [PATCH 969/988] netwatch-dns: add active check to keep DoH server --- netwatch-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index eee5f854..a379504b 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -94,8 +94,8 @@ :set ($HostInfo->"doh-url") ("https://" . [ $EitherOr $HostName ($HostVal->"host") ] . "/dns-query"); } - :if ($DohCurrent = $HostInfo->"doh-url") do={ - $LogPrint debug $ScriptName ("Current DoH server is still up: " . $DohCurrent); + :if ($DohCurrent = $HostInfo->"doh-url" && [ $IsDNSResolving ] = true) do={ + $LogPrint debug $ScriptName ("Current DoH server is still up and resolving: " . $DohCurrent); :set ExitOK true; :error true; } From 96896c37e5bf2dc80941e572c4a93c26ddcaf935 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 8 Dec 2025 09:36:03 +0100 Subject: [PATCH 970/988] netwatch-dns: update wording to reflect the extra check --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index a379504b..60064057 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -105,7 +105,7 @@ } :if ([ :len $DohCurrent ] > 0) do={ - $LogPrint info $ScriptName ("Current DoH server is down, disabling: " . $DohCurrent); + $LogPrint info $ScriptName ("Current DoH server is down or not resolving, disabling: " . $DohCurrent); /ip/dns/set use-doh-server=""; /ip/dns/cache/flush; } From c697c321e6381c60873b49f3cc332351ee758e06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Dec 2025 21:48:16 +0100 Subject: [PATCH 971/988] netwatch-dns: drop early check... ... as the later check should handle that just fine. --- netwatch-dns.rsc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 60064057..43669fab 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -73,13 +73,6 @@ :local DohCurrent [ /ip/dns/get use-doh-server ]; :local DohServers ({}); - - :if ([ :len $DohCurrent ] > 0 && [ $IsDNSResolving ] = false && [ $IsTimeSync ] = false) do={ - $LogPrint info $ScriptName ("Time is not sync, disabling DoH: " . $DohCurrent); - /ip/dns/set use-doh-server=""; - :set DohCurrent ""; - } - :foreach Host in=[ /tool/netwatch/find where comment~"\\bdoh\\b" status="up" ] do={ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; From 222404535b55c61937a8def152d412ac0a611507 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Dec 2025 16:29:20 +0100 Subject: [PATCH 972/988] netwatch-dns: drop declaration of unused function --- netwatch-dns.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 43669fab..ab4beb18 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -19,7 +19,6 @@ :global CertificateAvailable; :global EitherOr; :global IsDNSResolving; - :global IsTimeSync; :global LogPrint; :global LogPrintOnce; :global ParseKeyValueStore; From 0745f09a8a80adf08094bae5d58ed092547b423d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Dec 2025 09:14:26 +0100 Subject: [PATCH 973/988] global-functions: $FetchHuge: handle missing file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should not happen, as download was supposed to be successful - it does. 🤪 --- global-functions.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4bd7128b..eb02ac47 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -518,7 +518,11 @@ $RmDir $DirName; :return false; } - $WaitForFile $FileName; + + :if ([ $WaitForFile $FileName 5s ] = false) do={ + $LogPrint debug $0 ("The file downloaded from " . $Url . " did not show up."); + :return false; + } :local FileSize [ /file/get $FileName size ]; :local Return ""; From ee9618014c7e86623ae333460c31e486ce6dbf97 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Dec 2025 18:03:00 +0100 Subject: [PATCH 974/988] introduce contrib/telegram... ... with all the content for Miss Rose. https://t.me/MissRose_bot --- contrib/telegram.md | 274 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 contrib/telegram.md diff --git a/contrib/telegram.md b/contrib/telegram.md new file mode 100644 index 00000000..f6525054 --- /dev/null +++ b/contrib/telegram.md @@ -0,0 +1,274 @@ +Telegram +======== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../README.md) + +We have [Miss Rose Bot ↗️](https://t.me/MissRose_bot) in our +[RouterOS-Scripts ↗️](https://t.me/routeros_scripts) Telegram group, +always kind and ready to help moderate. + +Notes +----- + +### README + + /save readme Please read the [main README](https://rsc.eworm.de/) to understand how things work and to get the base installation right. + +### Available scripts + +#### accesslist-duplicates + + /save accesslist-duplicates Find and remove access list duplicates with [accesslist-duplicates](https://rsc.eworm.de/doc/accesslist-duplicates.md). + +#### backup-cloud + + /save backup-cloud Upload backup to Mikrotik cloud with [backup-cloud](https://rsc.eworm.de/doc/backup-cloud.md). + +#### backup-email + + /save backup-email Send backup via e-mail with [backup-email](https://rsc.eworm.de/doc/backup-email.md). + +#### backup-partition + + /save backup-partition Save configuration to fallback partition with [backup-partition](https://rsc.eworm.de/doc/backup-partition.md). + +#### backup-upload + + /save backup-upload Upload backup to server with [backup-upload](https://rsc.eworm.de/doc/backup-upload.md). + +#### capsman-download-packages + + /save capsman-download-packages Download packages for CAP upgrade from CAPsMAN with [capsman-download-packages](https://rsc.eworm.de/doc/capsman-download-packages.md). + +#### capsman-rolling-upgrade + + /save capsman-rolling-upgrade Run rolling CAP upgrades from CAPsMAN with [capsman-rolling-upgrade](https://rsc.eworm.de/doc/capsman-rolling-upgrade.md). + +#### certificate-renew-issued + + /save certificate-renew-issued Renew locally issued certificates with [certificate-renew-issued](https://rsc.eworm.de/doc/certificate-renew-issued.md). + +#### check-certificates + + /save check-certificates Renew certificates and notify on expiration with [check-certificates](https://rsc.eworm.de/doc/check-certificates.md). + +#### check-health + + /save check-health Notify about health state with [check-health](https://rsc.eworm.de/doc/check-health.md). + +#### check-lte-firmware-upgrade + + /save check-lte-firmware-upgrade Notify on LTE firmware upgrade with [check-lte-firmware-upgrade](https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md). + +#### check-perpetual-license + + /save check-perpetual-license Check perpetual license on CHR with [check-perpetual-license](https://rsc.eworm.de/doc/check-perpetual-license.md). + +#### check-routeros-update + + /save check-routeros-update Notify on RouterOS update with [check-routeros-update](https://rsc.eworm.de/doc/check-routeros-update.md). + +#### collect-wireless-mac + + /save collect-wireless-mac Collect MAC addresses in wireless access list with [collect-wireless-mac](https://rsc.eworm.de/doc/collect-wireless-mac.md). + +#### daily-psk + + /save daily-psk Use wireless network with [daily-psk](https://rsc.eworm.de/doc/daily-psk.md). + +#### dhcp-lease-comment + + /save dhcp-lease-comment Comment DHCP leases with [dhcp-lease-comment](https://rsc.eworm.de/doc/dhcp-lease-comment.md). + +#### dhcp-to-dns + + /save dhcp-to-dns Create DNS records for DHCP leases with [dhcp-to-dns](https://rsc.eworm.de/doc/dhcp-to-dns.md). + +#### firmware-upgrade-reboot + + /save firmware-upgrade-reboot Automatically upgrade firmware and reboot with [firmware-upgrade-reboot](https://rsc.eworm.de/doc/firmware-upgrade-reboot.md). + +#### fw-addr-lists + + /save fw-addr-lists Download, import and update firewall address-lists with [fw-addr-lists](https://rsc.eworm.de/doc/fw-addr-lists.md). + +#### global-wait + + /save global-wait Wait for global functions und modules with [global-wait](https://rsc.eworm.de/doc/global-wait.md). + +#### gps-track + + /save gps-track Send GPS position to server with [gps-track](https://rsc.eworm.de/doc/gps-track.md). + +#### hotspot-to-wpa + + /save hotspot-to-wpa Use WPA network with [hotspot-to-wpa](https://rsc.eworm.de/doc/hotspot-to-wpa.md). + +#### ipsec-to-dns + + /save ipsec-to-dns Create DNS records for IPSec peers with [ipsec-to-dns](https://rsc.eworm.de/doc/ipsec-to-dns.md). + +#### ipv6-update + + /save ipv6-update Update configuration on IPv6 prefix change with [ipv6-update](https://rsc.eworm.de/doc/ipv6-update.md). + +#### ip-addr-bridge + + /save ip-addr-bridge Manage IP addresses with [ip-addr-bridge](https://rsc.eworm.de/doc/ip-addr-bridge.md). + +#### lease-script + + /save lease-script Run other scripts on DHCP lease with [lease-script](https://rsc.eworm.de/doc/lease-script.md). + +#### leds-mode + + /save leds-mode Manage LEDs dark mode with [leds-mode](https://rsc.eworm.de/doc/leds-mode.md). + +#### log-forward + + /save log-forward Forward log messages via notification with [log-forward](https://rsc.eworm.de/doc/log-forward.md). + +#### mode-button + + /save mode-button Mode button with [mode-button](https://rsc.eworm.de/doc/mode-button.md). + +#### netwatch-dns + + /save netwatch-dns Manage DNS and DoH servers from netwatch with [netwatch-dns](https://rsc.eworm.de/doc/netwatch-dns.md). + +#### netwatch-notify + + /save netwatch-notify Notify on host up and down with [netwatch-notify](https://rsc.eworm.de/doc/netwatch-notify.md). + +#### ospf-to-leds + + /save ospf-to-leds Visualize OSPF state via LEDs with [ospf-to-leds](https://rsc.eworm.de/doc/ospf-to-leds.md). + +#### packages-update + + /save packages-update Manage system update with [packages-update](https://rsc.eworm.de/doc/packages-update.md). + +#### ppp-on-up + + /save ppp-on-up Run scripts on ppp connection with [ppp-on-up](https://rsc.eworm.de/doc/ppp-on-up.md). + +#### sms-action + + /save sms-action Act on received SMS with [sms-action](https://rsc.eworm.de/doc/sms-action.md). + +#### sms-forward + + /save sms-forward Forward received SMS with [sms-forward](https://rsc.eworm.de/doc/sms-forward.md). + +#### super-mario-theme + + /save super-mario-theme Play Super Mario theme with [super-mario-theme](https://rsc.eworm.de/doc/super-mario-theme.md). + +#### telegram-chat + + /save telegram-chat Chat with [telegram-chat](https://rsc.eworm.de/doc/telegram-chat.md). + +#### unattended-lte-firmware-upgrade + + /save unattended-lte-firmware-upgrade Install LTE firmware upgrade with [unattended-lte-firmware-upgrade](https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md). + +#### update-gre-address + + /save update-gre-address Update GRE configuration with [update-gre-address](https://rsc.eworm.de/doc/update-gre-address.md). + +#### update-tunnelbroker + + /save update-tunnelbroker Update tunnelbroker configuration with [update-tunnelbroker](https://rsc.eworm.de/doc/update-tunnelbroker.md). + +### Available modules + +#### mod/bridge-port-to + + /save mod/bridge-port-to Manage ports in bridge with [mod/bridge-port-to](https://rsc.eworm.de/doc/mod/bridge-port-to.md). + +#### mod/bridge-port-vlan + + /save mod/bridge-port-vlan Manage VLANs on bridge ports with [mod/bridge-port-vlan](https://rsc.eworm.de/doc/mod/bridge-port-vlan.md). + +#### mod/inspectvar + + /save mod/inspectvar Inspect variables with [mod/inspectvar](https://rsc.eworm.de/doc/mod/inspectvar.md). + +#### mod/ipcalc + + /save mod/ipcalc IP address calculation with [mod/ipcalc](https://rsc.eworm.de/doc/mod/ipcalc.md). + +#### mod/notification-email + + /save mod/notification-email Send notifications via e-mail with [mod/notification-email](https://rsc.eworm.de/doc/mod/notification-email.md). + +#### mod/notification-gotify + + /save mod/notification-gotify Send notifications via Gotify with [mod/notification-gotify](https://rsc.eworm.de/doc/mod/notification-gotify.md). + +#### mod/notification-matrix + + /save mod/notification-matrix Send notifications via Matrix with [mod/notification-matrix](https://rsc.eworm.de/doc/mod/notification-matrix.md). + +#### mod/notification-ntfy + + /save mod/notification-ntfy Send notifications via Ntfy with [mod/notification-ntfy](https://rsc.eworm.de/doc/mod/notification-ntfy.md). + +#### mod/notification-telegram + + /save mod/notification-telegram Send notifications via Telegram with [mod/notification-telegram](https://rsc.eworm.de/doc/mod/notification-telegram.md). + +#### mod/scriptrunonce + + /save mod/scriptrunonce Download script and run it once with [mod/scriptrunonce](https://rsc.eworm.de/doc/mod/scriptrunonce.md). + +#### mod/ssh-keys-import + + /save mod/ssh-keys-import Import ssh keys for public key authentication with [mod/ssh-keys-import](https://rsc.eworm.de/doc/mod/ssh-keys-import.md). + +### Other + +#### Installing from branches + + /save branches Living on the edge or testing new features? Learn how to [switch specific scripts or the complete installation to different branches](https://rsc.eworm.de/BRANCHES.md). + +#### Certificate name from browser + + /save certificate-name-from-browser Running or accessing a custom service and looking for the CA certificate? Get the [certificate name from browser](https://rsc.eworm.de/CERTIFICATES.md). + +#### Debug output and logs + + /save debug Enable [debug output and logs](https://rsc.eworm.de/DEBUG.md) for more information on what happens. + +#### Donate + + /save donate This project is developed in private spare time and usage is free of charge for you. If you like the scripts and think this is of value for you or your business [please consider a donation](https://rsc.eworm.de/#donate). Thanks! + +#### Fix existing installation + + /save fix-installation [Fix existing installation] Your installation broke and you do not know back and forth? See how to [fix an existing installation](https://rsc.eworm.de/INITIAL-COMMANDS.md#fix-existing-installation). + +#### Next! + + /save next Another satisfied user. 😊 Next, please! + +#### Off-topic + + /save off-topic Please note this group is not about MikroTik RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Your request is not about scripting at all, so please discuss somewhere else. See the [MikroTik RouterOS users (english)](https://t.me/RouterOS_users_english) group or official Mikrotik forums (https://forum.mikrotik.com/). + +Greeting +-------- + + /setwelcome Hello {mention} and welcome to {chatname}! + Please note this group is not about RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Also pay attention to [rules](https://t.me/routeros_scripts/4), thanks! + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) From aa0b5a9ca248cf14d8f596f62a1c672ca7fe7c45 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Dec 2025 19:21:29 +0100 Subject: [PATCH 975/988] README: add a brief description --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d562ada0..746390bf 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ RouterOS Scripts [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) +**a collection of scripts for MikroTik RouterOS** + ![RouterOS Scripts Logo](logo.svg) [RouterOS ↗️](https://mikrotik.com/software) is the operating system developed From 623f96d94a90327d06eed9612c4387cf404e85b1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 1 Jan 2026 13:47:40 +0100 Subject: [PATCH 976/988] update copyright for 2026 --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.d/state.rsc | 2 +- check-health.d/temperature.rsc | 2 +- check-health.d/voltage.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-perpetual-license.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- contrib/html.sh.d/foot.html | 2 +- contrib/logo-color.html | 2 +- contrib/notification.html | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-config-overlay.rsc | 2 +- global-config.rsc | 2 +- global-functions.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ip-addr-bridge.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- leds-day-mode.rsc | 2 +- leds-night-mode.rsc | 2 +- leds-toggle-mode.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-gotify.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- news-and-changes.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- super-mario-theme.rsc | 2 +- telegram-chat.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 85 files changed, 85 insertions(+), 85 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 1da03661..0d7a4386 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 03a97241..080ce72d 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index bf231475..15e96a99 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 528a73ce..7696f6cc 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/backup-cloud.rsc b/backup-cloud.rsc index e41db275..4d8830b6 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-cloud -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 diff --git a/backup-email.rsc b/backup-email.rsc index 8015beaa..317242b1 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-email -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 diff --git a/backup-partition.rsc b/backup-partition.rsc index ae7ad030..5f8a635e 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-partition -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 diff --git a/backup-upload.rsc b/backup-upload.rsc index e6b9f92f..f27032c4 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-upload -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 2ea16674..ff91e7ca 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index f95212a4..7f0a4b47 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 03fd9e73..d65a4aec 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 0d4114a3..81ce0152 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 690d73d8..9789d2f3 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 8e32ab20..bc0d4d38 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 14917e4c..807f0606 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-certificates.rsc b/check-certificates.rsc index 93641eec..db1e2d45 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-certificates -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index 5e4cbb82..ab32e41b 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/state -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index 9f3f1a5e..6ce3e959 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/temperature -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 5891fb4f..59dd23c3 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/voltage -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.rsc b/check-health.rsc index 760636db..4cb5baa0 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 9f4b6562..ced827e2 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index ff775c3d..0e66bccc 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-perpetual-license -# Copyright (c) 2025 Christian Hesse +# Copyright (c) 2025-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index e5b2e181..4a6925d0 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 06b8d844..2572acc9 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 6716582d..ae9a3395 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 53e6b0a8..54b113ec 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 43ac8519..20bbb100 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html index d3041520..9e28e115 100644 --- a/contrib/html.sh.d/foot.html +++ b/contrib/html.sh.d/foot.html @@ -1,5 +1,5 @@

RouterOS Scripts documentation generated on __DATE__ for __VERSION__
-Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/contrib/logo-color.html b/contrib/logo-color.html index e5bfb71e..3e9c05fe 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -57,6 +57,6 @@ a profile photo
for your Telegram bot.

⬅️ Go back to main README
⬆️ Go back to top

-

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+

Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/contrib/notification.html b/contrib/notification.html index baa659c3..239bc52c 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -52,6 +52,6 @@ notification and download it.

⬅️ Go back to main README
⬆️ Go back to top

-

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+

Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 3ecd6b66..30781d33 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index d496350c..730c52f0 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5a1df2f1..51bc4754 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index c441e581..91f323d1 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 3615bb9b..54dcc799 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 9da53336..8a54ef68 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 62cace12..3bc30723 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 667708cd..f9f1f048 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index a9c91e1c..7a823d24 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=20 diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index e3ca55b3..bd3aa174 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index e5a71aa6..a9c75d65 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists -# Copyright (c) 2023-2025 Christian Hesse +# Copyright (c) 2023-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 88bb4d99..5bfc3031 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,5 +1,5 @@ # Overlay for global configuration by RouterOS Scripts -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # global configuration, custom overlay diff --git a/global-config.rsc b/global-config.rsc index 86d528aa..31250418 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-config -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # global configuration diff --git a/global-functions.rsc b/global-functions.rsc index eb02ac47..ff663c7c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-functions -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/global-wait.rsc b/global-wait.rsc index 23b56298..746974e7 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-wait -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/gps-track.rsc b/gps-track.rsc index 6a090bfe..fb403e65 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: gps-track -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e4ac9678..585c7924 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index d51e1d03..0aac42fe 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 8bb2631b..6803a449 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 8977cee1..cbe0a791 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index c5d977d1..4169d6de 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 6a97e460..d90be359 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 68ff4a41..0f2bf8ab 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # enable or disable ip addresses based on bridge port state diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 1b5ed133..90a8215c 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 580a426c..0cbb2dc0 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipv6-update -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/lease-script.rsc b/lease-script.rsc index ab449568..7f9eaa97 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: lease-script -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index 7344fde7..d2341bfd 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # enable LEDs diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index 8bd028e7..87094fad 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # disable LEDs diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index b55e3514..b6118513 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # toggle LEDs mode diff --git a/log-forward.rsc b/log-forward.rsc index 3d7d0547..96edc11d 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: log-forward -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 93eedcef..7046ff86 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 6deee994..65c11fce 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index fc1b366f..d0473a9d 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index d65d4724..93ea8a30 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 668dabac..5f45e663 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index d8eafbe0..464b4272 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-gotify -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Leonardo David Monteiro # https://rsc.eworm.de/COPYING.md # diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index e9b42a0d..5203e0fb 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-matrix -# Copyright (c) 2013-2025 Michael Gisbers +# Copyright (c) 2013-2026 Michael Gisbers # Christian Hesse # https://rsc.eworm.de/COPYING.md # diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index dd10812e..03a2d420 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index b1996a32..959924f0 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 1d6aaf1f..0242b16e 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 8bea64ee..fb0cc0fe 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/mode-button.rsc b/mode-button.rsc index d82f8995..b7a7b85f 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mode-button -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index ab4beb18..c55f09e5 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 1fcc2034..d4a9123f 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/news-and-changes.rsc b/news-and-changes.rsc index dbfb1b9b..53f3e7b6 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,5 +1,5 @@ # News, changes and migration by RouterOS Scripts -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md :global IDonate; diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 26f8aa37..10d35307 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/packages-update.rsc b/packages-update.rsc index 379e818e..b0bf5478 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: packages-update -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index f16d73f3..bb09c856 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/sms-action.rsc b/sms-action.rsc index 47e19223..35f4cfa7 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-action -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/sms-forward.rsc b/sms-forward.rsc index 161ae6be..e3d2d2e7 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-forward -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Anatoly Bubenkov # https://rsc.eworm.de/COPYING.md # diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index 726c5267..318f1d9c 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # play Super Mario theme diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 54872fb9..1c949e8f 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: telegram-chat -# Copyright (c) 2023-2025 Christian Hesse +# Copyright (c) 2023-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 237c2d83..6f1ac024 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/update-gre-address.rsc b/update-gre-address.rsc index dd7d63e4..cde6aa0a 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-gre-address -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 5372f4c2..ee7f6f9c 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-tunnelbroker -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # From 4af18ced9e6d035c36cab2d34d4caa486a45c092 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 10:07:27 +0100 Subject: [PATCH 977/988] global-config: fix regex to load overlay snippets --- global-config.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 31250418..a36dbaac 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -276,7 +276,7 @@ # # load custom settings from overlay and snippets :foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ - [ /system/script/find where name~"^global-config-overlay.d/" ]) do={ + [ /system/script/find where name~"^global-config-overlay\\.d/." ]) do={ :onerror Err { /system/script/run $Script; } do={ From 8528ca376cb8faf182af9e6e7ec7f7531f6fc9c4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 10:08:09 +0100 Subject: [PATCH 978/988] global-config: support loading custom config snippets This may be interesting for custom scripts which can drop their own default global configuration. --- global-config.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index a36dbaac..25254123 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -275,7 +275,8 @@ # /_()_\ Things *will* break! # # load custom settings from overlay and snippets -:foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ +:foreach Script in=([ /system/script/find where name~"^global-config\\.d/." ], \ + [ /system/script/find where name="global-config-overlay" ], \ [ /system/script/find where name~"^global-config-overlay\\.d/." ]) do={ :onerror Err { /system/script/run $Script; From 8fa17d4b3b2ede5694f3f9e053d82e2491a9a77b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 11:08:58 +0100 Subject: [PATCH 979/988] check-health: fix regex to load plugins --- check-health.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 4cb5baa0..90d8c841 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -74,7 +74,7 @@ :set CheckHealthRAMUtilizationNotified false; } - :local Plugins [ /system/script/find where name~"^check-health.d/." ]; + :local Plugins [ /system/script/find where name~"^check-health\\.d/." ]; :if ([ :len $Plugins ] = 0) do={ $LogPrint debug $ScriptName ("No plugins installed."); :set ExitOK true; From 8878449b0be665f0c0df1b4ad48d20e2bb53efe9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 11:37:58 +0100 Subject: [PATCH 980/988] global-functions: support modules (or snippets) in global-functions.d/ --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ff663c7c..05c232ad 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1900,7 +1900,7 @@ } # load modules -:foreach Script in=[ /system/script/find where name ~ "^mod/." ] do={ +:foreach Script in=[ /system/script/find where name ~ "^(global-functions\\.d|mod)/." ] do={ :local ScriptVal [ /system/script/get $Script ]; :if ([ $ValidateSyntax ($ScriptVal->"source") ] = true) do={ :onerror Err { From 7dc230cceb6166632cd1513dd294b5f6b6bb0226 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 00:48:49 +0100 Subject: [PATCH 981/988] contrib/telegram: add Oxford Comma in greeting --- contrib/telegram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/telegram.md b/contrib/telegram.md index f6525054..355a9cdd 100644 --- a/contrib/telegram.md +++ b/contrib/telegram.md @@ -266,7 +266,7 @@ Notes Greeting -------- - /setwelcome Hello {mention} and welcome to {chatname}! + /setwelcome Hello {mention}, and welcome to {chatname}! Please note this group is not about RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Also pay attention to [rules](https://t.me/routeros_scripts/4), thanks! --- From 6990084d98f6063002fbfc7a500b8edead6a8309 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:41:59 +0100 Subject: [PATCH 982/988] global-functions: $CharacterMultiply: use local variables for parameters --- global-functions.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 05c232ad..d99e216f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -240,9 +240,12 @@ # multiply given character(s) :set CharacterMultiply do={ + :local Str [ :tostr $1 ]; + :local Num [ :tonum $2 ]; + :local Return ""; - :for I from=1 to=$2 do={ - :set Return ($Return . $1); + :for I from=1 to=$Num do={ + :set Return ($Return . $Str); } :return $Return; } From 0ceedab5db11314ed0e275f2129d602ba20e81d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:43:11 +0100 Subject: [PATCH 983/988] global-functions: $CharacterMultiply: return early on length zero... ... as :for loop counts backwards and would return two character otherwise. --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index d99e216f..3b5db905 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -243,6 +243,10 @@ :local Str [ :tostr $1 ]; :local Num [ :tonum $2 ]; + :if ($Num = 0) do={ + :return ""; + } + :local Return ""; :for I from=1 to=$Num do={ :set Return ($Return . $Str); From 33061fea21ab6c7e081948a3a71763b27f16233e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:54:35 +0100 Subject: [PATCH 984/988] mod/inspectvar: indent by two characters --- mod/inspectvar.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index d0473a9d..63f35ba1 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -36,7 +36,7 @@ :global CharacterMultiply; - :return ([ $CharacterMultiply " " $Level ] . "-" . $Prefix . "-> " . $Value); + :return ([ $CharacterMultiply " " ($Level * 2) ] . "-" . $Prefix . "-> " . $Value); } :local TypeOf [ :typeof $Input ]; From 0d71cd5b3bcb2ebf0a6d43ca74c04f0166ef5b24 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:56:35 +0100 Subject: [PATCH 985/988] doc/mod/inspectvar: update screenshot... ... with fix from $CharacterMultiply and doubled indention. --- doc/mod/inspectvar.d/01-inspectvar.avif | Bin 4232 -> 4243 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/mod/inspectvar.d/01-inspectvar.avif b/doc/mod/inspectvar.d/01-inspectvar.avif index 1be1358008388ec650c82e8974859237a0a5846f..e4e9bd5ab16c330adfc3d4775f65d3c6199a6288 100644 GIT binary patch delta 3799 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 Ns2toksDS!{ISW0#U5Eex delta 3787 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 Date: Fri, 9 Jan 2026 14:02:27 +0100 Subject: [PATCH 986/988] README: make prerequisite configuration a sub-section --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 746390bf..b11c4d09 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ Specific scripts may require even newer RouterOS version. > ℹ️ **Info**: The `main` branch is now RouterOS v7 only. If you are still > running RouterOS v6 switch to `routeros-v6` branch! +#### Prerequisite configuration + Starting with RouterOS 7.17 the [device-mode ↗️](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) has been extended to give more fine-grained control over what features are From 377e196cb0a8dcc8902465ea6b8569ead6e3f3c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 9 Jan 2026 16:01:58 +0100 Subject: [PATCH 987/988] =?UTF-8?q?README:=20long-term=20channel=20is=20ba?= =?UTF-8?q?ck!=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b11c4d09..c08ce0a9 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,26 @@ Requirements ### Software (RouterOS) Latest version of the scripts require recent RouterOS to function properly. -Make sure to install latest updates before you begin. If new functionality -or a breaking change in RouterOS `7.n` is used in my scripts I push my -change some time after `7.(n+1)` was released. At any time you should have -at least two minor and their bugfix releases to choose from. +Make sure to install latest updates before you begin. This is supposed to +work flawlessly with these channels: -Specific scripts may require even newer RouterOS version. +* `stable` - the latest version considered stable for daily use, including + new features +* `long-term` - a version considered rock-solid, usually one minor version + behind `stable` (`7.(n-1)`) + +New functionality or breaking changes in RouterOS are adopted fairly quick. +These changes are pushed for general availability once a version of +RouterOS supporting this had been released to the `long-term` channel a +reasonable time ago. + +At any time you should have at least two minor versions and their bugfix +releases to choose from. Often way older versions of RouterOS work just +fine. + +On the other hand in seldom cases and for good reasons *specific* scripts +may require an even newer RouterOS version, so only `stable` is supported +temporarily. > ℹ️ **Info**: The `main` branch is now RouterOS v7 only. If you are still > running RouterOS v6 switch to `routeros-v6` branch! From 927edc639cc20ea2598fcbdf25ed1d27cb1a8354 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 11 Jan 2026 21:53:37 +0100 Subject: [PATCH 988/988] README: hint on the badge regarding required RouterOS version --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c08ce0a9..d111b8e7 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,10 @@ On the other hand in seldom cases and for good reasons *specific* scripts may require an even newer RouterOS version, so only `stable` is supported temporarily. +> 💡️ **Hint**: If in doubt have a look at the badge at the top of each +> page showing the minimum version required: +> ![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat) + > ℹ️ **Info**: The `main` branch is now RouterOS v7 only. If you are still > running RouterOS v6 switch to `routeros-v6` branch!

~Yh_~P@|>z=u7`j{mT7_W>n)j6m8kZ+2GJP- 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 V(D}T0{ai`;EVN36d*R2n;;^5yT!{bx literal 0 HcmV?d00001 diff --git a/CERTIFICATES.md b/CERTIFICATES.md new file mode 100644 index 00000000..dfd86392 --- /dev/null +++ b/CERTIFICATES.md @@ -0,0 +1,74 @@ +Certificate name from browser +============================= + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](README.md) + +All well known desktop, mobile and server operating systems come with a +certificate store that is populated with a set of well known and trusted +certificates, acting as *trust anchors*. + +However RouterOS does not, still sometimes a specific certificate is +required to properly verify a chain of trust. One example is downloading +the scripts from this repository with `fetch` command, thus the very +first step of [installation](README.md#the-long-way-in-detail) is importing +the certificate. + +The scripts can install additional certificates when required. This happens +from this repository if available, or from [mkcert.org](https://mkcert.org) +as a fallback. + +Get the certificate's CommonName +-------------------------------- + +But how to determine what certificate may be required? Often easiest way +is to use a desktop browser to get that information. This demonstration uses +[Mozilla Firefox](https://www.mozilla.org/firefox/). + +Let's assume we want to make sure the certificate for +[git.eworm.de](https://git.eworm.de/) is available. Open that page in the +browser, then click the *lock* icon in addressbar, followed by "*Connection +secure*". + +![screenshot: dialog A](CERTIFICATES.d/01-dialog-A.avif) + +The dialog will change, click "*More information*". + +![screenshot: dialog B](CERTIFICATES.d/02-dialog-B.avif) + +A new window opens, click the button "*View Certificate*". (That window +can be closed now.) + +![screenshot: window](CERTIFICATES.d/03-window.avif) + +A new tab opens, showing information on the server certificate and its +chain of trust. The leftmost certificate is what we are interested in. + +![screenshot: certificate](CERTIFICATES.d/04-certificate.avif) + +Now we know that "`ISRG Root X2`" is required, some scripts need just +that information. + +Import a certificate by CommonName +---------------------------------- + +Running the function `$CertificateAvailable` with that name as parameter +makes sure the certificate is available in the device's store: + + $CertificateAvailable "ISRG Root X2"; + +If the certificate is actually available already nothing happens, and there +is no output. Otherwise the certificate is downloaded and imported. + +If importing a certificate with that exact name fails a warning is given +and nothing is actually imported. + +--- +[⬅️ Go back to main README](README.md) +[⬆️ Go back to top](#top) From af942d90d3eae961cc5616118800ec1727e14004 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:31:20 +0100 Subject: [PATCH 268/988] doc/mod/notification-matrix: link to 'certificate name from browser' --- CERTIFICATES.md | 5 +++++ doc/mod/notification-matrix.md | 3 +++ 2 files changed, 8 insertions(+) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index dfd86392..92a124bb 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -69,6 +69,11 @@ is no output. Otherwise the certificate is downloaded and imported. If importing a certificate with that exact name fails a warning is given and nothing is actually imported. +See also +-------- + +* [Send notifications via Matrix](doc/mod/notification-matrix.md) + --- [⬅️ Go back to main README](README.md) [⬆️ Go back to top](#top) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index dd46404c..fbc9b912 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -52,6 +52,8 @@ Trust Services*. Run this to import the required certificate: $CertificateAvailable "GTS Root R4"; Replace the CA certificate name with what ever is needed for your server. +You may want to find the +[certificate name from browser](../../CERTIFICATES.md). ### From other device @@ -127,6 +129,7 @@ function available: See also -------- +* [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) From c5740c2328c4d468766686717fd14b9860e0494c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:43:39 +0100 Subject: [PATCH 269/988] doc/mod/notification-ntfy: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/mod/notification-ntfy.md | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 92a124bb..819c32c2 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -73,6 +73,7 @@ See also -------- * [Send notifications via Matrix](doc/mod/notification-matrix.md) +* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) --- [⬅️ Go back to main README](README.md) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 2a43e3c8..5393d444 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -52,6 +52,10 @@ basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. Even authentication via access token is possible, adding it as password with a blank username. +For a custom service installing an additional certificate may be required. +You may want to install that certificate manually, after finding the +[certificate name from browser](../../CERTIFICATES.md). + Usage and invocation -------------------- @@ -82,6 +86,7 @@ function available: See also -------- +* [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Telegram](notification-telegram.md) From d213369e73da042014ca68af17831c5bc3eb4310 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:34:17 +0100 Subject: [PATCH 270/988] doc/fw-addr-lists: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/fw-addr-lists.md | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 819c32c2..25432994 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -72,6 +72,7 @@ and nothing is actually imported. See also -------- +* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 2008c7ea..3d9e771e 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -62,9 +62,8 @@ The configuration goes to `global-config-overlay`, these are the parameters: > your local `global-config-overlay` and modify it to your specific needs. Naming a certificate for a list makes the script verify the server -certificate, so you should add that if possible. Some certificates are -available in my repository and downloaded automatically. Import it manually -(menu `/certificate/`) if missing. +certificate, so you should add that if possible. You may want to find the +[certificate name from browser](../CERTIFICATES.md). Create firewall rules to process the packets that are related to addresses from address-lists. @@ -127,6 +126,11 @@ Drop packets in firewall's raw section: > ⚠️ **Warning**: Just again... The order of firewall rules is important. Make > sure they actually take effect as expected! +See also +-------- + +* [Certificate name from browser](../CERTIFICATES.md) + --- [⬅️ Go back to main README](../README.md) [⬆️ Go back to top](#top) From 31dfdf7e6243527d77af6b4ae93e753cd45c8cbb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 15:17:31 +0100 Subject: [PATCH 271/988] doc/netwatch-dns: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/netwatch-dns.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 25432994..589d4801 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -73,6 +73,7 @@ See also -------- * [Download, import and update firewall address-lists](doc/fw-addr-lists.md) +* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 54dd6c62..cdfbd974 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -59,8 +59,8 @@ resolves to the same address. Be aware that you have to keep the ip address in sync with real world manually! -Importing a certificate automatically is possible, at least if available in -the repository (see `certs` sub directory). +Importing a certificate automatically is possible. You may want to find the +[certificate name from browser](../CERTIFICATES.md). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; @@ -87,6 +87,7 @@ Also this allows to update host address, see option `resolve`. See also -------- +* [Certificate name from browser](../CERTIFICATES.md) * [Notify on host up and down](netwatch-notify.md) --- From 084c246ef0cab329fe981732089277fa8398800b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 5 Nov 2024 17:49:28 +0100 Subject: [PATCH 272/988] fw-addr-lists: simplify looping lines With `:deserialize` the **record** separator is always a new line. The property `delimiter=` is a **field** reparator, so you can parse a lines into an array. We do not want (or need) that, so use new line as field separator. This will result in an array with just one element, and we use that. Also convert the data to line feed explicitly, just to be sure. --- fw-addr-lists.rsc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4675e3a4..a9513d8c 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -65,7 +65,7 @@ :for I from=1 to=5 do={ :if ($Data = false) do={ - :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; + :set Data [ :tolf [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ] ]; :if ($Data = false) do={ :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading for list '" . $FwListName . \ @@ -86,8 +86,8 @@ "B for list '" . $FwListName . "' from: " . $List->"url"); } - :while ([ :len $Data ] != 0) do={ - :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; + :foreach Line in=[ :deserialize $Data delimiter="\n" from=dsv options=dsv.plain ] do={ + :set Line ($Line->0); :local Address; :if ([ :pick $Line 0 1 ] = "{") do={ :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; @@ -109,7 +109,6 @@ :error true; } } on-error={ } - :set Data [ :pick $Data ([ :len $Line ] + 1) [ :len $Data ] ]; } } From 9c945b1a3283bb352707c69630c579cf82484dcb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 6 Nov 2024 10:03:19 +0100 Subject: [PATCH 273/988] mod/ssh-keys-import: $SSHKeysImportFile: simplify looping lines --- mod/ssh-keys-import.rsc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 8cafa954..00f443ab 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -88,12 +88,11 @@ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } - :local Keys ([ /file/get $FileName contents ] . "\n"); + :local Keys [ :tolf [ /file/get $FileName contents ] ]; - :do { + :foreach Line in=[ :deserialize $Keys delimiter="\n" from=dsv options=dsv.plain ] do={ + :set Line ($Line->0); :local Continue false; - :local Line [ :pick $Keys 0 [ :find $Keys "\n" ] ]; - :set Keys [ :pick $Keys ([ :find $Keys "\n" ] + 1) [ :len $Keys ] ]; :local KeyVal [ :toarray [ $CharacterReplace $Line " " "," ] ]; :if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={ :do { @@ -110,5 +109,5 @@ :if ($Continue = false && [ :len ($KeyVal->0) ] > 0) do={ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } - } while=([ :len $Keys ] > 0); + } } From 0837391c38987462c3a1787143d631b92e0a0551 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Nov 2024 08:30:07 +0100 Subject: [PATCH 274/988] mod/ssh-keys-import: $SSHKeysImportFile: let `:deserialize` split the fields --- mod/ssh-keys-import.rsc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 00f443ab..f67c0fc0 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -72,7 +72,6 @@ :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; - :global CharacterReplace; :global EitherOr; :global LogPrint; :global ParseKeyValueStore; @@ -90,20 +89,18 @@ } :local Keys [ :tolf [ /file/get $FileName contents ] ]; - :foreach Line in=[ :deserialize $Keys delimiter="\n" from=dsv options=dsv.plain ] do={ - :set Line ($Line->0); + :foreach KeyVal in=[ :deserialize $Keys delimiter=" " from=dsv options=dsv.plain ] do={ :local Continue false; - :local KeyVal [ :toarray [ $CharacterReplace $Line " " "," ] ]; :if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={ :do { - $SSHKeysImport $Line $User; + $SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User; } on-error={ $LogPrint warning $0 ("Failed importing key for user '" . $User . "'."); } :set Continue true; } :if ($Continue = false && $KeyVal->0 = "#") do={ - :set User [ $EitherOr ([ $ParseKeyValueStore [ :pick $Line 2 [ :len $Line ] ] ]->"user") $User ]; + :set User [ $EitherOr ([ $ParseKeyValueStore ($KeyVal->1) ]->"user") $User ]; :set Continue true; } :if ($Continue = false && [ :len ($KeyVal->0) ] > 0) do={ From 1f526b356121749991fee69cee5a6c728855c8f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Nov 2024 08:50:12 +0100 Subject: [PATCH 275/988] mod/ssh-keys-import: $SSHKeysImport: split with `:deserialize` --- mod/ssh-keys-import.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index f67c0fc0..d6b3b3fb 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -16,7 +16,6 @@ :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; - :global CharacterReplace; :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; @@ -32,7 +31,7 @@ :return false; } - :local KeyVal [ :toarray [ $CharacterReplace $Key " " "," ] ]; + :local KeyVal ([ :deserialize $Key delimiter=" " from=dsv options=dsv.plain ]->0); :if (!($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa")) do={ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); :return false; From 6c8fa8e639318b72c2102dfff884aa039d09a0f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:40:05 +0100 Subject: [PATCH 276/988] check-routeros-update: replace hard-coded version --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 84849ead..c7a57021 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -67,7 +67,7 @@ :local NumLatestFeature ($NumLatest & $BitMask); :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); - :if ($NumLatest < 117505792) do={ + :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ $LogPrint info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); :error false; } From d97f63fa5a9e4649338e2a70e83516fbd6a61abc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:41:54 +0100 Subject: [PATCH 277/988] check-routeros-update: add specific message for empty version string --- check-routeros-update.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c7a57021..7ff9ccb0 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -60,6 +60,11 @@ :error true; } + :if ([ :len ($Update->"latest-version") ] = 0) do={ + $LogPrint info $ScriptName ("Received an empty version string from server."); + :error false; + } + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :local BitMask [ $VersionToNum "255.255zero0" ]; From 04172f0438411dd803705f372c7e85bd879d4d6b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:42:54 +0100 Subject: [PATCH 278/988] check-routeros-update: make invalid version string a warning --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 7ff9ccb0..d4893517 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -73,7 +73,7 @@ :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ - $LogPrint info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); + $LogPrint warning $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); :error false; } From a545d0d39e21b4fdf0b68153f7b4b175e2ea2bdf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:46:02 +0100 Subject: [PATCH 279/988] check-routeros-update: always exit early if up to date... ... and just make the output and log dependent on terminal. --- check-routeros-update.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index d4893517..06248088 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -55,8 +55,10 @@ /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; - :if ([ $ScriptFromTerminal $ScriptName ] = true && ($Update->"installed-version") = ($Update->"latest-version")) do={ - $LogPrint info $ScriptName ("System is already up to date."); + :if (($Update->"installed-version") = ($Update->"latest-version")) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + $LogPrint info $ScriptName ("System is already up to date."); + } :error true; } From f1533b8962bc67d17e9f6b5666ae51ee4d1e1ff4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:53:30 +0100 Subject: [PATCH 280/988] hotspot-to-wpa-cleanup: use the timeout in message... ... not the actual value. --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 45ea72b0..e3051709 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -65,7 +65,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 081f3d0d..70bee421 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -71,7 +71,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 23f773f5..c8147057 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -65,7 +65,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; From ae655646ba21cdf4638e6001a49c9d3cf849bc08 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 18:02:26 +0100 Subject: [PATCH 281/988] hotspot-to-wpa-cleanup: clean up daily only --- hotspot-to-wpa-cleanup.capsman.rsc | 3 ++- hotspot-to-wpa-cleanup.template.rsc | 3 ++- hotspot-to-wpa-cleanup.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e3051709..674a480a 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -62,7 +62,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 70bee421..88c307b8 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -68,7 +68,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index c8147057..b73f1a9f 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -62,7 +62,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); From e5c3aeb5cd314119dd7b062e43d65fdff7371051 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Nov 2024 08:57:05 +0100 Subject: [PATCH 282/988] hotspot-to-wpa-cleanup: prepare real timeout value in variable... ... to make sure it is not re-calculated for every single lease. --- hotspot-to-wpa-cleanup.capsman.rsc | 4 ++-- hotspot-to-wpa-cleanup.template.rsc | 4 ++-- hotspot-to-wpa-cleanup.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 674a480a..d429904d 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -61,9 +61,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 88c307b8..726bc74d 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -67,9 +67,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index b73f1a9f..32ae565e 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -61,9 +61,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); From a224fbc42457550fcb7f6daa81c2cb14b7075799 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Nov 2024 08:59:30 +0100 Subject: [PATCH 283/988] hotspot-to-wpa-cleanup: revert display of timeout value... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as the timeout is a time value, and showing "4w00:00:00" (with lots of zeros) is not any better. 😜 This reverts commit f1533b8962bc67d17e9f6b5666ae51ee4d1e1ff4. --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index d429904d..e9358502 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -66,7 +66,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 726bc74d..fa99b5df 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -72,7 +72,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 32ae565e..d3f859ed 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -66,7 +66,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; From 5b09469cc6c707b473b74687951b2d1e6468928a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Nov 2024 21:03:07 +0100 Subject: [PATCH 284/988] packages-update: drop check for device-mode downgrade... ... as things have been revised and this specific setting was removed. --- packages-update.rsc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index c2f0ba6d..b08a48d2 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -99,12 +99,6 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ - :if (([ /system/device-mode/get ]->"downgrade") = false) do={ - $LogPrint error $ScriptName \ - ("The device mode has locked downgrades! You will need physical access!"); - :error false; - } - :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Latest version is older than installed one. Want to downgrade? [y/N]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ From 1beda3aa7c08cbe0e06aff164fabfa86e8b6353d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:01:22 +0100 Subject: [PATCH 285/988] mode-button: fix the caller parameter to $LogPrint This is inside a function, so use just $0 here. --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 7908a7f1..84eb8ea9 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -52,7 +52,7 @@ :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ - $LogPrint info $ScriptName ("Acting on " . $Count . " mode-button presses: " . $Code); + $LogPrint info $0 ("Acting on " . $Count . " mode-button presses: " . $Code); :for I from=1 to=$Count do={ $LEDInvert; @@ -66,10 +66,10 @@ [ :parse $Code ]; } else={ - $LogPrint warning $ScriptName ("The code for " . $Count . " mode-button presses failed syntax validation!"); + $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); } } else={ - $LogPrint info $ScriptName ("No action defined for " . $Count . " mode-button presses."); + $LogPrint info $0 ("No action defined for " . $Count . " mode-button presses."); } } /system/scheduler/add name="_ModeButtonScheduler" \ From 53b6f7720ec33146581ceb878447d35d462c8697 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:02:43 +0100 Subject: [PATCH 286/988] mode-button: catch runtime errors in executed code --- mode-button.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index 84eb8ea9..ac1fb4fd 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -64,7 +64,11 @@ :delay 200ms; } - [ :parse $Code ]; + :do { + [ :parse $Code ]; + } on-error={ + $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed with runtime error!"); + } } else={ $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); } From 08ad4e519410c91d61e172f4ea97046dffc2db31 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:07:26 +0100 Subject: [PATCH 287/988] mode-button: do not act on disabled LED --- mode-button.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index ac1fb4fd..3bd922b9 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -36,7 +36,8 @@ :global IfThenElse; - :local LED [ /system/leds/find where leds=$ModeButtonLED type~"^(on|off)\$" interface=[] ]; + :local LED [ /system/leds/find where leds=$ModeButtonLED \ + !disabled type~"^(on|off)\$" interface=[] ]; :if ([ :len $LED ] = 0) do={ :return false; } From 4d8dce97691ad090091574a790449a7bd564023c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 22 Nov 2024 14:06:22 +0100 Subject: [PATCH 288/988] fw-addr-lists: spamhaus.org returned to 'GTS Root R4' --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 9ce8dd42..870cb542 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/ISRG-Root-X1 + www.spamhaus.org/GTS-Root-R4 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index c4e04b5e..2ed67f3c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From 794525b706827682c3525eeeb0797567c757b7de Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Nov 2024 09:54:19 +0100 Subject: [PATCH 289/988] fw-addr-lists: require RouterOS 7.16 Actually the requirement bumped with the change in commit: * 084c246ef0cab329fe981732089277fa8398800b fw-addr-lists: simplify looping lines --- doc/fw-addr-lists.md | 2 +- fw-addr-lists.rsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 3d9e771e..f581fd29 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a9513d8c..34b2fcce 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md From e851cd5ad0ccb38667ec88a52fdc123cc5a16aee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Nov 2024 09:57:11 +0100 Subject: [PATCH 290/988] mod/ssh-keys-import: require RouterOS 7.16 Actually the requirement bumped with the change in commits: * 9c945b1a3283bb352707c69630c579cf82484dcb mod/ssh-keys-import: $SSHKeysImportFile: simplify looping lines * 1f526b356121749991fee69cee5a6c728855c8f2 mod/ssh-keys-import: $SSHKeysImport: split with `:deserialize` --- doc/mod/ssh-keys-import.md | 2 +- mod/ssh-keys-import.rsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index dcfd95b1..344f4bc2 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index d6b3b3fb..c7b27885 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md From 6548f83ef4f60efadc3574876680801ee09ef638 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 Aug 2024 21:30:46 +0200 Subject: [PATCH 291/988] dhcp-to-dns: explicitly expect type=A... ... which is provided since 7.16beta7 (but require next stable release 7.16 as that is available meanwhile). I had this on my wishlist for a long time, and opened an issue in March 2023 about it (SUP-111312). Back then I changed the code to support both, see commit 779b3b8872b23b784c331d7a454c86439046f5d3. --- dhcp-to-dns.rsc | 8 ++++---- doc/dhcp-to-dns.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 0ab5e2a3..9bf506fc 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md @@ -40,7 +40,7 @@ } :local PlaceBefore ([ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ]->0); - :foreach DnsRecord in=[ /ip/dns/static/find where comment~("^" . $CommentPrefix . "\\b") (!type or type=A) ] do={ + :foreach DnsRecord in=[ /ip/dns/static/find where comment~("^" . $CommentPrefix . "\\b") type=A ] do={ :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; :local DnsRecordInfo [ $ParseKeyValueStore ($DnsRecordVal->"comment") ]; :local MacInServer ($DnsRecordInfo->"macaddress" . " in " . $DnsRecordInfo->"server"); @@ -83,7 +83,7 @@ :local FullCN ($HostName . "." . $NetDomain); :local MacInServer ($LeaseVal->"active-mac-address" . " in " . $LeaseVal->"server"); - :local DnsRecord [ /ip/dns/static/find where comment=$Comment (!type or type=A) ]; + :local DnsRecord [ /ip/dns/static/find where comment=$Comment type=A ]; :if ([ :len $DnsRecord ] > 0) do={ :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; @@ -116,7 +116,7 @@ } } - :if ([ :len [ /ip/dns/static/find where name=$FullA (!type or type=A) ] ] > 1) do={ + :if ([ :len [ /ip/dns/static/find where name=$FullA type=A ] ] > 1) do={ $LogPrintOnce warning $ScriptName ("The name '" . $FullA . "' appeared in more than one A record!"); } } else={ diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index 572011fb..4211d854 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 09e8b1d21953ad8ba5185b3cb02bbd4b35269963 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 08:53:20 +0200 Subject: [PATCH 292/988] netwatch-dns: explicitly expect type=A... ... which is provided since 7.16beta7 (but require next stable release 7.16 as that is available meanwhile). --- doc/netwatch-dns.md | 2 +- netwatch-dns.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index cdfbd974..6d2c8651 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 09d471df..6fbfc895 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md @@ -80,7 +80,7 @@ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; :local HostName [ /ip/dns/static/find where name address=($HostVal->"host") \ - (!type or type="A" or type="AAAA") !disabled !dynamic ]; + (type="A" or type="AAAA") !disabled !dynamic ]; :if ([ :len $HostName ] > 0) do={ :set HostName [ /ip/dns/static/get ($HostName->0) name ]; } From 0d69f8952c25f3bfecd9e33c1520e74eebe42314 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:06:56 +0100 Subject: [PATCH 293/988] global-functions: introduce $ExitError... ... as a simple macro to print error message on unintentional error. --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 6fec6dd3..26ccc2aa 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -32,6 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; +:global ExitError; :global FetchHuge; :global FetchUserAgentStr; :global FormatLine; @@ -425,6 +426,18 @@ :return $Return; } +# simple macro to print error message on unintentional error +:set ExitError do={ + :local ExitOK [ :tostr $1 ]; + :local ScriptName [ :tostr $2 ]; + + :global LogPrint; + + :if ($ExitOK = "false") do={ + $LogPrint error $ScriptName ("Script exited with error."); + } +} + # fetch huge data to file, read in chunks :set FetchHuge do={ :local ScriptName [ :tostr $1 ]; From ed6739b8bcb93f8e1025401e22db4244c70ac8c6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:02:52 +0100 Subject: [PATCH 294/988] global-functions: $ExitError: give script name in message --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 26ccc2aa..8941994e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -434,7 +434,7 @@ :global LogPrint; :if ($ExitOK = "false") do={ - $LogPrint error $ScriptName ("Script exited with error."); + $LogPrint error $ScriptName ("Script '" . $ScriptName . "' exited with error."); } } From 36b81fab9474aa0ddc6acdb88f51ef211a1c5563 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:19:54 +0100 Subject: [PATCH 295/988] backup-cloud: use $ExitError to indicate unintentional error --- backup-cloud.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f70752e4..4cc7a589 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -34,6 +35,7 @@ :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -44,6 +46,7 @@ :if ([ $MkDir ("tmpfs/backup-cloud") ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -87,4 +90,6 @@ :set PackagesUpdateBackupFailure true; } /file/remove "tmpfs/backup-cloud"; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 52b5490babc9005fbbb8e0cb1e2ae323a2bd2f70 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:22:11 +0100 Subject: [PATCH 296/988] backup-email: use $ExitError to indicate unintentional error --- backup-email.rsc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backup-email.rsc b/backup-email.rsc index e507c6e1..e1d44eac 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -39,17 +40,20 @@ :if ([ :typeof $SendEMail2 ] = "nothing") do={ $LogPrint error $ScriptName ("The module for sending notifications via e-mail is not installed."); + :set ExitOK true; :error false; } :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :set ExitOK true; :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -69,6 +73,7 @@ :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -116,9 +121,12 @@ :if ($I >= 120) do={ $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } :delay 1s; :set I ($I + 1); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 2c4053cff55a7d0a90f364f7aded280422dc1d65 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:26:34 +0100 Subject: [PATCH 297/988] accesslist-duplicates: use $ExitError to indicate unintentional error --- accesslist-duplicates.capsman.rsc | 5 ++++- accesslist-duplicates.local.rsc | 5 ++++- accesslist-duplicates.template.rsc | 5 ++++- accesslist-duplicates.wifi.rsc | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index d6e2928c..ce0ce115 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index e90842db..aa78fe81 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index d2753404..d0c282d7 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -40,4 +41,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index f4dae4b5..b1444e3d 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 95030b9b74db03cf67c4702c82bb1d1224c9690e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:28:30 +0100 Subject: [PATCH 298/988] backup-partition: use $ExitError to indicate unintentional error --- backup-partition.rsc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 51df4545..f1e1c170 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -42,12 +43,14 @@ :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } :if ([ :len [ /partitions/find ] ] < 2) do={ $LogPrint error $ScriptName ("Device does not have a fallback partition."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -56,6 +59,7 @@ :if ([ :len $ActiveRunning ] < 1) do={ $LogPrint error $ScriptName ("Device is not running from active partition."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -65,6 +69,7 @@ :if ([ :len $FallbackTo ] < 1) do={ $LogPrint error $ScriptName ("There is no inactive partition named '" . $FallbackToName . "'."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -74,6 +79,7 @@ :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } } @@ -86,6 +92,7 @@ ($NumInstalled & $BitMask) != ($NumLatest & $BitMask)) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } } @@ -103,6 +110,9 @@ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!"); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 268743ef6be5c400ec9fcb044e4961c5d8d9b531 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:29:02 +0100 Subject: [PATCH 299/988] backup-upload: use $ExitError to indicate unintentional error --- backup-upload.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 8d96eba5..12698e93 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -43,11 +44,13 @@ :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :set ExitOK true; :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -67,6 +70,7 @@ :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -158,4 +162,6 @@ :set PackagesUpdateBackupFailure true; } /file/remove $DirName; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From c909bef613884bf67d239a1e6c0bed4e3d7a112e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 300/988] capsman-download-packages: use $ExitError to indicate unintentional error --- capsman-download-packages.capsman.rsc | 8 +++++++- capsman-download-packages.template.rsc | 8 +++++++- capsman-download-packages.wifi.rsc | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index f2ff0249..18028840 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -35,6 +37,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -82,4 +86,6 @@ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ad9b926a..72edaa91 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,6 +27,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -37,6 +39,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -44,6 +47,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -93,4 +97,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 056136f2..74a5d9dd 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -35,6 +37,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -84,4 +88,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 172d43288e2117f2a687df6168d2d461e780a8c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 301/988] capsman-rolling-upgrade: use $ExitError to indicate unintentional error --- capsman-rolling-upgrade.capsman.rsc | 6 +++++- capsman-rolling-upgrade.template.rsc | 6 +++++- capsman-rolling-upgrade.wifi.rsc | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index f287ea3c..d0f9fb88 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -43,4 +45,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 3d987475..1bd5f2a5 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -16,6 +16,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -51,4 +53,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 369dccc0..c9e6622c 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -44,4 +46,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From dc7642c1fd3c3029e3993d9ff73b7743ec8e0ea8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 302/988] certificate-renew-issued: use $ExitError to indicate unintentional error --- certificate-renew-issued.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index f2c1dfec..ce61f7d3 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -45,4 +47,6 @@ $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 00487f93d48e5e7547281808225d108eeeae586f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 303/988] check-certificates: use $ExitError to indicate unintentional error --- check-certificates.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 7aaac84f..52cfc5ea 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -133,6 +134,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -218,4 +220,6 @@ ", it is invalid after " . ($CertVal->"invalid-after") . "."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 451df78dd8371288413fd45064141b6063e36187 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 304/988] check-health: use $ExitError to indicate unintentional error --- check-health.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 540336dc..495b4500 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -40,6 +41,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -78,6 +80,7 @@ :if ([ :len [ /system/health/find ] ] = 0) do={ $LogPrint debug $ScriptName ("Your device does not provide any health values."); + :set ExitOK true; :error true; } @@ -175,4 +178,6 @@ } :set ($CheckHealthLast->$Name) $Value; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 91c8d306558c056792ff8132caa77fdf0bda059a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 305/988] check-lte-firmware-upgrade: use $ExitError to indicate unintentional error --- check-lte-firmware-upgrade.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 2e52c2a7..898d6f18 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -100,4 +102,6 @@ :foreach Interface in=[ /interface/lte/find ] do={ $CheckInterface $ScriptName $Interface; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 9d17beef03ace2d75c9e2f9f98fa297707c9e0e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 306/988] check-routeros-update: use $ExitError to indicate unintentional error --- check-routeros-update.rsc | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 06248088..510acd98 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -34,20 +35,24 @@ :global WaitFullyConnected; :local DoUpdate do={ + :global LogPrint; + :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ /system/script/run packages-update; } else={ /system/package/update/install without-paging; } - :error "Waiting for system to reboot."; + $LogPrint info $0 ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ + :set ExitOK true; :error "A reboot for update is already scheduled."; } @@ -59,11 +64,13 @@ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ $LogPrint info $ScriptName ("System is already up to date."); } + :set ExitOK true; :error true; } :if ([ :len ($Update->"latest-version") ] = 0) do={ $LogPrint info $ScriptName ("Received an empty version string from server."); + :set ExitOK true; :error false; } @@ -76,6 +83,7 @@ :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ $LogPrint warning $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); + :set ExitOK true; :error false; } @@ -88,6 +96,8 @@ message=("Installing ALL versions automatically, including " . $Update->"latest-version" . \ "... Updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } :if ($SafeUpdatePatch = true && $NumInstalledFeature = $NumLatestFeature) do={ @@ -97,6 +107,8 @@ message=("Version " . $Update->"latest-version" . " is a patch update for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } :if ($SafeUpdateNeighbor = true) do={ @@ -111,6 +123,8 @@ message=("Seen a neighbor (" . $Neighbor . ") running version " . $Update->"latest-version" . \ " from " . $Update->"channel" . ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } } @@ -131,6 +145,8 @@ message=("Version " . $Update->"latest-version" . " is considered safe for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } } @@ -140,6 +156,7 @@ :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ /system/package/update/set channel=stable; $LogPrint info $ScriptName ("Switched to channel 'stable', please re-run!"); + :set ExitOK true; :error true; } } @@ -147,6 +164,8 @@ :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $DoUpdate; + :set ExitOK true; + :error true; } else={ :put "Canceled..."; } @@ -155,6 +174,7 @@ :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Already sent the RouterOS update notification for version " . \ $Update->"latest-version" . "."); + :set ExitOK true; :error true; } @@ -170,6 +190,7 @@ :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Already sent the RouterOS downgrade notification for version " . \ $Update->"latest-version" . "."); + :set ExitOK true; :error true; } @@ -182,4 +203,6 @@ " is available for downgrade."); :set SentRouterosUpdateNotification ($Update->"latest-version"); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From bf322781d17629c3254520766ae540fb3ae846be Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 307/988] collect-wireless-mac: use $ExitError to indicate unintentional error --- collect-wireless-mac.capsman.rsc | 6 +++++- collect-wireless-mac.local.rsc | 6 +++++- collect-wireless-mac.template.rsc | 6 +++++- collect-wireless-mac.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 9efa9ef5..77fd6e30 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -93,4 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 27c9d1cb..dc7be192 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -94,4 +96,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index d41c17d7..34b1695d 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -30,6 +31,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -111,4 +113,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 00753203..23c93b0e 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -93,4 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From f9a6916827b3954637f52ac726d937e04a471e3e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 308/988] daily-psk.capsman: use $ExitError to indicate unintentional error --- daily-psk.capsman.rsc | 6 +++++- daily-psk.local.rsc | 6 +++++- daily-psk.template.rsc | 6 +++++- daily-psk.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 0562e399..263f6e5e 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -89,4 +91,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 0bef0e9c..f0757e16 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -88,4 +90,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 9d71958e..7e36b5a0 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -32,6 +33,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -104,4 +106,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 83a896ce..293f0e42 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -89,4 +91,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 87cde2cc2fe8604457f9fd4826abac1409d88a0d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 309/988] dhcp-lease-comment: use $ExitError to indicate unintentional error --- dhcp-lease-comment.capsman.rsc | 6 +++++- dhcp-lease-comment.local.rsc | 6 +++++- dhcp-lease-comment.template.rsc | 6 +++++- dhcp-lease-comment.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index c435ec32..5ac0009d 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 27e6605d..1b74d932 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index c562ca29..8f1ad470 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -41,4 +43,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index ba617d71..d3741c5e 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From c8d423c7d59a9051914d5dd676bcd997d7e9854b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 310/988] dhcp-to-dns: use $ExitError to indicate unintentional error --- dhcp-to-dns.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 9bf506fc..ad55c4d0 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -27,6 +28,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -123,4 +125,6 @@ $LogPrint debug $ScriptName ("No address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 590030d391d523bc555c192c5f84f9cdb6504abd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 311/988] firmware-upgrade-reboot: use $ExitError to indicate unintentional error --- firmware-upgrade-reboot.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 74847acb..96559032 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global VersionToNum; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -26,10 +28,12 @@ :if ($RouterBoard->"current-firmware" = $RouterBoard->"upgrade-firmware") do={ $LogPrint info $ScriptName ("Current and upgrade firmware match with version " . \ $RouterBoard->"current-firmware" . "."); + :set ExitOK true; :error true; } :if ([ $VersionToNum ($RouterBoard->"current-firmware") ] > [ $VersionToNum ($RouterBoard->"upgrade-firmware") ]) do={ $LogPrint info $ScriptName ("Different firmware version is available, but it is a downgrade. Ignoring."); + :set ExitOK true; :error true; } @@ -51,4 +55,6 @@ $LogPrint info $ScriptName ("Firmware upgrade successful, rebooting."); /system/reboot; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 923a6385bf8fcb770a70650318d96f0571d7297e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 312/988] fw-addr-lists: use $ExitError to indicate unintentional error --- fw-addr-lists.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 34b2fcce..6682f4ab 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -36,6 +37,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -184,4 +186,6 @@ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 90cfa83d95baf440544a331fd60f9903afa1fead Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 313/988] gps-track: use $ExitError to indicate unintentional error --- gps-track.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gps-track.rsc b/gps-track.rsc index a2ea9fff..c0ecac49 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -45,4 +47,6 @@ } else={ $LogPrint debug $ScriptName ("GPS data not valid."); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From f7b96aa3e93f98b7a8dd076e34b7c302fe436f50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 314/988] hotspot-to-wpa-cleanup: use $ExitError to indicate unintentional error --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++++- hotspot-to-wpa-cleanup.template.rsc | 6 +++++- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e9358502..8a38213f 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -72,4 +74,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index fa99b5df..e8d2dfbb 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -24,6 +25,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -79,4 +81,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index d3f859ed..e2ef1fda 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -72,4 +74,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From ff00c27f990b851b9d14f708aecae6087fedc011 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:55:12 +0100 Subject: [PATCH 315/988] global-functions: $ExitError: give matching message for functions --- global-functions.rsc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8941994e..6c74c2fd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -428,13 +428,15 @@ # simple macro to print error message on unintentional error :set ExitError do={ - :local ExitOK [ :tostr $1 ]; - :local ScriptName [ :tostr $2 ]; + :local ExitOK [ :tostr $1 ]; + :local Name [ :tostr $2 ]; + :global IfThenElse; :global LogPrint; :if ($ExitOK = "false") do={ - $LogPrint error $ScriptName ("Script '" . $ScriptName . "' exited with error."); + $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ + "Function" "Script" ] . " '" . $Name . "' exited with error."); } } From 8e12453058ae848a6d61c104ab6aa22902205d98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 316/988] hotspot-to-wpa: use $ExitError to indicate unintentional error --- hotspot-to-wpa.capsman.rsc | 8 +++++++- hotspot-to-wpa.template.rsc | 8 +++++++- hotspot-to-wpa.wifi.rsc | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index b85c5911..e57d3275 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,11 +26,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -57,6 +60,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -95,4 +99,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 44607cc1..efe37d0c 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,11 +27,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -64,6 +67,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -115,4 +119,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 25933c63..6242d047 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,11 +26,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -57,6 +60,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -92,4 +96,6 @@ :delay 2s; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 8c5bd8f5e2a5943e720e6086c1aec74ddb81eaf1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:02:04 +0100 Subject: [PATCH 317/988] global-functions: $ScriptInstallUpdate: use $ExitError to indicate unintentional error --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 6c74c2fd..743c50e4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1018,7 +1018,7 @@ } # install new scripts, update existing scripts -:set ScriptInstallUpdate do={ +:set ScriptInstallUpdate do={ :do { :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; @@ -1237,7 +1237,9 @@ :set GlobalConfigChanges; :set GlobalConfigMigration; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # lock script against multiple invocation :set ScriptLock do={ From a6fd6bd80cf827a417549c5d433630efcbf1b8b6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 318/988] ipsec-to-dns: use $ExitError to indicate unintentional error --- ipsec-to-dns.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index bd74a8f8..47676cac 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,6 +27,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -76,4 +78,6 @@ /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5b9031ccca75e7e1ba8479af1ae180ae8422ac74 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:06:38 +0100 Subject: [PATCH 319/988] global-functions: $SendNotification: use $ExitError to indicate unintentional error --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 743c50e4..625f8cdd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1374,11 +1374,13 @@ } # send notification via NotificationFunctions - expects at least two string arguments -:set SendNotification do={ +:set SendNotification do={ :do { :global SendNotification2; $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via NotificationFunctions - expects one array argument :set SendNotification2 do={ From 82de8bd935c5a2ccdaf3bfb9db732bdec0ce7d96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 320/988] ipv6-update: use $ExitError to indicate unintentional error --- ipv6-update.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ccc0eb95..ea1d4445 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,16 +23,19 @@ :local PdPrefix $"pd-prefix"; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $NaAddress ] = "str") do={ $LogPrint info $ScriptName ("An address (" . $NaAddress . ") was acquired, not a prefix. Ignoring."); + :set ExitOK true; :error false; } :if ([ :typeof $PdPrefix ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); + :set ExitOK true; :error false; } @@ -90,4 +94,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1fe90a6e9aeaba7350f13f52cc9a196a0bc8ca1c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:03:41 +0100 Subject: [PATCH 321/988] mode-button: $ModeButtonScheduler: use $ExitError to indicate unintentional error --- mode-button.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 2d428ed2..90fe80e6 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -25,7 +25,7 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); - :global ModeButtonScheduler do={ + :global ModeButtonScheduler do={ :do { :local FuncName $0; :global ModeButton; @@ -81,7 +81,9 @@ } else={ $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } - } + } on-error={ + :global ExitError; $ExitError false $0; + } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; } else={ From 177a1e798a09115ecc9241f5f39065a2583bcfac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 322/988] lease-script: use $ExitError to indicate unintentional error --- lease-script.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lease-script.rsc b/lease-script.rsc index f484414f..995c7e4b 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ [ :typeof $leaseServerName ] = "nothing" || \ [ :typeof $leaseBound ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ip dhcp-server."); + :set ExitOK true; :error false; } @@ -32,11 +34,13 @@ "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC); :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } :if ([ :len [ /system/script/job/find where script=$ScriptName ] ] > 1) do={ $LogPrint debug $ScriptName ("More invocations are waiting, exiting early."); + :set ExitOK true; :error true; } @@ -56,4 +60,6 @@ $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5db686a15ccd21ed3a190cd4c9eea0bcc6e56abd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:09:05 +0100 Subject: [PATCH 323/988] mod/bridge-port-to: $BridgePortTo: use $ExitError to indicate unintentional error --- mod/bridge-port-to.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 7dae6797..9e7b9114 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -10,7 +10,7 @@ :global BridgePortTo; -:set BridgePortTo do={ +:set BridgePortTo do={ :do { :local BridgePortTo [ :tostr $1 ]; :global IfThenElse; @@ -65,4 +65,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From da7a031081bcbb4c563bb8b56f7ee150c32b54c0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 324/988] log-forward: use $ExitError to indicate unintentional error --- log-forward.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/log-forward.rsc b/log-forward.rsc index e0d8f359..8e660fc4 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -33,6 +34,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -43,6 +45,7 @@ :if ($LogForwardRateLimit > 30) do={ :set LogForwardRateLimit ($LogForwardRateLimit - 1); $LogPrint info $ScriptName ("Rate limit in action, not forwarding logs, if any!"); + :set ExitOK true; :error false; } @@ -100,4 +103,6 @@ :local LogAll [ /log/find ]; :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 495232b299bafadc4d21551f094c3c42fa090f57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:09:48 +0100 Subject: [PATCH 325/988] mod/bridge-port-vlan: $BridgePortVlan: use $ExitError to indicate unintentional error --- mod/bridge-port-vlan.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index c9f55ae2..18fa2db0 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -10,7 +10,7 @@ :global BridgePortVlan; -:global BridgePortVlan do={ +:global BridgePortVlan do={ :do { :local ConfigTo [ :tostr $1 ]; :global IfThenElse; @@ -74,4 +74,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From b7ce6aee71733a1e84b911a21c8868b8d2279c10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 326/988] mode-button: use $ExitError to indicate unintentional error --- mode-button.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index 3bd922b9..24de4532 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -83,4 +84,6 @@ $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 05cb87f475ffc3f9fdc1fa6988925e79a3dacd38 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:08 +0100 Subject: [PATCH 327/988] mod/inspectvar: $InspectVar: use $ExitError to indicate unintentional error --- mod/inspectvar.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 73205b25..0209214e 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -12,11 +12,13 @@ :global InspectVarReturn; # inspect variable and print on terminal -:set InspectVar do={ +:set InspectVar do={ :do { :global InspectVarReturn; :put [ :tocrlf [ $InspectVarReturn $1 ] ]; -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # inspect variable and return formatted string :set InspectVarReturn do={ From d89a3694850a76e487b139eebf24572344a5502e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:08:36 +0100 Subject: [PATCH 328/988] netwatch-dns: use $ExitError to indicate unintentional error --- netwatch-dns.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 6fbfc895..a704c847 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -24,12 +25,14 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :local SettleTime (5m30s - [ /system/resource/get uptime ]); :if ($SettleTime > 0s) do={ $LogPrint info $ScriptName ("System just booted, giving netwatch " . $SettleTime . " to settle."); + :set ExitOK true; :error true; } @@ -92,6 +95,7 @@ :if ($DohCurrent = $HostInfo->"doh-url") do={ $LogPrint debug $ScriptName ("Current DoH server is still up: " . $DohCurrent); + :set ExitOK true; :error true; } @@ -132,6 +136,7 @@ } /ip/dns/cache/flush; $LogPrint info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")); + :set ExitOK true; :error true; } else={ $LogPrint warning $ScriptName ("Received unexpected response from DoH server: " . \ @@ -139,4 +144,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 34172e4c78cc5a6d0fe99df279e42a8794f84c94 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:27 +0100 Subject: [PATCH 329/988] mod/ipcalc: $IPCalc: use $ExitError to indicate unintentional error --- mod/ipcalc.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 003bdc36..021cd306 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -12,7 +12,7 @@ :global IPCalcReturn; # print netmask, network, min host, max host and broadcast -:set IPCalc do={ +:set IPCalc do={ :do { :local Input [ :tostr $1 ]; :global FormatLine; @@ -27,7 +27,9 @@ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # calculate and return netmask, network, min host, max host and broadcast :set IPCalcReturn do={ From bdc15eaefb51b40b3d414f0e94bfa22233b0f2a4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 330/988] netwatch-notify: use $ExitError to indicate unintentional error --- netwatch-notify.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index a49d0cde..f1e87bd4 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -75,6 +76,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -218,4 +220,6 @@ "since"=($Metric->"since") }; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5450618723dabf9d42857047ea906c9fc87886dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:51:50 +0100 Subject: [PATCH 331/988] mod/notification-email: $FlushEmailQueue: use $ExitError to indicate unintentional error --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 3d62ddfb..ff4188c7 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -34,7 +34,7 @@ } # flush e-mail queue -:set FlushEmailQueue do={ +:set FlushEmailQueue do={ :do { :global EmailQueue; :global EitherOr; @@ -113,7 +113,9 @@ } else={ /system/scheduler/set interval=1m comment="Waiting for retry..." $Scheduler; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # generate filter for log-forward :set LogForwardFilterLogForwarding do={ From eeb76c227cbc04c410e7062daef4cda9cb3d5bf3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 332/988] ospf-to-leds: use $ExitError to indicate unintentional error --- ospf-to-leds.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index b78faa4a..d96e7636 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -42,4 +44,6 @@ /system/leds/set type=off [ find where leds=$LED ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1927dc505a88ef5ecb86d1d925cf44a5225b4b7c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:09:44 +0100 Subject: [PATCH 333/988] mod/notification-email: $SendEMail: use $ExitError to indicate unintentional error --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ff4188c7..e51779bf 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -226,11 +226,13 @@ } # send notification via e-mail - expects at least two string arguments -:set SendEMail do={ +:set SendEMail do={ :do { :global SendEMail2; $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via e-mail - expects one array argument :set SendEMail2 do={ From 81f59f9894cfd9b29a2366e8a13e124b358dadde Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 334/988] packages-update: use $ExitError to indicate unintentional error --- packages-update.rsc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index b08a48d2..924a5d96 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -45,6 +46,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -52,11 +54,13 @@ :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ $LogPrint warning $ScriptName ("Latest version is not known."); + :set ExitOK true; :error false; } :if ($Update->"installed-version" = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is already installed."); + :set ExitOK true; :error true; } @@ -85,10 +89,12 @@ $LogPrint info $ScriptName ("User requested to continue anyway."); } else={ $LogPrint info $ScriptName ("Canceled update..."); + :set ExitOK true; :error false; } } else={ $LogPrint warning $ScriptName ("Canceled non-interactive update."); + :set ExitOK true; :error false; } } @@ -108,6 +114,7 @@ } } else={ $LogPrint warning $ScriptName ("Not installing downgrade automatically."); + :set ExitOK true; :error false; } } @@ -116,6 +123,7 @@ :local PkgName [ /system/package/get $Package name ]; :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); + :set ExitOK true; :error false; } } @@ -130,11 +138,13 @@ :put "Do you want to (s)chedule reboot or (r)eboot now? [s/R]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 19) do={ $Schedule $ScriptName; + :set ExitOK true; :error true; } } else={ :if ($PackagesUpdateDeferReboot = true) do={ $Schedule $ScriptName; + :set ExitOK true; :error true; } } @@ -142,4 +152,6 @@ $LogPrint info $ScriptName ("Rebooting for update."); :delay 1s; /system/reboot; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1994b23e462c02ee71d5cb9db21d0e6075010c3c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:56:35 +0100 Subject: [PATCH 335/988] mod/notification-matrix: $FlushMatrixQueue: use $ExitError to indicate unintentional error --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 3adc1dfa..751967ca 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -18,7 +18,7 @@ :global SetupMatrixJoinRoom; # flush Matrix queue -:set FlushMatrixQueue do={ +:set FlushMatrixQueue do={ :do { :global MatrixQueue; :global IsFullyConnected; @@ -57,7 +57,9 @@ /system/scheduler/remove [ find where name="_FlushMatrixQueue" ]; :set MatrixQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via Matrix - expects one array argument :set ($NotificationFunctions->"matrix") do={ From be0548007184bae80dd40b4a6390ababeeb39617 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 336/988] ppp-on-up: use $ExitError to indicate unintentional error --- ppp-on-up.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 337b32da..13b42c71 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -20,6 +21,7 @@ :if ([ :typeof $Interface ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ppp on-up script hook."); + :set ExitOK true; :error false; } @@ -37,4 +39,6 @@ $LogPrint warning $ScriptName ("Running script '" . $ScriptName . "' failed!"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From de9dee83bea855a893594e0d58ca609872f75072 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:03 +0100 Subject: [PATCH 337/988] mod/notification-matrix: $SendMatrix: use $ExitError to indicate unintentional error --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 751967ca..14f369d2 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -166,11 +166,13 @@ } # send notification via Matrix - expects at least two string arguments -:set SendMatrix do={ +:set SendMatrix do={ :do { :global SendMatrix2; $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via Matrix - expects one array argument :set SendMatrix2 do={ From ede351f47e8311fe00bada723e69ab90dc1332d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 338/988] sms-action: use $ExitError to indicate unintentional error --- sms-action.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sms-action.rsc b/sms-action.rsc index c8966595..fd3096c1 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :if ([ :typeof $Action ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from SMS hook with action=..."); + :set ExitOK true; :error false; } @@ -34,4 +36,6 @@ } else={ $LogPrint warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!"); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From aac723e2a1eede3649c5f3b4bbe67af0e951063a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:57:01 +0100 Subject: [PATCH 339/988] mod/notification-ntfy: $FlushNtfyQueue: use $ExitError to indicate unintentional error --- mod/notification-ntfy.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index b2bb2800..5fdeedf5 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -15,7 +15,7 @@ :global SendNtfy2; # flush ntfy queue -:set FlushNtfyQueue do={ +:set FlushNtfyQueue do={ :do { :global NtfyQueue; :global NtfyMessageIDs; @@ -52,7 +52,9 @@ /system/scheduler/remove [ find where name="_FlushNtfyQueue" ]; :set NtfyQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via ntfy - expects one array argument :set ($NotificationFunctions->"ntfy") do={ From a78fe98fd0746dd88429413d9c81123866d880bd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 340/988] sms-forward: use $ExitError to indicate unintentional error --- sms-forward.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 0d493b65..8334d5fa 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -28,11 +29,13 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ /tool/sms/get receive-enabled ] = false) do={ $LogPrintOnce warning $ScriptName ("Receiving of SMS is not enabled."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ /interface/lte/get ($Settings->"port") running ] != true) do={ $LogPrint info $ScriptName ("The LTE interface is not in running state, skipping."); + :set ExitOK true; :error true; } @@ -92,4 +96,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From e76ae11b029169e971f7313b17d5c43589fa8170 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:24 +0100 Subject: [PATCH 341/988] mod/notification-ntfy: $SendNtfy: use $ExitError to indicate unintentional error --- mod/notification-ntfy.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 5fdeedf5..7e0234bf 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -134,11 +134,13 @@ } # send notification via ntfy - expects at least two string arguments -:set SendNtfy do={ +:set SendNtfy do={ :do { :global SendNtfy2; $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via ntfy - expects one array argument :set SendNtfy2 do={ From adbefca0e48bda15d90cc53c52c3982230f8864c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 342/988] telegram-chat: use $ExitError to indicate unintentional error --- telegram-chat.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f2750f5f..8589aab7 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -43,6 +44,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -57,6 +59,7 @@ :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); + :set ExitOK true; :error false; } @@ -82,6 +85,7 @@ :if ($Data = false) do={ $LogPrint warning $ScriptName ("Failed getting updates."); + :set ExitOK true; :error false; } @@ -130,6 +134,7 @@ :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Command); @@ -176,4 +181,6 @@ } :set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \ [ $IfThenElse ($UpdateID >= $TelegramChatOffset->2) ($UpdateID + 1) ($TelegramChatOffset->2) ]); -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From e89867be1533cd561bf61b65f3019946e2ceeee1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:57:20 +0100 Subject: [PATCH 343/988] mod/notification-telegram: $FlushTelegramQueue: use $ExitError to indicate unintentional error --- mod/notification-telegram.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 671bd1c4..993782d1 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -15,7 +15,7 @@ :global SendTelegram2; # flush telegram queue -:set FlushTelegramQueue do={ +:set FlushTelegramQueue do={ :do { :global TelegramQueue; :global TelegramMessageIDs; @@ -56,7 +56,9 @@ /system/scheduler/remove [ find where name="_FlushTelegramQueue" ]; :set TelegramQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via telegram - expects one array argument :set ($NotificationFunctions->"telegram") do={ From d4ea0e18a710c5a68c7dabaa5c1c5a40568c965b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 344/988] update-gre-address: use $ExitError to indicate unintentional error --- update-gre-address.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 6dd829d8..87762d6a 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -20,6 +21,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -39,4 +41,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 4968b79fc1142c9bfdbfe93c8f917cfdd7f51790 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:43 +0100 Subject: [PATCH 345/988] mod/notification-telegram: $SendTelegram: use $ExitError to indicate unintentional error --- mod/notification-telegram.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 993782d1..7d75b8ba 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -182,11 +182,13 @@ } # send notification via telegram - expects at least two string arguments -:set SendTelegram do={ +:set SendTelegram do={ :do { :global SendTelegram2; $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via telegram - expects one array argument :set SendTelegram2 do={ From ee030740cba5bd0c8b0c9c3e77551dd460abe48b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 346/988] update-tunnelbroker: use $ExitError to indicate unintentional error --- update-tunnelbroker.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 67a5d30f..dd43c643 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,11 +23,13 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); + :set ExitOK true; :error false; } @@ -50,6 +53,7 @@ :if (!($Data ~ "^(good|nochg) ")) do={ $LogPrint error $ScriptName ("Failed sending the local address to tunnelbroker or unexpected response!"); + :set ExitOK true; :error false; } @@ -64,4 +68,6 @@ /interface/6to4/set $Interface local-address=$PublicAddress; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 48bcf8ee6e92445b01f792f1c52af012ba05b7b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:45:30 +0100 Subject: [PATCH 347/988] =?UTF-8?q?global-functions:=20$FetchHuge:=20passi?= =?UTF-8?q?ng=20boolean=20to=20function=20is=20still=20broken...=20?= =?UTF-8?q?=F0=9F=A4=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- global-functions.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 47a69c47..6fec6dd3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -427,9 +427,9 @@ # fetch huge data to file, read in chunks :set FetchHuge do={ - :local ScriptName [ :tostr $1 ]; - :local Url [ :tostr $2 ]; - :local CheckCert [ :tobool $3 ]; + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + :local CheckCert [ :tostr $3 ]; :global CleanName; :global FetchUserAgentStr; @@ -439,7 +439,7 @@ :global MkDir; :global WaitForFile; - :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; + :set CheckCert [ $IfThenElse ($CheckCert = "false") "no" "yes-without-crl" ]; :local DirName ("tmpfs/" . [ $CleanName $ScriptName ]); :if ([ $MkDir $DirName ] = false) do={ From 73e0ac75f10019794a2692371ca08a46bea69eb9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:44 +0100 Subject: [PATCH 348/988] mod/scriptrunonce: $ScriptRunOnce: use $ExitError to indicate unintentional error --- mod/scriptrunonce.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 3d5dce9d..c8dcf26f 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -11,7 +11,7 @@ :global ScriptRunOnce; # fetch and run script(s) once -:set ScriptRunOnce do={ +:set ScriptRunOnce do={ :do { :local Scripts [ :toarray $1 ]; :global ScriptRunOnceBaseUrl; @@ -49,4 +49,6 @@ } } } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From 1788c0599865ee9cb7e5015e260d7e4a49abf581 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:11:39 +0100 Subject: [PATCH 349/988] mod/ssh-keys-import: $SSHKeysImport: use $ExitError to indicate unintentional error --- mod/ssh-keys-import.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index c7b27885..b2f1d20f 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -12,7 +12,7 @@ :global SSHKeysImportFile; # import single key passed as string -:set SSHKeysImport do={ +:set SSHKeysImport do={ :do { :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -64,7 +64,9 @@ /file/remove "tmpfs/ssh-keys-import"; :return false; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # import keys from a file :set SSHKeysImportFile do={ From f8a55860afaf8817e52cb89add227fa9a84435f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:19:01 +0100 Subject: [PATCH 350/988] check-routeros-update: pass script name to local function --- check-routeros-update.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 510acd98..a2e39b62 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -35,6 +35,8 @@ :global WaitFullyConnected; :local DoUpdate do={ + :local ScriptName [ :tostr $1 ]; + :global LogPrint; :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ @@ -42,7 +44,7 @@ } else={ /system/package/update/install without-paging; } - $LogPrint info $0 ("Waiting for system to reboot."); + $LogPrint info $ScriptName ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -95,7 +97,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Installing ALL versions automatically, including " . $Update->"latest-version" . \ "... Updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -106,7 +108,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is a patch update for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -122,7 +124,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Seen a neighbor (" . $Neighbor . ") running version " . $Update->"latest-version" . \ " from " . $Update->"channel" . ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -144,7 +146,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is considered safe for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -163,7 +165,7 @@ :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } else={ From 210ef26b93364f4b69cde9ff34139d51572357ee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:11:56 +0100 Subject: [PATCH 351/988] mod/ssh-keys-import: $SSHKeysImportFile: use $ExitError to indicate unintentional error --- mod/ssh-keys-import.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index b2f1d20f..583e8270 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -69,7 +69,7 @@ } } # import keys from a file -:set SSHKeysImportFile do={ +:set SSHKeysImportFile do={ :do { :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -108,4 +108,6 @@ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From e51191035b21c529efb4387dfe59976c3112f561 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:22:18 +0100 Subject: [PATCH 352/988] mode-button: $ModeButtonScheduler: explicitly name the variable --- mode-button.rsc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 24de4532..2d428ed2 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -26,6 +26,8 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); :global ModeButtonScheduler do={ + :local FuncName $0; + :global ModeButton; :global LogPrint; @@ -54,7 +56,7 @@ :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ - $LogPrint info $0 ("Acting on " . $Count . " mode-button presses: " . $Code); + $LogPrint info $FuncName ("Acting on " . $Count . " mode-button presses: " . $Code); :for I from=1 to=$Count do={ $LEDInvert; @@ -69,13 +71,15 @@ :do { [ :parse $Code ]; } on-error={ - $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed with runtime error!"); + $LogPrint warning $FuncName \ + ("The code for " . $Count . " mode-button presses failed with runtime error!"); } } else={ - $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); + $LogPrint warning $FuncName \ + ("The code for " . $Count . " mode-button presses failed syntax validation!"); } } else={ - $LogPrint info $0 ("No action defined for " . $Count . " mode-button presses."); + $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } } /system/scheduler/add name="_ModeButtonScheduler" \ From bceabebf9c6c30e2b1057448d74a5de006ef5d1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 17:05:12 +0100 Subject: [PATCH 353/988] mod/notification-email: drop useless safeguard Guess it was useful back in the day. Now the function exits early if the queue is empty... So this can never be zero. --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index e51779bf..dd909237 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -71,7 +71,7 @@ $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); } - /system/scheduler/set interval=([ $EitherOr $QueueLen 1 ] . "m") comment="Sending..." $Scheduler; + /system/scheduler/set interval=($QueueLen . "m") comment="Sending..." $Scheduler; :foreach Id,Message in=$EmailQueue do={ :if ([ :typeof $Message ] = "array" ) do={ From 42bcc63d29c85a7fcdb175b3ea725654d2db7039 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 17:12:24 +0100 Subject: [PATCH 354/988] mod/notification-email: increase retry interval on failure --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index dd909237..b109bf4e 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -46,8 +46,9 @@ :local AllDone true; :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + :local SchedVal [ /system/scheduler/get $Scheduler ]; - :if ([ :len $Scheduler ] > 0 && [ /system/scheduler/get $Scheduler interval ] < 1m) do={ + :if ([ :len $Scheduler ] > 0 && ($SchedVal->"interval") < 1m) do={ /system/scheduler/set interval=1m comment="Doing initial checks..." $Scheduler; } @@ -111,7 +112,8 @@ /system/scheduler/remove $Scheduler; :set EmailQueue; } else={ - /system/scheduler/set interval=1m comment="Waiting for retry..." $Scheduler; + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ + comment="Waiting for retry..." $Scheduler; } } on-error={ :global ExitError; $ExitError false $0; From c311e58d998fabc7568acd77f0a8bd42468f50b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 20:23:26 +0100 Subject: [PATCH 355/988] leds-toggle-mode: toggle in one call... ... and drop the condition. --- leds-toggle-mode.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 136c9d1c..07e12ae1 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -6,8 +6,4 @@ # toggle LEDs mode # https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md -:if ([ /system/leds/settings/get all-leds-off ] = "never") do={ - /system/leds/settings/set all-leds-off=immediate; -} else={ - /system/leds/settings/set all-leds-off=never; -} +/system/leds/settings/set all-leds-off=(({ "never"="immediate"; "immediate"="never" })->[ get all-leds-off ]); From d70efe910ae3a9bef3ee6b62c0fd6d591bab89e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 20:32:50 +0100 Subject: [PATCH 356/988] mode-button: support led toggle without extra script --- global-config.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 2ed67f3c..52928537 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -186,7 +186,7 @@ # Run different commands with multiple mode-button presses. :global ModeButton { - 1="/system/script/run leds-toggle-mode;"; + 1="/system/leds/settings/set all-leds-off=(({ \"never\"=\"immediate\"; \"immediate\"=\"never\" })->[ get all-leds-off ]);"; 2=":global Identity; :global SendNotification; :global SymbolForNotification; \$SendNotification ([ \$SymbolForNotification \"earth\" ] . \"Hello...\") (\"Hello world, \" . \$Identity . \" calling!\");"; 3="/system/shutdown;"; 4="/system/reboot;"; From 8231c3e833ee83a118f4d8395c097e6a9f312c2f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:40:06 +0100 Subject: [PATCH 357/988] global-functions: $WaitForFile: delay until "complete"... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Well, turns out that waiting for existence of a file is not sufficient. Chances are that a file is available just partly, so wait until the size no longer changes... Let's hope that works as expected. 🤞 --- global-functions.rsc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 625f8cdd..e5e5d502 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1577,6 +1577,16 @@ :delay $Delay; :set I ($I + 1); } + + :local File [ /file/find where name=$FileName ]; + :local SizeA 0; + :local SizeB 1; + :while ($SizeA < $SizeB) do={ + :set SizeA $SizeB; + :delay $Delay; + :set SizeB [ /file/get $File size ]; + } + :return true; } From 009a6bd76204083f4b1971b285d90e916c0fbc29 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:55:23 +0100 Subject: [PATCH 358/988] mod/notification-email: $FlushEmailQueue: return on success --- mod/notification-email.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index b109bf4e..1d9a0a18 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -111,10 +111,11 @@ :if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={ /system/scheduler/remove $Scheduler; :set EmailQueue; - } else={ - /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ - comment="Waiting for retry..." $Scheduler; + :return true; } + + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ + comment="Waiting for retry..." $Scheduler; } on-error={ :global ExitError; $ExitError false $0; } } From 53106731528adc607ee40336b79c516fac594a17 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:59:37 +0100 Subject: [PATCH 359/988] mod/notification-email: $FlushEmailQueue: return on purge --- mod/notification-email.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 1d9a0a18..60c1e9ba 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -114,6 +114,12 @@ :return true; } + :if ([ :len [ /system/scheduler/find where name="_FlushEmailQueue" ] ] = 0 && \ + [ :typeof $EmailQueue ] = "nothing") do={ + $LogPrint info $0 ("Queue was purged? Exiting."); + :return false; + } + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ comment="Waiting for retry..." $Scheduler; } on-error={ From 1e2ca3d21441ac7881b7c556c8d73c70bb92edc6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:28:12 +0100 Subject: [PATCH 360/988] mod/notification-email: $FlushEmailQueue: create scheduler if missing... ... as it is required to be modified several times below. --- mod/notification-email.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 60c1e9ba..c4747505 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -46,9 +46,15 @@ :local AllDone true; :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; - :local SchedVal [ /system/scheduler/get $Scheduler ]; - :if ([ :len $Scheduler ] > 0 && ($SchedVal->"interval") < 1m) do={ + :if ([ :len $Scheduler ] < 0) do={ + /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ + comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); + :set Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + } + + :local SchedVal [ /system/scheduler/get $Scheduler ]; + :if (($SchedVal->"interval") < 1m) do={ /system/scheduler/set interval=1m comment="Doing initial checks..." $Scheduler; } From 8c8c75ca66d59d9368fe3f4fe7f1124a425f41b3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:51:17 +0100 Subject: [PATCH 361/988] mod/notification-email: $FlushEmailQueue: move the check up... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as this needs to be done before creating a scheduler. 😜 Also remove the scheduler and return. --- mod/notification-email.rsc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c4747505..bbce6d06 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -47,6 +47,12 @@ :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + :if ([ :len $Scheduler ] > 0 && $QueueLen = 0) do={ + $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); + /system/scheduler/remove $Scheduler; + :return false; + } + :if ([ :len $Scheduler ] < 0) do={ /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); @@ -74,10 +80,6 @@ :return false; } - :if ([ :len $Scheduler ] > 0 && $QueueLen = 0) do={ - $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); - } - /system/scheduler/set interval=($QueueLen . "m") comment="Sending..." $Scheduler; :foreach Id,Message in=$EmailQueue do={ From b66332eb464884d69eef56aa5ecb7ae74d1914cc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:58:41 +0100 Subject: [PATCH 362/988] mod/notification-email: $FlushEmailQueue: just return on empty queue --- mod/notification-email.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index bbce6d06..a3291d9a 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -53,6 +53,10 @@ :return false; } + :if ($QueueLen = 0) do={ + :return true; + } + :if ([ :len $Scheduler ] < 0) do={ /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); From a7878d664f51ed77a574a5d360c9c53863d0d488 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 12:11:15 +0100 Subject: [PATCH 363/988] fw-addr-lists: do not fail on invalid json data --- fw-addr-lists.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 6682f4ab..a195c893 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -92,7 +92,9 @@ :set Line ($Line->0); :local Address; :if ([ :pick $Line 0 1 ] = "{") do={ - :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + :do { + :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + } on-error={ } } else={ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } From d1b9b1b410933e0510845c245f742a7df172dc61 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Dec 2024 17:40:49 +0100 Subject: [PATCH 364/988] mod/notification-ntfy: support authentication with bearer token Closes: https://github.com/eworm-de/routeros-scripts/issues/86 --- doc/mod/notification-ntfy.md | 2 ++ global-config.rsc | 1 + mod/notification-ntfy.rsc | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 5393d444..04dee355 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -52,6 +52,8 @@ basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. Even authentication via access token is possible, adding it as password with a blank username. +Also available is `NtfyServerToken` to add a bearer token for authentication. + For a custom service installing an additional certificate may be required. You may want to install that certificate manually, after finding the [certificate name from browser](../../CERTIFICATES.md). diff --git a/global-config.rsc b/global-config.rsc index 52928537..0c8f738c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -58,6 +58,7 @@ :global NtfyServer "ntfy.sh"; :global NtfyServerUser []; :global NtfyServerPass []; +:global NtfyServerToken []; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 7e0234bf..7e4eaf0c 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -67,6 +67,8 @@ :global NtfyServerOverride; :global NtfyServerPass; :global NtfyServerPassOverride; + :global NtfyServerToken; + :global NtfyServerTokenOverride; :global NtfyServerUser; :global NtfyServerUserOverride; :global NtfyTopic; @@ -83,6 +85,7 @@ :local Server [ $EitherOr ($NtfyServerOverride->($Notification->"origin")) $NtfyServer ]; :local User [ $EitherOr ($NtfyServerUserOverride->($Notification->"origin")) $NtfyServerUser ]; :local Pass [ $EitherOr ($NtfyServerPassOverride->($Notification->"origin")) $NtfyServerPass ]; + :local Token [ $EitherOr ($NtfyServerTokenOverride->($Notification->"origin")) $NtfyServerToken ]; :local Topic [ $EitherOr ($NtfyTopicOverride->($Notification->"origin")) $NtfyTopic ]; :if ([ :len $Topic ] = 0) do={ @@ -93,6 +96,9 @@ :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); + :if ([ :len $Token ] > 0) do={ + :set Headers ($Headers, ("Authorization: Bearer " . $Token)); + } :local Text (($Notification->"message") . "\n"); :if ([ :len ($Notification->"link") ] > 0) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")); From 6bee4675509e874d2f2ed8ee960f251b5667a451 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Dec 2024 17:48:49 +0100 Subject: [PATCH 365/988] mod/notification-ntfy: add basic authentication in headers This makes it a bit easier and straight forward as we pass the headers anyway. --- mod/notification-ntfy.rsc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 7e4eaf0c..f8351fd4 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -39,7 +39,7 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=($Message->"headers") http-data=($Message->"text") \ - ($Message->"url") user=($Message->"user") password=($Message->"pass") as-value; + ($Message->"url") as-value; :set ($NtfyQueue->$Id); } on-error={ $LogPrint debug $0 ("Sending queued Ntfy message failed."); @@ -96,6 +96,9 @@ :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); + :if ([ :len $User ] > 0 || [ :len $Pass ] > 0) do={ + :set Headers ($Headers, ("Authorization: Basic " . [ :convert to=base64 ($User . ":" . $Pass) ])); + } :if ([ :len $Token ] > 0) do={ :set Headers ($Headers, ("Authorization: Bearer " . $Token)); } @@ -112,7 +115,7 @@ } } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - http-header-field=$Headers http-data=$Text $Url user=$User password=$Pass as-value; + http-header-field=$Headers http-data=$Text $Url as-value; } on-error={ $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); @@ -123,7 +126,7 @@ "This message was queued since " . [ /system/clock/get date ] . " " . \ [ /system/clock/get time ] . " and may be obsolete."); :set ($NtfyQueue->[ :len $NtfyQueue ]) \ - { url=$Url; user=$User; pass=$Pass; headers=$Headers; text=$Text }; + { url=$Url; headers=$Headers; text=$Text }; :if ([ :len [ /system/scheduler/find where name="_FlushNtfyQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushNtfyQueue" interval=1m start-time=startup \ on-event=(":global FlushNtfyQueue; \$FlushNtfyQueue;"); From ba39c29648282159082dfa999ec40c7fc84b0e3c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 21:47:23 +0100 Subject: [PATCH 366/988] global-functions: $ParseKeyValueStore: split key and value... ... into separate variables. --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index e5e5d502..b212d3a0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -925,8 +925,9 @@ :local Result ({}); :foreach KeyValue in=[ :toarray $Source ] do={ :if ([ :find $KeyValue "=" ]) do={ - :set ($Result->[ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]) \ - [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :local Key [ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]; + :local Value [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :set ($Result->$Key) $Value; } else={ :set ($Result->$KeyValue) true; } From 8212bd6c95935f02335d7d774bd3115a2c071fb1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 21:56:45 +0100 Subject: [PATCH 367/988] global-functions: $ParseKeyValueStore: properly return boolean values --- global-functions.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index b212d3a0..766e8a2d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -927,6 +927,8 @@ :if ([ :find $KeyValue "=" ]) do={ :local Key [ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]; :local Value [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :if ($Value="true") do={ :set Value true; } + :if ($Value="false") do={ :set Value false; } :set ($Result->$Key) $Value; } else={ :set ($Result->$KeyValue) true; From ef3ce7cc6c43b28e6a80345d9861775767ba86f4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 22:22:30 +0100 Subject: [PATCH 368/988] global-functions: $ParseKeyValueStore: support JSON as input This used to require a key=value store, separated with commas. An example for `netwatch-notify` is: /tool/netwatch/add comment="notify, name=example.com" host=93.184.215.14; Now JSON is supported as well, so you could use: /tool/netwatch/add comment="{\"notify\":true,\"name\":\"example.com\"}" host=93.184.215.14; Looks more clumsy here, but may be of help in more complex setups... --- global-functions.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 766e8a2d..85818b44 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -919,6 +919,13 @@ # parse key value store :set ParseKeyValueStore do={ :local Source $1; + + :if ([ :pick $Source 0 1 ] = "{") do={ + :do { + :return [ :deserialize from=json $Source ]; + } on-error={ } + } + :if ([ :typeof $Source ] != "array") do={ :set Source [ :tostr $1 ]; } From 3ada3055fff08e655864f4e8e07f060b73077394 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 19:51:42 +0100 Subject: [PATCH 369/988] fw-addr-lists: spamhaus.org returned to 'ISRG Root X1' This reverts commit 4d8dce97691ad090091574a790449a7bd564023c. --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 870cb542..9ce8dd42 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/GTS-Root-R4 + www.spamhaus.org/ISRG-Root-X1 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 0c8f738c..cd41a9c7 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -107,9 +107,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From 191cc1b952b469c474b0181ebdee0ccfd47ae75b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 20:09:46 +0100 Subject: [PATCH 370/988] global-functions: $FetchHuge: another workaround for complete file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns out the workaround in $WaitForFile (commit 8231c3e833ee83a118f4d8395c097e6a9f312c2f) is not sufficient. It helps sometimes, but not always. Possibly depends on CPU speed and bandwidth of internet connection... Who knows!? 🤪 But! Reading the file goes beyond the known file size. That's suspicious and indicates this exact issue. So add a delay, and keep reading until sizes are equal. --- global-functions.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 85818b44..a59eca17 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -479,9 +479,13 @@ :local FileSize [ /file/get $FileName size ]; :local Return ""; :local VarSize 0; - :while ($VarSize < $FileSize) do={ + :while ($VarSize != $FileSize) do={ :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); + :set FileSize [ /file/get $FileName size ]; :set VarSize [ :len $Return ]; + :if ($VarSize > $FileSize) do={ + :delay 100ms; + } } /file/remove $DirName; :return $Return; From b98b2457140701261b299af0a2d742bf6aa2b9bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 20:22:51 +0100 Subject: [PATCH 371/988] global-functions: $WaitForFile: drop the first workaround This reverts commit 8231c3e833ee83a118f4d8395c097e6a9f312c2f. Truned out this workaround was not sufficient, see the follow-up in commit 191cc1b952b469c474b0181ebdee0ccfd47ae75b for details. But possibly the second one does it on its own? Reverting this for a test run. --- global-functions.rsc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a59eca17..d5df5e74 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1591,16 +1591,6 @@ :delay $Delay; :set I ($I + 1); } - - :local File [ /file/find where name=$FileName ]; - :local SizeA 0; - :local SizeB 1; - :while ($SizeA < $SizeB) do={ - :set SizeA $SizeB; - :delay $Delay; - :set SizeB [ /file/get $File size ]; - } - :return true; } From 9e3729c27990a7ecbdc73694319b924ee00ba867 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 2 Jan 2025 00:04:06 +0100 Subject: [PATCH 372/988] update copyright for 2025 --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-config-overlay.rsc | 2 +- global-config.rsc | 2 +- global-functions.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ip-addr-bridge.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- leds-day-mode.rsc | 2 +- leds-night-mode.rsc | 2 +- leds-toggle-mode.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- news-and-changes.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- super-mario-theme.rsc | 2 +- telegram-chat.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 77 files changed, 77 insertions(+), 77 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index ce0ce115..b611917e 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index aa78fe81..ef0cf32b 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index d0c282d7..ab5b671a 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index b1444e3d..0205598a 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 4cc7a589..37ca92f2 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-cloud -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 diff --git a/backup-email.rsc b/backup-email.rsc index e1d44eac..489927b2 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-email -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 diff --git a/backup-partition.rsc b/backup-partition.rsc index f1e1c170..b2b75ac6 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-partition -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 diff --git a/backup-upload.rsc b/backup-upload.rsc index 12698e93..e050140a 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-upload -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 18028840..46094983 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 72edaa91..642a0689 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 74a5d9dd..1ea9b792 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index d0f9fb88..7a5ed81a 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 1bd5f2a5..fd7e31fa 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index c9e6622c..3fb99b80 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index ce61f7d3..32c3267d 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-certificates.rsc b/check-certificates.rsc index 52cfc5ea..226364be 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-certificates -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-health.rsc b/check-health.rsc index 495b4500..d3586dbc 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 898d6f18..cd9f979d 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index a2e39b62..c3d26253 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 77fd6e30..05e4b898 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index dc7be192..67c1a989 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 34b1695d..84a96674 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 23c93b0e..fa4953ba 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 263f6e5e..f41da297 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index f0757e16..2920cb5b 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 7e36b5a0..05c376e2 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 293f0e42..4182ab8d 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 5ac0009d..947181bf 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 1b74d932..27306dd1 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 8f1ad470..8552b263 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index d3741c5e..bf67bd07 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index ad55c4d0..1eb832ac 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 96559032..f9e557cd 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a195c893..e98a6109 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists -# Copyright (c) 2023-2024 Christian Hesse +# Copyright (c) 2023-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 9ffd90cb..227ae5a0 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,5 +1,5 @@ # Overlay for global configuration by RouterOS Scripts -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # global configuration, custom overlay diff --git a/global-config.rsc b/global-config.rsc index cd41a9c7..1f4e9ca1 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-config -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # global configuration diff --git a/global-functions.rsc b/global-functions.rsc index d5df5e74..a2dd279b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-functions -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/global-wait.rsc b/global-wait.rsc index f0631e27..529dbd7b 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-wait -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/gps-track.rsc b/gps-track.rsc index c0ecac49..1bd976a0 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: gps-track -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 8a38213f..1d27faf6 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index e8d2dfbb..f92dbe5e 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index e2ef1fda..cd215935 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index e57d3275..d962ba75 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index efe37d0c..3438be70 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 6242d047..a2bb3ca9 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 758cd463..00b45a32 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # enable or disable ip addresses based on bridge port state diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 47676cac..39b21d5c 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ea1d4445..a2fb8317 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipv6-update -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/lease-script.rsc b/lease-script.rsc index 995c7e4b..3d0fc72a 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: lease-script -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index b7c6b5b8..e0f08d61 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # enable LEDs diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index fb7c7a2e..1f50dfd5 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # disable LEDs diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 07e12ae1..55d5b82d 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # toggle LEDs mode diff --git a/log-forward.rsc b/log-forward.rsc index 8e660fc4..8c2ebc0d 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: log-forward -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 9e7b9114..ec6f6128 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 18fa2db0..62216467 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 0209214e..01724bb9 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 021cd306..69dec8be 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index a3291d9a..6d700f5e 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 14f369d2..aad8b425 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-matrix -# Copyright (c) 2013-2024 Michael Gisbers +# Copyright (c) 2013-2025 Michael Gisbers # Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index f8351fd4..53ba9b47 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 7d75b8ba..f9700cf0 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index c8dcf26f..7e01e72e 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 583e8270..ad3a81ea 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/mode-button.rsc b/mode-button.rsc index 90fe80e6..f8bd7b83 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mode-button -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index a704c847..81f9d95d 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index f1e87bd4..e79977ea 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.15 diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 9ab811d6..545a0c93 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,5 +1,5 @@ # News, changes and migration by RouterOS Scripts -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md :global IDonate; diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index d96e7636..3400e7ff 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/packages-update.rsc b/packages-update.rsc index 924a5d96..a79946d5 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: packages-update -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 13b42c71..a776ce23 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/sms-action.rsc b/sms-action.rsc index fd3096c1..f22a0bb1 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-action -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/sms-forward.rsc b/sms-forward.rsc index 8334d5fa..efebb758 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-forward -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index 63308b08..fc868c8d 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # play Super Mario theme diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 8589aab7..eebb617e 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: telegram-chat -# Copyright (c) 2023-2024 Christian Hesse +# Copyright (c) 2023-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.15 diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 7ce40280..f1bc5529 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # schedule unattended lte firmware upgrade diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 87762d6a..4ac311a1 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-gre-address -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index dd43c643..589544c4 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-tunnelbroker -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # From db508ddcd1a4bb78af95e5d96a4f626173d29557 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:05 +0100 Subject: [PATCH 373/988] backup-cloud: refuse when running from backup partition --- backup-cloud.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 37ca92f2..f32a04dd 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -38,6 +38,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 303c39390068ebf0ab5cba3bbb967d6079fbdeb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:20 +0100 Subject: [PATCH 374/988] backup-email: refuse when running from backup partition --- backup-email.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-email.rsc b/backup-email.rsc index 489927b2..731fb95a 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -56,6 +56,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 6c990079a6c6f92c748f98a5128e7438e05caefb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:26:44 +0100 Subject: [PATCH 375/988] backup-partition: refuse when running from backup partition --- backup-partition.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index b2b75ac6..22982257 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -47,6 +47,13 @@ :error false; } + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + :if ([ :len [ /partitions/find ] ] < 2) do={ $LogPrint error $ScriptName ("Device does not have a fallback partition."); :set PackagesUpdateBackupFailure true; From d9693f4d5f783935cd2e47479889cc035b294934 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:38 +0100 Subject: [PATCH 376/988] backup-upload: refuse when running from backup partition --- backup-upload.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index e050140a..e035415d 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -53,6 +53,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 665516b33de8d4d58d18274e05a0180cf6978af0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:59 +0100 Subject: [PATCH 377/988] check-routeros-update: refuse when running from backup partition --- check-routeros-update.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c3d26253..19abebf4 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -51,6 +51,13 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ From ce2d090e998d51b92376f3470b829f598f3ce5bd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:31:13 +0100 Subject: [PATCH 378/988] packages-update: refuse when running from backup partition --- packages-update.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index a79946d5..7644219c 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -50,6 +50,12 @@ :error false; } + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set ExitOK true; + :error false; + } + :local Update [ /system/package/update/get ]; :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ From 98791f48fdb684f946fb94e8735b1073942cd731 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 9 Jan 2025 13:20:45 +0100 Subject: [PATCH 379/988] ppp-on-up: release only bound ipv6 dhcp clients --- ppp-on-up.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index a776ce23..ba9d0aae 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -28,7 +28,7 @@ :local IntName [ /interface/get $Interface name ]; $LogPrint info $ScriptName ("PPP interface " . $IntName . " is up."); - /ipv6/dhcp-client/release [ find where interface=$IntName !disabled ]; + /ipv6/dhcp-client/release [ find where interface=$IntName !disabled bound ]; :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\r?\n") ] do={ :local ScriptName [ /system/script/get $Script name ]; From e8b1e19b284af74032e1edcbb08665752dbe508a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 22 Nov 2024 14:06:22 +0100 Subject: [PATCH 380/988] fw-addr-lists: spamhaus.org returned to 'GTS Root R4' --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 9ce8dd42..870cb542 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/ISRG-Root-X1 + www.spamhaus.org/GTS-Root-R4 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 1f4e9ca1..c63283dc 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -107,9 +107,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From ccf17a438cd10f77f0f0c0cd83f6f6729b6479c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 Jan 2025 23:07:38 +0100 Subject: [PATCH 381/988] global-config: download scripts from rsc.eworm.de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently AI bots are crawling website all around the world. For a website hosting git content this adds a lot of extra load and traffic: The site has lots of sections, repositories have a lot of files, branches, tags, commit ids, etc... Multiply that and you have a nearly unlimited number of unique urls. The bots try to get each and every of these. To speed up the learing process on their side a swarm of hundreds, thousands or more ip addresses is active at the same time, ultimately DDOS'ing the websites, making it inaccessible. 😳🤬 Well, there is one single file all of these AI bots are not interested in: robots.txt 🤬🤬 On top some use random user agent strings, making filtering impossible. 🤬🤬🤬 For a short term sulution I deploy the repository content as static files, hopefully making these accessible at least. We will see. --- global-config.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index c63283dc..3e173204 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -217,14 +217,16 @@ :global GpsTrackUrl "https://example.com/index.php"; # This is the base url to fetch scripts from. -:global ScriptUpdatesBaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; +:global ScriptUpdatesBaseUrl "https://rsc.eworm.de/main/"; # alternative urls - main: stable code - next: currently in development +#:global ScriptUpdatesBaseUrl "https://rsc.eworm.de/next/"; +#:global ScriptUpdatesBaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; #:global ScriptUpdatesBaseUrl "https://raw.githubusercontent.com/eworm-de/routeros-scripts/main/"; #:global ScriptUpdatesBaseUrl "https://raw.githubusercontent.com/eworm-de/routeros-scripts/next/"; #:global ScriptUpdatesBaseUrl "https://gitlab.com/eworm-de/routeros-scripts/raw/main/"; #:global ScriptUpdatesBaseUrl "https://gitlab.com/eworm-de/routeros-scripts/raw/next/"; :global ScriptUpdatesUrlSuffix ""; -# use next branch with default url (git.eworm.de) +# use next branch with my git url (git.eworm.de) #:global ScriptUpdatesUrlSuffix "?h=next"; # Use this for defaults with $ScriptRunOnce From d4acc5aa59e30c5e430b553fb2142c7e7e004822 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 11:03:50 +0100 Subject: [PATCH 382/988] BRANCHES: adopt new default url --- BRANCHES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 2bacf8e8..5d94077b 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -22,13 +22,13 @@ for testing. To install a single script from `next` branch: - $ScriptInstallUpdate script-name "url-suffix=?h=next"; + $ScriptInstallUpdate script-name "base-url=https://rsc.eworm.de/next/"; ## Switch existing script Alternatively switch an existing script to update from `next` branch: - /system/script/set comment="url-suffix=?h=next" script-name; + /system/script/set comment="base-url=https://rsc.eworm.de/next/" script-name; $ScriptInstallUpdate; ## Switch installation @@ -36,7 +36,7 @@ Alternatively switch an existing script to update from `next` branch: Last but not least - to switch the complete installation to the `next` branch edit `global-config-overlay` and add: - :global ScriptUpdatesUrlSuffix "?h=next"; + :global ScriptUpdatesBaseUrl "https://rsc.eworm.de/next/"; ... then reload the configuration and update: From a446f31262118d59d6ec938a022b2f7d99fb5a70 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 Jan 2025 23:56:18 +0100 Subject: [PATCH 383/988] fw-addr-lists: use my static mirror --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 3e173204..c8b2c2e6 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -92,11 +92,11 @@ # This defines the settings for firewall address-lists (fw-addr-lists). :global FwAddrLists { # "allow"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/allow"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/allow"; # cert="ISRG Root X2"; timeout=1w }; # }; "block"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; cert="GlobalSign" }; @@ -112,7 +112,7 @@ # cert="GTS Root R4" }; }; # "mikrotik"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/mikrotik"; # cert="ISRG Root X2"; timeout=1w }; # }; }; From 500054535c44f7682bf82712dc37e299299b09dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:30:01 +0100 Subject: [PATCH 384/988] unattended-lte-firmware-upgrade: require RouterOS --- unattended-lte-firmware-upgrade.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index f1bc5529..ea18edfc 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.14 +# # schedule unattended lte firmware upgrade # https://git.eworm.de/cgit/routeros-scripts/about/doc/unattended-lte-firmware-upgrade.md From 1dda59034e366c6cb6e2b78fa820ece1407f93e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 385/988] accesslist-duplicates: use short url rsc.eworm.de --- accesslist-duplicates.capsman.rsc | 4 ++-- accesslist-duplicates.local.rsc | 4 ++-- accesslist-duplicates.template.rsc | 4 ++-- accesslist-duplicates.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index b611917e..0c4eaaf5 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index ef0cf32b..353fe1fc 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index ab5b671a..4219014f 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 0205598a..3ee53d8c 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! From 5281b4ba02a721af189ad70244c95cb175c6af06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 386/988] backup-cloud: use short url rsc.eworm.de --- backup-cloud.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f32a04dd..efae055f 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-cloud # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 # requires RouterOS, version=7.14 # # upload backup to MikroTik cloud -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md +# https://rsc.eworm.de/doc/backup-cloud.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 08ff07d037d88e7aba7356ba0f744a4e92d597ea Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 387/988] backup-email: use short url rsc.eworm.de --- backup-email.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 731fb95a..f6ebad0b 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-email # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 # requires RouterOS, version=7.14 # # create and email backup and config file -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md +# https://rsc.eworm.de/doc/backup-email.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From c70b6a8eb304641df205c1d18f12670d183a9385 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 388/988] backup-partition: use short url rsc.eworm.de --- backup-partition.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 22982257..b8bf7b1e 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-partition # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 # requires RouterOS, version=7.14 # # save configuration to fallback partition -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md +# https://rsc.eworm.de/doc/backup-partition.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 38b5fbab9cdc9fd755c04a2f7debd2d62ae05aab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 389/988] backup-upload: use short url rsc.eworm.de --- backup-upload.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index e035415d..011c5029 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-upload # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 # requires RouterOS, version=7.14 # # create and upload backup and config file -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md +# https://rsc.eworm.de/doc/backup-upload.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From b938847030e90c8c3b8decb55e6625aa2e537798 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 390/988] capsman-download-packages: use short url rsc.eworm.de --- capsman-download-packages.capsman.rsc | 4 ++-- capsman-download-packages.template.rsc | 4 ++-- capsman-download-packages.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 46094983..fa76ff5f 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages.capsman # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! Do not edit this file, it is generated from template! diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 642a0689..912e2795 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages%TEMPL% # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 1ea9b792..3a5e7d1e 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages.wifi # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! Do not edit this file, it is generated from template! From 26dbf5805a83a2670e678ec93d02796f7c3233cd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 391/988] capsman-rolling-upgrade: use short url rsc.eworm.de --- capsman-rolling-upgrade.capsman.rsc | 4 ++-- capsman-rolling-upgrade.template.rsc | 4 ++-- capsman-rolling-upgrade.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 7a5ed81a..abe066e8 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade.capsman # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.capsman # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! Do not edit this file, it is generated from template! diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index fd7e31fa..c1c7ff1e 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade%TEMPL% # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 3fb99b80..44c99db7 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade.wifi # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.wifi # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! Do not edit this file, it is generated from template! From 1b7458ac955dc32ea12f19a779c985f27e0c6a28 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 392/988] certificate-renew-issued: use short url rsc.eworm.de --- certificate-renew-issued.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 32c3267d..5a4043d2 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # renew locally issued certificates -# https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md +# https://rsc.eworm.de/doc/certificate-renew-issued.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 1239ac31044270036a8204cd7856776d8faee06e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 393/988] check-certificates: use short url rsc.eworm.de --- check-certificates.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 226364be..02e3e520 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-certificates # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for certificate validity -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md +# https://rsc.eworm.de/doc/check-certificates.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 231be730aea0bad7a914c387a719d7c46ecbb468 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 394/988] check-health: use short url rsc.eworm.de --- check-health.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index d3586dbc..31bd6c24 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-health # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for RouterOS health state -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md +# https://rsc.eworm.de/doc/check-health.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7484663b92062ae6c120227de22d387df93123ad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 395/988] check-lte-firmware-upgrade: use short url rsc.eworm.de --- check-lte-firmware-upgrade.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index cd9f979d..562b8fe6 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for LTE firmware upgrade, send notification -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md +# https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 36c87c91ea9b4bc5ef1153733d38e52ad0e3e291 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 396/988] check-routeros-update: use short url rsc.eworm.de --- check-routeros-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 19abebf4..9486d6c1 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for RouterOS update, send notification and/or install -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md +# https://rsc.eworm.de/doc/check-routeros-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From f8058eaf71c54fb722fb65c5e87c9f448927a36e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 397/988] collect-wireless-mac: use short url rsc.eworm.de --- collect-wireless-mac.capsman.rsc | 4 ++-- collect-wireless-mac.local.rsc | 4 ++-- collect-wireless-mac.template.rsc | 4 ++-- collect-wireless-mac.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 05e4b898..f718e0bc 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 67c1a989..00178752 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 84a96674..527e9851 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index fa4953ba..5f9de7d2 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! From 96fa76f07dfe86d31f32c90e969cb824d727280a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 398/988] daily-psk.template: use short url rsc.eworm.de --- daily-psk.capsman.rsc | 4 ++-- daily-psk.local.rsc | 4 ++-- daily-psk.template.rsc | 4 ++-- daily-psk.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index f41da297..56729315 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.capsman # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 2920cb5b..9dea4692 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.local # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 05c376e2..8202eeba 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk%TEMPL% # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 4182ab8d..3de3c5b6 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.wifi # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! From 61dee2177634b6e464aab4b644eb686f914cb365 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 399/988] dhcp-lease-comment: use short url rsc.eworm.de --- dhcp-lease-comment.capsman.rsc | 4 ++-- dhcp-lease-comment.local.rsc | 4 ++-- dhcp-lease-comment.template.rsc | 4 ++-- dhcp-lease-comment.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 947181bf..38039637 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 27306dd1..d5f14613 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 8552b263..2bddc268 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index bf67bd07..515b4384 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! From 632d294a988188eb9ea182316d28411b8c281ed2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 400/988] dhcp-to-dns: use short url rsc.eworm.de --- dhcp-to-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 1eb832ac..9b940984 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=20 # requires RouterOS, version=7.16 # # check DHCP leases and add/remove/update DNS entries -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md +# https://rsc.eworm.de/doc/dhcp-to-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7b760d9fa408b12ef00328266c77707f835f0600 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 401/988] firmware-upgrade-reboot: use short url rsc.eworm.de --- firmware-upgrade-reboot.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index f9e557cd..e3d62def 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # install firmware upgrade, and reboot -# https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md +# https://rsc.eworm.de/doc/firmware-upgrade-reboot.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 39c5aeda13e107f1dd91fc632cab536befeca6eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 402/988] fw-addr-lists: use short url rsc.eworm.de --- fw-addr-lists.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index e98a6109..d41dc04e 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists # Copyright (c) 2023-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # download, import and update firewall address-lists -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From ac62b8f24fc72aefbb9994abac3baa07bd3cfa93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 403/988] global-config-overlay: use short url rsc.eworm.de --- global-config-overlay.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 227ae5a0..9afacebd 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,12 +1,12 @@ # Overlay for global configuration by RouterOS Scripts # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # global configuration, custom overlay -# https://git.eworm.de/cgit/routeros-scripts/about/#editing-configuration +# https://rsc.eworm.de/#editing-configuration # Copy relevant configuration from global-config, paste and modify it here. -# https://git.eworm.de/cgit/routeros-scripts/about/global-config.rsc +# https://rsc.eworm.de/global-config.rsc # End of global-config-overlay From b7923485bdac90458321989eda261517afc4986e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 404/988] global-config: use short url rsc.eworm.de --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index c8b2c2e6..df26ef97 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: global-config # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # global configuration -# https://git.eworm.de/cgit/routeros-scripts/about/ +# https://rsc.eworm.de/ # Set this to 'true' to disable news and change notifications. :global NoNewsAndChangesNotification false; @@ -238,7 +238,7 @@ # This project is developed in private spare time and usage is free of charge # for you. If you like the scripts and think this is of value for you or your # business please consider a donation: -# https://git.eworm.de/cgit/routeros-scripts/about/#donate +# https://rsc.eworm.de/#donate # Enable this to silence donation hint. :global IDonate false; From 7be415d0ed8238564608c47b251f21f25e6f1d43 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 405/988] global-functions: use short url rsc.eworm.de --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a2dd279b..d5ac31ca 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -2,12 +2,12 @@ # RouterOS script: global-functions # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # global functions -# https://git.eworm.de/cgit/routeros-scripts/about/ +# https://rsc.eworm.de/ :local ScriptName [ :jobname ]; From 0431b02324877ae8585eb31effd789747f2aaf96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 406/988] global-wait: use short url rsc.eworm.de --- global-wait.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-wait.rsc b/global-wait.rsc index 529dbd7b..bc984622 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: global-wait # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # wait for global-functions to finish -# https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md +# https://rsc.eworm.de/doc/global-wait.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 72db13c0ab7bc2ba71400bb74976391d7a78e925 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 407/988] gps-track: use short url rsc.eworm.de --- gps-track.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index 1bd976a0..08873de6 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: gps-track # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # track gps data by sending json data to http server -# https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md +# https://rsc.eworm.de/doc/gps-track.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 996602bfe9f0363edae13c51604c23f46546ac49 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 408/988] hotspot-to-wpa-cleanup: use short url rsc.eworm.de --- hotspot-to-wpa-cleanup.capsman.rsc | 4 ++-- hotspot-to-wpa-cleanup.template.rsc | 4 ++-- hotspot-to-wpa-cleanup.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 1d27faf6..fde36f90 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index f92dbe5e..3ddcbe0d 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index cd215935..034530bb 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! From 9474102c62b4e9d36f908e40e14031da5a6fc116 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 409/988] hotspot-to-wpa: use short url rsc.eworm.de --- hotspot-to-wpa.capsman.rsc | 4 ++-- hotspot-to-wpa.template.rsc | 4 ++-- hotspot-to-wpa.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index d962ba75..1c77de96 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 3438be70..d8cd261b 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index a2bb3ca9..345087d9 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! From 453d80a121f7e92602466490b77b7d47ba3ef251 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 410/988] ip-addr-bridge: use short url rsc.eworm.de --- ip-addr-bridge.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 00b45a32..68ff4a41 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # enable or disable ip addresses based on bridge port state -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ip-addr-bridge.md +# https://rsc.eworm.de/doc/ip-addr-bridge.md :foreach Bridge in=[ /interface/bridge/find ] do={ :local BrName [ /interface/bridge/get $Bridge name ]; From 02cc581aff6c6a4191620450e5607c74aeaca203 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 411/988] ipsec-to-dns: use short url rsc.eworm.de --- ipsec-to-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 39b21d5c..1af58091 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # and add/remove/update DNS entries from IPSec mode-config -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md +# https://rsc.eworm.de/doc/ipsec-to-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 71316f7377987124858d74a9f5f741a133047dec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 412/988] ipv6-update: use short url rsc.eworm.de --- ipv6-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index a2fb8317..7eb625b2 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ipv6-update # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # update firewall and dns settings on IPv6 prefix change -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md +# https://rsc.eworm.de/doc/ipv6-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 5ead61cb6269ab5f2e6c145a4736765d938f6305 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 413/988] lease-script: use short url rsc.eworm.de --- lease-script.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 3d0fc72a..b6ceac96 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: lease-script # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run scripts on DHCP lease -# https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md +# https://rsc.eworm.de/doc/lease-script.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 5e60d2e1b7d1973a18737042e94d3e0ba262db14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 414/988] leds-day-mode: use short url rsc.eworm.de --- leds-day-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index e0f08d61..7344fde7 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # enable LEDs -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=never; From bf11489d11058562a1a10b883dbdb1d06f8c1a8e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 415/988] leds-night-mode: use short url rsc.eworm.de --- leds-night-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index 1f50dfd5..8bd028e7 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # disable LEDs -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=immediate; From b75a35417a4dc0793515275bdee8443248f5762c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 416/988] leds-toggle-mode: use short url rsc.eworm.de --- leds-toggle-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 55d5b82d..b55e3514 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # toggle LEDs mode -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=(({ "never"="immediate"; "immediate"="never" })->[ get all-leds-off ]); From b8841a71356c6e25870913183d10ef9a8732a42d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 417/988] log-forward: use short url rsc.eworm.de --- log-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 8c2ebc0d..379fa54e 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: log-forward # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # forward log messages via notification -# https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md +# https://rsc.eworm.de/doc/log-forward.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 6920842d1584a7c8b3a7208c1230a373d2932a8d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 418/988] mod/bridge-port-to: use short url rsc.eworm.de --- mod/bridge-port-to.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index ec6f6128..f00e10b1 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # reset bridge ports to default bridge -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md +# https://rsc.eworm.de/doc/mod/bridge-port-to.md :global BridgePortTo; From d5a50d824f0343a70e1945127b42dde719d761d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 419/988] mod/bridge-port-vlan: use short url rsc.eworm.de --- mod/bridge-port-vlan.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 62216467..62e71e38 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # manage VLANs on bridge ports -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md +# https://rsc.eworm.de/doc/mod/bridge-port-vlan.md :global BridgePortVlan; From 18fcecd21126b72c9ba1aef4375450bb8751feb3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 420/988] mode-button: use short url rsc.eworm.de --- mode-button.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index f8bd7b83..9339f1c1 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mode-button # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # act on multiple mode and reset button presses -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md +# https://rsc.eworm.de/doc/mode-button.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 078d5368fbfa195d1e6584b3789cfb3078babad7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 421/988] mod/inspectvar: use short url rsc.eworm.de --- mod/inspectvar.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 01724bb9..0f05da72 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # inspect variables -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md +# https://rsc.eworm.de/doc/mod/inspectvar.md :global InspectVar; :global InspectVarReturn; From 828f68be3c85a43e28884546f74dab3aca403eb9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 422/988] mod/ipcalc: use short url rsc.eworm.de --- mod/ipcalc.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 69dec8be..fbed74b5 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # ip address calculation -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md +# https://rsc.eworm.de/doc/mod/ipcalc.md :global IPCalc; :global IPCalcReturn; From 631f63836b6b758c4ff3816ffdd5c76d95d31961 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 423/988] mod/notification-email: use short url rsc.eworm.de --- mod/notification-email.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 6d700f5e..ca23550c 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via e-mail -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md +# https://rsc.eworm.de/doc/mod/notification-email.md :global EMailGenerateFrom; :global FlushEmailQueue; From 6567a94a4f4e263308a0b01663448179e6554821 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 424/988] mod/notification-matrix: use short url rsc.eworm.de --- mod/notification-matrix.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index aad8b425..aee231d9 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -2,12 +2,12 @@ # RouterOS script: mod/notification-matrix # Copyright (c) 2013-2025 Michael Gisbers # Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Matrix -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-matrix.md +# https://rsc.eworm.de/doc/mod/notification-matrix.md :global FlushMatrixQueue; :global NotificationFunctions; From 6e7f311269a1694dbc243eb60a363f1db4d89cd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 425/988] mod/notification-ntfy: use short url rsc.eworm.de --- mod/notification-ntfy.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 53ba9b47..df252bbb 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Ntfy (ntfy.sh) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md +# https://rsc.eworm.de/doc/mod/notification-ntfy.md :global FlushNtfyQueue; :global NotificationFunctions; From 27144a428a03241a7e67859bfa6acfc37e62f6dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 426/988] mod/notification-telegram: use short url rsc.eworm.de --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index f9700cf0..a20367cd 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Telegram -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-telegram.md +# https://rsc.eworm.de/doc/mod/notification-telegram.md :global FlushTelegramQueue; :global NotificationFunctions; From 66ab2a85114165ca2b5f4f5a6e221eed4c560b45 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 427/988] mod/scriptrunonce: use short url rsc.eworm.de --- mod/scriptrunonce.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 7e01e72e..cae2b051 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download script and run it once -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md +# https://rsc.eworm.de/doc/mod/scriptrunonce.md :global ScriptRunOnce; From ed184445783921343498f4f3589df858b2754cbd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 428/988] mod/ssh-keys-import: use short url rsc.eworm.de --- mod/ssh-keys-import.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index ad3a81ea..35aa7ec9 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # import ssh keys for public key authentication -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md +# https://rsc.eworm.de/doc/mod/ssh-keys-import.md :global SSHKeysImport; :global SSHKeysImportFile; From 299b34883ff508291dfa4acf04118695223c0cd3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 429/988] netwatch-dns: use short url rsc.eworm.de --- netwatch-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 81f9d95d..e05c3ac7 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # monitor and manage dns/doh with netwatch -# https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md +# https://rsc.eworm.de/doc/netwatch-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 563aeb8f71da109060961a16541f56c7dc019e2b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 430/988] netwatch-notify: use short url rsc.eworm.de --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index e79977ea..8b05c5e3 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # monitor netwatch and send notifications -# https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md +# https://rsc.eworm.de/doc/netwatch-notify.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 719079c5c1298a4800ac482247ee9ac5a9502740 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 431/988] news-and-changes: use short url rsc.eworm.de --- news-and-changes.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 545a0c93..7508b43f 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,6 +1,6 @@ # News, changes and migration by RouterOS Scripts # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md :global IDonate; From 3b0ea3a2388c69914fa76204c6e940b60f6aee83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 432/988] ospf-to-leds: use short url rsc.eworm.de --- ospf-to-leds.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 3400e7ff..9d822c15 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # visualize ospf instance state via leds -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md +# https://rsc.eworm.de/doc/ospf-to-leds.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 90a148a9d86f069048974399feca29a7911e833d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 433/988] packages-update: use short url rsc.eworm.de --- packages-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 7644219c..9971e47c 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: packages-update # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download packages and reboot for installation -# https://git.eworm.de/cgit/routeros-scripts/about/doc/packages-update.md +# https://rsc.eworm.de/doc/packages-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 867e504c94faf9d87b8caa6e4d77cd5426af9f73 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 434/988] ppp-on-up: use short url rsc.eworm.de --- ppp-on-up.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ba9d0aae..85e96896 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run scripts on ppp up -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md +# https://rsc.eworm.de/doc/ppp-on-up.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 1f5aea9fca6ecd5706cb29c8226109281333510d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 435/988] sms-action: use short url rsc.eworm.de --- sms-action.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index f22a0bb1..34d21272 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: sms-action # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run action on received SMS -# https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md +# https://rsc.eworm.de/doc/sms-action.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7addf2e53a73e230aeac962c9b86a1f1f7e2ddd4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 436/988] sms-forward: use short url rsc.eworm.de --- sms-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index efebb758..654fd564 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -2,12 +2,12 @@ # RouterOS script: sms-forward # Copyright (c) 2013-2025 Christian Hesse # Anatoly Bubenkov -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # forward SMS to e-mail -# https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md +# https://rsc.eworm.de/doc/sms-forward.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From dd2854e983685ae39465c4375bbdb7b4d27956e8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 437/988] super-mario-theme: use short url rsc.eworm.de --- super-mario-theme.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index fc868c8d..726c5267 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # play Super Mario theme -# https://git.eworm.de/cgit/routeros-scripts/about/doc/super-mario-theme.md +# https://rsc.eworm.de/doc/super-mario-theme.md :local Beeps { { 660; 100 }; 150; { 660; 100 }; 300; { 660; 100 }; 300; From e3ca37ad9a6f49ae5990e0fb4630d40e77153439 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 438/988] telegram-chat: use short url rsc.eworm.de --- telegram-chat.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index eebb617e..dcdbefa4 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: telegram-chat # Copyright (c) 2023-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # use Telegram to chat with your Router and send commands -# https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md +# https://rsc.eworm.de/doc/telegram-chat.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 32ac10e6efcd8967b998aef066220a75d4819e0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 439/988] unattended-lte-firmware-upgrade: use short url rsc.eworm.de --- unattended-lte-firmware-upgrade.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index ea18edfc..c7df92f4 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # schedule unattended lte firmware upgrade -# https://git.eworm.de/cgit/routeros-scripts/about/doc/unattended-lte-firmware-upgrade.md +# https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md :foreach Interface in=[ /interface/lte/find where running ] do={ :local Firmware; From 49aef0606bb36ee1b0d2ed93e7ce6b63d38338da Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 440/988] update-gre-address: use short url rsc.eworm.de --- update-gre-address.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 4ac311a1..6b169a00 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: update-gre-address # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # update gre interface remote address with dynamic address from # ipsec remote peer -# https://git.eworm.de/cgit/routeros-scripts/about/doc/update-gre-address.md +# https://rsc.eworm.de/doc/update-gre-address.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From c04ee5aadf4880bcea019f1cdcc1bfca918cce2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 441/988] update-tunnelbroker: use short url rsc.eworm.de --- update-tunnelbroker.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 589544c4..c47a45f3 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -2,13 +2,13 @@ # RouterOS script: update-tunnelbroker # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: ppp-on-up # requires RouterOS, version=7.14 # # update local address of tunnelbroker interface -# https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md +# https://rsc.eworm.de/doc/update-tunnelbroker.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 106a9bddefd7577b4baf7ae1d78e1bbde09b281e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 09:18:48 +0100 Subject: [PATCH 442/988] README: give hint on device mode --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 98209bd5..8594f58a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,12 @@ Specific scripts may require even newer RouterOS version. > ℹ️ **Info**: The `main` branch is now RouterOS v7 only. If you are still > running RouterOS v6 switch to `routeros-v6` branch! +Starting with RouterOS 7.17 the +[device-mode](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) +has been extended to give more fine-grained control over what features are +available. You need to enable `scheduler` and `fetch` at least, specific +scripts may require additional features. + ### Hardware RouterOS packages increase in size with each release. This becomes a From b177e298d7b447c41854d840eed6f687b6cec8b6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 09:45:25 +0100 Subject: [PATCH 443/988] global-functions: $ScriptInstallUpdate: support checking for device-mode features --- global-functions.rsc | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d5ac31ca..7d65f45d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -5,6 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # global functions # https://rsc.eworm.de/ @@ -1071,6 +1072,7 @@ :local ExpectedConfigVersionBefore $ExpectedConfigVersion; :local ReloadGlobalFunctions false; :local ReloadGlobalConfig false; + :local DeviceMode [ /system/device-mode/get ]; :foreach Script in=[ /system/script/find where source~"^#!rsc by RouterOS\r?\n" ] do={ :local ScriptVal [ /system/script/get $Script ]; @@ -1113,19 +1115,31 @@ :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ - :if ([ $ValidateSyntax $SourceNew ] = true) do={ - $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; + :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; + :local MissingDM ({}); + :foreach Feature,Value in=$RequiredDM do={ + :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ + :set MissingDM ($MissingDM, $Feature); } - :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ - :set ReloadGlobalFunctions true; + } + :if ([ :len $MissingDM ] = 0) do={ + :if ([ $ValidateSyntax $SourceNew ] = true) do={ + $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; + } + } else={ + $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ + "' failed! Ignoring!"); } } else={ - $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ - "' failed! Ignoring!"); + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ + "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); } } else={ $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ From aebc4e37da1a8e9ed1b343a83c7d60ac50fab9d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:26:22 +0100 Subject: [PATCH 444/988] backup-partition: add dependencies on device-mode --- backup-partition.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index b8bf7b1e..bfa7765c 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -5,6 +5,7 @@ # # provides: backup-script, order=70 # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # save configuration to fallback partition # https://rsc.eworm.de/doc/backup-partition.md From d81a786e8288fea463c7188f1939c59713add31a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:20:26 +0100 Subject: [PATCH 445/988] backup-upload: add dependencies on device-mode --- backup-upload.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index 011c5029..dc5120f5 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -5,6 +5,7 @@ # # provides: backup-script, order=50 # requires RouterOS, version=7.14 +# requires device-mode, fetch # # create and upload backup and config file # https://rsc.eworm.de/doc/backup-upload.md From 95b675f67ec9d7c5a9df01a54c1754834b02beee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:12 +0100 Subject: [PATCH 446/988] check-certificates: add dependencies on device-mode --- check-certificates.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 02e3e520..4271e00b 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # check for certificate validity # https://rsc.eworm.de/doc/check-certificates.md From 43f6c0b975bb4db73131f78014ca3d59123bd4a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:26 +0100 Subject: [PATCH 447/988] check-routeros-update: add dependencies on device-mode --- check-routeros-update.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 9486d6c1..5c9b392f 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # check for RouterOS update, send notification and/or install # https://rsc.eworm.de/doc/check-routeros-update.md From bc0227c49b99372ff46516e55175cf6ae1da31d3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:40 +0100 Subject: [PATCH 448/988] gps-track: add dependencies on device-mode --- gps-track.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/gps-track.rsc b/gps-track.rsc index 08873de6..5e35f8da 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # track gps data by sending json data to http server # https://rsc.eworm.de/doc/gps-track.md From e29ef31eb85e9b9001536ed1bb63a0b479cf4cad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:35:31 +0100 Subject: [PATCH 449/988] hotspot-to-wpa: add dependencies on device-mode --- hotspot-to-wpa.capsman.rsc | 1 + hotspot-to-wpa.template.rsc | 1 + hotspot-to-wpa.wifi.rsc | 1 + 3 files changed, 3 insertions(+) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 1c77de96..de9f9d9a 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index d8cd261b..003b12e2 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 345087d9..0d6a7b96 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md From 1ad4d05be8a69490902308baa515b8c87095bb2d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:35:23 +0100 Subject: [PATCH 450/988] hotspot-to-wpa-cleanup: add dependencies on device-mode --- hotspot-to-wpa-cleanup.capsman.rsc | 1 + hotspot-to-wpa-cleanup.template.rsc | 1 + hotspot-to-wpa-cleanup.wifi.rsc | 1 + 3 files changed, 3 insertions(+) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index fde36f90..c21ec3ea 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 3ddcbe0d..1bd877e9 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 034530bb..8e362048 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md From 5f1cbe6de5466ccaaf1b5eb29f7087f04cf342c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:25:15 +0100 Subject: [PATCH 451/988] ipsec-to-dns: add dependencies on device-mode --- ipsec-to-dns.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 1af58091..91f6b45e 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, ipsec # # and add/remove/update DNS entries from IPSec mode-config # https://rsc.eworm.de/doc/ipsec-to-dns.md From 56e74268b079fba7bda8803c0d88eeb67d0f4397 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:31:30 +0100 Subject: [PATCH 452/988] mode-button: add dependencies on device-mode --- mode-button.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mode-button.rsc b/mode-button.rsc index 9339f1c1..4cf5e754 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # act on multiple mode and reset button presses # https://rsc.eworm.de/doc/mode-button.md From 370e81321fe485a94560b4debe2ce7044c99e86f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:15:49 +0100 Subject: [PATCH 453/988] mod/notification-email: add dependencies on device-mode --- mod/notification-email.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ca23550c..404e74db 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, email, scheduler # # send notifications via e-mail # https://rsc.eworm.de/doc/mod/notification-email.md From 9a12934202c1bf8f46b326b37e7b06d84609c4ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:57 +0100 Subject: [PATCH 454/988] mod/notification-matrix: add dependencies on device-mode --- mod/notification-matrix.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index aee231d9..9b2b641c 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -5,6 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Matrix # https://rsc.eworm.de/doc/mod/notification-matrix.md From 9f2f54b4790659189c60e72918cc200625c22d25 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:08 +0100 Subject: [PATCH 455/988] mod/notification-ntfy: add dependencies on device-mode --- mod/notification-ntfy.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index df252bbb..212fde2e 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Ntfy (ntfy.sh) # https://rsc.eworm.de/doc/mod/notification-ntfy.md From 378a8978dfb86f1f690732cc0e513330282bcd98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:22 +0100 Subject: [PATCH 456/988] mod/notification-telegram: add dependencies on device-mode --- mod/notification-telegram.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index a20367cd..c3ef2dd3 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Telegram # https://rsc.eworm.de/doc/mod/notification-telegram.md From 59c9d0ce4bf97407a5f35d8556ecc9f4f03ca752 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:43 +0100 Subject: [PATCH 457/988] mod/scriptrunonce: add dependencies on device-mode --- mod/scriptrunonce.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index cae2b051..e5368c45 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # download script and run it once # https://rsc.eworm.de/doc/mod/scriptrunonce.md From 3ef458860153ab858eec70e0899efa91a84236d4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:55 +0100 Subject: [PATCH 458/988] netwatch-dns: add dependencies on device-mode --- netwatch-dns.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index e05c3ac7..467d6362 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 +# requires device-mode, fetch # # monitor and manage dns/doh with netwatch # https://rsc.eworm.de/doc/netwatch-dns.md From 8dc1e1ea6bdb815de28823dfa43d1cfeda67379f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:32:17 +0100 Subject: [PATCH 459/988] packages-update: add dependencies on device-mode --- packages-update.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/packages-update.rsc b/packages-update.rsc index 9971e47c..ff47b2a3 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # download packages and reboot for installation # https://rsc.eworm.de/doc/packages-update.md From ef48b8d39ebacf2bd1c560c6dea33399a9a47b47 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:23:58 +0100 Subject: [PATCH 460/988] telegram-chat: add dependencies on device-mode --- telegram-chat.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index dcdbefa4..8f29d8c0 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 +# requires device-mode, fetch # # use Telegram to chat with your Router and send commands # https://rsc.eworm.de/doc/telegram-chat.md From 9421566352041654e1f2ded815739b040eec1df4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:28:40 +0100 Subject: [PATCH 461/988] unattended-lte-firmware-upgrade: add dependencies on device-mode --- unattended-lte-firmware-upgrade.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index c7df92f4..74495d1a 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # schedule unattended lte firmware upgrade # https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md From d921af9a6bda54da74f6b7520db1a8e5697c8c3e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:23:06 +0100 Subject: [PATCH 462/988] update-tunnelbroker: add dependencies on device-mode --- update-tunnelbroker.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index c47a45f3..a58589b8 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -6,6 +6,7 @@ # # provides: ppp-on-up # requires RouterOS, version=7.14 +# requires device-mode, fetch # # update local address of tunnelbroker interface # https://rsc.eworm.de/doc/update-tunnelbroker.md From 8b19e74736693483faf533fd22fce458ae4fac9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 21:58:47 +0100 Subject: [PATCH 463/988] global-functions: $ScriptInstallUpdate: resolve nested conditions... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... and check one after another in a do-block. This uses `:error` as poor man's continue. 🤪 --- global-functions.rsc | 97 ++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 7d65f45d..befe8f0a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1109,52 +1109,59 @@ } } - :if ([ :len $SourceNew ] > 0) do={ - :local SourceCRLF [ :tocrlf $SourceNew ]; - :if ($SourceNew != $ScriptVal->"source" && $SourceCRLF != $ScriptVal->"source") do={ - :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ - :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); - :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ - :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; - :local MissingDM ({}); - :foreach Feature,Value in=$RequiredDM do={ - :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ - :set MissingDM ($MissingDM, $Feature); - } - } - :if ([ :len $MissingDM ] = 0) do={ - :if ([ $ValidateSyntax $SourceNew ] = true) do={ - $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; - } - } else={ - $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ - "' failed! Ignoring!"); - } - } else={ - $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ - "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); - } - } else={ - $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ - $Required . ", which is not met by your installation. Ignoring!"); - } - } else={ - $LogPrint warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ - "' is not valid (missing shebang). Ignoring!"); - } - } else={ - $LogPrint debug $0 ("Script '" . $ScriptVal->"name" . "' did not change."); + :do { + :if ([ :len $SourceNew ] = 0) do={ + $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); + :error false; } - } else={ - $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); - } + + :local SourceCRLF [ :tocrlf $SourceNew ]; + :if ($SourceNew = $ScriptVal->"source" || $SourceCRLF = $ScriptVal->"source") do={ + $LogPrint debug $0 ("Script '" . $ScriptVal->"name" . "' did not change."); + :error false; + } + + :if ([ :pick $SourceNew 0 18 ] != "#!rsc by RouterOS\n") do={ + $LogPrint warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ + "' is not valid (missing shebang). Ignoring!"); + :error false; + } + + :local RequiredROS ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); + :if ([ $RequiredRouterOS $0 [ $EitherOr $RequiredROS "0.0" ] false ] = false) do={ + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ + $RequiredROS . ", which is not met by your installation. Ignoring!"); + :error false; + } + + :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; + :local MissingDM ({}); + :foreach Feature,Value in=$RequiredDM do={ + :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ + :set MissingDM ($MissingDM, $Feature); + } + } + :if ([ :len $MissingDM ] > 0) do={ + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ + "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); + :error false; + } + + :if ([ $ValidateSyntax $SourceNew ] = false) do={ + $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . "' failed! Ignoring!"); + :error false; + } + + $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; + } + } on-error={ } } :if ($ReloadGlobalFunctions = true) do={ From 414c83ef814af82d53f5b4de3a8d6b5a004704c1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 22:07:06 +0100 Subject: [PATCH 464/988] global-functions: $ScriptInstallUpdate: resolve more nested conditions Just like the previous one. --- global-functions.rsc | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index befe8f0a..a2ec8338 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1221,18 +1221,24 @@ :if ([ :len $GlobalConfigMigration ] > 0) do={ :for I from=($ExpectedConfigVersionBefore + 1) to=$ExpectedConfigVersion do={ :local Migration ($GlobalConfigMigration->[ :tostr $I ]); - :if ([ :typeof $Migration ] = "str") do={ - :if ([ $ValidateSyntax $Migration ] = true) do={ - $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); - :do { - [ :parse $Migration ]; - } on-error={ - $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); - } - } else={ - $LogPrint warning $0 ("Migration code for change " . $I . " failed syntax validation!"); + :do { + :if ([ :typeof $Migration ] != "str") do={ + $LogPrint debug $0 ("Migration code for change " . $I . " is not available."); + :error false; } - } + + :if ([ $ValidateSyntax $Migration ] = false) do={ + $LogPrint warning $0 ("Migration code for change " . $I . " failed syntax validation!"); + :error false; + } + + $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); + :do { + [ :parse $Migration ]; + } on-error={ + $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); + } + } on-error={ } } } From aa294b4c67d038eae1b4e785dfd934176a1fb704 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Thu, 30 Jan 2025 20:27:14 +0100 Subject: [PATCH 465/988] certs: fix curl false positives... ... when default capath contains system certs If curl has a default capath (debian 12 capath=/etc/ssl/certs) it will add those certs and return ok to any valid https url, defeating the intended use of the cacert option in the Makefile that validates sites and certs. To avoid that, adding option "--capath /dev/null" overrides the default value, if any. Closes: https://github.com/eworm-de/routeros-scripts/pull/88 --- certs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certs/Makefile b/certs/Makefile index 870cb542..b5f6a926 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -29,4 +29,4 @@ DOMAINS = \ all: $(DOMAINS) $(DOMAINS): - curl --output /dev/null --silent --connect-timeout 5 --cacert $(notdir $@).pem https://$(dir $@) + curl --output /dev/null --silent --connect-timeout 5 --capath /dev/null --cacert $(notdir $@).pem https://$(dir $@) From fcb5347e3398dd8c77c44904a4bf0cefc57f3174 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:16:49 +0100 Subject: [PATCH 466/988] certs: split checks for dual, ipv4 & ipv6... ... and check both if available. --- certs/Makefile | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index b5f6a926..87b4feb3 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -1,32 +1,52 @@ # Makefile to check certificates -DOMAINS = \ - 1.1.1.1/DigiCert-Global-Root-G2 \ - 8.8.8.8/GTS-Root-R1 \ - 9.9.9.9/DigiCert-Global-Root-G3 \ +CURL = curl \ + --capath /dev/null \ + --connect-timeout 5 \ + --output /dev/null \ + --silent + +DOMAINS_DUAL = \ api.macvendors.com/GTS-Root-R4 \ - api.mullvad.net/ISRG-Root-X1 \ api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ cloudflare-dns.com/DigiCert-Global-Root-G2 \ dns.google/GTS-Root-R1 \ dns.quad9.net/DigiCert-Global-Root-G3 \ - feodotracker.abuse.ch/GlobalSign \ git.eworm.de/ISRG-Root-X2 \ - ipv4.showipv6.de/ISRG-Root-X1 \ - ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ - ipv6.showipv6.de/ISRG-Root-X1 \ lists.blocklist.de/Certum-Trusted-Network-CA \ matrix.org/GTS-Root-R4 \ + raw.githubusercontent.com/DigiCert-Global-Root-G2 \ + rsc.eworm.de/ISRG-Root-X2 \ + upgrade.mikrotik.com/ISRG-Root-X1 +DOMAINS_IPV4 = \ + 1.1.1.1/DigiCert-Global-Root-G2 \ + 8.8.8.8/GTS-Root-R1 \ + 9.9.9.9/DigiCert-Global-Root-G3 \ + api.mullvad.net/ISRG-Root-X1 \ + feodotracker.abuse.ch/GlobalSign \ + ipv4.showipv6.de/ISRG-Root-X1 \ + ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ sslbl.abuse.ch/GlobalSign \ - upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ www.spamhaus.org/GTS-Root-R4 +DOMAINS_IPV6 = \ + [2606\:4700\:4700\:\:1111]/DigiCert-Global-Root-G2 \ + [2001\:4860\:4860\:\:8888]/GTS-Root-R1 \ + [2620\:fe\:\:9]/DigiCert-Global-Root-G3 \ + ipv6.showipv6.de/ISRG-Root-X1 -.PHONY: $(DOMAINS) +.PHONY: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) -all: $(DOMAINS) +all: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) -$(DOMAINS): - curl --output /dev/null --silent --connect-timeout 5 --capath /dev/null --cacert $(notdir $@).pem https://$(dir $@) +$(DOMAINS_DUAL): + $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) + $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) + +$(DOMAINS_IPV4): + $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) + +$(DOMAINS_IPV6): + $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) From 87fb70534f8d86509505185f787118c64b3924ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:25:55 +0100 Subject: [PATCH 467/988] certs: support checking ipv4 or ipv6 only Just run for IPv4 only: make NOIPV6=1 ... or for IPv6 only: make NOIPV4=1 --- certs/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/certs/Makefile b/certs/Makefile index 87b4feb3..5dfb0d10 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -42,11 +42,19 @@ DOMAINS_IPV6 = \ all: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) $(DOMAINS_DUAL): +ifndef NOIPV4 $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) +endif +ifndef NOIPV6 $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) +endif $(DOMAINS_IPV4): +ifndef NOIPV4 $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) +endif $(DOMAINS_IPV6): +ifndef NOIPV6 $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) +endif From 0eb91b6bfa8e22f24f0be8052ae2b93c0114ae59 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:30:57 +0100 Subject: [PATCH 468/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index ed1d6faa..ef1bd8bf 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -22,6 +22,7 @@ for details! * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) +* [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) * [Stefan Müller](mailto:stefan.mueller.83@gmail.com) (@PackElend) From 44d0c852f11cce04139a25613822f103e39e06b1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 11:39:51 +0100 Subject: [PATCH 469/988] check-certificates: try with "star." for renewal with wildcards --- check-certificates.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 4271e00b..a61cf81f 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -158,6 +158,10 @@ :if ($ImportSuccess = false) do={ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ + :set LastName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + } } } :if ($ImportSuccess = false) do={ :error false; } From 75e5ddec527ac505540306ca5b26b7c40cdb1b5d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 13:09:22 +0100 Subject: [PATCH 470/988] check-certificates: do not rename the wrong certificate --- check-certificates.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index a61cf81f..2900a834 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -68,8 +68,10 @@ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); } - :foreach CertInChain in=[ /certificate/find where name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ - common-name!=$Name !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) !(common-name=[]) ] do={ + :foreach CertInChain in=[ /certificate/find where common-name!=$Name !private-key \ + name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ + !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) \ + !(common-name=[]) ] do={ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } From eabe3f6e951010ff9c112d82ee27bc39e3786960 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 21:33:57 +0100 Subject: [PATCH 471/988] check-certificates: pass real and modified name into function --- check-certificates.rsc | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 2900a834..b9861793 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -34,7 +34,8 @@ :local CheckCertificatesDownloadImport do={ :local ScriptName [ :tostr $1 ]; - :local Name [ :tostr $2 ]; + :local CertName [ :tostr $2 ]; + :local FetchName [ :tostr $3 ]; :global CertRenewUrl; :global CertRenewPass; @@ -49,7 +50,7 @@ :local Return false; :foreach Type in={ ".pem"; ".p12" } do={ - :local CertFileName ([ $UrlEncode $Name ] . $Type); + :local CertFileName ([ $UrlEncode $FetchName ] . $Type); :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; @@ -68,9 +69,9 @@ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); } - :foreach CertInChain in=[ /certificate/find where common-name!=$Name !private-key \ + :foreach CertInChain in=[ /certificate/find where common-name!=$CertName !private-key \ name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ - !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) \ + !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $CertName ] . "(\\W|\$)")) \ !(common-name=[]) ] do={ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } @@ -145,6 +146,7 @@ :foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ :local CertVal [ /certificate/get $Cert ]; :local LastName; + :local FetchName; :do { :if ([ :len $CertRenewUrl ] = 0) do={ @@ -155,14 +157,16 @@ :local ImportSuccess false; :set LastName ($CertVal->"common-name"); - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName $LastName; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; :foreach SAN in=($CertVal->"subject-alt-name") do={ :if ($ImportSuccess = false) do={ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName $LastName; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ - :set LastName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; } } } @@ -174,7 +178,7 @@ } else={ $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced."); - :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ + :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $FetchName ] ] . "\\.(p12|pem)_[0-9]+\$") \ (common-name=($CertVal->"common-name") or subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $LastName ] . "(\\W|\$)")) \ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; From 3ad7ccd3d6c443bf64156ffcd980a418584c35d1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Feb 2025 10:05:35 +0100 Subject: [PATCH 472/988] check-certificates: check to characters for star-dot --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index b9861793..34e7537c 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -164,7 +164,7 @@ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; :set FetchName $LastName; :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; - :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ + :if ($ImportSuccess = false && [ :pick $LastName 0 2 ] = "*.") do={ :set FetchName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; } From 61f3c26199b4c22ae312a09f6c82f8e9cc403dd0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Feb 2025 14:35:47 +0100 Subject: [PATCH 473/988] doc/check-health: highligh note on bad initial state --- doc/check-health.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/check-health.md b/doc/check-health.md index 578ea437..a9453714 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -26,14 +26,16 @@ health related events: * power supply failed or recovered * temperature is above or below threshold -Note that bad initial state will not trigger an event. - Monitoring CPU and RAM utilization (available processing and memory resources) works on all devices. Other than that only sensors available in hardware can be checked. See what your hardware supports: /system/health/print; +> ⚠️ **Warning**: Note that bad initial state will not trigger an event! For +> example rebooting a device that is already too hot will not trigger an +> alert on high temperature. + ### Sample notifications #### CPU utilization From 3024b246b58fa106592c7f6f949e421e15edcdb3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 12:02:31 +0100 Subject: [PATCH 474/988] check-health: remove extra line break --- check-health.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 31bd6c24..76de4cb4 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -91,7 +91,6 @@ :set CheckHealthTemperatureNotified ({}); } - :foreach Voltage in=[ /system/health/find where type="V" ] do={ :local Name [ /system/health/get $Voltage name ]; :local Value [ /system/health/get $Voltage value ]; From bfe5f20920a90fc54b7b25a238a1763fa6f2d5e7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 15:08:37 +0100 Subject: [PATCH 475/988] check-health: remove trailing whitespaces --- check-health.rsc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 76de4cb4..34c508c2 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -107,16 +107,16 @@ message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ [ $FormatLine "new value" ($Value . " V") 12 ]) }); - } else={ - :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); - } - :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); + } else={ + :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); + } + :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); } } } From 6501c98c822af958588512c374474f16bac61493 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:36:15 +0100 Subject: [PATCH 476/988] certs: dns.google switched to 'GTS Root R4' Note that 8.8.8.8 is still at 'GTS Root R1'... --- certs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certs/Makefile b/certs/Makefile index 5dfb0d10..ba25303b 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -10,7 +10,7 @@ DOMAINS_DUAL = \ api.macvendors.com/GTS-Root-R4 \ api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ cloudflare-dns.com/DigiCert-Global-Root-G2 \ - dns.google/GTS-Root-R1 \ + dns.google/GTS-Root-R4 \ dns.quad9.net/DigiCert-Global-Root-G3 \ git.eworm.de/ISRG-Root-X2 \ lists.blocklist.de/Certum-Trusted-Network-CA \ From 27c92b4382f961ad427313f6a0bfc01716e805d1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:51:42 +0100 Subject: [PATCH 477/988] doc/netwatch-dns: switch exmample to cloudflare-dns.com --- doc/netwatch-dns.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 6d2c8651..aa4e91f6 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -53,8 +53,8 @@ Note that using a name in DoH url may introduce a chicken-and-egg issue! Adding a static DNS record has the same result for the url, but always resolves to the same address. - /ip/dns/static/add name="dns.nextdns.io" address=199.247.16.158; - /tool/netwatch/add comment="doh" host=199.247.16.158; + /ip/dns/static/add name="cloudflare-dns.com" address=1.1.1.1; + /tool/netwatch/add comment="doh" host=1.1.1.1; Be aware that you have to keep the ip address in sync with real world manually! From 84ba3a463a46876f3e728326034d404d02aefb67 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:55:41 +0100 Subject: [PATCH 478/988] doc/netwatch-dns: warn on different certificate... ... based on indicated server name. Currently this is true for 8.8.8.8 (GTS Root R1) and dns.google (GTS Root R4). --- doc/netwatch-dns.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index aa4e91f6..0d949182 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -66,6 +66,10 @@ Importing a certificate automatically is possible. You may want to find the /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; +> ⚠️ **Warning**: Combining these techniques can cause some confusion and +> troubles! Chances are that a service uses different certificates based +> on indicated server name. + Sometimes using just one specific (possibly internal) DNS server may be desired, with fallback in case it fails. This is possible as well: From 23d38927bcd553229d1cd80bff0d3506ab40f6fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 12:27:35 +0100 Subject: [PATCH 479/988] check-health: split off plugins... ... from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically. --- check-health.d/state.rsc | 48 ++++++++ check-health.d/temperature.rsc | 74 ++++++++++++ check-health.d/voltage.rsc | 63 ++++++++++ check-health.rsc | 108 +++--------------- ...l.avif => notification-08-state-fail.avif} | Bin ...-ok.avif => notification-09-state-ok.avif} | Bin doc/check-health.md | 42 +++++-- global-functions.rsc | 2 +- news-and-changes.rsc | 2 + 9 files changed, 239 insertions(+), 100 deletions(-) create mode 100644 check-health.d/state.rsc create mode 100644 check-health.d/temperature.rsc create mode 100644 check-health.d/voltage.rsc rename doc/check-health.d/{notification-08-psu-fail.avif => notification-08-state-fail.avif} (100%) rename doc/check-health.d/{notification-09-psu-ok.avif => notification-09-state-ok.avif} (100%) diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc new file mode 100644 index 00000000..bcc1fbcc --- /dev/null +++ b/check-health.d/state.rsc @@ -0,0 +1,48 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/state +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - state plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global Identity; + + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="" name~"-state\$"] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any state health values."); + :return false; + } + + :foreach State in=[ /system/health/find where type="" name~"-state\$" ] do={ + :local Name [ /system/health/get $State name ]; + :local Value [ /system/health/get $State value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :if ($CheckHealthLast->$Name = "ok" && \ + $Value != "ok") do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ + message=("The device '" . $Name . "' on " . $Identity . " failed!") }); + } + :if ($CheckHealthLast->$Name != "ok" && \ + $Value = "ok") do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ + message=("The device '" . $Name . "' on " . $Identity . " recovered!") }); + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc new file mode 100644 index 00000000..9b847821 --- /dev/null +++ b/check-health.d/temperature.rsc @@ -0,0 +1,74 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/temperature +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - temperature plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global CheckHealthTemperature; + :global CheckHealthTemperatureDeviation; + :global CheckHealthTemperatureNotified; + :global Identity; + + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="C" ] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any voltage health values."); + :return false; + } + + :local TempToNum do={ + :global CharacterReplace; + :local T [ :toarray [ $CharacterReplace $1 "." "," ] ]; + :return ($T->0 * 10 + $T->1); + } + + :if ([ :typeof $CheckHealthTemperatureNotified ] != "array") do={ + :set CheckHealthTemperatureNotified ({}); + } + + :foreach Temperature in=[ /system/health/find where type="C" ] do={ + :local Name [ /system/health/get $Temperature name ]; + :local Value [ /system/health/get $Temperature value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :if ([ :typeof ($CheckHealthTemperature->$Name) ] != "num" ) do={ + $LogPrint info $FuncName ("No threshold given for " . $Name . ", assuming 50C."); + :set ($CheckHealthTemperature->$Name) 50; + } + :local Validate [ /system/health/get [ find where name=$Name ] value ]; + :while ($Value != $Validate) do={ + :set Value $Validate; + :set Validate [ /system/health/get [ find where name=$Name ] value ]; + } + :if ($Value > $CheckHealthTemperature->$Name && \ + $CheckHealthTemperatureNotified->$Name != true) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ + $Value . "\C2\B0" . "C") }); + :set ($CheckHealthTemperatureNotified->$Name) true; + } + :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ + $CheckHealthTemperatureNotified->$Name = true) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ + $Value . "\C2\B0" . "C") }); + :set ($CheckHealthTemperatureNotified->$Name) false; + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc new file mode 100644 index 00000000..6394795f --- /dev/null +++ b/check-health.d/voltage.rsc @@ -0,0 +1,63 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/voltage +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - voltage plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global CheckHealthVoltageLow; + :global CheckHealthVoltagePercent; + :global Identity; + + :global FormatLine; + :global IfThenElse; + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="V" ] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any voltage health values."); + :return false; + } + + :foreach Voltage in=[ /system/health/find where type="V" ] do={ + :local Name [ /system/health/get $Voltage name ]; + :local Value [ /system/health/get $Voltage value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :local NumCurr [ $TempToNum $Value ]; + :local NumLast [ $TempToNum ($CheckHealthLast->$Name) ]; + + :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ + $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ + $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ + [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ + [ $FormatLine "new value" ($Value . " V") 12 ]) }); + } else={ + :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); + } + :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); + } + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.rsc b/check-health.rsc index 34c508c2..827f5974 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -19,11 +19,6 @@ :global CheckHealthCPUUtilizationNotified; :global CheckHealthLast; :global CheckHealthRAMUtilizationNotified; - :global CheckHealthTemperature; - :global CheckHealthTemperatureDeviation; - :global CheckHealthTemperatureNotified; - :global CheckHealthVoltageLow; - :global CheckHealthVoltagePercent; :global Identity; :global FormatLine; @@ -33,6 +28,7 @@ :global ScriptLock; :global SendNotification2; :global SymbolForNotification; + :global ValidateSyntax; :local TempToNum do={ :global CharacterReplace; @@ -78,105 +74,37 @@ :set CheckHealthRAMUtilizationNotified false; } - :if ([ :len [ /system/health/find ] ] = 0) do={ - $LogPrint debug $ScriptName ("Your device does not provide any health values."); + :local Plugins [ /system/script/find where name~"^check-health.d/." ]; + :if ([ :len $Plugins ] = 0) do={ + $LogPrint debug $ScriptName ("No plugins installed."); :set ExitOK true; :error true; } + :global CheckHealthPlugins ({}); :if ([ :typeof $CheckHealthLast ] != "array") do={ :set CheckHealthLast ({}); } - :if ([ :typeof $CheckHealthTemperatureNotified ] != "array") do={ - :set CheckHealthTemperatureNotified ({}); - } - :foreach Voltage in=[ /system/health/find where type="V" ] do={ - :local Name [ /system/health/get $Voltage name ]; - :local Value [ /system/health/get $Voltage value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :local NumCurr [ $TempToNum $Value ]; - :local NumLast [ $TempToNum ($CheckHealthLast->$Name) ]; - - :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ - $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ - $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ - [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ - [ $FormatLine "new value" ($Value . " V") 12 ]) }); - } else={ - :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); - } - :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); - } + :foreach Plugin in=$Plugins do={ + :local PluginVal [ /system/script/get $Plugin ]; + :if ([ $ValidateSyntax ($PluginVal->"source") ] = true) do={ + :do { + /system/script/run $Plugin; + } on-error={ + $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run."); } + } else={ + $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); } - :set ($CheckHealthLast->$Name) $Value; } - :foreach PSU in=[ /system/health/find where name~"^psu.*-state\$" ] do={ - :local Name [ /system/health/get $PSU name ]; - :local Value [ /system/health/get $PSU value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :if ($CheckHealthLast->$Name = "ok" && \ - $Value != "ok") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ - message=("The power supply unit '" . $Name . "' on " . $Identity . " failed!") }); - } - :if ($CheckHealthLast->$Name != "ok" && \ - $Value = "ok") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ - message=("The power supply unit '" . $Name . "' on " . $Identity . " recovered!") }); - } - } - :set ($CheckHealthLast->$Name) $Value; + :foreach PluginName,Discard in=$CheckHealthPlugins do={ + ($CheckHealthPlugins->$PluginName) \ + ("\$CheckHealthPlugins->\"" . $PluginName . "\""); } - :foreach Temperature in=[ /system/health/find where type="C" ] do={ - :local Name [ /system/health/get $Temperature name ]; - :local Value [ /system/health/get $Temperature value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :if ([ :typeof ($CheckHealthTemperature->$Name) ] != "num" ) do={ - $LogPrint info $ScriptName ("No threshold given for " . $Name . ", assuming 50C."); - :set ($CheckHealthTemperature->$Name) 50; - } - :local Validate [ /system/health/get [ find where name=$Name ] value ]; - :while ($Value != $Validate) do={ - :set Value $Validate; - :set Validate [ /system/health/get [ find where name=$Name ] value ]; - } - :if ($Value > $CheckHealthTemperature->$Name && \ - $CheckHealthTemperatureNotified->$Name != true) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ - $Value . "\C2\B0" . "C") }); - :set ($CheckHealthTemperatureNotified->$Name) true; - } - :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ - $CheckHealthTemperatureNotified->$Name = true) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ - $Value . "\C2\B0" . "C") }); - :set ($CheckHealthTemperatureNotified->$Name) false; - } - } - :set ($CheckHealthLast->$Name) $Value; - } + :set CheckHealthPlugins; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } diff --git a/doc/check-health.d/notification-08-psu-fail.avif b/doc/check-health.d/notification-08-state-fail.avif similarity index 100% rename from doc/check-health.d/notification-08-psu-fail.avif rename to doc/check-health.d/notification-08-state-fail.avif diff --git a/doc/check-health.d/notification-09-psu-ok.avif b/doc/check-health.d/notification-09-state-ok.avif similarity index 100% rename from doc/check-health.d/notification-09-psu-ok.avif rename to doc/check-health.d/notification-09-state-ok.avif diff --git a/doc/check-health.md b/doc/check-health.md index a9453714..51e71bc3 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -17,21 +17,21 @@ Description ----------- This script is run from scheduler periodically, sending notification on -health related events: +health related events. Monitoring CPU and RAM utilization (available +processing and memory resources) works on all devices: * high CPU utilization * high RAM utilization (low available RAM) + +With additional plugins functionality can be extended, depending on +sensors available in hardware: + * voltage jumps up or down more than configured threshold * voltage drops below hard lower limit +* fan failed or recovered * power supply failed or recovered * temperature is above or below threshold -Monitoring CPU and RAM utilization (available processing and memory -resources) works on all devices. Other than that only sensors available -in hardware can be checked. See what your hardware supports: - - /system/health/print; - > ⚠️ **Warning**: Note that bad initial state will not trigger an event! For > example rebooting a device that is already too hot will not trigger an > alert on high temperature. @@ -59,8 +59,8 @@ in hardware can be checked. See what your hardware supports: #### PSU state -![check-health notification psu fail](check-health.d/notification-08-psu-fail.avif) -![check-health notification psu ok](check-health.d/notification-09-psu-ok.avif) +![check-health notification state fail](check-health.d/notification-08-state-fail.avif) +![check-health notification state ok](check-health.d/notification-09-state-ok.avif) Requirements and installation ----------------------------- @@ -74,6 +74,30 @@ Just install the script and create a scheduler: > precision of cpu utilization, escpecially on devices with limited > resources. Thus an unusual interval is used here. +### Plugins + +Additional plugins are available for sensors available in hardware. First +check what your hardware supports: + + /system/health/print; + +Then install the plugin for *fan* and *power supply unit* *state*: + + $ScriptInstallUpdate check-health,check-health.d/state; + +... or *temperature*: + + $ScriptInstallUpdate check-health,check-health.d/temperature; + +... or *voltage*: + + $ScriptInstallUpdate check-health,check-health.d/voltage; + +You can also combine the commands and install all or a subset of plugins +in one go: + + $ScriptInstallUpdate check-health,check-health.d/state,check-health.d/temperature,check-health.d/voltage; + Configuration ------------- diff --git a/global-functions.rsc b/global-functions.rsc index a2ec8338..8eb6712c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,7 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 131; +:global ExpectedConfigVersion 132; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 7508b43f..c7e566ff 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -56,6 +56,7 @@ 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; 130="Dropped intermediate certificates, depending on just root certificates now."; 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; + 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; }; # Migration steps to be applied on script updates @@ -64,4 +65,5 @@ 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; + 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; }"; }; From 7b660d095293e24bd3fedf2a00815eedec84ccf5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Feb 2025 21:24:20 +0100 Subject: [PATCH 480/988] packages-update: move configuration variables up --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index ff47b2a3..ba6d4f79 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -16,6 +16,9 @@ :do { :local ScriptName [ :jobname ]; + :global PackagesUpdateDeferReboot; + :global PackagesUpdateBackupFailure; + :global DownloadPackage; :global Grep; :global LogPrint; @@ -24,9 +27,6 @@ :global ScriptLock; :global VersionToNum; - :global PackagesUpdateDeferReboot; - :global PackagesUpdateBackupFailure; - :local Schedule do={ :local ScriptName [ :tostr $1 ]; From dafd95d44a18088771e6e0fd9b2ef115ddbcbc18 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Feb 2025 21:26:39 +0100 Subject: [PATCH 481/988] packages-update: disable random delay for backup --- packages-update.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index ba6d4f79..788edd43 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -16,6 +16,7 @@ :do { :local ScriptName [ :jobname ]; + :global BackupRandomDelay; :global PackagesUpdateDeferReboot; :global PackagesUpdateBackupFailure; @@ -79,7 +80,9 @@ :set ($RunOrder->($Store->"order" . "-" . $ScriptVal->"name")) ($ScriptVal->"name"); } + :local BackupRandomDelayBefore $BackupRandomDelay; :foreach Order,Script in=$RunOrder do={ + :set BackupRandomDelay 0; :set PackagesUpdateBackupFailure false; :do { $LogPrint info $ScriptName ("Running backup script " . $Script . " before update."); @@ -87,6 +90,7 @@ } on-error={ :set PackagesUpdateBackupFailure true; } + :set BackupRandomDelay $BackupRandomDelayBefore; :if ($PackagesUpdateBackupFailure = true) do={ $LogPrint warning $ScriptName ("Running backup script " . $Script . " before update failed!"); From dbdc3e4718f5b0ec614baa9a9a942b52cbb19ad4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:12:30 +0100 Subject: [PATCH 482/988] packages-update: ignore available packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was introduced with RouterOS 7.18beta2 to list and install available packages. We do not want to install all of them. 😝 --- packages-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index 788edd43..afec2f56 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -130,7 +130,7 @@ } } - :foreach Package in=[ /system/package/find where !bundle ] do={ + :foreach Package in=[ /system/package/find where !bundle !available ] do={ :local PkgName [ /system/package/get $Package name ]; :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); From 0fb5fd03230c2054a94d80ca72fc941e21b7f3ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:36:59 +0100 Subject: [PATCH 483/988] global-functions: $MkDir: create directory directly... ... instead of file inside directory. This requires RouterOS 7.15, so bumping requirement. --- README.md | 2 +- global-functions.rsc | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8594f58a..a76d50f7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/global-functions.rsc b/global-functions.rsc index 8eb6712c..48f1676a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # global functions @@ -895,10 +895,8 @@ } :do { - :local File ($Path . "/file"); - /file/add name=$File; - $WaitForFile $File; - /file/remove $File; + /file/add type="directory" name=$Path; + $WaitForFile $Path; } on-error={ $LogPrint warning $0 ("Making directory '" . $Path . "' failed!"); :return false; From 4542c2b19e4b74ee37c02671c05f4025946d8bf7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:16:57 +0100 Subject: [PATCH 484/988] global-functions: introduce $RmFile --- global-functions.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 48f1676a..e41d3529 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -63,6 +63,7 @@ :global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; +:global RmFile; :global ScriptFromTerminal; :global ScriptInstallUpdate; :global ScriptLock; @@ -1004,6 +1005,26 @@ :return true; } +# remove file +:set RmFile do={ + :local FileName [ :tostr $1 ]; + + :global LogPrint; + + :local File [ /file/find where name=$FileName type=file ]; + :if ([ :len $File ] = 0) do={ + :return true; + } + + :do { + /file/remove $File; + } on-error={ + $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed."); + :return false; + } + :return true; +} + # check if script is run from terminal :set ScriptFromTerminal do={ :local Script [ :tostr $1 ]; From 727495d9c4f7ff00a9d0c5dc1fd06e22ba3abe39 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:21:28 +0100 Subject: [PATCH 485/988] global-functions: introduce $RmDir --- global-functions.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index e41d3529..b7a3b6a9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -63,6 +63,7 @@ :global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; +:global RmDir; :global RmFile; :global ScriptFromTerminal; :global ScriptInstallUpdate; @@ -1005,6 +1006,26 @@ :return true; } +# remove directory +:set RmDir do={ + :local DirName [ :tostr $1 ]; + + :global LogPrint; + + :local Dir [ /file/find where name=$DirName type=directory ]; + :if ([ :len $Dir ] = 0) do={ + :return true; + } + + :do { + /file/remove $Dir; + } on-error={ + $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed."); + :return false; + } + :return true; +} + # remove file :set RmFile do={ :local FileName [ :tostr $1 ]; From 7233dea5bb9e73a93599baf17077b80758934665 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 19:24:38 +0100 Subject: [PATCH 486/988] global-functions: $RmFile: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index b7a3b6a9..50202f00 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1032,8 +1032,11 @@ :global LogPrint; + $LogPrint debug $0 ("Removing file: ". $FileName); + :local File [ /file/find where name=$FileName type=file ]; :if ([ :len $File ] = 0) do={ + $LogPrint debug $0 ("... which does not exist."); :return true; } From 49d9fb1ffddfb973bed00aac3a36bf4dd8d6687a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 19:24:05 +0100 Subject: [PATCH 487/988] global-functions: $RmDir: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 50202f00..2799f39a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1012,8 +1012,11 @@ :global LogPrint; + $LogPrint debug $0 ("Removing directory: ". $DirName); + :local Dir [ /file/find where name=$DirName type=directory ]; :if ([ :len $Dir ] = 0) do={ + $LogPrint debug $0 ("... which does not exist."); :return true; } From 4bfb591fa035a12e80edf8f2550f6237cd343cd9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:39:48 +0100 Subject: [PATCH 488/988] bump required RouterOS version for all scripts --- BRANCHES.md | 2 +- CERTIFICATES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.d/state.rsc | 2 +- check-health.d/temperature.rsc | 2 +- check-health.d/voltage.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/inspectvar.md | 2 +- doc/mod/ipcalc.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-matrix.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/notification-telegram.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mode-button.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/packages-update.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mode-button.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 108 files changed, 108 insertions(+), 108 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 5d94077b..8a0bdadf 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 589d4801..5432d78a 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -4,7 +4,7 @@ Certificate name from browser [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index ef1bd8bf..0b35c40e 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 84a88fee..424ef329 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 0c4eaaf5..27546c8d 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 353fe1fc..589815d6 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 4219014f..ccbca3df 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 3ee53d8c..527ebb4b 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index efae055f..9d760804 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upload backup to MikroTik cloud # https://rsc.eworm.de/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index f6ebad0b..d0973011 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # create and email backup and config file # https://rsc.eworm.de/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index bfa7765c..1f0cf2ee 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # save configuration to fallback partition diff --git a/backup-upload.rsc b/backup-upload.rsc index dc5120f5..533cc550 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # create and upload backup and config file diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index fa76ff5f..2726af77 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 912e2795..0a42bb25 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 3a5e7d1e..037409a8 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index abe066e8..791b3dbb 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.capsman -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index c1c7ff1e..0b1cc2ba 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 44c99db7..4afdee2e 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.wifi -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 5a4043d2..91a48dea 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # renew locally issued certificates # https://rsc.eworm.de/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index 34e7537c..25807cba 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # check for certificate validity diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index bcc1fbcc..29919359 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - state plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index 9b847821..a2f632d2 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - temperature plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 6394795f..9071c886 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - voltage plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.rsc b/check-health.rsc index 827f5974..f02a2491 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state # https://rsc.eworm.de/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 562b8fe6..c5b6cb56 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for LTE firmware upgrade, send notification # https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 5c9b392f..361be34e 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # check for RouterOS update, send notification and/or install diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index f718e0bc..17e09e3c 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 00178752..4a38bfa4 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 527e9851..da901be2 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 5f9de7d2..cb217ce1 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 38039637..36b31c85 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index d5f14613..35dc6f68 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 2bddc268..47a85542 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 515b4384..e0f97851 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index a6302f5a..e4d0c7fa 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index d6587609..72869606 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index aedae4d8..7b8bcfec 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 9f62967b..9d615a53 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index f2858b29..6a5b0e4f 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index d7199347..57222272 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index f366d403..d277db67 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 096e07b9..c4615b5e 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 4188815b..4c144ba3 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index 51e71bc3..7cf0c33e 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 66b2cf57..3693b712 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 2e9b8aa2..926b4aaa 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 84c111d6..01975223 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 6a4c930a..b02f1993 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index 7ab6ac57..54f1da00 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index 6787d209..799cae78 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 9685899f..5e4878f5 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 07d07dc8..a2e97483 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index ddbcc0a7..f9f98e32 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index a688e809..123656ca 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 42f0fe4c..1f009b15 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index 1b59ff7a..f83c3833 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index c01472e2..a194396f 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 55b15405..25be00a7 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 2ed9dc7d..629c5263 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index ded26039..cf291995 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 4e2f4c1d..7daba153 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index 9f394293..c07853e5 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 0bef4553..34d1c09e 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index fbc9b912..89c1b01d 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -4,7 +4,7 @@ Send notifications via Matrix [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 04dee355..51756ace 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index f55f936d..b85d09ce 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -4,7 +4,7 @@ Send notifications via Telegram [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 0127c6d3..955d12ed 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 7feb19fa..be15bc92 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index 23248b5b..3694d35c 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/packages-update.md b/doc/packages-update.md index 8b0d4a31..75225fe2 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -4,7 +4,7 @@ Manage system update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 7902f3bb..305afc1d 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index 5de7f0d7..b696c85e 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 8e7417b8..ccb6482b 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index 2ffb25b3..c72f2209 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index e9a888c3..cb96aa15 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index 7e101c4a..de9f622e 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 126d470b..ee0fe987 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index e3d62def..86a9a8c5 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # install firmware upgrade, and reboot # https://rsc.eworm.de/doc/firmware-upgrade-reboot.md diff --git a/global-wait.rsc b/global-wait.rsc index bc984622..ca3fc0c4 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # wait for global-functions to finish # https://rsc.eworm.de/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index 5e35f8da..dea56d2e 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # track gps data by sending json data to http server diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index c21ec3ea..033d0e73 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 1bd877e9..0f8c490e 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 8e362048..dfec697d 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index de9f9d9a..3f514750 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 003b12e2..068241d1 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 0d6a7b96..cc5e2fc6 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 91f6b45e..26dab0a2 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, ipsec # # and add/remove/update DNS entries from IPSec mode-config diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 7eb625b2..c6e3d653 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update firewall and dns settings on IPv6 prefix change # https://rsc.eworm.de/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index b6ceac96..bf27fda8 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run scripts on DHCP lease # https://rsc.eworm.de/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index 379fa54e..58ec9564 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # forward log messages via notification # https://rsc.eworm.de/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index f00e10b1..39a036e5 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # reset bridge ports to default bridge # https://rsc.eworm.de/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 62e71e38..0eeb9b5f 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # manage VLANs on bridge ports # https://rsc.eworm.de/doc/mod/bridge-port-vlan.md diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 0f05da72..c8615573 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # inspect variables # https://rsc.eworm.de/doc/mod/inspectvar.md diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index fbed74b5..477cf4a8 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # ip address calculation # https://rsc.eworm.de/doc/mod/ipcalc.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 404e74db..7b89d985 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, email, scheduler # # send notifications via e-mail diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 9b2b641c..e989ee04 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -4,7 +4,7 @@ # Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Matrix diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 212fde2e..aac6d6c1 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Ntfy (ntfy.sh) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index c3ef2dd3..23ef942e 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Telegram diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index e5368c45..b158c9ca 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # download script and run it once diff --git a/mode-button.rsc b/mode-button.rsc index 4cf5e754..edc5f400 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # act on multiple mode and reset button presses diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 9d822c15..a8662b32 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # visualize ospf instance state via leds # https://rsc.eworm.de/doc/ospf-to-leds.md diff --git a/packages-update.rsc b/packages-update.rsc index afec2f56..b11596ea 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # download packages and reboot for installation diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 85e96896..e09bd9d5 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run scripts on ppp up # https://rsc.eworm.de/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 34d21272..3c8307a8 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run action on received SMS # https://rsc.eworm.de/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index 654fd564..8169022c 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # forward SMS to e-mail # https://rsc.eworm.de/doc/sms-forward.md diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 74495d1a..83925fd9 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # schedule unattended lte firmware upgrade diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 6b169a00..cddfa92f 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index a58589b8..45afa6f8 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # update local address of tunnelbroker interface From a8e5b5226bc6a11a0ccbca0f3becc85f9f4904e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 11:04:09 +0100 Subject: [PATCH 489/988] global-functions: $RmFile: fail on wrong type --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 2799f39a..ac37deeb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1037,6 +1037,11 @@ $LogPrint debug $0 ("Removing file: ". $FileName); + :if ([ :len [ /file/find where name=$FileName type!=file ] ] > 0) do={ + $LogPrint error $0 ("File '" . $FileName . "' is not a file."); + :return false; + } + :local File [ /file/find where name=$FileName type=file ]; :if ([ :len $File ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); From 82020ddd73163194eb75aaa6f57d8e41597a7e6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 11:03:34 +0100 Subject: [PATCH 490/988] global-functions: $RmDir: fail on wrong type --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index ac37deeb..cf278eb1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1014,6 +1014,11 @@ $LogPrint debug $0 ("Removing directory: ". $DirName); + :if ([ :len [ /file/find where name=$DirName type!=directory ] ] > 0) do={ + $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); + :return false; + } + :local Dir [ /file/find where name=$DirName type=directory ]; :if ([ :len $Dir ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); From dbdf2952443ada35695925628999db4ddbe80be0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:33:35 +0100 Subject: [PATCH 491/988] global-functions: $CertificateDownload: use $RmFile --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index cf278eb1..782c1a32 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -149,6 +149,7 @@ :global CleanName; :global FetchUserAgentStr; :global LogPrint; + :global RmFile; :global WaitForFile; $LogPrint info $0 ("Downloading and importing certificate with " . \ @@ -172,7 +173,7 @@ dst-path=$FileName as-value; $WaitForFile $FileName; :if ([ /file/get $FileName size ] = 0) do={ - /file/remove $FileName; + $RmFile $FileName; :error false; } } on-error={ @@ -183,7 +184,7 @@ /certificate/import file-name=$FileName passphrase="" as-value; :delay 1s; - /file/remove [ find where name=$FileName ]; + $RmFile $FileName; :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ /certificate/remove [ find where name~("^" . $FileName . "_[0-9]+\$") ]; From ea8ec6b580071d832df28fd78a9e3c4c07a17bef Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:35:39 +0100 Subject: [PATCH 492/988] global-functions: $DownloadPackage: use $RmFile --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 782c1a32..b19ec56b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -343,6 +343,7 @@ :global CleanFilePath; :global LogPrint; :global MkDir; + :global RmFile; :global WaitForFile; :if ([ :len $PkgName ] = 0) do={ :return false; } @@ -386,7 +387,7 @@ $LogPrint debug $0 ("Downloading package file failed."); } - /file/remove [ find where name=$PkgDest ]; + $RmFile $PkgDest; :set Retry ($Retry - 1); } From d19b90df08dd179163c501a08d53eaf15bc53f15 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:37:01 +0100 Subject: [PATCH 493/988] global-functions: $FetchHuge: use $RmFile --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index b19ec56b..ab6610e1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -457,6 +457,7 @@ :global IfThenElse; :global LogPrint; :global MkDir; + :global RmFile; :global WaitForFile; :set CheckCert [ $IfThenElse ($CheckCert = "false") "no" "yes-without-crl" ]; @@ -473,7 +474,7 @@ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ :if ([ $WaitForFile $FileName 500ms ] = true) do={ - /file/remove $FileName; + $RmFile $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); /file/remove $DirName; From 4760515add1f753af7596245eb1a6c560ea37031 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:38:09 +0100 Subject: [PATCH 494/988] global-functions: $FetchHuge: use $RmDir --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ab6610e1..e680b60b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -457,6 +457,7 @@ :global IfThenElse; :global LogPrint; :global MkDir; + :global RmDir; :global RmFile; :global WaitForFile; @@ -477,7 +478,7 @@ $RmFile $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); - /file/remove $DirName; + $RmDir $DirName; :return false; } $WaitForFile $FileName; @@ -493,7 +494,7 @@ :delay 100ms; } } - /file/remove $DirName; + $RmDir $DirName; :return $Return; } From f5f00b70e325d80db939dcc2aa885b80845566fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:41:58 +0100 Subject: [PATCH 495/988] global-functions: $MkDir: use $RmDir --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index e680b60b..4b1f63dc 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -857,6 +857,7 @@ :global CleanFilePath; :global LogPrint; + :global RmDir; :global WaitForFile; :local MkTmpfs do={ @@ -873,7 +874,7 @@ } $LogPrint info $0 ("Creating disk of type tmpfs."); - /file/remove [ find where name="tmpfs" type="directory" ]; + $RmDir "tmpfs"; :do { /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/get total-memory ] / 3); $WaitForFile "tmpfs"; From d748b69142a8b2b2d4328ef0e07dabe01fdbc01e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:13:43 +0100 Subject: [PATCH 496/988] backup-cloud: use $RmDir --- backup-cloud.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 9d760804..c4e23b2a 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -26,6 +26,7 @@ :global LogPrint; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -97,7 +98,7 @@ $LogPrint error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!"); :set PackagesUpdateBackupFailure true; } - /file/remove "tmpfs/backup-cloud"; + $RmDir "tmpfs/backup-cloud"; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } From 81ba47a07d97a4cc36fc020cf35de7656e2abbb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:10:46 +0100 Subject: [PATCH 497/988] backup-upload: use $RmDir --- backup-upload.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 533cc550..7f15a86e 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -35,6 +35,7 @@ :global LogPrint; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -170,7 +171,7 @@ :if ($Failed = 1) do={ :set PackagesUpdateBackupFailure true; } - /file/remove $DirName; + $RmDir $DirName; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } From 88ff03136805f40f14bb5d39af370c0ace62c4e7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:10:05 +0100 Subject: [PATCH 498/988] backup-upload: use $RmFile --- backup-upload.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 7f15a86e..14c39141 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -36,6 +36,7 @@ :global MkDir; :global RandomDelay; :global RmDir; + :global RmFile; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -100,7 +101,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".backup"); + $RmFile ($FilePath . ".backup"); } # create configuration export @@ -119,7 +120,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".rsc"); + $RmFile ($FilePath . ".rsc"); } # global-config-overlay @@ -140,7 +141,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".conf"); + $RmFile ($FilePath . ".conf"); } :local FileInfo do={ From 63db96bdccc9c9c1356e71683157383322b40285 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:06:33 +0100 Subject: [PATCH 499/988] capsman-download-packages: use $RmFile --- capsman-download-packages.capsman.rsc | 3 ++- capsman-download-packages.template.rsc | 3 ++- capsman-download-packages.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 2726af77..4387cb15 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -22,6 +22,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -61,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 0a42bb25..744494e5 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -23,6 +23,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -63,7 +64,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 037409a8..a0c5e121 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -22,6 +22,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -61,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } From 6570a84904bcdd6d74090944f0fc94d1b94add90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:08:40 +0100 Subject: [PATCH 500/988] check-certificates: use $RmFile --- check-certificates.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 25807cba..09073953 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -44,6 +44,7 @@ :global EscapeForRegEx; :global FetchUserAgentStr; :global LogPrint; + :global RmFile; :global UrlEncode; :global WaitForFile; @@ -63,7 +64,7 @@ :set DecryptionFailed false; } } - /file/remove [ find where name=$CertFileName ]; + $RmFile $CertFileName; :if ($DecryptionFailed = true) do={ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); From 0fea300feaaaf8f3c87facb99e04126753713c76 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:12:51 +0100 Subject: [PATCH 501/988] mod/ssh-keys-import: use $RmDir --- mod/ssh-keys-import.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 35aa7ec9..2fae4b13 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -19,6 +19,7 @@ :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; + :global RmDir; :global WaitForFile; :if ([ :len $Key ] = 0 || [ :len $User ] = 0) do={ @@ -58,10 +59,10 @@ /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 . "'."); - /file/remove "tmpfs/ssh-keys-import"; + $RmDir "tmpfs/ssh-keys-import"; } on-error={ $LogPrint warning $0 ("Failed importing key."); - /file/remove "tmpfs/ssh-keys-import"; + $RmDir "tmpfs/ssh-keys-import"; :return false; } } on-error={ From b156fc43cfde99935eb78d95c6a5eae35b8f70f1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:14:58 +0100 Subject: [PATCH 502/988] telegram-chat: use $RmDir --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 8f29d8c0..10952a6a 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -37,6 +37,7 @@ :global MIN; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptLock; :global SendTelegram2; :global SymbolForNotification; @@ -154,7 +155,7 @@ $State . [ $IfThenElse ([ :len $Content ] > 0) \ ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) \ ([ $SymbolForNotification "memo" ] . "No output.") ]) }); - /file/remove "tmpfs/telegram-chat"; + $RmDir "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ From fc3beac83b8a6fd35a7b3736759f15bb8b71a723 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 08:42:17 +0100 Subject: [PATCH 503/988] log-forward: make empty string a special meaning --- global-config.rsc | 10 +++++----- log-forward.rsc | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index df26ef97..5df7b345 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -119,17 +119,17 @@ :global FwAddrListTimeOut 1d; # This defines what log messages to filter or include by topic or message -# text. Regular expressions are supported. Do *NOT* set an empty string, -# that will filter or include everything! +# text. Regular expressions are supported. An empty string has a special +# meaning not to filter or include anything. # These are filters, so excluding messages from forwarding. :global LogForwardFilter "(debug|info|packet|raw)"; -:global LogForwardFilterMessage []; +:global LogForwardFilterMessage ""; #:global LogForwardFilterMessage "message text"; #:global LogForwardFilterMessage "(message text|another text|...)"; # ... and another setting with reverse logic. This includes messages even # if filtered above. -:global LogForwardInclude []; -:global LogForwardIncludeMessage []; +:global LogForwardInclude ""; +:global LogForwardIncludeMessage ""; #:global LogForwardInclude "account"; #:global LogForwardIncludeMessage "message text"; diff --git a/log-forward.rsc b/log-forward.rsc index 58ec9564..afeb3f29 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -57,6 +57,11 @@ :local MessageVal; :local MessageDups ({}); + :set LogForwardFilter [ $EitherOr $LogForwardFilter [] ]; + :set LogForwardFilterMessage [ $EitherOr $LogForwardFilterMessage [] ]; + :set LogForwardInclude [ $EitherOr $LogForwardInclude [] ]; + :set LogForwardIncludeMessage [ $EitherOr $LogForwardIncludeMessage [] ]; + :local LogForwardFilterLogForwardingCached [ $EitherOr [ $LogForwardFilterLogForwarding ] ("\$^") ]; :foreach Message in=[ /log/find where (!(message="") and \ !(message~$LogForwardFilterLogForwardingCached) and \ From 2e42f7963c2186512c4fa2cd75de7ab07754f229 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 08:45:25 +0100 Subject: [PATCH 504/988] mod/notification-ntfy: use empty strings as default... ... which should be fine now that the credentials are not passed with fetch's properties, but as properly formatted authentication header. --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 5df7b345..b0f0c643 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -56,9 +56,9 @@ # install the module: # $ScriptInstallUpdate mod/notification-ntfy :global NtfyServer "ntfy.sh"; -:global NtfyServerUser []; -:global NtfyServerPass []; -:global NtfyServerToken []; +:global NtfyServerUser ""; +:global NtfyServerPass ""; +:global NtfyServerToken ""; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting From da280586b5012feb576cd7cd3e911d00ac7bf63e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 14:00:37 +0100 Subject: [PATCH 505/988] doc/log-forward: add a hint on defaults --- doc/log-forward.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/log-forward.md b/doc/log-forward.md index 25be00a7..93f6a7dd 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -53,6 +53,12 @@ Just install the script: Configuration ------------- +The default configuration should provide reasonable presets, filtering +*info*, and effectively forwarding *warning* and *error*. + +> 💡️ **Hint**: Please try with defaults first, especially if you are not +> familiar with regular expressions! + The configuration goes to `global-config-overlay`, these are the parameters: * `LogForwardFilter`: define topics *not* to be forwarded From 8af67af462369968238afe874a24c26141b0b5c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 14:08:06 +0100 Subject: [PATCH 506/988] doc/log-forward: mention ntfy --- doc/log-forward.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/log-forward.md b/doc/log-forward.md index 93f6a7dd..3c195694 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -22,15 +22,15 @@ server (see `/system/logging`). This has some limitation, however: * does not work early after boot if network connectivity is not yet established, or breaks intermittently * lots of messages generate a flood of mails -* Matrix and Telegram are not supported +* Matrix, Ntfy and Telegram are not supported The script works around the limitations, for example it does: * read from `/log`, including messages from early boot * skip multi-repeated messages * rate-limit itself to mitigate flooding -* forward via notification (which includes *e-mail*, *Matrix* and *Telegram* - when installed and configured, see below) +* forward via notification (which includes *e-mail*, *Matrix*, *Ntfy* and + *Telegram* when installed and configured, see below) It is intended to be run periodically from scheduler, then collects new log messages and forwards them via notification. From 4d0b4a1ff4137ae0b5508fb16428ac4da7205410 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 14:30:14 +0100 Subject: [PATCH 507/988] fw-addr-lists: these lists are deprecated and discontinued Any alternatives around? --- certs/GlobalSign.pem | 28 ---------------------------- certs/Makefile | 2 -- doc/fw-addr-lists.md | 6 +++--- global-config.rsc | 4 ---- 4 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 certs/GlobalSign.pem diff --git a/certs/GlobalSign.pem b/certs/GlobalSign.pem deleted file mode 100644 index 47035e48..00000000 --- a/certs/GlobalSign.pem +++ /dev/null @@ -1,28 +0,0 @@ -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- diff --git a/certs/Makefile b/certs/Makefile index ba25303b..4e252b4a 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -23,12 +23,10 @@ DOMAINS_IPV4 = \ 8.8.8.8/GTS-Root-R1 \ 9.9.9.9/DigiCert-Global-Root-G3 \ api.mullvad.net/ISRG-Root-X1 \ - feodotracker.abuse.ch/GlobalSign \ ipv4.showipv6.de/ISRG-Root-X1 \ ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ - sslbl.abuse.ch/GlobalSign \ www.dshield.org/ISRG-Root-X1 \ www.spamhaus.org/GTS-Root-R4 DOMAINS_IPV6 = \ diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index f581fd29..b888d4be 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,9 +19,9 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains -lists from [abuse.ch](https://abuse.ch/), [dshield.org](https://dshield.org/) -and [blocklist.de](https://www.blocklist.de/), and -lists from [spamhaus.org](https://spamhaus.org/) are prepared. +lists from [dshield.org](https://dshield.org/) and +[blocklist.de](https://www.blocklist.de/), and lists from +[spamhaus.org](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not see situation when the lists are not populated. diff --git a/global-config.rsc b/global-config.rsc index b0f0c643..2be47524 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -98,10 +98,6 @@ "block"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; - { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; - cert="GlobalSign" }; - { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; - cert="GlobalSign" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From e1c561dd91dff9ad7c6bdd1e3496e126a8ac8b2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 14:56:43 +0100 Subject: [PATCH 508/988] global-functions: $MkDir: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 4b1f63dc..645ce3cf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -891,7 +891,10 @@ :return true; } + $LogPrint debug $0 ("Making directory: " . $Path); + :if ([ :len [ /file/find where name=$Path type="directory" ] ] = 1) do={ + $LogPrint debug $0 ("... which already exists."); :return true; } From d41f7585504b592938da5ea0fc68870d1f68c0f5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 15:32:05 +0100 Subject: [PATCH 509/988] introduce DEBUG info --- DEBUG.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 DEBUG.md diff --git a/DEBUG.md b/DEBUG.md new file mode 100644 index 00000000..3d7f0258 --- /dev/null +++ b/DEBUG.md @@ -0,0 +1,49 @@ +Debug output and logs +===================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](README.md) + +Sometimes scripts do not behave as expected. In these cases debug output +or logs can help. + +## Debug output + +Run this command in a terminal: + + :set PrintDebug true; + +You will then see debug output when running the script from terminal. + +To revert to default output run: + + :set PrintDebug false; + +### Debug output for specific script + +Even having debug output for a specific script or function only (or a +set of) is possible. To enable debug output for `telegram-chat` run: + + :set ($PrintDebugOverride->"telegram-chat") true; + +## Debug logs + +The debug info can go to system log. To make it show up in `memory` run: + + /system/logging/add topics=script,debug action=memory; + +Other actions (`disk`, `email`, `remote` or `support`) can be used as +well. I do not recommend using `echo` - use [debug output](#debug-output) +instead. + +Disable or remote that setting to restore regular logging. + +--- +[⬅️ Go back to main README](README.md) +[⬆️ Go back to top](#top) From c8759381e90408a01dd842e837724b77f2d8c237 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 19:14:42 +0100 Subject: [PATCH 510/988] global-functions: $WaitForFile: check that we can get properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looks like RouterOS 7.18beta2 brings more breakage. Having a file available in listing is just the first step now. We also need to make sure that the file properties are accessible... 🤪 I have seen this taking several tens of seconds at least... 🤪🤪 So let's just try until we have properties available, or the file vanishes. Reported as SUP-179200. 🤞 --- global-functions.rsc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 645ce3cf..13dca64c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1669,6 +1669,7 @@ :global CleanFilePath; :global EitherOr; + :global LogPrintOnce; :global MAX; :set FileName [ $CleanFilePath $FileName ]; @@ -1682,7 +1683,20 @@ :delay $Delay; :set I ($I + 1); } - :return true; + + :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ + :do { + /file/get $FileName; + :return true; + } on-error={ + $LogPrintOnce warning $0 \ + ("Hit the infamous file handling breakage (SUP-179200) introduced with RouterOS 7.18beta2..."); + } + :delay $Delay; + :set Delay ($Delay * 3 / 2); + } + + :return false; } # wait to be fully connected (default route is reachable, time is sync, DNS resolves) From df631b987d86b3b20cd55de9a005b13703576784 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 12:13:17 +0100 Subject: [PATCH 511/988] fw-addr-lists: add a collective list in default configuration --- doc/fw-addr-lists.md | 3 ++- global-config.rsc | 4 ++++ global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index b888d4be..cb560d74 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -18,7 +18,8 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control -servers and similar malicious entities. The default configuration contains +servers and similar malicious entities. The default configuration contains a +[collective list by GitHub user @stamparm](https://github.com/stamparm/ipsum), lists from [dshield.org](https://dshield.org/) and [blocklist.de](https://www.blocklist.de/), and lists from [spamhaus.org](https://spamhaus.org/) are prepared. diff --git a/global-config.rsc b/global-config.rsc index 2be47524..b364a253 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -90,6 +90,7 @@ :global BackupPartitionCopyBeforeFeatureUpdate false; # This defines the settings for firewall address-lists (fw-addr-lists). +# Warning: Mind your device's resources - memory and processing! :global FwAddrLists { # "allow"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/allow"; @@ -98,6 +99,9 @@ "block"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; + { url="https://raw.githubusercontent.com/stamparm/ipsum/refs/heads/master/levels/4.txt"; +# # higher level (decrease the numerical value) for more addresses, and vice versa + cert="DigiCert Global Root G2" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index 13dca64c..59963703 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,7 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 132; +:global ExpectedConfigVersion 133; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index c7e566ff..6f9e96ed 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -57,6 +57,7 @@ 130="Dropped intermediate certificates, depending on just root certificates now."; 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; + 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; }; # Migration steps to be applied on script updates From b7b3b43f3b11a280dbb465a425a5a554c2e8e471 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 13:59:31 +0100 Subject: [PATCH 512/988] mod/scriptrunonce: use $FetchHuge --- mod/scriptrunonce.rsc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index b158c9ca..683e4168 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -4,7 +4,6 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 -# requires device-mode, fetch # # download script and run it once # https://rsc.eworm.de/doc/mod/scriptrunonce.md @@ -18,6 +17,7 @@ :global ScriptRunOnceBaseUrl; :global ScriptRunOnceUrlSuffix; + :global FetchHuge; :global LogPrint; :global ValidateSyntax; @@ -30,11 +30,10 @@ :set Script ($ScriptRunOnceBaseUrl . $Script . ".rsc" . $ScriptRunOnceUrlSuffix); } - :local Source; - :do { - :set Source ([ /tool/fetch check-certificate=yes-without-crl $Script output=user as-value ]->"data"); - } on-error={ + :local Source [ $FetchHuge $0 $Script true ]; + :if ($Source = false) do={ $LogPrint warning $0 ("Failed fetching script '" . $Script . "'!"); + :return false; } :if ([ :len $Source ] > 0) do={ From 1c957dbc6d0a35d48f18f2fde0f2061f334feca8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 14:01:10 +0100 Subject: [PATCH 513/988] mod/scriptrunonce: resolve nested conditions --- mod/scriptrunonce.rsc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 683e4168..9d990a12 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -36,17 +36,16 @@ :return false; } - :if ([ :len $Source ] > 0) do={ - :if ([ $ValidateSyntax $Source ] = true) do={ - :do { - $LogPrint info $0 ("Running script '" . $Script . "' now."); - [ :parse $Source ]; - } on-error={ - $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); - } - } else={ - $LogPrint warning $0 ("The script '" . $Script . "' failed syntax validation!"); - } + :if ([ $ValidateSyntax $Source ] = false) do={ + $LogPrint warning $0 ("The script '" . $Script . "' failed syntax validation!"); + :return false; + } + + :do { + $LogPrint info $0 ("Running script '" . $Script . "' now."); + [ :parse $Source ]; + } on-error={ + $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); } } } on-error={ From 5715bc7b57ced8f38b394d535028659655a71801 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 14:02:33 +0100 Subject: [PATCH 514/988] mod/scriptrunonce: always give proper return code --- mod/scriptrunonce.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 9d990a12..7fcd5b5b 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -46,7 +46,10 @@ [ :parse $Source ]; } on-error={ $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); + :return false; } + + :return true; } } on-error={ :global ExitError; $ExitError false $0; From 584e507fd18f0a0d97f6e3cbfc4f3f6e0d4854fc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 08:50:49 +0100 Subject: [PATCH 515/988] global-functions: $DeviceInfo: show commit id (if available) --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 59963703..71e5c66c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,6 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version +:global CommitId "unknown"; :global ExpectedConfigVersion 133; # global variables not to be changed by user @@ -284,6 +285,7 @@ # get readable device info :set DeviceInfo do={ + :global CommitId; :global ExpectedConfigVersion; :global Identity; @@ -324,6 +326,8 @@ $RouterBoard->"current-firmware" != $RouterBoard->"upgrade-firmware") \ ([ $FormatLine " Firmware" ($RouterBoard->"current-firmware") ] . "\n") ] . \ "RouterOS-Scripts:\n" . \ + [ $IfThenElse ($CommitId != "unknown") \ + ([ $FormatLine " Commit" [ :pick $CommitId 0 8 ] ] . "\n") ] . \ [ $FormatLine " Version" $ExpectedConfigVersion ]); } From 0199ea8884d9b45a184717bdbd5dccf829eb527d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 09:07:43 +0100 Subject: [PATCH 516/988] global-functions: $ScriptInstallUpdate: show commit id (if available) --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 71e5c66c..204f8249 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1105,6 +1105,7 @@ :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; + :global CommitId; :global ExpectedConfigVersion; :global Identity; :global IDonate; @@ -1137,6 +1138,7 @@ } } + :local CommitIdBefore $CommitId; :local ExpectedConfigVersionBefore $ExpectedConfigVersion; :local ReloadGlobalFunctions false; :local ReloadGlobalConfig false; @@ -1251,6 +1253,10 @@ } } + :if ($CommitId != "unknown" && $CommitIdBefore != $CommitId) do={ + $LogPrint info $0 ("Updated to commit id: " . [ :pick $CommitId 0 8 ]); + } + :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ $LogPrint warning $0 ("The configuration version decreased from " . \ $ExpectedConfigVersionBefore . " to " . $ExpectedConfigVersion . \ From dafcc1a0cb8d18b191919c4876fa1db6c3fe2e27 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 17:49:42 +0100 Subject: [PATCH 517/988] global-functions: $RmFile: fix type safeguard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ups... 🫣 The type is not just literal 'file' - but what ever type the file is, like 'backup', 'package', 'script', '.conf file', ... So let's match those types we do *not* want to remove. Fixes: https://github.com/eworm-de/routeros-scripts/issues/90 --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 204f8249..221b1b50 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1054,12 +1054,12 @@ $LogPrint debug $0 ("Removing file: ". $FileName); - :if ([ :len [ /file/find where name=$FileName type!=file ] ] > 0) do={ + :if ([ :len [ /file/find where name=$FileName (type=directory or type=disk) ] ] > 0) do={ $LogPrint error $0 ("File '" . $FileName . "' is not a file."); :return false; } - :local File [ /file/find where name=$FileName type=file ]; + :local File [ /file/find where name=$FileName !(type=directory or type=disk) ]; :if ([ :len $File ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); :return true; From 75633872aa8a09a328e2bef07211e182bceb2725 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Feb 2025 11:45:02 +0100 Subject: [PATCH 518/988] global-functions: $DeviceInfo: also show commit info --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 221b1b50..c6625c17 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,8 +12,9 @@ :local ScriptName [ :jobname ]; -# expected configuration version +# Git commit id & info, expected configuration version :global CommitId "unknown"; +:global CommitInfo "unknown"; :global ExpectedConfigVersion 133; # global variables not to be changed by user @@ -286,6 +287,7 @@ # get readable device info :set DeviceInfo do={ :global CommitId; + :global CommitInfo; :global ExpectedConfigVersion; :global Identity; @@ -327,7 +329,7 @@ ([ $FormatLine " Firmware" ($RouterBoard->"current-firmware") ] . "\n") ] . \ "RouterOS-Scripts:\n" . \ [ $IfThenElse ($CommitId != "unknown") \ - ([ $FormatLine " Commit" [ :pick $CommitId 0 8 ] ] . "\n") ] . \ + ([ $FormatLine " Commit" ($CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . "\n") ] . \ [ $FormatLine " Version" $ExpectedConfigVersion ]); } From 2c92c78b4647e43c44da567e98adee69b7857393 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Feb 2025 11:47:26 +0100 Subject: [PATCH 519/988] global-functions: $ScriptInstallUpdate: also show commit info --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index c6625c17..f5fa5cbf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1108,6 +1108,7 @@ :local NewComment [ :tostr $2 ]; :global CommitId; + :global CommitInfo; :global ExpectedConfigVersion; :global Identity; :global IDonate; @@ -1256,7 +1257,7 @@ } :if ($CommitId != "unknown" && $CommitIdBefore != $CommitId) do={ - $LogPrint info $0 ("Updated to commit id: " . [ :pick $CommitId 0 8 ]); + $LogPrint info $0 ("Updated to commit: " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]); } :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ From 58da92e36a704a0bd5915451fbace686e8d9456d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Feb 2025 22:21:03 +0100 Subject: [PATCH 520/988] global-functions: $WaitForFile: drop the warning on file handling breakage... ... but keep the workaround for now - just to be sure. --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f5fa5cbf..99e52f80 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1682,7 +1682,6 @@ :global CleanFilePath; :global EitherOr; - :global LogPrintOnce; :global MAX; :set FileName [ $CleanFilePath $FileName ]; @@ -1701,10 +1700,7 @@ :do { /file/get $FileName; :return true; - } on-error={ - $LogPrintOnce warning $0 \ - ("Hit the infamous file handling breakage (SUP-179200) introduced with RouterOS 7.18beta2..."); - } + } on-error={ } :delay $Delay; :set Delay ($Delay * 3 / 2); } From cad104879cbc758717f6cbf18f2f1b8946078c19 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 14:49:30 +0100 Subject: [PATCH 521/988] mod/notification-telegram: simplify the queue... ... and pass http-data as a complete sting. --- mod/notification-telegram.rsc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 23ef942e..be4a915d 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -22,7 +22,6 @@ :global IsFullyConnected; :global LogPrint; - :global UrlEncode; :if ([ $IsFullyConnected ] = false) do={ $LogPrint debug $0 ("System is not fully connected, not flushing."); @@ -41,9 +40,7 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \ - http-data=("chat_id=" . ($Message->"chatid") . "&disable_notification=" . ($Message->"silent") . \ - "&reply_to_message_id=" . ($Message->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2&text=" . [ $UrlEncode ($Message->"text") ]) as-value ]->"data"); + 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={ @@ -145,6 +142,9 @@ (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%_!") "plain" "_" ]); } + :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ + "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ + "&parse_mode=MarkdownV2"); :do { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); @@ -152,9 +152,7 @@ } :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \ - http-data=("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ - "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); + 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..."); @@ -165,8 +163,8 @@ :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ [ $EscapeMD ("This message was queued since _" . [ /system/clock/get date ] . \ " " . [ /system/clock/get time ] . "_ and may be obsolete.") "plain" "_" ]); - :set ($TelegramQueue->[ :len $TelegramQueue ]) { chatid=$ChatId; tokenid=$TokenId; - text=$Text; silent=($Notification->"silent"); replyto=($Notification->"replyto") }; + :set ($TelegramQueue->[ :len $TelegramQueue ]) { tokenid=$TokenId; + http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) }; :if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushTelegramQueue" interval=1m start-time=startup \ on-event=(":global FlushTelegramQueue; \$FlushTelegramQueue;"); From a22b62f58803141a3055db046363f4d41b12ea83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 14:57:26 +0100 Subject: [PATCH 522/988] mod/notification-telegram: support sending to group's topic... ... when a group has enabled the "Topics" feature. --- doc/mod/notification-telegram.md | 3 +++ global-config.rsc | 2 ++ mod/notification-telegram.rsc | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index b85d09ce..80437168 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -58,6 +58,9 @@ Sending notifications to a group is possible as well. Add your bot and the *GetIDs Bot* to a group, then use the group's id (which starts with a dash) for `TelegramChatId`. Then remove *GetIDs Bot* from group. +Groups can enable the `Topics` feature. Use `TelegramThreadId` to send to a +specific topic in a group. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index b364a253..2524dedc 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -33,6 +33,8 @@ :global TelegramChatId ""; #:global TelegramTokenId "123456:ABCDEF-GHI"; #:global TelegramChatId "12345678"; +# Use this to send notifications to a specific topic in group. +:global TelegramThreadId ""; # Using telegram-chat you have to define trusted chat ids (not group ids!) # or user names. Groups allow to chat with devices simultaneously. #:global TelegramChatIdsTrusted { diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index be4a915d..d04893f0 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -68,6 +68,8 @@ :global TelegramChatIdOverride; :global TelegramMessageIDs; :global TelegramQueue; + :global TelegramThreadId; + :global TelegramThreadIdOverride; :global TelegramTokenId; :global TelegramTokenIdOverride; @@ -108,6 +110,8 @@ :local ChatId [ $EitherOr ($Notification->"chatid") \ [ $EitherOr ($TelegramChatIdOverride->($Notification->"origin")) $TelegramChatId ] ]; + :local ThreadId [ $EitherOr ($Notification->"threadid") \ + [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) $TelegramThreadId ] ]; :local TokenId [ $EitherOr ($TelegramTokenIdOverride->($Notification->"origin")) $TelegramTokenId ]; :if ([ :len $TokenId ] = 0 || [ :len $ChatId ] = 0) do={ @@ -143,8 +147,8 @@ } :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ - "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2"); + "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ + "&disable_web_page_preview=true&parse_mode=MarkdownV2"); :do { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); From 757fa60e6f37cc684abec5582d1b6051f6ef8d6d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 10:46:25 +0100 Subject: [PATCH 523/988] telegram-chat: make $IsReply a boolean... ... and check for correct data type. We need this for a group with topic feature enabled, as that variable is set there, but is is an array. --- telegram-chat.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 10952a6a..eacbbcb9 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -97,7 +97,7 @@ :foreach Update in=($JSON->"result") do={ :set UpdateID ($Update->"update_id"); :local Message ($Update->"message"); - :local IsReply [ :len ($Message->"reply_to_message") ]; + :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; @@ -130,7 +130,8 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = false && \ + $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); From 7928c5f0543765e27379e39bbaff6bdb19638971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 15:31:34 +0100 Subject: [PATCH 524/988] telegram-chat: support reply in group's topic --- telegram-chat.rsc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index eacbbcb9..07e38164 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -104,6 +104,7 @@ :local Chat ($Message->"chat"); :local From ($Message->"from"); :local Command ($Message->"text"); + :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={ @@ -115,7 +116,8 @@ :local Done false; :if ($Command = "?") do={ $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; @@ -150,7 +152,8 @@ :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ $State . [ $IfThenElse ([ :len $Content ] > 0) \ @@ -159,7 +162,8 @@ $RmDir "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ [ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") }); @@ -171,7 +175,8 @@ " (ID " . $From->"id" . ") in update " . $UpdateID . "!"); :if ($Command ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ $LogPrint warning $ScriptName $MessageText; - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("You are not trusted.") }); } else={ From e5de9de391283f64763ad16446fa2f6727191306 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 12:19:49 +0100 Subject: [PATCH 525/988] notify on support for Telegram group topics --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 99e52f80..42782bc4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 133; +:global ExpectedConfigVersion 134; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 6f9e96ed..a735ff77 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -58,6 +58,7 @@ 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; + 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; }; # Migration steps to be applied on script updates From c33eb41c9cfb73e7e5b5ec7a3c37aa9e92ebc9cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 18 Dec 2024 17:50:56 +0100 Subject: [PATCH 526/988] global-functions: $DeviceInfo: add license level, re-order --- global-functions.rsc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 42782bc4..b3166dc0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -309,16 +309,19 @@ ([ $FormatLine "Location" ($Snmp->"location") ] . "\n") ] . \ [ $IfThenElse ([ :len ($Snmp->"contact") ] > 0) \ ([ $FormatLine "Contact" ($Snmp->"contact") ] . "\n") ] . \ - [ $FormatLine "Board name" ($Resource->"board-name") ] . "\n" . \ - [ $FormatLine "Architecture" ($Resource->"architecture-name") ] . "\n" . \ + "Hardware:\n" . \ + [ $FormatLine " Board" ($Resource->"board-name") ] . "\n" . \ + [ $FormatLine " Arch" ($Resource->"architecture-name") ] . "\n" . \ [ $IfThenElse ($RouterBoard->"routerboard" = true) \ - ([ $FormatLine "Model" ($RouterBoard->"model") ] . \ + ([ $FormatLine " Model" ($RouterBoard->"model") ] . \ [ $IfThenElse ([ :len ($RouterBoard->"revision") ] > 0) \ (" " . $RouterBoard->"revision") ] . "\n" . \ - [ $FormatLine "Serial number" ($RouterBoard->"serial-number") ] . "\n") ] . \ - [ $IfThenElse ([ :len ($License->"level") ] > 0) \ - ([ $FormatLine "License" ($License->"level") ] . "\n") ] . \ + [ $FormatLine " Serial" ($RouterBoard->"serial-number") ] . "\n") ] . \ + [ $IfThenElse ([ :len ($License->"nlevel") ] > 0) \ + ([ $FormatLine " License" ("level " . ($License->"nlevel")) ] . "\n") ] . \ "RouterOS:\n" . \ + [ $IfThenElse ([ :len ($License->"level") ] > 0) \ + ([ $FormatLine " License" ("level " . ($License->"level")) ] . "\n") ] . \ [ $FormatLine " Channel" ($Update->"channel") ] . "\n" . \ [ $FormatLine " Installed" ($Update->"installed-version") ] . "\n" . \ [ $IfThenElse ([ :typeof ($Update->"latest-version") ] != "nothing" && \ From 4eafcaa3ace2be0f17618c90c0d320647dfd8e38 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 21:26:52 +0100 Subject: [PATCH 527/988] telegram-chat: say hello when awaiting commands --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 07e38164..5db4860f 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -119,7 +119,8 @@ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); + message=([ $IfThenElse ([ :len ($From->"first_name") ] > 0) ("Hello " . ($From->"first_name") . "!\n\n") ] . \ + "Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } :if ($Done = false && [ :pick $Command 0 1 ] = "!") do={ From 53b13b295af835658dc4ef6192624b2ae898bab1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 21:33:08 +0100 Subject: [PATCH 528/988] mod/notification-telegram: introduce $GetTelegramChatId --- .../notification-telegram.d/getchatid.avif | Bin 0 -> 3896 bytes doc/mod/notification-telegram.md | 24 ++++++++----- global-functions.rsc | 2 +- mod/notification-telegram.rsc | 34 ++++++++++++++++++ news-and-changes.rsc | 1 + 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 doc/mod/notification-telegram.d/getchatid.avif diff --git a/doc/mod/notification-telegram.d/getchatid.avif b/doc/mod/notification-telegram.d/getchatid.avif new file mode 100644 index 0000000000000000000000000000000000000000..779296915de91a9b21e2f05685e34a1539d9c73e GIT binary patch literal 3896 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 ℹ️ **Info**: Copy relevant configuration from @@ -54,9 +61,10 @@ reload the configuration. ### Notifications to a group -Sending notifications to a group is possible as well. Add your bot and the -*GetIDs Bot* to a group, then use the group's id (which starts with a dash) -for `TelegramChatId`. Then remove *GetIDs Bot* from group. +Sending notifications to a group is possible as well. Add your bot to a group +and make it an admin (required for read access!) and send a message and run +`$GetTelegramChatId` again. Then use that chat id (which starts with a dash) +for `TelegramChatId`. Groups can enable the `Topics` feature. Use `TelegramThreadId` to send to a specific topic in a group. diff --git a/global-functions.rsc b/global-functions.rsc index b3166dc0..43cd7f05 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 134; +:global ExpectedConfigVersion 135; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index d04893f0..7782fcfd 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -10,6 +10,7 @@ # https://rsc.eworm.de/doc/mod/notification-telegram.md :global FlushTelegramQueue; +:global GetTelegramChatId; :global NotificationFunctions; :global PurgeTelegramQueue; :global SendTelegram; @@ -58,6 +59,39 @@ :global ExitError; $ExitError false $0; } } +# get the chat id +:set GetTelegramChatId do={ :do { + :global TelegramTokenId; + + :global CertificateAvailable; + :global LogPrint; + + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + $LogPrint warning $0 ("Downloading required certificate failed."); + :return false; + } + + :local Data; + :do { + :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!"); + :return false; + } + + :local JSON [ :deserialize from=json value=$Data ]; + :foreach Update in=($JSON->"result") do={ + $LogPrint info $0 ("The chat id is: " . ($Update->"message"->"chat"->"id")); + :return true; + } + + $LogPrint info $0 ("No message received."); +} on-error={ + :global ExitError; $ExitError false $0; +} } + # send notification via telegram - expects one array argument :set ($NotificationFunctions->"telegram") do={ :local Notification $1; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index a735ff77..459326f3 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -59,6 +59,7 @@ 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; + 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; }; # Migration steps to be applied on script updates From f6c2225f68fae8494d620dca0fc41b50a0450977 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:37:57 +0100 Subject: [PATCH 529/988] check-certificates: catch and ignore import error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hmm... 🤨 When was that runtime error introduced? I *think* it worked before. --- check-certificates.rsc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 09073953..94f23a79 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -59,10 +59,12 @@ :local DecryptionFailed true; :foreach PassPhrase in=$CertRenewPass do={ - :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; - :if ($Result->"decryption-failures" = 0) do={ - :set DecryptionFailed false; - } + :do { + :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; + :if ($Result->"decryption-failures" = 0) do={ + :set DecryptionFailed false; + } + } on-error={ } } $RmFile $CertFileName; From a6d4e7e82cc9870c6cfd1e0ee9724eb6129ce5ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 18:03:17 +0100 Subject: [PATCH 530/988] check-certificates: drop dot from type... ... and add it in file name. --- check-certificates.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 94f23a79..20ac2e2c 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -50,8 +50,8 @@ :local Return false; - :foreach Type in={ ".pem"; ".p12" } do={ - :local CertFileName ([ $UrlEncode $FetchName ] . $Type); + :foreach Type in={ "pem"; "p12" } do={ + :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; From 3d40b4419d47f41edf5059c00c1ab575f49c6da1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:40:12 +0100 Subject: [PATCH 531/988] check-certificates: add more debug output --- check-certificates.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 20ac2e2c..68620156 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -58,10 +58,12 @@ $WaitForFile $CertFileName; :local DecryptionFailed true; - :foreach PassPhrase in=$CertRenewPass do={ + :foreach I,PassPhrase in=$CertRenewPass do={ :do { + $LogPrint debug $ScriptName ("Trying " . $I . ". passphrase... "); :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; :if ($Result->"decryption-failures" = 0) do={ + $LogPrint debug $ScriptName ("Success!"); :set DecryptionFailed false; } } on-error={ } From 512c54bd590503af27e754c5c65c34b5307cf9c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:55:09 +0100 Subject: [PATCH 532/988] check-certificates: ... and even more --- check-certificates.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 68620156..6dff9bac 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -52,6 +52,9 @@ :foreach Type in={ "pem"; "p12" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); + $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ + "' (file '" . $CertFileName . "')..."); + :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; From e833dfcf25175fb1d5c652dcf898c6332ce70404 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:51:25 +0100 Subject: [PATCH 533/988] check-certificates: simplify return from function... ... and also break earch on success. --- check-certificates.rsc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 6dff9bac..5065c33d 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -48,8 +48,6 @@ :global UrlEncode; :global WaitForFile; - :local Return false; - :foreach Type in={ "pem"; "p12" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ @@ -84,13 +82,13 @@ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } - :set Return true; + :return true; } on-error={ $LogPrint debug $ScriptName ("Could not download certificate file '" . $CertFileName . "'."); } } - :return $Return; + :return false; } :local FormatInfo do={ From 14195c51ca381063789ca58c760d70037328e600 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 18:25:58 +0100 Subject: [PATCH 534/988] check-certificates: try PKCS#12 before PEM... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as that is more likely to have a private key. Is that true? 🤨 --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 5065c33d..be8e4dff 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -48,7 +48,7 @@ :global UrlEncode; :global WaitForFile; - :foreach Type in={ "pem"; "p12" } do={ + :foreach Type in={ "p12"; "pem" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ "' (file '" . $CertFileName . "')..."); From b11be59b0824efac6df128fde46a529ced14a2d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Feb 2025 10:44:53 +0100 Subject: [PATCH 535/988] README: quote the certificate file name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a76d50f7..fae69869 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ file to your MikroTik device. Then we import the certificate. - /certificate/import file-name=isrg-root-x2.pem passphrase=""; + /certificate/import file-name="isrg-root-x2.pem" passphrase=""; Do not worry that the command is not shown - that happens because it contains a sensitive property, the passphrase. From e2fe653035ca2217dc56235de780f72dbb790e1d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 20:16:12 +0100 Subject: [PATCH 536/988] mod/notification-telegram: $GetTelegramChatId: use last message --- mod/notification-telegram.rsc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 7782fcfd..45286154 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -82,12 +82,15 @@ } :local JSON [ :deserialize from=json value=$Data ]; - :foreach Update in=($JSON->"result") do={ - $LogPrint info $0 ("The chat id is: " . ($Update->"message"->"chat"->"id")); - :return true; + :local Count [ :len ($JSON->"result") ]; + + :if ($Count = 0) do={ + $LogPrint info $0 ("No message received."); + :return false; } - $LogPrint info $0 ("No message received."); + :local Message ($JSON->"result"->($Count - 1)->"message"); + $LogPrint info $0 ("The chat id is: " . ($Message->"chat"->"id")); } on-error={ :global ExitError; $ExitError false $0; } } From f5189b8bd7ca01fb6e26414960764960a03066c4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Feb 2025 10:45:30 +0100 Subject: [PATCH 537/988] INITIAL-COMMANDS: quote the certificate file name --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 424ef329..8b64d281 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -19,7 +19,7 @@ Run the complete base installation: { /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; :delay 1s; - /certificate/import file-name=isrg-root-x2.pem passphrase=""; + /certificate/import file-name="isrg-root-x2.pem" passphrase=""; :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; From 0c4fb42616f8015dd128ec7df1d1afce590d26ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 20:18:12 +0100 Subject: [PATCH 538/988] mod/notification-telegram: $GetTelegramChatId: give thead id... ... if message was sent to group's topic. --- mod/notification-telegram.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 45286154..68e913f6 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -91,6 +91,9 @@ :local Message ($JSON->"result"->($Count - 1)->"message"); $LogPrint info $0 ("The chat id is: " . ($Message->"chat"->"id")); + :if (($Message->"is_topic_message") = true) do={ + $LogPrint info $0 ("The thread id is: " . ($Message->"message_thread_id")); + } } on-error={ :global ExitError; $ExitError false $0; } } From 33c02e06092eded4b3344a6eb22742c9be531fb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Mar 2025 09:10:54 +0100 Subject: [PATCH 539/988] ipv6-update: ignore if prefix is no longer valid --- ipv6-update.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index c6e3d653..beccde09 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -20,7 +20,9 @@ :global ScriptLock; :local NaAddress $"na-address"; + :local NaValid $"na-valid"; :local PdPrefix $"pd-prefix"; + :local PdValid $"pd-valid"; :if ([ $ScriptLock $ScriptName ] = false) do={ :set ExitOK true; @@ -39,6 +41,12 @@ :error false; } + :if ($PdValid != 1) do={ + $LogPrint info $ScriptName ("The prefix " . $PdPrefix . " is no longer valid. Ignoring."); + :set ExitOK true; + :error false; + } + :local Pool [ /ipv6/pool/get [ find where prefix=$PdPrefix ] name ]; :if ([ :len [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ] ] = 0) do={ /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool) dynamic=yes; From 469f783a92c8e67088d70572157ff4cd7d47fcd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Mar 2025 09:12:43 +0100 Subject: [PATCH 540/988] ipv6-update: check for availability of both variables --- ipv6-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index beccde09..94bd1bc4 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -35,7 +35,7 @@ :error false; } - :if ([ :typeof $PdPrefix ] = "nothing") do={ + :if ([ :typeof $PdPrefix ] = "nothing" || [ :typeof $PdValid ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); :set ExitOK true; :error false; From 3ccaafd1b38f4335aa28361778aa37db2ca22d5f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 00:28:01 +0100 Subject: [PATCH 541/988] global-functions: $ScriptInstallUpdate: move code into block --- global-functions.rsc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 43cd7f05..8fcd56d1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1163,7 +1163,12 @@ } } - :if (!($ScriptInfo->"ignore" = true)) do={ + :do { + :if ($ScriptInfo->"ignore" = true) do={ + $LogPrint debug $0 ("Ignoring script '" . $ScriptVal->"name" . "', as requested."); + :error true; + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; @@ -1182,10 +1187,9 @@ } else={ $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!"); } + :error false; } - } - :do { :if ([ :len $SourceNew ] = 0) do={ $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); :error false; From 0c1d96f89dfb4d209b0848d5ac2d81a640e0f056 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 00:18:43 +0100 Subject: [PATCH 542/988] global-functions: $ScriptInstallUpdate: get and compare checksums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The file 'checksums.json' is generated when deploying to my web server... This should speed up the update a lot as it reduces downloads to a minimum. 🎉😁 --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 8fcd56d1..8405c92b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1150,6 +1150,14 @@ :local ReloadGlobalConfig false; :local DeviceMode [ /system/device-mode/get ]; + :local CheckSums ({}); + :do { + :local Url ($ScriptUpdatesBaseUrl . "checksums.json" . $ScriptUpdatesUrlSuffix); + $LogPrint debug $0 ("Fetching checksums from url: " . $Url); + :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certificate=yes-without-crl \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]->"data") ]; + } on-error={ } + :foreach Script in=[ /system/script/find where source~"^#!rsc by RouterOS\r?\n" ] do={ :local ScriptVal [ /system/script/get $Script ]; :local ScriptInfo [ $ParseKeyValueStore ($ScriptVal->"comment") ]; @@ -1169,6 +1177,11 @@ :error true; } + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name"))) do={ + $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); + :error true; + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; From 10374afc182cd8b08e07a3d45890518e8b6be73c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:37:42 +0100 Subject: [PATCH 543/988] global-functions: $ScriptInstallUpdate: support checksums for CRLF scripts --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8405c92b..d883aa0a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1177,7 +1177,8 @@ :error true; } - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name"))) do={ + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name")) || \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = ($CheckSums->($ScriptVal->"name"))) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From c9de6d85790897a945910316a14db16b0435c41e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:39:59 +0100 Subject: [PATCH 544/988] global-functions: $ScriptInstallUpdate: put checksum into variable --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d883aa0a..a9fa938c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1177,8 +1177,9 @@ :error true; } - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name")) || \ - [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = ($CheckSums->($ScriptVal->"name"))) do={ + :local CheckSum ($CheckSums->($ScriptVal->"name")); + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = $CheckSum || \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From b13360e4b86838d95cd8c9a1a4e2ea8d757dbb0f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:53:04 +0100 Subject: [PATCH 545/988] global-functions: $ScriptInstallUpdate: simplify check This one should suffice... --- global-functions.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a9fa938c..4c777a17 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1178,8 +1178,7 @@ } :local CheckSum ($CheckSums->($ScriptVal->"name")); - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = $CheckSum || \ - [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ + :if ([ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From 1b46a5fd9bc69f4d609b28e7ff8d36717a3b9a8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 08:55:06 +0100 Subject: [PATCH 546/988] global-functions: $ScriptInstallUpdate: checksum only for same source So ignore if script is fetched from different base or with different suffix. --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4c777a17..da311651 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1178,7 +1178,8 @@ } :local CheckSum ($CheckSums->($ScriptVal->"name")); - :if ([ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ + :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From e341e1c30ca4ff8b87bc757cc5c0effbc50a7ea6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 15:02:31 +0100 Subject: [PATCH 547/988] global-functions: introduce $LogPrintVerbose ... ... which is a declared function, but has no code, intentionally. It can be called as a no-op by default. If you want this output set the function to be the same as $LogPrint: :set LogPrintVerbose $LogPrint; --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index da311651..911ff6a4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -55,6 +55,7 @@ :global IsTimeSync; :global LogPrint; :global LogPrintOnce; +:global LogPrintVerbose; :global MAX; :global MIN; :global MkDir; @@ -848,6 +849,8 @@ :return true; } +# The function $LogPrintVerbose is declared, but has no code, intentionally. + # get max value :set MAX do={ :if ($1 > $2) do={ :return $1; } From 6d718ec9877c3ecfc10681e85d050d15ed4d4b80 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 14:38:35 +0100 Subject: [PATCH 548/988] fw-addr-lists: use $LogPrintVerbose ... ... to reduce debug output and speed up execution. --- fw-addr-lists.rsc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index d41dc04e..af8c65d7 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -24,6 +24,7 @@ :global HumanReadableNum; :global LogPrint; :global LogPrintOnce; + :global LogPrintVerbose; :global ScriptLock; :global WaitFullyConnected; @@ -120,14 +121,14 @@ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ "' with " . ($IPv4Addresses->$Address) . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ "': " . $Address); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); @@ -139,14 +140,14 @@ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ "' with " . ($IPv6Addresses->$Address) . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ "': " . $Address); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); @@ -155,7 +156,7 @@ } :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ @@ -169,7 +170,7 @@ } :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ From 7be26a07125b9c946859560bd59323f84feb9494 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 14:54:38 +0100 Subject: [PATCH 549/988] DEBUG: add info on $LogPrintVerbose --- DEBUG.md | 14 ++++++++++++++ global-functions.rsc | 1 + 2 files changed, 15 insertions(+) diff --git a/DEBUG.md b/DEBUG.md index 3d7f0258..d5e9beb7 100644 --- a/DEBUG.md +++ b/DEBUG.md @@ -44,6 +44,20 @@ instead. Disable or remote that setting to restore regular logging. +## Verbose output + +Specific scripts can generate huge amount of output. These do use a function +`$LogPrintVerbose`, which is declared, but has no code, intentionally. + +If you *really* want that output set the function to be the same as +`$LogPrint`: + + :set LogPrintVerbose $LogPrint; + +To revert that change just run: + + :set LogPrintVerbose; + --- [⬅️ Go back to main README](README.md) [⬆️ Go back to top](#top) diff --git a/global-functions.rsc b/global-functions.rsc index 911ff6a4..8ae7bb8e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -850,6 +850,7 @@ } # The function $LogPrintVerbose is declared, but has no code, intentionally. +# https://rsc.eworm.de/DEBUG.md#verbose-output # get max value :set MAX do={ From fb343c99e399d679f3e2a22e76c14a5899024319 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 22:59:31 +0100 Subject: [PATCH 550/988] fw-addr-lists: put timeout into variable --- fw-addr-lists.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index af8c65d7..331d2c64 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -120,10 +120,11 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ + :local TimeOut ($IPv4Addresses->$Address); + :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ - "' with " . ($IPv4Addresses->$Address) . ": " . $Address); - /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); + "' with " . $TimeOut . ": " . $Address); + /ip/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ @@ -139,10 +140,11 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ + :local TimeOut ($IPv6Addresses->$Address); + :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ - "' with " . ($IPv6Addresses->$Address) . ": " . $Address); - /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); + "' with " . $TimeOut . ": " . $Address); + /ipv6/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ From ea6de35699a5b62dfffcc583c1a7181e1a6a688f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 23:00:50 +0100 Subject: [PATCH 551/988] fw-addr-lists: do not clean up Cleanup is important on renew (so the script does not attempt to re-add), but we do not care here. --- fw-addr-lists.rsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 331d2c64..70893e32 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -163,7 +163,6 @@ :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; - :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ @@ -177,7 +176,6 @@ :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; - :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ From 2f55bfaf009d726e1174b50887fdb8f9b4b57573 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 12:21:22 +0100 Subject: [PATCH 552/988] fw-addr-lists: strip cidr for host addresses This makes sure the addresses match later when we read them from address-list for renew. --- fw-addr-lists.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 70893e32..fc537951 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -101,10 +101,16 @@ } :do { :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ + :if ($Address ~ "/32\$") do={ + :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; + } :set ($IPv4Addresses->$Address) $TimeOut; :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) ]; + } :set ($IPv6Addresses->$Address) $TimeOut; :error true; } From e148df9e573801803e35d8dfaef277f571952fdc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 23:05:45 +0100 Subject: [PATCH 553/988] fw-addr-lists: put addresses into "branches"... ... effectively adding another layer and some complexity, but: The addresses are sorted inside the array, and sorting less addresses in a branch saves a lot of processing power. So this is a lot faster now... --- fw-addr-lists.rsc | 65 +++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index fc537951..a97f7ed4 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -100,23 +100,24 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { + :local Branch [ :pick $Address 0 1 ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; } - :set ($IPv4Addresses->$Address) $TimeOut; + :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :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) ]; } - :set ($IPv6Addresses->$Address) $TimeOut; + :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv4Addresses->$Address) $TimeOut; - :set ($IPv6Addresses->$Address) $TimeOut; + :set ($IPv4Addresses->$Branch->$Address) $TimeOut; + :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } } on-error={ } @@ -126,12 +127,13 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local TimeOut ($IPv4Addresses->$Address); + :local Branch [ :pick $Address 0 1 ]; + :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ "' with " . $TimeOut . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=$TimeOut; - :set ($IPv4Addresses->$Address); + :set ($IPv4Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ @@ -146,12 +148,13 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local TimeOut ($IPv6Addresses->$Address); + :local Branch [ :pick $Address 0 1 ]; + :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ "' with " . $TimeOut . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=$TimeOut; - :set ($IPv6Addresses->$Address); + :set ($IPv6Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ @@ -163,29 +166,35 @@ } } - :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); - :do { - /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); + :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 { + /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); + } } } - :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); - :do { - /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); + :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 { + /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); + } } } From d71ea804b077d35183df318fb305b213fb961d27 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 20:35:36 +0100 Subject: [PATCH 554/988] fw-addr-lists: two characters for branch Using one character for IPv4 is ok (1 to 9), but IPv6 global unicase (2000::/3) results in just two different characters (2 and 3). So let's use first two characters... --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a97f7ed4..9ad5b3a7 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -100,7 +100,7 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; @@ -127,7 +127,7 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -148,7 +148,7 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ From f0e6cbcfe1a0be05f30d37cd495d4dbea0888f07 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 8 Mar 2025 10:09:51 +0100 Subject: [PATCH 555/988] fw-addr-lists: get branch from calculated checksum The addresses were spread very uneven before. Let's calculate a checksum, and take the first two characters of that. The addresses are now spread evenly on 256 branches (0x00 to 0xff). --- fw-addr-lists.rsc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 9ad5b3a7..f0940fef 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -37,6 +37,11 @@ } } + :local GetBranch do={ + :global EitherOr; + :return [ :pick [ :convert transform=md5 to=hex [ :pick $1 0 [ $EitherOr [ :find $1 "/" ] [ :len $1 ] ] ] ] 0 2 ]; + } + :if ([ $ScriptLock $ScriptName ] = false) do={ :set ExitOK true; :error false; @@ -100,7 +105,7 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; @@ -127,7 +132,7 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -148,7 +153,7 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ From eb59dd21caf8026748eada3aee137b8e3b6590b7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 17:33:51 +0100 Subject: [PATCH 556/988] check-routeros-update: check perpetual license... ... as these have to be renewed and can expire. --- check-routeros-update.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 361be34e..8d200d2d 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -66,6 +66,27 @@ :error "A reboot for update is already scheduled."; } + :local License [ /system/license/get ]; + :if ([ :typeof ($License->"deadline-at") ] = "str") do={ + :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ + $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set ExitOK true; + :error false; + } + + :if ([ :totime ($License->"next-renewal-at") ] + 1w < [ :timestamp ]) do={ + $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + } + } + $LogPrint debug $ScriptName ("Checking for updates..."); /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; From 788400c4586b6a2e61c6e36acd10ab5d20da00c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Mar 2025 16:29:06 +0100 Subject: [PATCH 557/988] fw-addr-lists: raw.githubusercontent.com requires 'USERTrust RSA Certification Authority' now --- certs/Makefile | 2 +- .../USERTrust-RSA-Certification-Authority.pem | 41 +++++++++++++++++++ global-config.rsc | 2 +- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 certs/USERTrust-RSA-Certification-Authority.pem diff --git a/certs/Makefile b/certs/Makefile index 4e252b4a..3ccad6e2 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -15,7 +15,7 @@ DOMAINS_DUAL = \ git.eworm.de/ISRG-Root-X2 \ lists.blocklist.de/Certum-Trusted-Network-CA \ matrix.org/GTS-Root-R4 \ - raw.githubusercontent.com/DigiCert-Global-Root-G2 \ + raw.githubusercontent.com/USERTrust-RSA-Certification-Authority \ rsc.eworm.de/ISRG-Root-X2 \ upgrade.mikrotik.com/ISRG-Root-X1 DOMAINS_IPV4 = \ diff --git a/certs/USERTrust-RSA-Certification-Authority.pem b/certs/USERTrust-RSA-Certification-Authority.pem new file mode 100644 index 00000000..0fbeef63 --- /dev/null +++ b/certs/USERTrust-RSA-Certification-Authority.pem @@ -0,0 +1,41 @@ +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 2524dedc..fa32b163 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -103,7 +103,7 @@ # cert="ISRG Root X2" }; { url="https://raw.githubusercontent.com/stamparm/ipsum/refs/heads/master/levels/4.txt"; # # higher level (decrease the numerical value) for more addresses, and vice versa - cert="DigiCert Global Root G2" }; + cert="USERTrust RSA Certification Authority" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From 97b99316b2f96fa9c5d2f539e31aa308e86c99b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 10:31:11 +0100 Subject: [PATCH 558/988] netwatch-notify: increase timeout... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as a timeout of one second expires immediately. 🤨 --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 8b05c5e3..9a4c9d97 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,12 +61,12 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=1s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=1s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From 155542668719f9feaac45fdb786b2e5fc5fd1e71 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 11:18:18 +0100 Subject: [PATCH 559/988] netwatch-notify: increase the timeout even more MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This interacts with the number of addresses in the address-list. Having a lot of addresses there (for exemple from script 'fw-addr-lists' 😜) makes the 'find' take longer. We have to make sure that 'find' succeeds before the address times out. As this does not hurt... Let's just bump to 10 seconds to be safe. --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 9a4c9d97..2a5050ce 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,12 +61,12 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From b63e0fcb2fc282ac69cbef74b35bd40e8df5a464 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 11:26:22 +0100 Subject: [PATCH 560/988] netwatch-notify: check matching address type only --- netwatch-notify.rsc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 2a5050ce..0b8a8dc5 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,15 +61,19 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; - :delay 20ms; - :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ - :return true; + :if ([ :typeof [ :toip $Expected ] ] = "ip") do={ + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + :delay 20ms; + :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ + :return true; + } } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; - :delay 20ms; - :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ - :return true; + :if ([ :typeof [ :toip6 $Expected ] ] = "ip6") do={ + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + :delay 20ms; + :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ + :return true; + } } :return false; From 20bf609c44c2b4111bb387b36b955b8c3243fbf1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Mar 2025 10:51:39 +0100 Subject: [PATCH 561/988] check-routeros-update: fix condition for license check Turns out that `next-renewal-at` is moved forward when renewal failed, so it never matches the criteria. Just start complaining three weeks before deadline. --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 8d200d2d..78161e4b 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -78,7 +78,7 @@ :error false; } - :if ([ :totime ($License->"next-renewal-at") ] + 1w < [ :timestamp ]) do={ + :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ From ce39b79f69f978a8de521643b07b9c19de02b06f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Mar 2025 11:50:38 +0100 Subject: [PATCH 562/988] capsman-download-packages: fix parameter for $RmFile The function can not handle ids, we have to pass a name instead. --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 4387cb15..25c43f58 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -62,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 744494e5..b2698382 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -64,7 +64,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index a0c5e121..901bb0af 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -62,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } From f8c3659f6a329498b7aea5ff7f4b67ae1ef727df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Mar 2025 09:19:02 +0100 Subject: [PATCH 563/988] support creating the checksums file --- .gitignore | 3 +++ Makefile | 7 +++++-- contrib/checksums.sh | 9 +++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100755 contrib/checksums.sh diff --git a/.gitignore b/.gitignore index cf89f870..8abdc284 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,8 @@ # html files (as generated from markdown) *.html +# checksums file as used by $ScriptInstallUpdate +checksums.json + # Mac OS X folder settings file .DS_Store diff --git a/Makefile b/Makefile index d21713c2..89517410 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ WIFI = $(wildcard *.wifi.rsc) MARKDOWN = $(wildcard *.md doc/*.md doc/mod/*.md) HTML = $(MARKDOWN:.md=.html) -all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) +all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json %.html: %.md Makefile markdown $< | sed 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' > $@ @@ -32,5 +32,8 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ +checksums.json: contrib/checksums.sh *.rsc */*.rsc + contrib/checksums.sh + clean: - rm -f $(HTML) + rm -f $(HTML) checksums.json diff --git a/contrib/checksums.sh b/contrib/checksums.sh new file mode 100755 index 00000000..b472b49f --- /dev/null +++ b/contrib/checksums.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# generate a checksums file as used by $ScriptInstallUpdate + +set -e + +md5sum $(find -name '*.rsc' | sort) | \ + sed -e "s| \./||" -e 's|.rsc$||' | \ + jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' > 'checksums.json' From 690951469291ae96ead1f88226be78ec7735d098 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Mar 2025 09:48:01 +0100 Subject: [PATCH 564/988] check-routeros-update: send certificate warning just once... ... and another one once expired. --- check-routeros-update.rsc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 78161e4b..51df175d 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -22,6 +22,7 @@ :global SafeUpdateNeighborIdentity; :global SafeUpdatePatch; :global SafeUpdateUrl; + :global SentCertificateNotification; :global SentRouterosUpdateNotification; :global DeviceInfo; @@ -70,20 +71,26 @@ :if ([ :typeof ($License->"deadline-at") ] = "str") do={ :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ - message=("Your license expired on " . ($License->"deadline-at") . \ - ", can no longer update RouterOS on " . $Identity . "...") }); + :if ($SentCertificateNotification != "expired") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set SentCertificateNotification "expired"; + } :set ExitOK true; :error false; } :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ - message=("Your license failed to renew and is about to expire on " . \ - ($License->"deadline-at") . " on " . $Identity . "...") }); + :if ($SentCertificateNotification != "warning") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + :set SentCertificateNotification "warning"; + } } } From 16c9ce437ef268780303f627bba08a166e2aef05 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Mar 2025 21:14:12 +0100 Subject: [PATCH 565/988] check-routeros-update: send notification on renewed license... ... when a warning has been sent before. --- check-routeros-update.rsc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 51df175d..1a5a930f 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -92,6 +92,16 @@ :set SentCertificateNotification "warning"; } } + + :if ([ :typeof $SentCertificateNotification ] = "str" && \ + [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ + $LogPrint info $ScriptName ("Your license was successfully renewed."); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + message=("Your license was successfully renewed on " . $Identity . \ + ". It is now valid until " . ($License->"deadline-at") . ".") }); + :set SentCertificateNotification; + } } $LogPrint debug $ScriptName ("Checking for updates..."); From 3c30276e235b6c8105f44db49ba6586d296f264c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Mar 2025 17:54:09 +0100 Subject: [PATCH 566/988] check-routeros-update: split off check-perpetual-license... ... and also add documentation, screenshot, etc. --- README.md | 1 + check-perpetual-license.rsc | 78 ++++++++++++++++++ check-routeros-update.rsc | 38 --------- .../notification.avif | Bin 0 -> 4004 bytes doc/check-perpetual-license.md | 70 ++++++++++++++++ doc/check-routeros-update.md | 1 + global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 8 files changed, 152 insertions(+), 39 deletions(-) create mode 100644 check-perpetual-license.rsc create mode 100644 doc/check-perpetual-license.d/notification.avif create mode 100644 doc/check-perpetual-license.md diff --git a/README.md b/README.md index fae69869..ffbc27ed 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,7 @@ Available scripts * [Renew certificates and notify on expiration](doc/check-certificates.md) * [Notify about health state](doc/check-health.md) * [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) +* [Check perpetual license on CHR](doc/check-perpetual-license.md) * [Notify on RouterOS update](doc/check-routeros-update.md) * [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) * [Use wireless network with daily psk](doc/daily-psk.md) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc new file mode 100644 index 00000000..9a3a3c74 --- /dev/null +++ b/check-perpetual-license.rsc @@ -0,0 +1,78 @@ +#!rsc by RouterOS +# RouterOS script: check-perpetual-license +# Copyright (c) 2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.15 +# +# check perpetual license on CHR +# https://rsc.eworm.de/doc/check-perpetual-license.md + +:global GlobalFunctionsReady; +:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } + +:local ExitOK false; +:do { + :local ScriptName [ :jobname ]; + + :global Identity; + :global SentCertificateNotification; + + :global LogPrint; + :global ScriptLock; + :global SendNotification2; + :global SymbolForNotification; + :global WaitFullyConnected; + + :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; + :error false; + } + + $WaitFullyConnected; + + :local License [ /system/license/get ]; + :if ([ :typeof ($License->"deadline-at") ] != "str") do={ + $LogPrint info $ScriptName ("This device does not have a perpetual license."); + :set ExitOK true; + :error true; + } + + :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ + $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); + :if ($SentCertificateNotification != "expired") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set SentCertificateNotification "expired"; + } + :set ExitOK true; + :error true; + } + + :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ + $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); + :if ($SentCertificateNotification != "warning") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + :set SentCertificateNotification "warning"; + } + :set ExitOK true; + :error true; + } + + :if ([ :typeof $SentCertificateNotification ] = "str" && \ + [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ + $LogPrint info $ScriptName ("Your license was successfully renewed."); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + message=("Your license was successfully renewed on " . $Identity . \ + ". It is now valid until " . ($License->"deadline-at") . ".") }); + :set SentCertificateNotification; + } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 1a5a930f..361be34e 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -22,7 +22,6 @@ :global SafeUpdateNeighborIdentity; :global SafeUpdatePatch; :global SafeUpdateUrl; - :global SentCertificateNotification; :global SentRouterosUpdateNotification; :global DeviceInfo; @@ -67,43 +66,6 @@ :error "A reboot for update is already scheduled."; } - :local License [ /system/license/get ]; - :if ([ :typeof ($License->"deadline-at") ] = "str") do={ - :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ - $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); - :if ($SentCertificateNotification != "expired") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ - message=("Your license expired on " . ($License->"deadline-at") . \ - ", can no longer update RouterOS on " . $Identity . "...") }); - :set SentCertificateNotification "expired"; - } - :set ExitOK true; - :error false; - } - - :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ - $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); - :if ($SentCertificateNotification != "warning") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ - message=("Your license failed to renew and is about to expire on " . \ - ($License->"deadline-at") . " on " . $Identity . "...") }); - :set SentCertificateNotification "warning"; - } - } - - :if ([ :typeof $SentCertificateNotification ] = "str" && \ - [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ - $LogPrint info $ScriptName ("Your license was successfully renewed."); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ - message=("Your license was successfully renewed on " . $Identity . \ - ". It is now valid until " . ($License->"deadline-at") . ".") }); - :set SentCertificateNotification; - } - } - $LogPrint debug $ScriptName ("Checking for updates..."); /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; diff --git a/doc/check-perpetual-license.d/notification.avif b/doc/check-perpetual-license.d/notification.avif new file mode 100644 index 0000000000000000000000000000000000000000..70ca603d4488773dd8a476ced8c89506407b95ef GIT binary patch literal 4004 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 literal 0 HcmV?d00001 diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md new file mode 100644 index 00000000..d4440045 --- /dev/null +++ b/doc/check-perpetual-license.md @@ -0,0 +1,70 @@ +Check perpetual license on CHR +============================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../README.md) + +> ℹ️ **Info**: This script can not be used on its own but requires the base +> installation. See [main README](../README.md) for details. + +Description +----------- + +On *Cloud Hosted Router* (*CHR*) the licensing is perpetual: Buy once, use +forever - but it needs regular renewal. This script checks licensing state +and sends a notification to warn before expiration. + +### Sample notification + +![check-perpetual-license notification](check-perpetual-license.d/notification.avif) + +Requirements and installation +----------------------------- + +Just install the script: + + $ScriptInstallUpdate check-perpetual-license; + +And add a scheduler for automatic update notification: + + /system/scheduler/add interval=1d name=check-perpetual-license on-event="/system/script/run check-perpetual-license;" start-time=startup; + +Configuration +------------- + +No extra configuration is required for this script, but notification +settings are required for +[e-mail](mod/notification-email.md), +[matrix](mod/notification-matrix.md), +[ntfy](mod/notification-ntfy.md) and/or +[telegram](mod/notification-telegram.md). + +Usage and invocation +-------------------- + +Be notified when run from scheduler or run it manually: + + /system/script/run check-perpetual-license; + +Tips & Tricks +------------- + +The script checks for full connectivity before acting, so scheduling at +startup is perfectly valid: + + /system/scheduler/add name=check-perpetual-license@startup on-event="/system/script/run check-perpetual-license;" start-time=startup; + +See also +-------- + +* [Notify on RouterOS update](check-routeros-update.md) + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 926b4aaa..b6c716cb 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -99,6 +99,7 @@ startup is perfectly valid: See also -------- +* [Check perpetual license on CHR](check-perpetual-license.md) * [Automatically upgrade firmware and reboot](firmware-upgrade-reboot.md) * [Manage system update](packages-update.md) diff --git a/global-functions.rsc b/global-functions.rsc index 8ae7bb8e..8ade79bf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 135; +:global ExpectedConfigVersion 136; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 459326f3..55b41650 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -60,6 +60,7 @@ 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; + 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; }; # Migration steps to be applied on script updates From cdfb086b490cafd685e947433515e43dc5547a62 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 31 Mar 2025 11:19:23 +0200 Subject: [PATCH 567/988] mod/notification-telegram: fix override quirk IDs for chat and thread can be overridden. Overriding the chat probably makes the thread invalid - so ignore that then. --- mod/notification-telegram.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 68e913f6..5ef353b4 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -151,7 +151,8 @@ :local ChatId [ $EitherOr ($Notification->"chatid") \ [ $EitherOr ($TelegramChatIdOverride->($Notification->"origin")) $TelegramChatId ] ]; :local ThreadId [ $EitherOr ($Notification->"threadid") \ - [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) $TelegramThreadId ] ]; + [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) \ + [ $IfThenElse ([ :len ($TelegramChatIdOverride->($Notification->"origin")) ] = 0) $TelegramThreadId ] ] ]; :local TokenId [ $EitherOr ($TelegramTokenIdOverride->($Notification->"origin")) $TelegramTokenId ]; :if ([ :len $TokenId ] = 0 || [ :len $ChatId ] = 0) do={ From b560ea4b7d3da75b5f54633eea6a5fb7472d5bd6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 31 Mar 2025 14:30:56 +0200 Subject: [PATCH 568/988] logo: strip some bytes... ... by just re-compressing/re-encoding. --- logo.avif | Bin 2001 -> 1744 bytes logo.png | Bin 4428 -> 4406 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.avif b/logo.avif index 399a2f5ad184fabd7e8127b1e2f1bd994ac7a6b4..956fea8a115623093ec4aef204d69a1a29b53db4 100644 GIT binary patch delta 843 zcmV-R1GN0n56}&eBMpXaWprTx00000001G8FdUInClmsK000C}00IC2009610j>Z5 z0MoIKApw5{Ds5z8bP@mx1{fKy-(gTP#sNfR0frRY%c{{n{hP|N?3Uaqj0L}}@qNfO zUB2aZ8Kr1U{|(j(T$tyh0vOM1q|wTT0X(pK|2Cc9mV0U>am(|lq5{?-y_i?Zr%fu$ zhCDQU=SG}pl+0lejjhL_%w5(HDH(E*okS>|c<+C}P|5$Cf3i?w@OMvy-89`L;#}oM z#2YLk@1}eq#BCuEpbjI5&bIPhY)ZN!fIW7@!JRM9tZSY=8tl(Zn50AhCeIn}bsHqt zVjhC`$G`d1oc$}4gYH%lC=vh)2{;+A-(dj_29Pqp2t;H6VTKq`-8AXdR-Lqe?ll_b zFZZ*n0~`W>ozo$$2fsVSgxpZ#`gr)>n>xw_(#K$B*CM4aHkwEn#JzNubEuV$7=|bA z+ROhT#2ittG2`z=D|OK4zz~ip#0=ynf)@69qgTUtc0+U0uVpYVnm_j8zn0 zJjAjZ9#{~&B=BfFlV5^?`+Bg~S3lvt=dZ1bMkPXj%M`I5p6v2f7J3b@(m+zN6G0CG z{>v?H18V1~@QQG}uh>+c4cY33da3fQ@firsI+uS(o8t{=MtAATH=Lm)TuQAPYya;@v3#M7IYcTEH*jc21m6D)sW-ivCX~$+cSN*r2BpR|Tb22mj|3DNH zT_*pR4q1Qq{z@4w3$5CBwN)%tU^mL(%3q*e9|R8b<56wQ^9`(%3tH$y{UL2-whDf z+PTBdBt(eDqSo^hFgbp(q)#zr2WYWtTbv|w_sz`3(xK`HZ^Wld@#0fDAk(E3KqjJV zz@p4**S2B5Axq>5d?~(DcWcfn@0Gs-wjg(jH~rSuRt;kgdOR8IFNG#knQ0V1TZ3~i z{TlO|tkVnTj)H$$Qb#lavhGSviyk4IJ-g^UwjH~xR7&7SpHW^fe`YmIBX?2Aqr zu8_1h^hG$GGy=y`3LIlI`rBGbwh2kd13ji1;2ei$0-$M4jMe@bt5xL|t${H^4RE-Q zpG%uN7Z!`MfEbi_9^@tGJyxq8x;(wr1VJtc5nJr#OzwsX=}tN(;LpDRJjy5|ddREv zd?KC`i%f&ZEB@53j3wi zl_RoNS*Raoq@rbLZm4~lEaA3srZ@-8A(nYyxW!PEbvL)zS>NC;=@2O@pkAzFEw>>R z#!t2z-sGcGhBZRmWj9_an-~xQN%q|fOQuJ>IA2Jewfl0ctt7)TkciXY5*Z#$ zk8~jc#NV#gn;>c9ZkhO(Xx%U9!h%ElLo)Jw;CDbsZYyeFmmdxIYAGz#837LAKx{w{ z0=K5F+bLRn>s#zg)nWKKMmn}bcWI!ZYkBtH^BNq zrrSDz_1XfK{W_rx^Krge(1;-v#Q@xCU9FIF>7gC9{6qS+MHKcIz<(aA&ha=2IZ8F9 z#8QUWD}S?cFpN9SU5-vgikk;H8#n@Tx5!|`458gpN4b2BUT#>w7= z0CWfOO%ucw+c?ki!hG2fhgu3_1Qnfq#WPK_7b_d|_7AftXk0qc zYNiQDrFZq9_kZ@#=~`%9@4ls-Dt-YZ>XTWJLq|SqWe(SR-hI>BfoA9!n*Y(DvhMy1 diff --git a/logo.png b/logo.png index d97b75dc7d39e2c9e6ff6339d47711e97d6be1f0..7bec10e5242bbc518dc3d730c44425295b283433 100644 GIT binary patch delta 4394 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 delta 4397 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 From 2cc47f56b95b36eb73ed9bbe3e74f28b4f37dccd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 2 Apr 2025 11:32:24 +0200 Subject: [PATCH 569/988] README: give the script names --- README.md | 102 +++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index ffbc27ed..1f7c8edd 100644 --- a/README.md +++ b/README.md @@ -214,61 +214,61 @@ There's much more to explore... Have fun! Available scripts ----------------- -* [Find and remove access list duplicates](doc/accesslist-duplicates.md) -* [Upload backup to Mikrotik cloud](doc/backup-cloud.md) -* [Send backup via e-mail](doc/backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) -* [Upload backup to server](doc/backup-upload.md) -* [Download packages for CAP upgrade from CAPsMAN](doc/capsman-download-packages.md) -* [Run rolling CAP upgrades from CAPsMAN](doc/capsman-rolling-upgrade.md) -* [Renew locally issued certificates](doc/certificate-renew-issued.md) -* [Renew certificates and notify on expiration](doc/check-certificates.md) -* [Notify about health state](doc/check-health.md) -* [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) -* [Check perpetual license on CHR](doc/check-perpetual-license.md) -* [Notify on RouterOS update](doc/check-routeros-update.md) -* [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) -* [Use wireless network with daily psk](doc/daily-psk.md) -* [Comment DHCP leases with info from access list](doc/dhcp-lease-comment.md) -* [Create DNS records for DHCP leases](doc/dhcp-to-dns.md) -* [Automatically upgrade firmware and reboot](doc/firmware-upgrade-reboot.md) -* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) -* [Wait for global functions und modules](doc/global-wait.md) -* [Send GPS position to server](doc/gps-track.md) -* [Use WPA network with hotspot credentials](doc/hotspot-to-wpa.md) -* [Create DNS records for IPSec peers](doc/ipsec-to-dns.md) -* [Update configuration on IPv6 prefix change](doc/ipv6-update.md) -* [Manage IP addresses with bridge status](doc/ip-addr-bridge.md) -* [Run other scripts on DHCP lease](doc/lease-script.md) -* [Manage LEDs dark mode](doc/leds-mode.md) -* [Forward log messages via notification](doc/log-forward.md) -* [Mode button with multiple presses](doc/mode-button.md) -* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) -* [Notify on host up and down](doc/netwatch-notify.md) -* [Visualize OSPF state via LEDs](doc/ospf-to-leds.md) -* [Manage system update](doc/packages-update.md) -* [Run scripts on ppp connection](doc/ppp-on-up.md) -* [Act on received SMS](doc/sms-action.md) -* [Forward received SMS](doc/sms-forward.md) -* [Play Super Mario theme](doc/super-mario-theme.md) -* [Chat with your router and send commands via Telegram bot](doc/telegram-chat.md) -* [Install LTE firmware upgrade](doc/unattended-lte-firmware-upgrade.md) -* [Update GRE configuration with dynamic addresses](doc/update-gre-address.md) -* [Update tunnelbroker configuration](doc/update-tunnelbroker.md) +* [Find and remove access list duplicates](doc/accesslist-duplicates.md) (`accesslist-duplicates`) +* [Upload backup to Mikrotik cloud](doc/backup-cloud.md) (`backup-cloud`) +* [Send backup via e-mail](doc/backup-email.md) (`backup-email`) +* [Save configuration to fallback partition](doc/backup-partition.md) (`backup-partition`) +* [Upload backup to server](doc/backup-upload.md) (`backup-upload`) +* [Download packages for CAP upgrade from CAPsMAN](doc/capsman-download-packages.md) (`capsman-download-packages`) +* [Run rolling CAP upgrades from CAPsMAN](doc/capsman-rolling-upgrade.md) (`capsman-rolling-upgrade`) +* [Renew locally issued certificates](doc/certificate-renew-issued.md) (`certificate-renew-issued`) +* [Renew certificates and notify on expiration](doc/check-certificates.md) (`check-certificates`) +* [Notify about health state](doc/check-health.md) (`check-health`) +* [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) (`check-lte-firmware-upgrade`) +* [Check perpetual license on CHR](doc/check-perpetual-license.md) (`check-perpetual-license`) +* [Notify on RouterOS update](doc/check-routeros-update.md) (`check-routeros-update`) +* [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) (`collect-wireless-mac`) +* [Use wireless network with daily psk](doc/daily-psk.md) (`daily-psk`) +* [Comment DHCP leases with info from access list](doc/dhcp-lease-comment.md) (`dhcp-lease-comment`) +* [Create DNS records for DHCP leases](doc/dhcp-to-dns.md) (`dhcp-to-dns`) +* [Automatically upgrade firmware and reboot](doc/firmware-upgrade-reboot.md) (`firmware-upgrade-reboot`) +* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) (`fw-addr-lists`) +* [Wait for global functions und modules](doc/global-wait.md) (`global-wait`) +* [Send GPS position to server](doc/gps-track.md) (`gps-track`) +* [Use WPA network with hotspot credentials](doc/hotspot-to-wpa.md) (`hotspot-to-wpa` & `hotspot-to-wpa-cleanup`) +* [Create DNS records for IPSec peers](doc/ipsec-to-dns.md) (`ipsec-to-dns`) +* [Update configuration on IPv6 prefix change](doc/ipv6-update.md) (`ipv6-update`) +* [Manage IP addresses with bridge status](doc/ip-addr-bridge.md) (`ip-addr-bridge`) +* [Run other scripts on DHCP lease](doc/lease-script.md) (`lease-script`) +* [Manage LEDs dark mode](doc/leds-mode.md) (`leds-day-mode`, `leds-night-mode` & `leds-toggle-mode`) +* [Forward log messages via notification](doc/log-forward.md) (`log-forward`) +* [Mode button with multiple presses](doc/mode-button.md) (`mode-button`) +* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) (`netwatch-dns`) +* [Notify on host up and down](doc/netwatch-notify.md) (`netwatch-notify`) +* [Visualize OSPF state via LEDs](doc/ospf-to-leds.md) (`ospf-to-leds`) +* [Manage system update](doc/packages-update.md) (`packages-update`) +* [Run scripts on ppp connection](doc/ppp-on-up.md) (`ppp-on-up`) +* [Act on received SMS](doc/sms-action.md) (`sms-action`) +* [Forward received SMS](doc/sms-forward.md) (`sms-forward`) +* [Play Super Mario theme](doc/super-mario-theme.md) (`super-mario-theme`) +* [Chat with your router and send commands via Telegram bot](doc/telegram-chat.md) (`telegram-chat`) +* [Install LTE firmware upgrade](doc/unattended-lte-firmware-upgrade.md) (`unattended-lte-firmware-upgrade`) +* [Update GRE configuration with dynamic addresses](doc/update-gre-address.md) (`update-gre-address`) +* [Update tunnelbroker configuration](doc/update-tunnelbroker.md) (`update-tunnelbroker`) Available modules ----------------- -* [Manage ports in bridge](doc/mod/bridge-port-to.md) -* [Manage VLANs on bridge ports](doc/mod/bridge-port-vlan.md) -* [Inspect variables](doc/mod/inspectvar.md) -* [IP address calculation](doc/mod/ipcalc.md) -* [Send notifications via e-mail](doc/mod/notification-email.md) -* [Send notifications via Matrix](doc/mod/notification-matrix.md) -* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) -* [Send notifications via Telegram](doc/mod/notification-telegram.md) -* [Download script and run it once](doc/mod/scriptrunonce.md) -* [Import ssh keys for public key authentication](doc/mod/ssh-keys-import.md) +* [Manage ports in bridge](doc/mod/bridge-port-to.md) (`mod/bridge-port-to`) +* [Manage VLANs on bridge ports](doc/mod/bridge-port-vlan.md) (`mod/bridge-port-vlan`) +* [Inspect variables](doc/mod/inspectvar.md) (`mod/inspectvar`) +* [IP address calculation](doc/mod/ipcalc.md) (`mod/ipcalc`) +* [Send notifications via e-mail](doc/mod/notification-email.md) (`mod/notification-email`) +* [Send notifications via Matrix](doc/mod/notification-matrix.md) (`mod/notification-matrix`) +* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) (`mod/notification-ntfy`) +* [Send notifications via Telegram](doc/mod/notification-telegram.md) (`mod/notification-telegram`) +* [Download script and run it once](doc/mod/scriptrunonce.md) (`mod/scriptrunonce`) +* [Import ssh keys for public key authentication](doc/mod/ssh-keys-import.md) (`mod/ssh-keys-import`) Installing custom scripts & modules ----------------------------------- From 27987a0d7cf54343aa15ee9dd23f7006b323bf2a Mon Sep 17 00:00:00 2001 From: Ilya Kulakov Date: Mon, 7 Apr 2025 11:27:22 +0200 Subject: [PATCH 570/988] global-functions: $ScriptLock: fix second parameter This broke with 1e8918fdaa5a30393e2004d1f5e4dff458936b67... Fixes: https://github.com/eworm-de/routeros-scripts/issues/95 --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8ade79bf..d6661223 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1388,7 +1388,7 @@ # lock script against multiple invocation :set ScriptLock do={ :local Script [ :tostr $1 ]; - :local WaitMax ([ :tonum $3 ] * 10); + :local WaitMax ([ :tonum $2 ] * 10); :global GetRandom20CharAlNum; :global IfThenElse; From 67e7b11aa7def03e69ff9135653039eed220c619 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 09:13:20 +0200 Subject: [PATCH 571/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b35c40e..55d2205b 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -21,6 +21,7 @@ for details! * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) +* [Ilya Kulakov](mailto:kulakov.ilya@gmail.com) (@Kentzo) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen From 314ba5796d05591ec4781b72222b95c9c8590928 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 09:41:25 +0200 Subject: [PATCH 572/988] global-functions: $ScriptLock: increase interval with wait time Inspired by: https://github.com/eworm-de/routeros-scripts/issues/95#issuecomment-2773513467 --- global-functions.rsc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d6661223..d488c0f5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1387,8 +1387,8 @@ # lock script against multiple invocation :set ScriptLock do={ - :local Script [ :tostr $1 ]; - :local WaitMax ([ :tonum $2 ] * 10); + :local Script [ :tostr $1 ]; + :local WaitMax [ :totime $2 ]; :global GetRandom20CharAlNum; :global IfThenElse; @@ -1477,6 +1477,10 @@ :set ($ScriptLockOrder->$Script) ({}); } + :if ([ :typeof $WaitMax ] = "nil" ) do={ + :set WaitMax 0s; + } + :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ $LogPrint error $0 ("A script named '" . $Script . "' does not exist!"); :error false; @@ -1496,12 +1500,13 @@ :local MyTicket [ $GetRandom20CharAlNum 6 ]; $AddTicket $Script $MyTicket; - :local WaitCount 0; - :while ($WaitMax > $WaitCount && \ + :local WaitInterval ($WaitMax / 20); + :local WaitTime $WaitMax; + :while ($WaitTime > 0 && \ ([ $IsFirstTicket $Script $MyTicket ] = false || \ [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ - :set WaitCount ($WaitCount + 1); - :delay 100ms; + :set WaitTime ($WaitTime - $WaitInterval); + :delay $WaitInterval; } :if ([ $IsFirstTicket $Script $MyTicket ] = true && \ @@ -1513,7 +1518,7 @@ $RemoveTicket $Script $MyTicket; $LogPrint debug $0 ("Script '" . $Script . "' started more than once" . \ - [ $IfThenElse ($WaitCount > 0) " and timed out waiting for lock" "" ] . "..."); + [ $IfThenElse ($WaitTime < $WaitMax) " and timed out waiting for lock" "" ] . "..."); :return false; } From 019e10e1903e261ed1629a1db6ff2d64257916aa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 13:44:53 +0200 Subject: [PATCH 573/988] global-functions: $CertificateDownload: no infinite loop We can not call $CertificateAvailable here, as that will most likely cause an infinite loop. After all that's the certificate mkcert.org is using. And it *is* available in this repository. --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d488c0f5..30374aa3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -167,8 +167,8 @@ $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . \ "' from repository! Trying fallback to mkcert.org..."); :do { - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ - $LogPrint error $0 ("Downloading required certificate failed."); + :if ([ :len [ /certificate/find where common-name="ISRG Root X1" ] ] = 0) do={ + $LogPrint error $0 ("Required certificate is not available."); :return false; } /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ From e36613608c18bc4bcbc11e2d8da47f6c8c53c454 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 14:14:00 +0200 Subject: [PATCH 574/988] global-functions: $CertificateNameByCN: support matching by fingerprint and name --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 30374aa3..f73ea14f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -203,11 +203,12 @@ # name a certificate by its common-name :set CertificateNameByCN do={ - :local CommonName [ :tostr $1 ]; + :local Match [ :tostr $1 ]; :global CleanName; - :local Cert [ /certificate/find where common-name=$CommonName ]; + :local Cert [ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]; + :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; } From 44fa91f5c47ec739a7f74aa2861ab58cc42bed39 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 15:05:27 +0200 Subject: [PATCH 575/988] global-functions: $CertificateNameByCN: pick the first match only --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index f73ea14f..7b1c2143 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -207,7 +207,7 @@ :global CleanName; - :local Cert [ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]; + :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; } From c823ff87ed32beeea6e0a49d194178db9944693d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 14:42:51 +0200 Subject: [PATCH 576/988] global-functions: $CertificateNameByCN: return false without match... ... and return true on success. --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 7b1c2143..d0145676 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -208,8 +208,12 @@ :global CleanName; :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); + :if ([ :len $Cert ] = 0) do={ + :return false; + } :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; + :return true; } # multiply given character(s) From d4b5e1f5e7acb59bc365c6598749d1ec15c8cd36 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Apr 2025 11:07:59 +0200 Subject: [PATCH 577/988] global-functions: $CertificateNameByCN: warn with no match --- global-functions.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index d0145676..70269c80 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -206,9 +206,11 @@ :local Match [ :tostr $1 ]; :global CleanName; + :global LogPrint; :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); :if ([ :len $Cert ] = 0) do={ + $LogPrint warning $0 ("No matching certificate found."); :return false; } :local CommonName [ /certificate/get $Cert common-name ]; From 75163f0d3cbd9daf6ff7977f60403beff1b9e76a Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Mon, 7 Apr 2025 13:51:56 +0200 Subject: [PATCH 578/988] INITIAL-COMMANDS: support installation from custom server Closes: https://github.com/eworm-de/routeros-scripts/pull/96 Co-authored-by: Christian Hesse --- INITIAL-COMMANDS.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 8b64d281..002e51af 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,23 +17,27 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; + :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local CertFileName "ISRG-Root-X2.pem"; + :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + + /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; - /certificate/import file-name="isrg-root-x2.pem" passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ + /certificate/import file-name=$CertFileName passphrase=""; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/remove [ find where name=$Script ]; - /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . ".rsc") output=user as-value]->"data"); + /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); }; /system/script { run global-config; run global-functions; }; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "ISRG Root X2"; + $CertificateNameByCN $CertFingerprint; }; Then continue setup with From 390e3653d714472f038814194239ad362c24baa9 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Mon, 7 Apr 2025 16:16:19 +0200 Subject: [PATCH 579/988] INITIAL-COMMANDS: add status output Co-authored-by: Christian Hesse --- INITIAL-COMMANDS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 002e51af..65b313b5 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -21,6 +21,7 @@ Run the complete base installation: :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + :put "Importing certificate..."; /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; /certificate/import file-name=$CertFileName passphrase=""; @@ -28,14 +29,19 @@ Run the complete base installation: :error "Something is wrong with your certificates!"; }; :delay 1s; + :put "Renaming global-config-overlay, if exists..."; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ + :put "Installing $Script..."; /system/script/remove [ find where name=$Script ]; /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); }; + :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; + :put "Scheduling to load configuration and functions..."; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; + :put "Renaming certificate by its common-name..."; :global CertificateNameByCN; $CertificateNameByCN $CertFingerprint; }; From d80f43a1c86760565d0e0a662ceb0de63636c61a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 11 Apr 2025 08:07:17 +0200 Subject: [PATCH 580/988] INITIAL-COMMANDS: fix typos --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 65b313b5..79773bd9 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -10,7 +10,7 @@ Initial commands [⬅️ Go back to main README](README.md) -> ⚠️ **Warning**: These command are inteneded for initial setup. If you are +> ⚠️ **Warning**: These commands are intended for initial setup. If you are > not aware of the procedure please follow > [the long way in detail](README.md#the-long-way-in-detail). From 29bcd191ee7b4487cb9c909e6c7778767c6283f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 17 Apr 2025 10:44:05 +0200 Subject: [PATCH 581/988] global-functions: $ScriptInstallUpdate: support downloading certificate... ... for individual scripts. Just add it in comment with "certificate=...". This also works on installtion: $ScriptInstallUpdate new-script "base-url=..., certificate=..."; Closes: https://github.com/eworm-de/routeros-scripts/pull/97 --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 70269c80..72c36cdc 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1195,6 +1195,12 @@ :error true; } + :if ([ :len ($ScriptInfo->"certificate") ] > 0) do={ + :if ([ $CertificateAvailable ($ScriptInfo->"certificate") ] = false) do={ + $LogPrint warning $0 ("Downloading certificate failed, trying without."); + } + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; From b78df91b23a4e108ef0268c3c604191581d104ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 17 Apr 2025 22:22:05 +0200 Subject: [PATCH 582/988] README: and another hint on RouterOS version --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1f7c8edd..e8e1b686 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,9 @@ And finally load configuration and functions and add the scheduler. ![screenshot: run and schedule scripts](README.d/05-run-and-schedule-scripts.avif) +> 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the +> RouterOS on your device is too old. Check for updates! + ### Scheduled automatic updates The last step is optional: Add this scheduler **only** if you want the From 405c329f39d402911ad5040f893a952df6407813 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:07:11 +0200 Subject: [PATCH 583/988] README: mark all external links --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e8e1b686..dcf9c283 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ RouterOS Scripts ![RouterOS Scripts Logo](logo.svg) -[RouterOS](https://mikrotik.com/software) is the operating system developed -by [MikroTik](https://mikrotik.com/aboutus) for networking tasks. This -repository holds a number of [scripts](https://wiki.mikrotik.com/wiki/Manual:Scripting) +[RouterOS ↗️](https://mikrotik.com/software) is the operating system developed +by [MikroTik ↗️](https://mikrotik.com/aboutus) for networking tasks. This +repository holds a number of [scripts ↗️](https://wiki.mikrotik.com/wiki/Manual:Scripting) to manage RouterOS devices or extend their functionality. *Use at your own risk*, pay attention to @@ -35,7 +35,7 @@ Specific scripts may require even newer RouterOS version. > running RouterOS v6 switch to `routeros-v6` branch! Starting with RouterOS 7.17 the -[device-mode](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) +[device-mode ↗️](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) has been extended to give more fine-grained control over what features are available. You need to enable `scheduler` and `fetch` at least, specific scripts may require additional features. @@ -61,9 +61,9 @@ First time users should take the long way below. ### Live presentation Want to see it in action? I've had a presentation [Repository based -RouterOS script distribution](https://www.youtube.com/watch?v=B9neG3oAhcY) +RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY) including demonstation recorded live at [MUM Europe -2019](https://mum.mikrotik.com/2019/EU/) in Vienna. +2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna. > ⚠️ **Warning**: Some details changed. So see the presentation, then follow > the steps below for up-to-date commands. @@ -83,7 +83,7 @@ Note that the commands above do *not* verify server certificate, so if you want to be safe download with your workstations's browser and transfer the file to your MikroTik device. -* [ISRG Root X2](https://letsencrypt.org/certs/isrg-root-x2.pem) +* [ISRG Root X2 ↗️](https://letsencrypt.org/certs/isrg-root-x2.pem) Then we import the certificate. @@ -194,7 +194,7 @@ Scheduler and events -------------------- Most scripts are designed to run regularly from -[scheduler](https://wiki.mikrotik.com/wiki/Manual:System/Scheduler). We just +[scheduler ↗️](https://wiki.mikrotik.com/wiki/Manual:System/Scheduler). We just added `check-routeros-update`, so let's run it daily to make sure not to miss an update. @@ -328,7 +328,7 @@ Possibly a scheduler and other configuration has to be removed as well. Contact ------- -We have a Telegram Group [RouterOS-Scripts](https://t.me/routeros_scripts)! +We have a Telegram Group [RouterOS-Scripts ↗️](https://t.me/routeros_scripts)! [![RouterOS Scripts Telegram Group](README.d/telegram-group.avif)](https://t.me/routeros_scripts) @@ -352,7 +352,7 @@ at github. This project is developed in private spare time and usage is free of charge for you. If you like the scripts and think this is of value for you or your business please consider to -[donate with PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J). +[donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J). [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=for-the-badge)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 158230070fbfae7a83b881b7bcd6f1651de45e54 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:14:02 +0200 Subject: [PATCH 584/988] BRANCHES: mark all external links --- BRANCHES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BRANCHES.md b/BRANCHES.md index 8a0bdadf..dc4f4ac4 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -13,7 +13,7 @@ Installing from branches > ⚠️ **Warning**: Living on the edge? Great, read on! > If not: Please use the `main` branch and leave this page! -These scripts are developed in a [git](https://git-scm.com/) repository. +These scripts are developed in a [git ↗️](https://git-scm.com/) repository. Development and experimental branches are used to provide early access for specific changes. You can install scripts from these branches for testing. From 8328400e8724006ce68a401d8297cbd8f4f30a7e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:14:53 +0200 Subject: [PATCH 585/988] CERTIFICATES: mark all external links --- CERTIFICATES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 5432d78a..8ead4527 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -21,7 +21,7 @@ first step of [installation](README.md#the-long-way-in-detail) is importing the certificate. The scripts can install additional certificates when required. This happens -from this repository if available, or from [mkcert.org](https://mkcert.org) +from this repository if available, or from [mkcert.org ↗️](https://mkcert.org) as a fallback. Get the certificate's CommonName @@ -29,7 +29,7 @@ Get the certificate's CommonName But how to determine what certificate may be required? Often easiest way is to use a desktop browser to get that information. This demonstration uses -[Mozilla Firefox](https://www.mozilla.org/firefox/). +[Mozilla Firefox ↗️](https://www.mozilla.org/firefox/). Let's assume we want to make sure the certificate for [git.eworm.de](https://git.eworm.de/) is available. Open that page in the From a1437a4c8315f2640925323cdea7fb620b7bbf5f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:13:00 +0200 Subject: [PATCH 586/988] CONTRIBUTIONS: mark all external links --- CONTRIBUTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 55d2205b..0b894531 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -31,7 +31,7 @@ for details! ## Donations Add yourself to the list, -[donate with PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! +[donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! * Abdul Mannan Abbasi * Andrea Ruffini Perico From b12f8a39745cb54318b5d55bf65a1d8cfff81b02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:17:58 +0200 Subject: [PATCH 587/988] doc/backup-cloud: mark all external links --- doc/backup-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 72869606..740af537 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -17,7 +17,7 @@ Description ----------- This script uploads -[binary backup to Mikrotik cloud](https://wiki.mikrotik.com/wiki/Manual:IP/Cloud#Backup). +[binary backup to Mikrotik cloud ↗️](https://wiki.mikrotik.com/wiki/Manual:IP/Cloud#Backup). > ⚠️ **Warning**: The used command can hit errors that a script can with > workaround only. A notification *should* be sent anyway. But it can result From 4118f53aae9c87dcc90dff6c800a8baf5d04785d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:09 +0200 Subject: [PATCH 588/988] doc/backup-partition: mark all external links --- doc/backup-partition.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 9d615a53..50b8a094 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -17,7 +17,7 @@ Description ----------- This script saves the current configuration to fallback -[partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). +[partition ↗️](https://wiki.mikrotik.com/wiki/Manual:Partitions). It can also copy-over the RouterOS installation when run interactively or just before a feature update. From 34eac64f3378387f402151d1a017fc00e81b7c61 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:26 +0200 Subject: [PATCH 589/988] doc/check-routeros-update: mark all external links --- doc/check-routeros-update.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index b6c716cb..ea9bcbec 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -30,8 +30,8 @@ automatically is supported. > ⚠️ **Warning**: Installing updates is important from a security point > of view. At the same time it can be source of serve breakage. So test > versions in lab and read -> [changelog](https://mikrotik.com/download/changelogs/) and -> [forum](https://forum.mikrotik.com/viewforum.php?f=21) before deploying +> [changelog ↗️](https://mikrotik.com/download/changelogs/) and +> [forum ↗️](https://forum.mikrotik.com/viewforum.php?f=21) before deploying > to your production environment! Automatic updates should be handled > with care! From 3788a3e2861c7a3f48f221771977c133204a7f32 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:40 +0200 Subject: [PATCH 590/988] doc/fw-addr-lists: mark all external links --- doc/fw-addr-lists.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index cb560d74..d09383bf 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,10 +19,10 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains a -[collective list by GitHub user @stamparm](https://github.com/stamparm/ipsum), -lists from [dshield.org](https://dshield.org/) and -[blocklist.de](https://www.blocklist.de/), and lists from -[spamhaus.org](https://spamhaus.org/) are prepared. +[collective list by GitHub user @stamparm ↗️](https://github.com/stamparm/ipsum), +lists from [dshield.org ↗️](https://dshield.org/) and +[blocklist.de ↗️](https://www.blocklist.de/), and lists from +[spamhaus.org ↗️](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not see situation when the lists are not populated. From 2fa044972cc2e38e404b0e76035609c51174c0d3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:50 +0200 Subject: [PATCH 591/988] doc/log-forward: mark all external links --- doc/log-forward.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/log-forward.md b/doc/log-forward.md index 3c195694..9ead1652 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -72,7 +72,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: > your local `global-config-overlay` and modify it to your specific needs. These patterns are matched as -[regular expressions](https://wiki.mikrotik.com/wiki/Manual:Regular_Expressions). +[regular expressions ↗️](https://wiki.mikrotik.com/wiki/Manual:Regular_Expressions). To forward **all** (ignoring severity) log messages with topics `account` (which includes user logins) and `dhcp` you need something like: From 0eaefcdc72ba217990fce4bf17460337697305a9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:12 +0200 Subject: [PATCH 592/988] doc/mod/notification-email: mark all external links --- doc/mod/notification-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 34d1c09e..dabadf31 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -32,7 +32,7 @@ Configuration ------------- Set up your device's -[e-mail settings](https://wiki.mikrotik.com/wiki/Manual:Tools/email). +[e-mail settings ↗️](https://wiki.mikrotik.com/wiki/Manual:Tools/email). Also make sure the device has correct time configured, best is to set up the ntp client. From 183b16d83c1a182ba35d21453687a27106d94883 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:31 +0200 Subject: [PATCH 593/988] doc/mod/notification-matrix: mark all external links --- doc/mod/notification-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 89c1b01d..da725cff 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Matrix](https://matrix.org/) via client server api. A queue is used to +[Matrix ↗️](https://matrix.org/) via client server api. A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation From c69b13c87961dbfced0002e85b98a32fe6b7fc84 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:41 +0200 Subject: [PATCH 594/988] doc/mod/notification-notify: mark all external links --- doc/mod/notification-ntfy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 51756ace..ef5dd58c 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Ntfy](https://ntfy.sh/). A queue is used to make sure +[Ntfy ↗️](https://ntfy.sh/). A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation @@ -28,7 +28,7 @@ Just install the module: $ScriptInstallUpdate mod/notification-ntfy; Also install the Ntfy app on your mobile device or use the -[web app](https://ntfy.sh/app) in a browser of your choice. +[web app ↗️](https://ntfy.sh/app) in a browser of your choice. Configuration ------------- From 3822887ba2d157101caf3529a5234d3974ef472e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:49 +0200 Subject: [PATCH 595/988] doc/mod/notification-telegram: mark all external links --- doc/mod/notification-telegram.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 2d00116a..6b10fed5 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Telegram](https://telegram.org/) via bot api. A queue is used to make sure +[Telegram ↗️](https://telegram.org/) via bot api. A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation @@ -33,7 +33,7 @@ and create an account. Configuration ------------- -Open Telegram, then start a chat with [BotFather](https://t.me/BotFather) and +Open Telegram, then start a chat with [BotFather ↗️](https://t.me/BotFather) and create your own bot: ![create new bot](notification-telegram.d/newbot.avif) @@ -102,7 +102,7 @@ Tips & Tricks ### Set a profile photo You can use a profile photo for your bot to make it recognizable. Open the -chat with [BotFather](https://t.me/BotFather) and set it there. +chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) From fe649181180986935a049b489322b10327ba0697 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Apr 2025 10:48:36 +0200 Subject: [PATCH 596/988] README: add disclaimer on external links --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dcf9c283..1d2d64fb 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ repository holds a number of [scripts ↗️](https://wiki.mikrotik.com/wiki/Man to manage RouterOS devices or extend their functionality. *Use at your own risk*, pay attention to -[license and warranty](#license-and-warranty)! +[license and warranty](#license-and-warranty), and +[disclaimer on external links](#disclaimer-on-external-links)! Requirements ------------ @@ -371,6 +372,21 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU General Public License](COPYING.md) for more details. +Disclaimer on external links +---------------------------- + +Our website contains links to the websites of third parties ("external +links"). As the content of these websites is not under our control, we +cannot assume any liability for such external content. In all cases, the +provider of information of the linked websites is liable for the content +and accuracy of the information provided. At the point in time when the +links were placed, no infringements of the law were recognisable to us. +As soon as an infringement of the law becomes known to us, we will +immediately remove the link in question. + +> 💡️ **Hint**: All external links are marked with an arrow pointing +> diagonally in an up-right (or north-east) direction (↗️). + Upstream -------- From 0717ebfbd500517231a6da31091a1f4d59bedd00 Mon Sep 17 00:00:00 2001 From: Leonardo David Monteiro Date: Tue, 4 Mar 2025 17:21:00 +0100 Subject: [PATCH 597/988] introduce mod/notification-gotify... ... for sending notifications via Gotify (https://gotify.net). Closes: https://github.com/eworm-de/routeros-scripts/pull/92 Co-authored-by: Christian Hesse --- CERTIFICATES.md | 1 + README.md | 1 + doc/backup-cloud.md | 1 + doc/backup-upload.md | 1 + doc/check-certificates.md | 1 + doc/check-health.md | 1 + doc/check-lte-firmware-upgrade.md | 1 + doc/check-perpetual-license.md | 1 + doc/check-routeros-update.md | 1 + doc/collect-wireless-mac.md | 1 + doc/daily-psk.md | 1 + doc/log-forward.md | 7 +- doc/mod/notification-email.md | 1 + doc/mod/notification-gotify.d/appsetup.avif | Bin 0 -> 18099 bytes doc/mod/notification-gotify.md | 97 ++++++++++++++ doc/mod/notification-matrix.md | 1 + doc/mod/notification-ntfy.md | 1 + doc/mod/notification-telegram.md | 1 + doc/netwatch-notify.md | 1 + doc/sms-forward.md | 1 + global-config.rsc | 6 + global-functions.rsc | 2 +- mod/notification-gotify.rsc | 139 ++++++++++++++++++++ news-and-changes.rsc | 1 + 24 files changed, 265 insertions(+), 4 deletions(-) create mode 100644 doc/mod/notification-gotify.d/appsetup.avif create mode 100644 doc/mod/notification-gotify.md create mode 100644 mod/notification-gotify.rsc diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 8ead4527..69d6c185 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -74,6 +74,7 @@ See also * [Download, import and update firewall address-lists](doc/fw-addr-lists.md) * [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) +* [Send notifications via Gotify](doc/mod/notification-gotify.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/README.md b/README.md index 1d2d64fb..2a8b2cef 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,7 @@ Available modules * [Inspect variables](doc/mod/inspectvar.md) (`mod/inspectvar`) * [IP address calculation](doc/mod/ipcalc.md) (`mod/ipcalc`) * [Send notifications via e-mail](doc/mod/notification-email.md) (`mod/notification-email`) +* [Send notifications via Gotify](doc/mod/notification-gotify.md) (`mod/notification-gotify`) * [Send notifications via Matrix](doc/mod/notification-matrix.md) (`mod/notification-matrix`) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) (`mod/notification-ntfy`) * [Send notifications via Telegram](doc/mod/notification-telegram.md) (`mod/notification-telegram`) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 740af537..7d55d748 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -49,6 +49,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/backup-upload.md b/doc/backup-upload.md index 6a5b0e4f..b4012c8b 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -55,6 +55,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 4c144ba3..a9426dba 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -51,6 +51,7 @@ subject alternative name (aka *Subject Alt Name* or *SAN*) can be used. Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-health.md b/doc/check-health.md index 7cf0c33e..33847e36 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -113,6 +113,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 3693b712..a84e2ac2 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -44,6 +44,7 @@ Configuration Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md index d4440045..0335fb54 100644 --- a/doc/check-perpetual-license.md +++ b/doc/check-perpetual-license.md @@ -41,6 +41,7 @@ Configuration No extra configuration is required for this script, but notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index ea9bcbec..a45e0751 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -73,6 +73,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 01975223..2378fed8 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -54,6 +54,7 @@ entries are to be added. Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 4a3de64e..118d768c 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -79,6 +79,7 @@ For legacy local interface: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [trix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/log-forward.md b/doc/log-forward.md index 9ead1652..f6086c85 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -22,15 +22,15 @@ server (see `/system/logging`). This has some limitation, however: * does not work early after boot if network connectivity is not yet established, or breaks intermittently * lots of messages generate a flood of mails -* Matrix, Ntfy and Telegram are not supported +* Gotify, Matrix, Ntfy and Telegram are not supported The script works around the limitations, for example it does: * read from `/log`, including messages from early boot * skip multi-repeated messages * rate-limit itself to mitigate flooding -* forward via notification (which includes *e-mail*, *Matrix*, *Ntfy* and - *Telegram* when installed and configured, see below) +* forward via notification (which includes *e-mail*, *Gotify*, *Matrix*, + *Ntfy* and *Telegram* when installed and configured, see below) It is intended to be run periodically from scheduler, then collects new log messages and forwards them via notification. @@ -80,6 +80,7 @@ To forward **all** (ignoring severity) log messages with topics `account` Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index dabadf31..127bf964 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -79,6 +79,7 @@ function available: See also -------- +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-gotify.d/appsetup.avif b/doc/mod/notification-gotify.d/appsetup.avif new file mode 100644 index 0000000000000000000000000000000000000000..58f57a807cd9c4853bf819336af8dc65f2eddd48 GIT binary patch literal 18099 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 literal 0 HcmV?d00001 diff --git a/doc/mod/notification-gotify.md b/doc/mod/notification-gotify.md new file mode 100644 index 00000000..6fce6293 --- /dev/null +++ b/doc/mod/notification-gotify.md @@ -0,0 +1,97 @@ +Send notifications via Gotify +=========================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../../README.md) + +> ℹ️️ **Info**: This module can not be used on its own but requires the base +> installation. See [main README](../../README.md) for details. + +Description +----------- + +This module adds support for sending notifications via +[Gotify ↗️](https://gotify.net/). A queue is used to make sure +notifications are not lost on failure but sent later. + +Requirements and installation +----------------------------- + +Just install the module: + + $ScriptInstallUpdate mod/notification-gotify; + +Also deploy the [Gotify server ↗️](https://github.com/gotify/server) and +optionally install a Gotify client on your mobile device. + +Configuration +------------- + +Follow the [Installation ↗️](https://gotify.net/docs/install) instructions +and the [First Login ↗️](https://gotify.net/docs/first-login) setup. Once +you have a user and account you can start creating apps. Each app is an +independent notification feed for a device or application. + +![Create new app](notification-gotify.d/appsetup.avif) + +On creation apps are assigned a *Token* for authentification, you will need +that in configuration. + +Edit `global-config-overlay`, add `GotifyServer` with your server address +(just the address, no protocol - `https://` is assumed) and `GotifyToken` +with the *Token* from your configured app on the Gotify server. Then reload +the configuration. + +> ℹ️ **Info**: Copy relevant configuration from +> [`global-config`](../../global-config.rsc) (the one without `-overlay`) to +> your local `global-config-overlay` and modify it to your specific needs. + +For a custom service installing an additional certificate may be required. +You may want to install that certificate manually, after finding the +[certificate name from browser](../../CERTIFICATES.md). + +Usage and invocation +-------------------- + +There's nothing special to do. Every script or function sending a notification +will now send it to your Gotify application feed. + +But of course you can use the function to send notifications directly. Give +it a try: + + $SendGotify "Subject..." "Body..."; + +Alternatively this sends a notification with all available and configured +methods: + + $SendNotification "Subject..." "Body..."; + +To use the functions in your own scripts you have to declare them first. +Place this before you call them: + + :global SendGotify; + :global SendNotification; + +In case there is a situation when the queue needs to be purged there is a +function available: + + $PurgeGotifyQueue; + +See also +-------- + +* [Certificate name from browser](../../CERTIFICATES.md) +* [Send notifications via e-mail](notification-email.md) +* [Send notifications via Matrix](notification-matrix.md) +* [Send notifications via Ntfy](notification-ntfy.md) +* [Send notifications via Telegram](notification-telegram.md) + +--- +[⬅️ Go back to main README](../../README.md) +[⬆️ Go back to top](#top) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index da725cff..da6d6dea 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -131,6 +131,7 @@ See also * [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index ef5dd58c..993501d9 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -90,6 +90,7 @@ See also * [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 6b10fed5..804104fa 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -115,6 +115,7 @@ See also * [Chat with your router and send commands via Telegram bot](../telegram-chat.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Ntfy](notification-ntfy.md) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 81adfe9d..91c568fc 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -47,6 +47,7 @@ The hosts to be checked have to be added to netwatch with specific comment: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/sms-forward.md b/doc/sms-forward.md index ccb6482b..0c1317d3 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -56,6 +56,7 @@ The configuration goes to `global-config-overlay`, this is the only parameter: Notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/global-config.rsc b/global-config.rsc index fa32b163..42a457a5 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -63,6 +63,12 @@ :global NtfyServerToken ""; :global NtfyTopic ""; +# You can send Gotify notifications. Configure these settings and +# install the module: +# $ScriptInstallUpdate mod/notification-gotify +:global GotifyServer ""; +:global GotifyToken ""; + # It is possible to override e-mail, Telegram, Matrix and Ntfy setting # for every script. This is done in arrays, where 'Override' is appended # to the variable name, like this: diff --git a/global-functions.rsc b/global-functions.rsc index 72c36cdc..71aa7de3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 136; +:global ExpectedConfigVersion 137; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc new file mode 100644 index 00000000..70709189 --- /dev/null +++ b/mod/notification-gotify.rsc @@ -0,0 +1,139 @@ +#!rsc by RouterOS +# RouterOS script: mod/notification-gotify +# Copyright (c) 2013-2025 Christian Hesse +# Leonardo David Monteiro +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.15 +# requires device-mode, fetch, scheduler +# +# send notifications via Gotify (gotify.net) +# https://rsc.eworm.de/doc/mod/notification-gotify.md + +:global FlushGotifyQueue; +:global NotificationFunctions; +:global PurgeGotifyQueue; +:global SendGotify; +:global SendGotify2; + +# flush Gotify queue +:set FlushGotifyQueue do={ :do { + :global GotifyQueue; + + :global IsFullyConnected; + :global LogPrint; + + :if ([ $IsFullyConnected ] = false) do={ + $LogPrint debug $0 ("System is not fully connected, not flushing."); + :return false; + } + + :local AllDone true; + :local QueueLen [ :len $GotifyQueue ]; + + :if ([ :len [ /system/scheduler/find where name="_FlushGotifyQueue" ] ] > 0 && $QueueLen = 0) do={ + $LogPrint warning $0 ("Flushing Gotify messages from scheduler, but queue is empty."); + } + + :foreach Id,Message in=$GotifyQueue do={ + :if ([ :typeof $Message ] = "array" ) do={ + :do { + /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."); + :set AllDone false; + } + } + } + + :if ($AllDone = true && $QueueLen = [ :len $GotifyQueue ]) do={ + /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; + :set GotifyQueue; + } +} on-error={ + :global ExitError; $ExitError false $0; +} } + +# send notification via Gotify - expects one array argument +:set ($NotificationFunctions->"gotify") do={ + :local Notification $1; + + :global Identity; + :global IdentityExtra; + :global GotifyQueue; + :global GotifyServer; + :global GotifyServerOverride; + :global GotifyToken; + :global GotifyTokenOverride; + + :global EitherOr; + :global FetchUserAgentStr; + :global IfThenElse; + :global LogPrint; + :global SymbolForNotification; + + :local Server [ $EitherOr ($GotifyServerOverride->($Notification->"origin")) $GotifyServer ]; + :local Token [ $EitherOr ($GotifyTokenOverride->($Notification->"origin")) $GotifyToken ]; + + :if ([ :len $Token ] = 0) do={ + :return false; + } + + :local Url ("https://" . $Server . "/message"); + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ + ("X-Gotify-Key: " . $Token); "Content-Type: application/json" }); + :local Message ({ + "title"=("[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")); \ + "message"=(($Notification->"message") . "\n" . [ $IfThenElse ([ :len ($Notification->"link") ] > 0) \ + ("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ]); \ + "priority"=[ :tonum [ $IfThenElse ($Notification->"silent") 2 5 ] ] }); + + :do { + /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..."); + + :if ([ :typeof $GotifyQueue ] = "nothing") do={ + :set GotifyQueue ({}); + } + :set ($Message->"message") (($Notification->"message") . "\n" . \ + [ $SymbolForNotification "alarm-clock" ] . "This message was queued since " . \ + [ /system/clock/get date ] . " " . [ /system/clock/get time ] . " and may be obsolete."); + :set ($GotifyQueue->[ :len $GotifyQueue ]) \ + { url=$Url; headers=$Headers; message=$Message }; + :if ([ :len [ /system/scheduler/find where name="_FlushGotifyQueue" ] ] = 0) do={ + /system/scheduler/add name="_FlushGotifyQueue" interval=1m start-time=startup \ + on-event=(":global FlushGotifyQueue; \$FlushGotifyQueue;"); + } + } +} + +# purge the Gotify queue +:set PurgeGotifyQueue do={ + :global GotifyQueue; + + /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; + :set GotifyQueue; +} + +# send notification via Gotify - expects at least two string arguments +:set SendGotify do={ :do { + :global SendGotify2; + + $SendGotify2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); +} on-error={ + :global ExitError; $ExitError false $0; +} } + +# send notification via Gotify - expects one array argument +:set SendGotify2 do={ + :local Notification $1; + + :global NotificationFunctions; + + ($NotificationFunctions->"gotify") ("\$NotificationFunctions->\"gotify\"") $Notification; +} diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 55b41650..a9a29049 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -61,6 +61,7 @@ 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; + 137="Added support to send notifications via Gotify (gotify.net)."; }; # Migration steps to be applied on script updates From 07541a3cbcacdc53c7108fabb17deb73e5c93bef Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 26 Apr 2025 01:18:40 +0200 Subject: [PATCH 598/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b894531..5bf5d089 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -22,6 +22,7 @@ for details! * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Ilya Kulakov](mailto:kulakov.ilya@gmail.com) (@Kentzo) +* [Leonardo David Monteiro](mailto:leo@cub3.xyz) (@leosfsm) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen From fa83c76be17c6a6bb1472c7e1e7dacf20178397f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 26 Apr 2025 00:54:46 +0200 Subject: [PATCH 599/988] doc/check-lte-firmware-upgrade: add missing reference for ntfy --- doc/check-lte-firmware-upgrade.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index a84e2ac2..a0c441e3 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -45,7 +45,8 @@ Configuration Also notification settings are required for [e-mail](mod/notification-email.md), [gotify](mod/notification-gotify.md), -[matrix](mod/notification-matrix.md) and/or +[matrix](mod/notification-matrix.md), +[ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). See also From 154fb438002c0103eef88a207f0f86b417a86dda Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 3 May 2025 22:01:47 +0200 Subject: [PATCH 600/988] mod/notification-ntfy: drop unused variable --- mod/notification-ntfy.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index aac6d6c1..2748c5b6 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -18,7 +18,6 @@ # flush ntfy queue :set FlushNtfyQueue do={ :do { :global NtfyQueue; - :global NtfyMessageIDs; :global IsFullyConnected; :global LogPrint; From ccfe1a781edc2990575cca57d49582e7e046d960 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:25:28 +0200 Subject: [PATCH 601/988] check-routeros-update: log and print info with scheduler --- check-routeros-update.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 361be34e..1b68d5af 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -62,8 +62,9 @@ $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ + $LogPrint info $ScriptName ("A reboot for update is already scheduled."); :set ExitOK true; - :error "A reboot for update is already scheduled."; + :error false; } $LogPrint debug $ScriptName ("Checking for updates..."); From 90f61d3d75bccb8f8892dc7190ec325ccc7d940f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:17:26 +0200 Subject: [PATCH 602/988] global-functions: $ExitError: support to pass in error message --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 71aa7de3..17b36741 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -452,13 +452,15 @@ :set ExitError do={ :local ExitOK [ :tostr $1 ]; :local Name [ :tostr $2 ]; + :local Error [ :tostr $3 ]; :global IfThenElse; :global LogPrint; :if ($ExitOK = "false") do={ $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ - "Function" "Script" ] . " '" . $Name . "' exited with error."); + "Function" "Script" ] . " '" . $Name . "' exited with error" . \ + [ $IfThenElse (!($Error ~ "^(|true|false)\$")) (": " . $Error) "." ]); } } From 41bf9677db821c1d2c2479dc4f6f8b8740f3bdbe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:49:49 +0200 Subject: [PATCH 603/988] global-functions: use :onerror for outer block --- global-functions.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 17b36741..29e6d06b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1119,7 +1119,7 @@ } # install new scripts, update existing scripts -:set ScriptInstallUpdate do={ :do { +:set ScriptInstallUpdate do={ :onerror Err { :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; @@ -1396,8 +1396,8 @@ :set GlobalConfigChanges; :set GlobalConfigMigration; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # lock script against multiple invocation @@ -1538,12 +1538,12 @@ } # send notification via NotificationFunctions - expects at least two string arguments -:set SendNotification do={ :do { +:set SendNotification do={ :onerror Err { :global SendNotification2; $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via NotificationFunctions - expects one array argument From b9faeb86b98cc1667f0591dfd34ca43dbd6a718b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 604/988] accesslist-duplicates: use :onerror for outer block --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 27546c8d..c0967541 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 589815d6..6f2d1205 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index ccbca3df..b08f2adb 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -41,6 +41,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 527ebb4b..ccd04f5d 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 02a205b14ecec27f535b0453c012e27a03c2a6ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 605/988] backup-cloud: use :onerror for outer block --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index c4e23b2a..bc09aac2 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupRandomDelay; @@ -99,6 +99,6 @@ :set PackagesUpdateBackupFailure true; } $RmDir "tmpfs/backup-cloud"; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 953daca8ac06c01050057f1e14e2020a58116f50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 606/988] backup-email: use :onerror for outer block --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index d0973011..95f25109 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPassword; @@ -135,6 +135,6 @@ :delay 1s; :set I ($I + 1); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 34c052c5f14da6d9a68861f26b383594ee61bcb4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 607/988] backup-partition: use :onerror for outer block --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 1f0cf2ee..42f77904 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; @@ -121,6 +121,6 @@ :set ExitOK true; :error false; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 0a9acab0405fc5ec5081e6f423c04e26c1847cac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 608/988] backup-upload: use :onerror for outer block --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 14c39141..945659a0 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPassword; @@ -173,6 +173,6 @@ :set PackagesUpdateBackupFailure true; } $RmDir $DirName; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e0ba2c8282be0af1a1f43a5ebd51fb5848c955b9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 609/988] capsman-download-packages: use :onerror for outer block --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 25c43f58..688f7041 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -87,6 +87,6 @@ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index b2698382..12506ead 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -98,6 +98,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 901bb0af..78238ef3 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -89,6 +89,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 54a3012e89a4b377a1f5f1ac9435b7d3a8912ec1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 610/988] capsman-rolling-upgrade: use :onerror for outer block --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 791b3dbb..813b8e59 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -45,6 +45,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 0b1cc2ba..355926da 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -17,7 +17,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -53,6 +53,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 4afdee2e..3d5c801f 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -46,6 +46,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 009516dbd4525126d688b26e189fa7f3be893f93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 611/988] certificate-renew-issued: use :onerror for outer block --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 91a48dea..dc724b00 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertIssuedExportPass; @@ -47,6 +47,6 @@ $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e44a5384b7e21e0013746a1d06762d969d5b45d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 612/988] check-certificates: use :onerror for outer block --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index be8e4dff..75a006eb 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertRenewTime; @@ -237,6 +237,6 @@ ", it is invalid after " . ($CertVal->"invalid-after") . "."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 051a1d95e5e1f5e90e79d505ef4bf542344cd64d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 613/988] check-health: use :onerror for outer block --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index f02a2491..75710a07 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; @@ -105,6 +105,6 @@ } :set CheckHealthPlugins; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From b959f2d941a87bd24e3495ca3d30a765200f8698 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 614/988] check-lte-firmware-upgrade: use :onerror for outer block --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index c5b6cb56..f0b173fa 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; @@ -102,6 +102,6 @@ :foreach Interface in=[ /interface/lte/find ] do={ $CheckInterface $ScriptName $Interface; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From f5c33a9cfb367cf80b2bf34a924f95d6e124c454 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 615/988] check-perpetual-license: use :onerror for outer block --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index 9a3a3c74..7caa69aa 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -73,6 +73,6 @@ ". It is now valid until " . ($License->"deadline-at") . ".") }); :set SentCertificateNotification; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 472dc9289dd1bf9309c17341bd996149ef0837d8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 616/988] check-routeros-update: use :onerror for outer block --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 1b68d5af..ee7e5dac 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -214,6 +214,6 @@ " is available for downgrade."); :set SentRouterosUpdateNotification ($Update->"latest-version"); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 7d8e9fda29f219471d8d68e1feb70e01e8d7e8dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 617/988] collect-wireless-mac: use :onerror for outer block --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 17e09e3c..5cec9b90 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -95,6 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 4a38bfa4..db75d69b 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -96,6 +96,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index da901be2..144a8be1 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -113,6 +113,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index cb217ce1..74f3ec6d 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -95,6 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 55e07a8a4223850c94e24706fcf929c2328415d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 618/988] daily-psk: use :onerror for outer block --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 56729315..e4e7b8b1 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -91,6 +91,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 9dea4692..efea9b50 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -90,6 +90,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 8202eeba..5944c743 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -106,6 +106,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 3de3c5b6..050e9c27 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -91,6 +91,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 5dc6b712e187af1e84b75d7e497ad7f50ca1bad7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 619/988] dhcp-lease-comment: use :onerror for outer block --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 36b31c85..92495c91 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 35dc6f68..07802bc2 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 47a85542..814e1d7c 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -43,6 +43,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index e0f97851..92fb6b00 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 8ed83a311d3b9140b01c2dd5064f59ad4bcc3955 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 620/988] dhcp-to-dns: use :onerror for outer block --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 9b940984..b032071f 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Domain; @@ -125,6 +125,6 @@ $LogPrint debug $ScriptName ("No address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d99380443b1607389d107bf0fbc4182168a4d8b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 621/988] firmware-upgrade-reboot: use :onerror for outer block --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 86a9a8c5..9c3ba76b 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -55,6 +55,6 @@ $LogPrint info $ScriptName ("Firmware upgrade successful, rebooting."); /system/reboot; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 0e93d8ca665100a0db14b4191c494af51a238a35 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 622/988] fw-addr-lists: use :onerror for outer block --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index f0940fef..0fd79c1b 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global FwAddrLists; @@ -209,6 +209,6 @@ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d609da00416f95eb74e9742dbc0a981a5b9a41b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 623/988] gps-track: use :onerror for outer block --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index dea56d2e..bd280c9b 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global GpsTrackUrl; @@ -48,6 +48,6 @@ } else={ $LogPrint debug $ScriptName ("GPS data not valid."); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 143b8a8ddc2b30940333b95e09d23574076e48cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 624/988] hotspot-to-wpa-cleanup: use :onerror for outer block --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 033d0e73..6cd1bfbc 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -75,6 +75,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 0f8c490e..18d6beae 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -17,7 +17,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -82,6 +82,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index dfec697d..6348f74f 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -75,6 +75,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 9ae733a1678577a96ba00a79de347a18c8cec319 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 625/988] hotspot-to-wpa: use :onerror for outer block --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 3f514750..54724cff 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -100,6 +100,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 068241d1..6764af9f 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -120,6 +120,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index cc5e2fc6..e74081ae 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -97,6 +97,6 @@ :delay 2s; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 1075b6b24e8875ced9da78f0a9c112283e345f21 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 626/988] ipsec-to-dns: use :onerror for outer block --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 26dab0a2..a2739328 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Domain; @@ -79,6 +79,6 @@ /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 39ab19b272160f85df034a5f71d4d5dd5748e962 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 627/988] ipv6-update: use :onerror for outer block --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 94bd1bc4..633919d3 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -102,6 +102,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From da9313801774c2f5d7c02d1b5bd3ac001e0be20f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 628/988] lease-script: use :onerror for outer block --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index bf27fda8..309337c7 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Grep; @@ -60,6 +60,6 @@ $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From c643069b3e77cca143f3f58ad10fe69c9eda69e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 629/988] log-forward: use :onerror for outer block --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index afeb3f29..0ce420f2 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -108,6 +108,6 @@ :local LogAll [ /log/find ]; :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 9acf9781cbe85c23b76bd82d1843b7fc9fa16913 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 630/988] accesslist-duplicates: fail if global functions do not become ready --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index c0967541..545b24ea 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 6f2d1205..ac2c7fe3 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index b08f2adb..89559918 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -11,11 +11,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index ccd04f5d..331de751 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); From 7d4e4ec273342ce0738102ce123deb673b199d3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 631/988] backup-cloud: fail if global functions do not become ready --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index bc09aac2..f0861f09 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -9,11 +9,11 @@ # upload backup to MikroTik cloud # https://rsc.eworm.de/doc/backup-cloud.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 64ec962bb6de5cef73a2c0da378f4e49a73e6e8e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 632/988] backup-email: fail if global functions do not become ready --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 95f25109..da2ee02d 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -9,11 +9,11 @@ # create and email backup and config file # https://rsc.eworm.de/doc/backup-email.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From bf1b3e3c5e7943309fbb1b036babd628b827dc63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 633/988] backup-partition: fail if global functions do not become ready --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 42f77904..f99a66c1 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -10,11 +10,11 @@ # save configuration to fallback partition # https://rsc.eworm.de/doc/backup-partition.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; From 9423d8019a5aa7a78f9fea16b228af112848f1f3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 634/988] backup-upload: fail if global functions do not become ready --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 945659a0..9373b4c1 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -10,11 +10,11 @@ # create and upload backup and config file # https://rsc.eworm.de/doc/backup-upload.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From 33393798b1a7eb5756b1da6b89d72daff05eea96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 635/988] capsman-download-packages: fail if global functions do not become ready --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 688f7041..ee826386 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 12506ead..91a9167c 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 78238ef3..cb6cb6f4 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; From de5aab12ae2e3d8db965925941746d202813650a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 636/988] capsman-rolling-upgrade: fail if global functions do not become ready --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 813b8e59..20978802 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 355926da..75de088f 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -13,11 +13,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 3d5c801f..e6c6facb 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From b4188ab1a2356c0ce5f70f449a185900decc86ea Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 637/988] certificate-renew-issued: fail if global functions do not become ready --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index dc724b00..3fd60208 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -8,11 +8,11 @@ # renew locally issued certificates # https://rsc.eworm.de/doc/certificate-renew-issued.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertIssuedExportPass; From 9b811e1ed25c9fc6c47eb4ef4d31036e3b7e3d0a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 638/988] check-certificates: fail if global functions do not become ready --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 75a006eb..505ec4b0 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -9,11 +9,11 @@ # check for certificate validity # https://rsc.eworm.de/doc/check-certificates.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertRenewTime; From 96cbb32a4f073e11f264e4a641cb304de49fb435 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 639/988] check-health: fail if global functions do not become ready --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 75710a07..40ce101d 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -8,11 +8,11 @@ # check for RouterOS health state # https://rsc.eworm.de/doc/check-health.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; From 8f1ac6fa17afd96afb82de31f0e997b73f40d883 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 640/988] check-lte-firmware-upgrade: fail if global functions do not become ready --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index f0b173fa..6030e4d4 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -8,11 +8,11 @@ # check for LTE firmware upgrade, send notification # https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; From 08d78224a000751409cd715c4219aae3e2ac9eba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 641/988] check-perpetual-license: fail if global functions do not become ready --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index 7caa69aa..d46f0b49 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -8,11 +8,11 @@ # check perpetual license on CHR # https://rsc.eworm.de/doc/check-perpetual-license.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 69b2af4bd7ac5f63860532c36d762953adf87d90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 10:46:44 +0200 Subject: [PATCH 642/988] check-routeros-update: fail if global functions do not become ready --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index ee7e5dac..932256ad 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -9,11 +9,11 @@ # check for RouterOS update, send notification and/or install # https://rsc.eworm.de/doc/check-routeros-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 2712bcb44db3e323faf2ddc18ddd228fcdbf215a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 643/988] collect-wireless-mac: fail if global functions do not become ready --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 5cec9b90..fa6198a0 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index db75d69b..4082bbbe 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 144a8be1..51671562 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 74f3ec6d..af0dd8b2 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 8418d58ff0703d18db0e513bd71484dc93c9e821 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 644/988] daily-psk: fail if global functions do not become ready --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index e4e7b8b1..a1b01fc8 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index efea9b50..6ba6ce2f 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5944c743..43ce3331 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 050e9c27..7e1714dc 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; From ff03f49724cdcba8774de481779b5f7e7993dc36 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 645/988] mode-button: use :onerror for outer block --- mode-button.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index edc5f400..83897ba7 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global ModeButton; @@ -26,7 +26,7 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); - :global ModeButtonScheduler do={ :do { + :global ModeButtonScheduler do={ :onerror Err { :local FuncName $0; :global ModeButton; @@ -82,8 +82,8 @@ } else={ $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } - } on-error={ - :global ExitError; $ExitError false $0; + } do={ + :global ExitError; $ExitError false $0 $Err; } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; @@ -91,6 +91,6 @@ $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From a556f4c39858223e75e60228f9618aaaf0cc0af7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 646/988] dhcp-lease-comment: fail if global functions do not become ready --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 92495c91..724682b1 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 07802bc2..0a5f3b56 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 814e1d7c..71307b70 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 92fb6b00..1f29f0b4 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 2d41ad718d785545c165ef4bcf4603abdbeec020 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 647/988] netwatch-dns: use :onerror for outer block --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 467d6362..1d2d86b2 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertificateAvailable; @@ -145,6 +145,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From a308d4269e5d20f3787c524a427e8acf55e7a1d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 648/988] dhcp-to-dns: fail if global functions do not become ready --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index b032071f..e66704b1 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -9,11 +9,11 @@ # check DHCP leases and add/remove/update DNS entries # https://rsc.eworm.de/doc/dhcp-to-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 0df4170a2e634591327088988f685f0c35d82569 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 649/988] netwatch-notify: use :onerror for outer block --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0b8a8dc5..d256689a 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global NetwatchNotify; @@ -224,6 +224,6 @@ "since"=($Metric->"since") }; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 4d1349125da065caaa0f3a572629c875eeb01d96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 650/988] firmware-upgrade-reboot: fail if global functions do not become ready --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 9c3ba76b..d5774db1 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -8,11 +8,11 @@ # install firmware upgrade, and reboot # https://rsc.eworm.de/doc/firmware-upgrade-reboot.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From c720eadd2c42286653ac8984d6e7c255b2ad97a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 651/988] ospf-to-leds: use :onerror for outer block --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index a8662b32..e2f4dcf6 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -44,6 +44,6 @@ /system/leds/set type=off [ find where leds=$LED ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 4b92181f2eefcc416c3281fc376c42e33712eb55 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 652/988] fw-addr-lists: fail if global functions do not become ready --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 0fd79c1b..1a892dac 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -8,11 +8,11 @@ # download, import and update firewall address-lists # https://rsc.eworm.de/doc/fw-addr-lists.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global FwAddrLists; From 9a5a2aec4fc08685725e3d0ef2b98459cfd433e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 653/988] packages-update: use :onerror for outer block --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index b11596ea..dce7cca4 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupRandomDelay; @@ -163,6 +163,6 @@ $LogPrint info $ScriptName ("Rebooting for update."); :delay 1s; /system/reboot; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 925e7f869e59b1c544062bdd6693f2a286a5504e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 654/988] gps-track: fail if global functions do not become ready --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index bd280c9b..d66bf009 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -9,11 +9,11 @@ # track gps data by sending json data to http server # https://rsc.eworm.de/doc/gps-track.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global GpsTrackUrl; From aeccd36f16a13ebe01a48a9b522b503adf599c6e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 655/988] ppp-on-up: use :onerror for outer block --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index e09bd9d5..ffe3079c 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -39,6 +39,6 @@ $LogPrint warning $ScriptName ("Running script '" . $ScriptName . "' failed!"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 76778f04319819eec8e2285f3a88703e4290cbde Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 656/988] hotspot-to-wpa-cleanup: fail if global functions do not become ready --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 6cd1bfbc..fd0e5545 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 18d6beae..11f359cc 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -13,11 +13,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 6348f74f..7f0ebae8 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From 3eec13b8b58d57c04d957e13d016c9e587a5de68 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 657/988] sms-action: use :onerror for outer block --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index 3c8307a8..d5bd5531 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global SmsAction; @@ -36,6 +36,6 @@ } else={ $LogPrint warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!"); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 057bbb8481f57cde2917aa358b36f6793f3bff85 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 658/988] hotspot-to-wpa: fail if global functions do not become ready --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 54724cff..a9a14075 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 6764af9f..84a43bcc 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index e74081ae..5c5afdab 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From aae9b4d4e39c36ceeef1d0e1125c8bce9255bdac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 659/988] sms-forward: use :onerror for outer block --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 8169022c..ddaa3a8c 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -96,6 +96,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From bcdb74f31d9f4006ff55f83900a85e310f14c372 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 13:52:57 +0200 Subject: [PATCH 660/988] global-config: introduce a state variable --- global-config.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-config.rsc b/global-config.rsc index 42a457a5..c0577ff6 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -6,6 +6,9 @@ # global configuration # https://rsc.eworm.de/ +# Warning: Do *NOT* copy this line to overlay! +:global GlobalConfigReady false; + # Set this to 'true' to disable news and change notifications. :global NoNewsAndChangesNotification false; @@ -275,3 +278,6 @@ [ /system/script/get $Script name ] . " failed!"); } } + +# signal we are ready +:set GlobalConfigReady true; From 83cf003f62877f34abb112ed5105b391ea11f4e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 661/988] ipsec-to-dns: fail if global functions do not become ready --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index a2739328..fb7b55c1 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -9,11 +9,11 @@ # and add/remove/update DNS entries from IPSec mode-config # https://rsc.eworm.de/doc/ipsec-to-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 3ad8cafc7a01ced329b4b1af6cafd87a282e71df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 662/988] telegram-chat: use :onerror for outer block --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 5db4860f..155bb023 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -190,6 +190,6 @@ } :set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \ [ $IfThenElse ($UpdateID >= $TelegramChatOffset->2) ($UpdateID + 1) ($TelegramChatOffset->2) ]); -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 60c5e84401ddb1490bd43daf796e4ba86ca22327 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 663/988] accesslist-duplicates: check for global config to be ready --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 545b24ea..5e6cf0a0 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index ac2c7fe3..a6b4f417 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 89559918..e51198d8 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 331de751..cadacb6b 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); From 41b705aa5a2158a7da7c51da4c95db96d7363d9c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 664/988] ipv6-update: fail if global functions do not become ready --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 633919d3..24167c01 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -8,11 +8,11 @@ # update firewall and dns settings on IPv6 prefix change # https://rsc.eworm.de/doc/ipv6-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From fe3d9f841822d210d13af90025415015e89743a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 665/988] update-gre-address: use :onerror for outer block --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index cddfa92f..2570f80a 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CharacterReplace; @@ -41,6 +41,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d57916fc267e9fdeb9c878f578c2b7d3736fbac6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 666/988] backup-cloud: check for global config to be ready --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f0861f09..e41db275 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 829fce789b6d0bd5de192c8491e1b54a5fe9ba35 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 667/988] lease-script: fail if global functions do not become ready --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 309337c7..501e0470 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -8,11 +8,11 @@ # run scripts on DHCP lease # https://rsc.eworm.de/doc/lease-script.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Grep; From d2af793683cdfa7e187da10cf8baf5c99e9c7fe1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 668/988] update-tunnelbroker: use :onerror for outer block --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 45afa6f8..10adef0b 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertificateAvailable; @@ -69,6 +69,6 @@ /interface/6to4/set $Interface local-address=$PublicAddress; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 37a6d4cc438b2b3481d8904aa0ec4dcde9a96ce8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 669/988] backup-email: check for global config to be ready --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index da2ee02d..632d2e60 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From a6ab95ccef4bc3255b7d45f66f86865337459f67 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 670/988] log-forward: fail if global functions do not become ready --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 0ce420f2..3774dac7 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -8,11 +8,11 @@ # forward log messages via notification # https://rsc.eworm.de/doc/log-forward.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 02986eb77a2f6e2b8a0f008ca21ed49dd6195e24 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 671/988] mod/bridge-port-to: use :onerror for outer block --- mod/bridge-port-to.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 39a036e5..93eedcef 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -10,7 +10,7 @@ :global BridgePortTo; -:set BridgePortTo do={ :do { +:set BridgePortTo do={ :onerror Err { :local BridgePortTo [ :tostr $1 ]; :global IfThenElse; @@ -65,6 +65,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 200167fa38037a02d63c249639027614f101118f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 672/988] backup-partition: check for global config to be ready --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index f99a66c1..c2221d2c 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; From 63606ad25cec7d1345c3b3a9158472328f02444c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 673/988] mode-button: fail if global functions do not become ready --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 83897ba7..e5c836f0 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -9,11 +9,11 @@ # act on multiple mode and reset button presses # https://rsc.eworm.de/doc/mode-button.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global ModeButton; From d5141f43e5e812e387eadb7b6f505f136032c48f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 674/988] mod/bridge-port-vlan: use :onerror for outer block --- mod/bridge-port-vlan.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 0eeb9b5f..6deee994 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -10,7 +10,7 @@ :global BridgePortVlan; -:global BridgePortVlan do={ :do { +:global BridgePortVlan do={ :onerror Err { :local ConfigTo [ :tostr $1 ]; :global IfThenElse; @@ -74,6 +74,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 27fc07e9406ae6a37f642213d5da3d23b92e63f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 675/988] backup-upload: check for global config to be ready --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 9373b4c1..11ced4ca 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From 2374be9a2192a1bcf43aa487facc1c17da34e08d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 676/988] netwatch-dns: fail if global functions do not become ready --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 1d2d86b2..5a928f0a 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -9,11 +9,11 @@ # monitor and manage dns/doh with netwatch # https://rsc.eworm.de/doc/netwatch-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 9b558ff8a1bc57f3197e71d73b468e820577d4f7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 677/988] mod/inspectvar: use :onerror for outer block --- mod/inspectvar.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index c8615573..89c02860 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -12,12 +12,12 @@ :global InspectVarReturn; # inspect variable and print on terminal -:set InspectVar do={ :do { +:set InspectVar do={ :onerror Err { :global InspectVarReturn; :put [ :tocrlf [ $InspectVarReturn $1 ] ]; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # inspect variable and return formatted string From 12037ff6e618d84bead0252d9fee36617e9e7ee6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 678/988] capsman-download-packages: check for global config to be ready --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index ee826386..cab1e4c3 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 91a9167c..ea411201 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index cb6cb6f4..a8103569 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; From 446aa3d7ffff5f9b70be2bfafdcef2ec88f3742c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 679/988] netwatch-notify: fail if global functions do not become ready --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index d256689a..0c483305 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -8,11 +8,11 @@ # monitor netwatch and send notifications # https://rsc.eworm.de/doc/netwatch-notify.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global NetwatchNotify; From 8cddc63767010072417d405cc4460febb8e9978d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 680/988] mod/ipcalc: use :onerror for outer block --- mod/ipcalc.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 477cf4a8..eacff6d9 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -12,7 +12,7 @@ :global IPCalcReturn; # print netmask, network, min host, max host and broadcast -:set IPCalc do={ :do { +:set IPCalc do={ :onerror Err { :local Input [ :tostr $1 ]; :global FormatLine; @@ -27,8 +27,8 @@ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # calculate and return netmask, network, min host, max host and broadcast From 40b19a179d0b7b87cfc2bf2fd9a92c0a20f95532 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 681/988] capsman-rolling-upgrade: check for global config to be ready --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 20978802..0d4114a3 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 75de088f..690d73d8 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -15,9 +15,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index e6c6facb..8e32ab20 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From ff812dd1928657dbae9df59e2d19d6f6fe33fb1f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 682/988] ospf-to-leds: fail if global functions do not become ready --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index e2f4dcf6..cdc06e55 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -8,11 +8,11 @@ # visualize ospf instance state via leds # https://rsc.eworm.de/doc/ospf-to-leds.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 862830b341716250daba288091b36d64926dccdb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 683/988] mod/notification-email: use :onerror for outer block --- mod/notification-email.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 7b89d985..c0f9d860 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -35,7 +35,7 @@ } # flush e-mail queue -:set FlushEmailQueue do={ :do { +:set FlushEmailQueue do={ :onerror Err { :global EmailQueue; :global EitherOr; @@ -135,8 +135,8 @@ /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ comment="Waiting for retry..." $Scheduler; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # generate filter for log-forward @@ -248,12 +248,12 @@ } # send notification via e-mail - expects at least two string arguments -:set SendEMail do={ :do { +:set SendEMail do={ :onerror Err { :global SendEMail2; $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via e-mail - expects one array argument From ef1a402c4e61be10824ef441811d6f8a03ed35a7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 684/988] certificate-renew-issued: check for global config to be ready --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 3fd60208..14917e4c 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertIssuedExportPass; From 4358dabb19d45e3bee816d6f9bc76dad21a3c10c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 685/988] packages-update: fail if global functions do not become ready --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index dce7cca4..81a6d132 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -9,11 +9,11 @@ # download packages and reboot for installation # https://rsc.eworm.de/doc/packages-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 9d845d40f00250e1b3107c175aa2f1a77ffb3a63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 686/988] mod/notification-gotify: use :onerror for outer block --- mod/notification-gotify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index 70709189..3ae4cdd3 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -17,7 +17,7 @@ :global SendGotify2; # flush Gotify queue -:set FlushGotifyQueue do={ :do { +:set FlushGotifyQueue do={ :onerror Err { :global GotifyQueue; :global IsFullyConnected; @@ -53,8 +53,8 @@ /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; :set GotifyQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Gotify - expects one array argument @@ -121,12 +121,12 @@ } # send notification via Gotify - expects at least two string arguments -:set SendGotify do={ :do { +:set SendGotify do={ :onerror Err { :global SendGotify2; $SendGotify2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Gotify - expects one array argument From 4954a886958a7e3e0b9c05dcd9e8d4135f0d5a04 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 687/988] check-certificates: check for global config to be ready --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 505ec4b0..c10e33ba 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertRenewTime; From 7b624faaa108201522cb792fcf776c39e30a0839 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 688/988] ppp-on-up: fail if global functions do not become ready --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ffe3079c..ef08c9d8 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -8,11 +8,11 @@ # run scripts on ppp up # https://rsc.eworm.de/doc/ppp-on-up.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From d865deb8a8710d98453adf221e72fdfd0a71dc33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 689/988] mod/notification-matrix: use :onerror for outer block --- mod/notification-matrix.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index e989ee04..c8cf887c 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -19,7 +19,7 @@ :global SetupMatrixJoinRoom; # flush Matrix queue -:set FlushMatrixQueue do={ :do { +:set FlushMatrixQueue do={ :onerror Err { :global MatrixQueue; :global IsFullyConnected; @@ -58,8 +58,8 @@ /system/scheduler/remove [ find where name="_FlushMatrixQueue" ]; :set MatrixQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Matrix - expects one array argument @@ -167,12 +167,12 @@ } # send notification via Matrix - expects at least two string arguments -:set SendMatrix do={ :do { +:set SendMatrix do={ :onerror Err { :global SendMatrix2; $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Matrix - expects one array argument From 1936dcb563c47b4ca4847912077f5f609d1360ad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 690/988] check-health: check for global config to be ready --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 40ce101d..1b92d1e4 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; From 0ef8888412f2f9ad8fe8ffc714b3dfb30802f55e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 691/988] sms-action: fail if global functions do not become ready --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index d5bd5531..0f02bcec 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -8,11 +8,11 @@ # run action on received SMS # https://rsc.eworm.de/doc/sms-action.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SmsAction; From e3a15cc6b803453290d2cc8e2415c207473aa2a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 692/988] mod/notification-ntfy: use :onerror for outer block --- mod/notification-ntfy.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 2748c5b6..8e5688e8 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -16,7 +16,7 @@ :global SendNtfy2; # flush ntfy queue -:set FlushNtfyQueue do={ :do { +:set FlushNtfyQueue do={ :onerror Err { :global NtfyQueue; :global IsFullyConnected; @@ -52,8 +52,8 @@ /system/scheduler/remove [ find where name="_FlushNtfyQueue" ]; :set NtfyQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via ntfy - expects one array argument @@ -143,12 +143,12 @@ } # send notification via ntfy - expects at least two string arguments -:set SendNtfy do={ :do { +:set SendNtfy do={ :onerror Err { :global SendNtfy2; $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via ntfy - expects one array argument From 506acb748b9e6670323b68fb46b90e5d16ddff15 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 693/988] check-lte-firmware-upgrade: check for global config to be ready --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 6030e4d4..1a5e08ce 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; From 24ea16cf91dae10a654e77911dbb53b213a6fd4f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 694/988] sms-forward: fail if global functions do not become ready --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index ddaa3a8c..9c3e4a55 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -9,11 +9,11 @@ # forward SMS to e-mail # https://rsc.eworm.de/doc/sms-forward.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From f7ba78702f92bec374b59066e57772d76f97358f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 695/988] mod/notification-telegram: use :onerror for outer block --- mod/notification-telegram.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 5ef353b4..51c8dbf7 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -17,7 +17,7 @@ :global SendTelegram2; # flush telegram queue -:set FlushTelegramQueue do={ :do { +:set FlushTelegramQueue do={ :onerror Err { :global TelegramQueue; :global TelegramMessageIDs; @@ -55,12 +55,12 @@ /system/scheduler/remove [ find where name="_FlushTelegramQueue" ]; :set TelegramQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # get the chat id -:set GetTelegramChatId do={ :do { +:set GetTelegramChatId do={ :onerror Err { :global TelegramTokenId; :global CertificateAvailable; @@ -94,8 +94,8 @@ :if (($Message->"is_topic_message") = true) do={ $LogPrint info $0 ("The thread id is: " . ($Message->"message_thread_id")); } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via telegram - expects one array argument @@ -226,12 +226,12 @@ } # send notification via telegram - expects at least two string arguments -:set SendTelegram do={ :do { +:set SendTelegram do={ :onerror Err { :global SendTelegram2; $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via telegram - expects one array argument From 78463f469b02768c1197db9c2cc35c46581c7fcc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 696/988] check-perpetual-license: check for global config to be ready --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index d46f0b49..c2f0dff0 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 35bce7c5eb775e7d9d0e774344918383d17b9009 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 697/988] telegram-chat: fail if global functions do not become ready --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 155bb023..f62034c1 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -9,11 +9,11 @@ # use Telegram to chat with your Router and send commands # https://rsc.eworm.de/doc/telegram-chat.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 5958851bd7e3b034dda25f670e0019247c4d73a0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 698/988] mod/scriptrunonce: use :onerror for outer block --- mod/scriptrunonce.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 7fcd5b5b..3797c155 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -11,7 +11,7 @@ :global ScriptRunOnce; # fetch and run script(s) once -:set ScriptRunOnce do={ :do { +:set ScriptRunOnce do={ :onerror Err { :local Scripts [ :toarray $1 ]; :global ScriptRunOnceBaseUrl; @@ -51,6 +51,6 @@ :return true; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 59c66de69065989d8f3b6032c156d484299f2032 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 699/988] check-routeros-update: check for global config to be ready --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 932256ad..34d06475 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 87edd0bd29f3825fd638760f20343f5afe890ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 700/988] update-gre-address: fail if global functions do not become ready --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 2570f80a..8d98eaa7 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -9,11 +9,11 @@ # ipsec remote peer # https://rsc.eworm.de/doc/update-gre-address.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CharacterReplace; From af40ae82edaccbf6d1995f8ad1a5250f57f950db Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 701/988] mod/ssh-keys-import: use :onerror for outer block --- mod/ssh-keys-import.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 2fae4b13..9a6cd398 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -12,7 +12,7 @@ :global SSHKeysImportFile; # import single key passed as string -:set SSHKeysImport do={ :do { +:set SSHKeysImport do={ :onerror Err { :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -65,12 +65,12 @@ $RmDir "tmpfs/ssh-keys-import"; :return false; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # import keys from a file -:set SSHKeysImportFile do={ :do { +:set SSHKeysImportFile do={ :onerror Err { :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -109,6 +109,6 @@ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 286ed96cc34efa929093bb72e64d102b458ae60e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 702/988] collect-wireless-mac: check for global config to be ready --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index fa6198a0..06b8d844 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 4082bbbe..6716582d 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 51671562..53e6b0a8 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index af0dd8b2..43ac8519 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 6040f70b19a06dc0d9817f3240b1bb13c34d453c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 703/988] update-tunnelbroker: fail if global functions do not become ready --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 10adef0b..2deb5b22 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -11,11 +11,11 @@ # update local address of tunnelbroker interface # https://rsc.eworm.de/doc/update-tunnelbroker.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From b19c448f7839aea73830fb0f3bb7314f98ce2f2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 704/988] daily-psk: check for global config to be ready --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index a1b01fc8..3ecd6b66 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 6ba6ce2f..d496350c 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 43ce3331..5a1df2f1 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 7e1714dc..c441e581 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; From ad6ad5bfccfec0bfbb83848ddf6784ef12e1e770 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 705/988] dhcp-lease-comment: check for global config to be ready --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 724682b1..3615bb9b 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 0a5f3b56..9da53336 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 71307b70..62cace12 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 1f29f0b4..667708cd 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 857993cf90b0bb432c18292816734f55ed2867cf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 706/988] dhcp-to-dns: check for global config to be ready --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index e66704b1..a9c91e1c 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From a68763c4dd4ca4e93dcd0edd98cd25bc8ac5d734 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 707/988] firmware-upgrade-reboot: check for global config to be ready --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index d5774db1..e3ca55b3 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 9e70bca30b792785034422db15bf158d94e666e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 708/988] fw-addr-lists: check for global config to be ready --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 1a892dac..4ee3c344 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global FwAddrLists; From 148892694fe43d6382ec368e450634342965882a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 709/988] gps-track: check for global config to be ready --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index d66bf009..4cc50663 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global GpsTrackUrl; From 713e63da87d57d77961ddf606b4438a4c2b7ecd7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 710/988] hotspot-to-wpa-cleanup: check for global config to be ready --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index fd0e5545..e4ac9678 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 11f359cc..d51e1d03 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -15,9 +15,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 7f0ebae8..8bb2631b 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From 6a9fced721e9ed54b451aeecc2e68f761663dfb6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 711/988] hotspot-to-wpa: check for global config to be ready --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index a9a14075..8977cee1 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 84a43bcc..c5d977d1 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 5c5afdab..6a97e460 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From ce29fcf49ed381ebd910f74193ce3be7cac1def9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 712/988] ipsec-to-dns: check for global config to be ready --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index fb7b55c1..1b5ed133 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 59f9a1187f769dc57d778a77264ae69591ac594b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 713/988] ipv6-update: check for global config to be ready --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 24167c01..580a426c 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 10bd9a1cb5b3d556abcc5732d894e3bcc797e94b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 714/988] lease-script: check for global config to be ready --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 501e0470..b166ee3b 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Grep; From 160effd91b66459dd9a2ecaf5ecc442a33f135c5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 715/988] log-forward: check for global config to be ready --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 3774dac7..be7eff7b 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From bc1c238158a18f5fc7122a5110f21d29e72540cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 716/988] mode-button: check for global config to be ready --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index e5c836f0..c6422f0b 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global ModeButton; From 2d39dbdf7c363ba5657dee6c94f9763bbaab3e86 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 717/988] netwatch-dns: check for global config to be ready --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 5a928f0a..3da14987 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 5b40380cd2dfe6b3fcd0828460851c41e1d1b416 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 718/988] netwatch-notify: check for global config to be ready --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0c483305..fb8e8d5e 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global NetwatchNotify; From aaecd1b457f5e5779276c7217d1c5429536d5534 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 719/988] ospf-to-leds: check for global config to be ready --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index cdc06e55..26f8aa37 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 38ec392a5fd462a803f4e04219a0d4acbf98bc63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 720/988] packages-update: check for global config to be ready --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 81a6d132..4fde131b 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 194698f53f27bebc9ee349597c764b58cd4475b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 721/988] ppp-on-up: check for global config to be ready --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ef08c9d8..f16d73f3 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 6270ac45d8ed241cfe31e345cccc097cb33bd02b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 722/988] sms-action: check for global config to be ready --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index 0f02bcec..47e19223 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SmsAction; From 15248ffd39b982a176d87c39db6c3f789102a29f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 723/988] sms-forward: check for global config to be ready --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 9c3e4a55..8ca5ae43 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 9b5419b939cadc751076c68a2b6bb8434a828444 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 724/988] telegram-chat: check for global config to be ready --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f62034c1..b1f7f99e 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From b4d80d3b178e376568a3e7bbcb5dce29c631e383 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 725/988] update-gre-address: check for global config to be ready --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 8d98eaa7..dd7d63e4 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CharacterReplace; From f2dbb9eff34aa43fd2be41f9a6a36da06e07dbb0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 726/988] update-tunnelbroker: check for global config to be ready --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 2deb5b22..8e5e1d0f 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 0f58cecc0f2f114d5520db5d283fcd7d243c1bc1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:09:50 +0200 Subject: [PATCH 727/988] global-wait: check for global config to be ready --- global-wait.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-wait.rsc b/global-wait.rsc index ca3fc0c4..23b56298 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -8,5 +8,6 @@ # wait for global-functions to finish # https://rsc.eworm.de/doc/global-wait.md +:global GlobalConfigReady; :global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:while ($GlobalConfigReady != true || $GlobalFunctionsReady != true) do={ :delay 500ms; } From 4561b17dbff272b1b5671155ee1838dba2f24062 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 13:57:05 +0200 Subject: [PATCH 728/988] global-config: add another comment with visual hint --- global-config.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-config.rsc b/global-config.rsc index c0577ff6..2d7d43d2 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -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; From 661aad522b09bf4aba5b0be4877669e0a826b4a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:05:47 +0200 Subject: [PATCH 729/988] global-config: add another visual hint --- global-config.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 2d7d43d2..589a58a4 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -270,8 +270,11 @@ "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 { From f095b581e74b5c5a8110c801243b2ec039499120 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 19:42:12 +0200 Subject: [PATCH 730/988] global-functions: $ScriptInstallUpdate: set config and functions not ready... ... before reload. This should fix some corner cases where scripts ran with broken configuration or functions. Also do reload both - configuration and functions - to simplify the function. --- global-functions.rsc | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 29e6d06b..6e3d7120 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -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 ({}); @@ -1269,31 +1270,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); } } From 90857805622a97ac3b150da60579952bf2ba0185 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 11:45:55 +0200 Subject: [PATCH 731/988] sms-forward: delay after removal... ... to give the SIM card some time to succeed. Removing several messages one after another fails without this. --- sms-forward.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sms-forward.rsc b/sms-forward.rsc index 8ca5ae43..4798a8ac 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -62,6 +62,7 @@ ($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={ $LogPrint debug $ScriptName ("Removing SMS, which started a script."); /tool/sms/inbox/remove $Sms; + :delay 50ms; } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); @@ -93,6 +94,7 @@ " by " . $Identity . " from " . $Phone . ":" . $Messages) }); :foreach Sms in=$Delete do={ /tool/sms/inbox/remove $Sms; + :delay 50ms; } } } From 01f3cb91e796fba77bc7ec810d98a31fe2a33843 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 14:31:37 +0200 Subject: [PATCH 732/988] sms-forward: add error handling on message removal --- sms-forward.rsc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 4798a8ac..a564056a 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -61,8 +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; - :delay 50ms; + :onerror Err { + /tool/sms/inbox/remove $Sms; + :delay 50ms; + } do={ + $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); + } } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); @@ -93,8 +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; - :delay 50ms; + :onerror Err { + /tool/sms/inbox/remove $Sms; + :delay 50ms; + } do={ + $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); + } } } } From 6691e2e765c7dbfa3e639bea2331bbbf0b83ed4f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 21 May 2025 21:51:16 +0200 Subject: [PATCH 733/988] global-functions: $DownloadPackage: reverse failure logic... ... and do not retry. --- global-functions.rsc | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 6e3d7120..1dd77083 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -391,25 +391,22 @@ :local Url ("https://upgrade.mikrotik.com/routeros/" . $PkgVer . "/" . $PkgFile); $LogPrint info $0 ("Downloading package file '" . $PkgName . "'..."); $LogPrint debug $0 ("... from url: " . $Url); - :local Retry 3; - :while ($Retry > 0) do={ - :do { - /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."); - } - - $RmFile $PkgDest; - :set Retry ($Retry - 1); + :do { + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; + $WaitForFile $PkgDest; + } on-error={ + $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); + :return false; } - $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); - :return false; + :if ([ /file/get [ find where name=$PkgDest ] type ] != "package") do={ + $LogPrint warning $0 ("Downloaded file is not a package, removing."); + $RmFile $PkgDest; + :return false; + } + + :return true; } # return either first (if "true") or second From c3fce370660b8c128f579d2a419c657395748c2e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 17:59:20 +0200 Subject: [PATCH 734/988] backup-partition: :do ... on-error=... -> :onerror ... do=... --- backup-partition.rsc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index c2221d2c..ae7ad030 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -32,14 +32,15 @@ :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; } + :return true; } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -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; From dc2296d5004b806aa5c5812c0e1a7ff4016be005 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 18:03:30 +0200 Subject: [PATCH 735/988] backup-upload: :do ... on-error=... -> :onerror ... do=... --- backup-upload.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 11ced4ca..e6b9f92f 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -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; } From 187aeba78bebef1d1f47524c690ad260adffcadd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:04:15 +0200 Subject: [PATCH 736/988] check-health: :do ... on-error=... -> :onerror ... do=... --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 1b92d1e4..4cb99408 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -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."); From 1925d2847c6d9b48364e24153fcbfb10cd9e758d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:05:41 +0200 Subject: [PATCH 737/988] check-lte-firmware-upgrade: :do ... on-error=... -> :onerror ... do=... --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 1a5e08ce..9f4b6562 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -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; } From 79f681b80115b2f663feda478294717bb021c7ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:06:25 +0200 Subject: [PATCH 738/988] check-routeros-update: :do ... on-error=... -> :onerror ... do=... --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 34d06475..e28a0190 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -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..."); From 142b0760b0e8daa205cc1fc8f471716e219ece82 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:17:46 +0200 Subject: [PATCH 739/988] fw-addr-lists: :do ... on-error=... -> :onerror ... do=... --- fw-addr-lists.rsc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4ee3c344..659fb2f9 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -176,13 +176,13 @@ :foreach Address,Timeout in=$Branch do={ $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); - :do { + :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); } } } @@ -192,13 +192,13 @@ :foreach Address,Timeout in=$Branch do={ $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); - :do { + :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); } } } From b807fc9e90b105c2057631c23f5685d18b811951 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:21:03 +0200 Subject: [PATCH 740/988] fw-addr-lists: adopt changes in wording... ... to match the changes from previous commit. --- fw-addr-lists.rsc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 659fb2f9..5a03875d 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -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,8 +174,8 @@ :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); + $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; @@ -190,8 +190,8 @@ :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); + $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; From a9e7bb0a05c4b4a2744039ce7369760c5cbc0c9f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:22:02 +0200 Subject: [PATCH 741/988] global-config: :do ... on-error=... -> :onerror ... do=... --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 589a58a4..86d528aa 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -277,11 +277,11 @@ # load custom settings from overlay and snippets :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); } } From 5b89f3e425c0703c804dda76ef22efe22b438cc3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 21 May 2025 21:53:34 +0200 Subject: [PATCH 742/988] global-functions: $DownloadPackage: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1dd77083..fc33f5aa 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -392,11 +392,11 @@ $LogPrint info $0 ("Downloading package file '" . $PkgName . "'..."); $LogPrint debug $0 ("... from url: " . $Url); - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; $WaitForFile $PkgDest; - } on-error={ - $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); + } do={ + $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed: " . $Err); :return false; } From a6b36dde7bbd9bd4308588cbe0b10ae04399b8e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:24:56 +0200 Subject: [PATCH 743/988] global-functions: $FetchHuge: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index fc33f5aa..3b7ff7cf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -486,14 +486,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; } From 7a1fef78a26bfa913c4aaa5702b2d4178e663118 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:26:53 +0200 Subject: [PATCH 744/988] global-functions: $GetMacVendor: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b7ff7cf..35dd0e0f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -586,12 +586,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"; } From 09f9826760316c35cb229bde4d065c89290c6076 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:27:50 +0200 Subject: [PATCH 745/988] global-functions: $MkDir: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 35dd0e0f..271e3a25 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -894,11 +894,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; @@ -923,11 +923,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; } From 86a8919ed2f87d75b2150b09ec5f237dc93f046e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:29:22 +0200 Subject: [PATCH 746/988] global-functions: $RmDir: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 271e3a25..f0256fc6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1052,10 +1052,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; From 2317013121f8b3a53dd588f0fa5020b61ba7da53 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:30:08 +0200 Subject: [PATCH 747/988] global-functions: $RmFile: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f0256fc6..c8832911 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1080,10 +1080,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; From 12926b7c429f93a2579b134deef245793195744b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:33:39 +0200 Subject: [PATCH 748/988] global-functions: $ScriptInstallUpdate: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index c8832911..1bbc77e4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1201,7 +1201,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); @@ -1211,13 +1211,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; } @@ -1304,7 +1302,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 \ @@ -1312,16 +1310,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!"); @@ -1343,10 +1341,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={ } } From f5c4378676ef1e791738106723071c3dd6fe65ca Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:37:18 +0200 Subject: [PATCH 749/988] global-functions: $ValidateSyntax: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1bbc77e4..11ab6770 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1652,9 +1652,9 @@ :set ValidateSyntax do={ :local Code [ :tostr $1 ]; - :do { + :onerror Err { [ :parse (":local Validate do={\n" . $Code . "\n}") ]; - } on-error={ + } do={ :return false; } :return true; From 8b1b73c936c0a0172383a521f7bc5fb70d9d2f14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:39:17 +0200 Subject: [PATCH 750/988] global-functions: $ValidateSyntax: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 11ab6770..51b47b55 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1652,9 +1652,12 @@ :set ValidateSyntax do={ :local Code [ :tostr $1 ]; + :global LogPrint; + :onerror Err { [ :parse (":local Validate do={\n" . $Code . "\n}") ]; } do={ + $LogPrint debug $0 ("Valdation failed: " . $Err); :return false; } :return true; From 5c599beae1c539ef4b657a6d8cb32195b4bfa174 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:40:41 +0200 Subject: [PATCH 751/988] global-functions: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 51b47b55..8331e4a7 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1771,10 +1771,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."); From d5f9ecebfbda885c4600ff99ee2713a5827e0398 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:41:57 +0200 Subject: [PATCH 752/988] gps-track: :do ... on-error=... -> :onerror ... do=... --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index 4cc50663..6a090bfe 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -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."); From c1e6348bb9ffaaa9e43dafab039ec261614e0711 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:42:48 +0200 Subject: [PATCH 753/988] lease-script: :do ... on-error=... -> :onerror ... do=... --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index b166ee3b..ab449568 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -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={ From 5badafe109c6514a83b2935aa3543054eb20ddc3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:54:51 +0200 Subject: [PATCH 754/988] mod/notification-telegram: :do ... on-error=... -> :onerror ... do=... --- mod/notification-telegram.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 51c8dbf7..0832b07e 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -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; } @@ -190,7 +190,7 @@ :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 { + :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 ({}); From 2a7fd7ea53d62cc9897643250bb04022f1377ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:55:55 +0200 Subject: [PATCH 755/988] mod/notification-ntfy: :do ... on-error=... -> :onerror ... do=... --- mod/notification-ntfy.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 8e5688e8..71140209 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -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 ({}); From 3f092d34774ac500faec0870e89a048a26a5bbf0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:57:31 +0200 Subject: [PATCH 756/988] mod/notification-matrix: :do ... on-error=... -> :onerror ... do=... --- mod/notification-matrix.rsc | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index c8cf887c..e9b42a0d 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -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 ] . ""); } - :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; } } From e01873301f7a92fc0109d8afce845a175f414504 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:58:53 +0200 Subject: [PATCH 757/988] mod/notification-gotify: :do ... on-error=... -> :onerror ... do=... --- mod/notification-gotify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index 3ae4cdd3..d8eafbe0 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -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 ({}); From 314e68e4cd3d097d510cb0bef25fec838421b689 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:45:59 +0200 Subject: [PATCH 758/988] mode-button: :do ... on-error=... -> :onerror ... do=... --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index c6422f0b..d82f8995 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -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 \ From 9ae21c00bdbbda52fea6c2cc32248d714617f1f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:02:15 +0200 Subject: [PATCH 759/988] mod/scriptrunonce: :do ... on-error=... -> :onerror ... do=... --- mod/scriptrunonce.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 3797c155..1d6aaf1f 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -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; } From 9cd4ed08a475b93fbf11266dc5a0804afd58e195 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:05:12 +0200 Subject: [PATCH 760/988] mod/ssh-keys-import: :do ... on-error=... -> :onerror ... do=... --- mod/ssh-keys-import.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 9a6cd398..176c1b46 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -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; } From c757064eb9537321b7cad69db6e05ddc9c576583 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:05:39 +0200 Subject: [PATCH 761/988] =?UTF-8?q?mod/ssh-keys-import:=20:do=20...=20on-e?= =?UTF-8?q?rror=3D...=20->=20...=20well...=20-=20fix=20condition=20?= =?UTF-8?q?=F0=9F=A5=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mod/ssh-keys-import.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 176c1b46..94675255 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -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; From a523f9793861d8927388f18bb5f2319bbe04c0b8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:07:30 +0200 Subject: [PATCH 762/988] netwatch-dns: :do ... on-error=... -> :onerror ... do=... --- netwatch-dns.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 3da14987..4fa076af 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -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={ From fefe59751f1487fbdd4feace39c32445bd97547c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:09:59 +0200 Subject: [PATCH 763/988] netwatch-notify: :do ... on-error=... -> :onerror ... do=... --- netwatch-notify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index fb8e8d5e..00f03cde 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -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); } } } From d0adf9974e75668fc16e736ce2dc29a1477b10b8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:12:08 +0200 Subject: [PATCH 764/988] sms-forward: :do ... on-error=... -> :onerror ... do=... --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index a564056a..feb640e5 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -74,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!"); From f22d46da96dfe0c421172d30ee1baf9976205329 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:13:05 +0200 Subject: [PATCH 765/988] telegram-chat: :do ... on-error=... -> :onerror ... do=... --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index b1f7f99e..5bfa31c8 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -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"); } From 10ac81634877858717a3d99fee418edc9887b377 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:14:24 +0200 Subject: [PATCH 766/988] unattended-lte-firmware-upgrade: :do ... on-error=... -> :onerror ... do=... --- unattended-lte-firmware-upgrade.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 83925fd9..237c2d83 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -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); } } From 205bcce6f9d49518f1e1999154d96b0e0bb6d1ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:15:35 +0200 Subject: [PATCH 767/988] update-tunnelbroker: :do ... on-error=... -> :onerror ... do=... --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 8e5e1d0f..9057e1e4 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -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; } } From 3521995dbc1173e722819efca1908cd0df251b1d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:07:39 +0200 Subject: [PATCH 768/988] mod/inspectvar: use $CharacterMultiply --- mod/inspectvar.rsc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 89c02860..b864d9a8 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -33,11 +33,9 @@ :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 ]; From 187735f35f7b361b1cc6d45f703d5c121681254c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:12:02 +0200 Subject: [PATCH 769/988] mod/inspectvar: print the length for strings --- mod/inspectvar.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index b864d9a8..84c40d8f 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -39,6 +39,7 @@ } :local TypeOf [ :typeof $Input ]; + :local Len [ :len $Input ]; :local Return [ $IndentReturn "type" $TypeOf $Level ]; :if ($TypeOf = "array") do={ @@ -48,6 +49,10 @@ [ $InspectVarReturn $Value ($Level + 2) ]); } } else={ + :if ($TypeOf = "str") do={ + :set $Return ($Return . "\n" . \ + [ $IndentReturn "len" $Len $Level ]); + } :if ($TypeOf != "nothing") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "value" [ $IfThenElse ([ :len $Input ] > 80) \ From 36f155ce621abe427d126a6ee3a3363bff15b2bb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:15:21 +0200 Subject: [PATCH 770/988] mod/inspectvar: remove CR, replace LF --- mod/inspectvar.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 84c40d8f..b32480f3 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -25,6 +25,7 @@ :local Input $1; :local Level (0 + [ :tonum $2 ]); + :global CharacterReplace; :global IfThenElse; :global InspectVarReturn; @@ -52,6 +53,7 @@ :if ($TypeOf = "str") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "len" $Len $Level ]); + :set Input [ $CharacterReplace [ $CharacterReplace $Input ("\r") "" ] ("\n") " " ]; } :if ($TypeOf != "nothing") do={ :set $Return ($Return . "\n" . \ From bd3cc3bbd49934f42fe9f6c6820501c7cc9d33ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 13:35:49 +0200 Subject: [PATCH 771/988] mod/inspectvar: replace only when matching --- mod/inspectvar.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index b32480f3..fc1b366f 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -53,7 +53,12 @@ :if ($TypeOf = "str") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "len" $Len $Level ]); - :set Input [ $CharacterReplace [ $CharacterReplace $Input ("\r") "" ] ("\n") " " ]; + :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" . \ From ff218e4ce5032b2ead7f33f53382bda98f6e5e2e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:21:59 +0200 Subject: [PATCH 772/988] mod/notification-email: add error handling when sending mail --- mod/notification-email.rsc | 57 +++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c0f9d860..e05a8131 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -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; + } } } From 74dc809b98759cb337fbaf6b1fa98bb0137dadc0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 13:29:01 +0200 Subject: [PATCH 773/988] mod/notification-email: properly truncate the body Truned out that the size limit for e-mail message/body is anywhere just below 64kB... So truncate at about 62.000 bytes. --- mod/notification-email.rsc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index e05a8131..c799c874 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -181,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 ]; @@ -193,13 +194,22 @@ :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" . ($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 \ From 2a956874777c83748f4a2afea4e9ee1382928230 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 14:54:42 +0200 Subject: [PATCH 774/988] mod/notification-email: add the link symbol --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c799c874..52937668 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -202,7 +202,8 @@ } :local Signature [ $EitherOr [ $NotificationEMailSignature ] [ /system/note/get note ] ]; :set Body ($Body . "\n" . \ - [ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n" . ($Notification->"link")) ] . \ + [ $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) "" ]); From ce129ee4418a09d4b1987e3d94818a561d9fd384 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 11 May 2025 22:02:18 +0200 Subject: [PATCH 775/988] fw-addr-lists: for IPv6 the CIDR is always expected --- fw-addr-lists.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 5a03875d..efd37db7 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -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; From e78c71948dfa847fd21820dffacd3c6e7165d832 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 12 May 2025 16:50:06 +0200 Subject: [PATCH 776/988] mod/notification-telegram: fix indention --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 0832b07e..2eb90e12 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -189,7 +189,7 @@ :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"); + "&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."); From 1b5dd1e1d3555f347bd6ff587659ac8b8ec5c73e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 12 May 2025 16:53:55 +0200 Subject: [PATCH 777/988] telegram-chat: support trusted group chat ids But be warned: Adding a person to a trusted group will give her/him administrative control over the device(s) - without changes on the device itself! On the other hand... Removing permissions is easily done by removing a person from a group. Closes: https://github.com/eworm-de/routeros-scripts/issues/101 --- telegram-chat.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 5bfa31c8..50fc0cce 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -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; } } From f1396b83aa7f506fe653184016cd970728eb9407 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 13 May 2025 09:52:12 +0200 Subject: [PATCH 778/988] telegram-chat: support debug output for updates in JSON --- telegram-chat.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 50fc0cce..277c40fc 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -33,6 +33,7 @@ :global GetRandom20CharAlNum; :global IfThenElse; :global LogPrint; + :global LogPrintVerbose; :global MAX; :global MIN; :global MkDir; @@ -96,6 +97,8 @@ :local Uptime [ /system/resource/get uptime ]; :foreach Update in=($JSON->"result") do={ :set UpdateID ($Update->"update_id"); + $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); + :local Message ($Update->"message"); :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); From 64fe923c5aea4e6b8cd549a39f8e76c1e9814391 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 13 May 2025 10:02:03 +0200 Subject: [PATCH 779/988] DEBUG: fix typo --- DEBUG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEBUG.md b/DEBUG.md index d5e9beb7..66bf728a 100644 --- a/DEBUG.md +++ b/DEBUG.md @@ -42,7 +42,7 @@ Other actions (`disk`, `email`, `remote` or `support`) can be used as well. I do not recommend using `echo` - use [debug output](#debug-output) instead. -Disable or remote that setting to restore regular logging. +Disable or remove that setting to restore regular logging. ## Verbose output From 86ad41f6b612ef3b904e053b2dbf2f12d3260842 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 09:06:02 +0200 Subject: [PATCH 780/988] fix the trust state for certificates RouterOS 7.19 is suffering an issue with certificate store, where the trust state is not available correctly. This effects certificates imported a long time ago, with RouterOS 7.4 or older. Fixing trust state for all certificates by re-setting the trust state... (Reported as SUP-188791...) --- global-functions.rsc | 2 +- news-and-changes.rsc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8331e4a7..ef849e0d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 137; +:global ExpectedConfigVersion 138; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index a9a29049..dbfb1b9b 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -62,6 +62,7 @@ 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; 137="Added support to send notifications via Gotify (gotify.net)."; + 138="RouterOS 7.19 is suffering an issue with certificate store. Fixing trust state for all certificates..."; }; # Migration steps to be applied on script updates @@ -71,4 +72,5 @@ 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; }"; + 138="/certificate/set trusted=yes [ find where trusted=yes ];"; }; From 4bd7d44cd2b9252d7389f049c367e57c642551d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 11:16:40 +0200 Subject: [PATCH 781/988] global-functions: $ScriptInstallUpdate: fix syntax error --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ef849e0d..55dbdee9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1212,7 +1212,7 @@ :set SourceNew [ :tolf ($Result->"data") ]; } } do={ - $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . . "': " . $Err); + $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err); :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; From c50acd697a75d9e1dd3d336405d4bdc1567546ee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 17:36:56 +0200 Subject: [PATCH 782/988] telegram-chat: fix detection of replies --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 277c40fc..98624792 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -100,7 +100,7 @@ $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); :local Message ($Update->"message"); - :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); + :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "array"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; From 6a49c483b679d7dc68b7b12617be24508c3fa5b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 17:38:22 +0200 Subject: [PATCH 783/988] telegram-chat: rename variable... ... to better describe the use. --- telegram-chat.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 98624792..fdd08838 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -100,7 +100,7 @@ $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); :local Message ($Update->"message"); - :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "array"); + :local IsAnyReply ([ :typeof ($Message->"reply_to_message") ] = "array"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; @@ -138,7 +138,7 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = false && \ + :if ($Done = false && ($IsMyReply = 1 || ($IsAnyReply = false && \ $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; From 3d3b270748b43362d0ec51a1e52f300e6770b469 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 14:07:57 +0200 Subject: [PATCH 784/988] README: give a hint on builtin certificate store I guess this should become the default any time in future... --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a8b2cef..bc098408 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,14 @@ including demonstation recorded live at [MUM Europe ### The long way in detail The update script does server certificate verification, so first step is to -download the certificates. If you intend to download the scripts from a +download the certificates. + +> 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You +> can skip the steps regarding certificate download and import if you set +> the trust for these builtin trust anchors: +> `/certificate/settings/set builtin-trust-anchors=trusted;` + +If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. From d59c4aee26788f3c5088c32a3bd54f0562b4d2b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 14:16:57 +0200 Subject: [PATCH 785/988] README: add a paragraph and link to jump --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bc098408..243e1fc5 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,9 @@ The update script does server certificate verification, so first step is to download the certificates. > 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You -> can skip the steps regarding certificate download and import if you set -> the trust for these builtin trust anchors: +> can skip the steps regarding certificate download and import and jump +> to [installation of scripts](#installation-of-scripts) if you set the +> trust for these builtin trust anchors: > `/certificate/settings/set builtin-trust-anchors=trusted;` If you intend to download the scripts from a @@ -113,6 +114,8 @@ is shown. Always make sure there are no certificates installed you do not know or want! +#### Installation of scripts + All following commands will verify the server certificate. For validity the certificate's lifetime is checked with local time, so make sure the device's date and time is set correctly! From bf684a7197f9ad07e23415de5779a366af7dd71b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 15:08:26 +0200 Subject: [PATCH 786/988] global-functions: $CertificateAvailable: try to use builtin certificates The builtin certificates were introduced with RouterOS 7.19, so requires this hacky :parse workaround. --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 55dbdee9..759b2744 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -119,6 +119,11 @@ :return false; } + :if (([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={ + :return true; + } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ From d69b39957278a9393762ec1653895eeb69483e9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 16:38:50 +0200 Subject: [PATCH 787/988] INITIAL-COMMANDS: use builtin certificates if possible --- INITIAL-COMMANDS.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 79773bd9..40f609b9 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -18,17 +18,21 @@ Run the complete base installation: { :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local CertCommonName "ISRG Root X2"; :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - :put "Importing certificate..."; - /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; - :delay 1s; - /certificate/import file-name=$CertFileName passphrase=""; - :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ - :error "Something is wrong with your certificates!"; + :if (!(([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ + :put "Importing certificate..."; + /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; + :delay 1s; + /certificate/import file-name=$CertFileName passphrase=""; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ + :error "Something is wrong with your certificates!"; + }; + :delay 1s; }; - :delay 1s; :put "Renaming global-config-overlay, if exists..."; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -41,9 +45,11 @@ Run the complete base installation: :put "Scheduling to load configuration and functions..."; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; - :put "Renaming certificate by its common-name..."; - :global CertificateNameByCN; - $CertificateNameByCN $CertFingerprint; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={ + :put "Renaming certificate by its common-name..."; + :global CertificateNameByCN; + $CertificateNameByCN $CertFingerprint; + }; }; Then continue setup with From b70e6e79843f7c1bbc0031dd74cdf8005d3da4ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 21:53:23 +0200 Subject: [PATCH 788/988] global-functions: introduce $FileGet --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 759b2744..3a2d20a5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -38,6 +38,7 @@ :global ExitError; :global FetchHuge; :global FetchUserAgentStr; +:global FileGet; :global FormatLine; :global FormatMultiLines; :global GetMacVendor; @@ -529,6 +530,18 @@ $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); } +# get file properties in array, or false on error +:set FileGet do={ + :local FileName [ :tostr $1 ]; + + :local FileVal false; + :do { + :set FileVal [ /file/get $FileName ]; + } on-error={ } + + :return $FileVal; +} + # format a line for output :set FormatLine do={ :local Key [ :tostr $1 ]; From 1e4f168735663cc09395980b5fa24a25f6403347 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:42:25 +0200 Subject: [PATCH 789/988] global-functions: $MkDir: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3a2d20a5..3b2ab95d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -893,6 +893,7 @@ :local Path [ :tostr $1 ]; :global CleanFilePath; + :global FileGet; :global LogPrint; :global RmDir; :global WaitForFile; @@ -930,7 +931,8 @@ $LogPrint debug $0 ("Making directory: " . $Path); - :if ([ :len [ /file/find where name=$Path type="directory" ] ] = 1) do={ + :local PathVal [ $FileGet $Path ]; + :if ($PathVal->"type" = "directory") do={ $LogPrint debug $0 ("... which already exists."); :return true; } From d993495e44563f841f7fed19fcf3162a6cb7b971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:38:26 +0200 Subject: [PATCH 790/988] global-functions: $RmDir: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b2ab95d..2d0cd391 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1057,25 +1057,26 @@ :set RmDir do={ :local DirName [ :tostr $1 ]; + :global FileGet; :global LogPrint; $LogPrint debug $0 ("Removing directory: ". $DirName); - :if ([ :len [ /file/find where name=$DirName type!=directory ] ] > 0) do={ - $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); - :return false; - } - - :local Dir [ /file/find where name=$DirName type=directory ]; - :if ([ :len $Dir ] = 0) do={ + :local DirVal [ $FileGet $DirName ]; + :if ($DirVal = false) do={ $LogPrint debug $0 ("... which does not exist."); :return true; } + :if ($DirVal->"type" != "directory") do={ + $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); + :return false; + } + :onerror Err { - /file/remove $Dir; + /file/remove $DirName; } do={ - $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed: " . $Err); + $LogPrint error $0 ("Removing directory '" . $DirName . "' failed: " . $Err); :return false; } :return true; From fb8e616846ab8decb10a8b792b5307a01195110d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:41:34 +0200 Subject: [PATCH 791/988] global-functions: $RmFile: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2d0cd391..985deba4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1086,25 +1086,26 @@ :set RmFile do={ :local FileName [ :tostr $1 ]; + :global FileGet; :global LogPrint; $LogPrint debug $0 ("Removing file: ". $FileName); - :if ([ :len [ /file/find where name=$FileName (type=directory or type=disk) ] ] > 0) do={ - $LogPrint error $0 ("File '" . $FileName . "' is not a file."); - :return false; - } - - :local File [ /file/find where name=$FileName !(type=directory or type=disk) ]; - :if ([ :len $File ] = 0) do={ + :local FileVal [ $FileGet $FileName ]; + :if ($FileVal = false) do={ $LogPrint debug $0 ("... which does not exist."); :return true; } + :if ($FileVal->"type" = "directory" || $FileVal->"type" = "disk") do={ + $LogPrint error $0 ("File '" . $FileName . "' is not a file."); + :return false; + } + :onerror Err { - /file/remove $File; + /file/remove $FileName; } do={ - $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed: " . $Err); + $LogPrint error $0 ("Removing file '" . $FileName . "' failed: " . $Err); :return false; } :return true; From e08bb2192dfd22b25652553f28304818a3602331 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:48:05 +0200 Subject: [PATCH 792/988] global-functions: $WaitForFile: drop the workaround This was fixed in RouterOS 7.18rc1, so should be ok to remove now. --- global-functions.rsc | 9 --------- 1 file changed, 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 985deba4..3a621697 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1757,15 +1757,6 @@ :set I ($I + 1); } - :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ - :do { - /file/get $FileName; - :return true; - } on-error={ } - :delay $Delay; - :set Delay ($Delay * 3 / 2); - } - :return false; } From 0e00a228d67d77fadc80eee2df04c2cec25b8db8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:25:20 +0200 Subject: [PATCH 793/988] global-functions: $WaitForFile: use :retry for simplification, ... ... and to work around restrictions in new file handling. --- global-functions.rsc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3a621697..fa5d2be9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1746,16 +1746,14 @@ :global MAX; :set FileName [ $CleanFilePath $FileName ]; - :local I 1; :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); - :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :if ($I >= 10) do={ - :return false; - } - :delay $Delay; - :set I ($I + 1); - } + :do { + :retry { + /file/get $FileName; + :return true; + } delay=$Delay max=10; + } on-error={ } :return false; } From cb984a5e527a12aaa2336cfd66f180302755f066 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:34:07 +0200 Subject: [PATCH 794/988] global-functions: introduce $FileExists --- global-functions.rsc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index fa5d2be9..ddddc409 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -38,6 +38,7 @@ :global ExitError; :global FetchHuge; :global FetchUserAgentStr; +:global FileExists; :global FileGet; :global FormatLine; :global FormatMultiLines; @@ -530,6 +531,29 @@ $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); } +# check for existence of file, optionally with type +:set FileExists do={ + :local FileName [ :tostr $1 ]; + :local Type [ :tostr $2 ]; + + :global FileGet; + + :local FileVal [ $FileGet $FileName ]; + :if ($FileVal = false) do={ + :return false; + } + + :if ([ :len ($FileVal->"size") ] = 0) do={ + :return false; + } + + :if ([ :len $Type ] = 0 || $FileVal->"type" = $Type) do={ + :return true; + } + + :return false; +} + # get file properties in array, or false on error :set FileGet do={ :local FileName [ :tostr $1 ]; From 8353a8547f45a18e167b8ffd3779d8bd469dd1c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:44:49 +0200 Subject: [PATCH 795/988] global-functions: $DownloadPackage: use $FileExists ... ... to work around restrictions in new file handling. --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ddddc409..50426b69 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -365,6 +365,7 @@ :global CertificateAvailable; :global CleanFilePath; + :global FileExists; :global LogPrint; :global MkDir; :global RmFile; @@ -385,7 +386,7 @@ :return false; } - :if ([ :len [ /file/find where name=$PkgDest type="package" ] ] > 0) do={ + :if ([ $FileExists $PkgDest "package" ] = true) do={ $LogPrint info $0 ("Package file " . $PkgName . " already exists."); :return true; } @@ -407,7 +408,7 @@ :return false; } - :if ([ /file/get [ find where name=$PkgDest ] type ] != "package") do={ + :if ([ $FileExists $PkgDest "package" ] = false) do={ $LogPrint warning $0 ("Downloaded file is not a package, removing."); $RmFile $PkgDest; :return false; From a2f837be591e4e64f2634e1d2e57352989326e98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:39:18 +0200 Subject: [PATCH 796/988] backup-email: use :retry and $FileExists ... ... to work around restrictions in new file handling. --- backup-email.rsc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 632d2e60..cff6fd83 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -27,6 +27,7 @@ :global CleanName; :global DeviceInfo; + :global FileExists; :global FormatLine; :global LogPrint; :global MkDir; @@ -124,16 +125,16 @@ attach=$Attach; remove-attach=true }); # wait for the mail to be sent - :local I 0; - :while ([ :len [ /file/find where name ~ ($FilePath . "\\.(backup|rsc)\$") ] ] > 0) do={ - :if ($I >= 120) do={ - $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); - :set PackagesUpdateBackupFailure true; - :set ExitOK true; - :error false; - } - :delay 1s; - :set I ($I + 1); + :do { + :retry { + :if ([ $FileExists ($FilePath . ".backup") "backup" ] = true || \ + [ $FileExists ($FilePath . ".rsc") "script" ] = true) do={ + :error "Files are still available."; + } + } delay=1s max=120; + } on-error={ + $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); + :set PackagesUpdateBackupFailure true; } } do={ :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; From 43bac7c33c50e164ff7ac56029519d510bc08973 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 23:52:29 +0200 Subject: [PATCH 797/988] backup-email: check for .conf file --- backup-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-email.rsc b/backup-email.rsc index cff6fd83..cc621055 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -127,7 +127,8 @@ # wait for the mail to be sent :do { :retry { - :if ([ $FileExists ($FilePath . ".backup") "backup" ] = true || \ + :if ([ $FileExists ($FilePath . ".conf") ".conf file" ] = true || \ + [ $FileExists ($FilePath . ".backup") "backup" ] = true || \ [ $FileExists ($FilePath . ".rsc") "script" ] = true) do={ :error "Files are still available."; } From daee05dbd7c03aa7ce977ba7856234026185c4a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 23:49:50 +0200 Subject: [PATCH 798/988] backup-email: add a comment why files are not removed --- backup-email.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-email.rsc b/backup-email.rsc index cc621055..8015beaa 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -137,6 +137,7 @@ $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); :set PackagesUpdateBackupFailure true; } + # do not remove the files here, as the mail is still queued! } do={ :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e3284ca77081642d2105d6a6773fa6767188dbec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:46:03 +0200 Subject: [PATCH 799/988] mod/notification-email: use $FileExists ... ... to work around restrictions in new file handling. --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 52937668..75e11b9d 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -40,6 +40,7 @@ :global EitherOr; :global EMailGenerateFrom; + :global FileExists; :global IsDNSResolving; :global IsTimeSync; :global LogPrint; @@ -93,7 +94,7 @@ :onerror Err { :local Attach ({}); :foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={ - :if ([ :len [ /file/find where name=$File ] ] = 1) do={ + :if ([ $FileExists $File ] = true) do={ :set Attach ($Attach, $File); } else={ $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); From 2d81984aed8894200e4f8c6c72596b8b05bdbb93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:46:16 +0200 Subject: [PATCH 800/988] mod/notification-email: use $RmFile --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 75e11b9d..ad9762a3 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -44,6 +44,7 @@ :global IsDNSResolving; :global IsTimeSync; :global LogPrint; + :global RmFile; :local AllDone true; :local QueueLen [ :len $EmailQueue ]; @@ -111,7 +112,7 @@ :set Wait false; :if (($Message->"remove-attach") = true) do={ :foreach File in=$Attach do={ - /file/remove $File; + $RmFile $File; } } } From 80aed200fd7400e4a4958ba314912488780be635 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:48:57 +0200 Subject: [PATCH 801/988] mod/ssh-keys-import: use $FileExists ... ... to work around restrictions in new file handling. --- mod/ssh-keys-import.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 94675255..7bdc95da 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -75,6 +75,7 @@ :local User [ :tostr $2 ]; :global EitherOr; + :global FileExists; :global LogPrint; :global ParseKeyValueStore; :global SSHKeysImport; @@ -84,8 +85,7 @@ :return false; } - :local File [ /file/find where name=$FileName ]; - :if ([ :len $File ] = 0) do={ + :if ([ $FileExists $FileName ] = true) do={ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } From 30b80e903dbf80510fbb05f21c598ecf6c1834d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:41:03 +0200 Subject: [PATCH 802/988] telegram-chat: use $FileExists ... ... to work around restrictions in new file handling. --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index fdd08838..7f7b7a79 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -30,6 +30,7 @@ :global CertificateAvailable; :global EitherOr; :global EscapeForRegEx; + :global FileExists; :global GetRandom20CharAlNum; :global IfThenElse; :global LogPrint; @@ -154,7 +155,7 @@ :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ :set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n"); } - :if ([ :len [ /file/find where name=($File . ".failed") ] ] > 0) do={ + :if ([ $FileExists ($File . ".failed") ] = true) do={ :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); From 5b15c82bb11f9da1b6858504dc1e0de401e91c8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 22:16:43 +0200 Subject: [PATCH 803/988] capsman-download-packages: use $FileGet ... ... to work around restrictions in new file handling. --- capsman-download-packages.capsman.rsc | 3 ++- capsman-download-packages.template.rsc | 3 ++- capsman-download-packages.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index cab1e4c3..e296e159 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -20,6 +20,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -42,7 +43,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ea411201..4040d4d0 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -21,6 +21,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -44,7 +45,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index a8103569..809fe8e7 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -20,6 +20,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -42,7 +43,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); From 15fd522d3db507cc7c22af9cd59ff85d41a5be6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 23:22:59 +0200 Subject: [PATCH 804/988] capsman-download-packages: adopt new functionality from file menu --- capsman-download-packages.capsman.rsc | 8 ++++---- capsman-download-packages.template.rsc | 8 ++++---- capsman-download-packages.wifi.rsc | 8 ++++---- doc/capsman-download-packages.md | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index e296e159..aaebf5c0 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 4040d4d0..ebbba709 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -56,8 +56,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -69,7 +69,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); # NOT /interface/wifi/ # :foreach Arch in={ "arm"; "mipsbe" } do={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 809fe8e7..7de0431f 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "arm64" } do={ :local Packages { "arm"={ "routeros"; "wifi-qcom"; "wifi-qcom-ac" }; diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 57222272..4daad494 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.18-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From c3d3d61f92d4d3e219373045dbd3b982af18a824 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 15:58:00 +0200 Subject: [PATCH 805/988] packages-update: support deferred reboot with longer interval --- doc/packages-update.md | 4 ++-- packages-update.rsc | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/packages-update.md b/doc/packages-update.md index 75225fe2..a0a17956 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -46,8 +46,8 @@ Configuration The configuration goes to `global-config-overlay`, this is the only parameter: -* `PackagesUpdateDeferReboot`: defer the reboot for night (between 3 AM - and 5 AM) +* `PackagesUpdateDeferReboot`: defer the reboot for night (between 3 AM and + 5 AM), use a numerical value in days suffixed with a `d` to defer further By modifying the scheduler's `start-time` you can force the reboot at different time. diff --git a/packages-update.rsc b/packages-update.rsc index 4fde131b..43f67494 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -31,19 +31,24 @@ :local Schedule do={ :local ScriptName [ :tostr $1 ]; + :global PackagesUpdateDeferReboot; + :global GetRandomNumber; + :global IfThenElse; :global LogPrint; :global RebootForUpdate do={ /system/reboot; } + :local Interval [ $IfThenElse ($PackagesUpdateDeferReboot >= 1d) $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; - /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=1d \ + /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=$Interval \ on-event=("/system/scheduler/remove \"_RebootForUpdate\"; " . \ ":global RebootForUpdate; \$RebootForUpdate;"); $LogPrint info $ScriptName ("Scheduled reboot for update at " . $StartTime . \ - " local time (" . [ /system/clock/get time-zone-name ] . ")."); + " local time (" . [ /system/clock/get time-zone-name ] . ")" . \ + [ $IfThenElse ($Interval > 1d) (" deferred by " . $Interval) ] . "."); :return true; } @@ -153,7 +158,7 @@ :error true; } } else={ - :if ($PackagesUpdateDeferReboot = true) do={ + :if ($PackagesUpdateDeferReboot = true || $PackagesUpdateDeferReboot >= 1d) do={ $Schedule $ScriptName; :set ExitOK true; :error true; From 1f4bf9ee63c57a711652954d6d408b221a6503e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 16:12:28 +0200 Subject: [PATCH 806/988] check-routeros-update: remove a stale scheduler --- check-routeros-update.rsc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index e28a0190..8b80ddeb 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -28,6 +28,7 @@ :global EscapeForRegEx; :global FetchUserAgentStr; :global LogPrint; + :global RebootForUpdate; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -62,9 +63,14 @@ $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ - $LogPrint info $ScriptName ("A reboot for update is already scheduled."); - :set ExitOK true; - :error false; + :if ([ :typeof $RebootForUpdate ] = "nothing") do={ + $LogPrint info $ScriptName ("Found a stale scheduler for reboot, removing."); + /system/scheduler/remove "_RebootForUpdate"; + } else={ + $LogPrint info $ScriptName ("A reboot for update is already scheduled."); + :set ExitOK true; + :error false; + } } $LogPrint debug $ScriptName ("Checking for updates..."); From 0de6d006ae1773b38bef60845c6c343bc20f5da6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 21:37:59 +0200 Subject: [PATCH 807/988] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 5bf5d089..00861c18 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -35,6 +35,7 @@ Add yourself to the list, [donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! * Abdul Mannan Abbasi +* Alex Maier * Andrea Ruffini Perico * Andrew Cox * Christoph Boss (@Kampfwurst) From 595b4aea9d43f6eef3aa3dad7a198431a7e3cf9a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Jun 2025 22:54:40 +0200 Subject: [PATCH 808/988] capsman-download-packages: revert changes for "new functionality" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Though we keep the quoting for type.) Well, turned out this functionality is for `/file/print` only, but does not work with `/file/find`. 🫣🥴 This reverts commit 15fd522d3db507cc7c22af9cd59ff85d41a5be6f. --- capsman-download-packages.capsman.rsc | 8 ++++---- capsman-download-packages.template.rsc | 8 ++++---- capsman-download-packages.wifi.rsc | 8 ++++---- doc/capsman-download-packages.md | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index aaebf5c0..2ea16674 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ebbba709..f95212a4 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -56,8 +56,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -69,7 +69,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); # NOT /interface/wifi/ # :foreach Arch in={ "arm"; "mipsbe" } do={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 7de0431f..03fd9e73 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "arm64" } do={ :local Packages { "arm"={ "routeros"; "wifi-qcom"; "wifi-qcom-ac" }; diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 4daad494..57222272 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.18-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From e2d3f0f073f1cd923892f4ac9af0d20dfb5902ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Jun 2025 12:26:49 +0200 Subject: [PATCH 809/988] fw-addr-lists: delay on possible scripting subsystem crash This happens in :convert when a list is way too large. Let's use $LogPrintOnce here. If the scripting subsystem really crashes the message will be purged from $LogPrintOnceMessages anyway (as all global variables are lost). --- fw-addr-lists.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index efd37db7..0c45f7ea 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -48,6 +48,12 @@ } $WaitFullyConnected; + :if ([ :len [ /log/find where topics=({"script"; "warning"}) \ + message=("\$LogPrintOnce: The message is already in log, scripting subsystem may have crashed before!") ] ] > 0) do={ + $LogPrintOnce warning $ScriptName ("Scripting subsystem may have crashed, possibly caused by us. Delaying!"); + :delay 5m; + } + :local ListComment ("managed by " . $ScriptName); :foreach FwListName,FwList in=$FwAddrLists do={ From de2a90d8413b832d3bb01337ef14d1866d23d981 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Jun 2025 15:51:16 +0200 Subject: [PATCH 810/988] doc/fw-addr-lists: add a warning on possible subsystem crash --- doc/fw-addr-lists.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index d09383bf..46b80c29 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -32,7 +32,10 @@ certificate is checked. > ⚠️ **Warning**: The script does not limit the size of a list, but keep in > mind that huge lists can exhaust your device's resources (RAM and CPU), -> and may take a long time to process. +> and may take a long time to process. +> Even crashes for the complete scripting (and CLI) subsystem are possible. +> This should be logged accordingly with warnings when global functions are +> reloaded from scheduler. Requirements and installation ----------------------------- From 95f8af6234ab56c9a831d0f37f338d7b8b3e0cbe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 20 Jun 2025 23:47:47 +0200 Subject: [PATCH 811/988] packages-update: convert to time before comparing... ... to avoid: packages-update: Script 'packages-update' exited with error: Script Error: cannot compare if truth value is more than or equal to ip address --- packages-update.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 43f67494..d3140f29 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,7 +41,8 @@ /system/reboot; } - :local Interval [ $IfThenElse ($PackagesUpdateDeferReboot >= 1d) $PackagesUpdateDeferReboot 1d ]; + :local Interval [ $IfThenElse ([ :totime $PackagesUpdateDeferReboot ] >= 1d) \ + $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=$Interval \ on-event=("/system/scheduler/remove \"_RebootForUpdate\"; " . \ @@ -158,7 +159,7 @@ :error true; } } else={ - :if ($PackagesUpdateDeferReboot = true || $PackagesUpdateDeferReboot >= 1d) do={ + :if ($PackagesUpdateDeferReboot = true || [ :totime $PackagesUpdateDeferReboot ] >= 1d) do={ $Schedule $ScriptName; :set ExitOK true; :error true; From 64158498504635d98adac896f480d71d9bf8a2a9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 21 Jun 2025 23:09:24 +0200 Subject: [PATCH 812/988] global-functions: $WaitForFile: (mostly) revert changes This (mostly) reverts commits 0e00a228d67d77fadc80eee2df04c2cec25b8db8 and e08bb2192dfd22b25652553f28304818a3602331. This is required for RouterOS 7.20beta4. That fixed recursive find for files, and (again, or still?) suffers timing (and thus racing) issues getting file properties. This breaks RouterOS 7.20beta2 again, so that specific version is not supported. Just update... --- global-functions.rsc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 50426b69..fd89f0f3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1771,14 +1771,26 @@ :global MAX; :set FileName [ $CleanFilePath $FileName ]; - :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); + :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 9); :do { - :retry { + :retry { + :if ([ :len [ /file/find where name=$FileName ] ] = 0) do={ + :error false; + } + } delay=$Delay max=10; + } on-error={ + :return false; + } + + :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ + :do { /file/get $FileName; :return true; - } delay=$Delay max=10; - } on-error={ } + } on-error={ } + :delay $Delay; + :set Delay ($Delay * 3 / 2); + } :return false; } From 1307b8587e57deaf95146820b7f32bb9a713892d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 22 Jun 2025 00:15:17 +0200 Subject: [PATCH 813/988] global-functions: $FileGet: mitigate race with file properties RouterOS is suffering a race condition, where a file exists, but its properties are not (yet) available. This is handled in $WaitForFile. This passes an interval of zero to $WaitForFile, as does not wait for the file to exist, but wants to avoid the race only. --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index fd89f0f3..829cbf27 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -559,6 +559,12 @@ :set FileGet do={ :local FileName [ :tostr $1 ]; + :global WaitForFile; + + :if ([ $WaitForFile $FileName 0s ] = false) do={ + :return false; + } + :local FileVal false; :do { :set FileVal [ /file/get $FileName ]; From d46574b4fe5ea3f72ce804bd5fb38a5408f9cd94 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Jun 2025 10:30:26 +0200 Subject: [PATCH 814/988] netwatch-dns: retry doh server... ... for more resilience on bad connectivity or saturated link. --- netwatch-dns.rsc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 4fa076af..2df26b03 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -119,11 +119,13 @@ :local Data false; :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"); + :retry { + :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"); + } delay=1s max=3; } do={ $LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \ " failed: " . $Err); From b068f86995c63278c91f9e92831f075fab5af2f1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Jun 2025 10:47:12 +0200 Subject: [PATCH 815/988] netwatch-dns: fix indention --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 2df26b03..9e2f9bcf 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -125,7 +125,7 @@ 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"); - } delay=1s max=3; + } delay=1s max=3; } do={ $LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \ " failed: " . $Err); From 89175e511fc965721fc19d88819c0fef13e383dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Jul 2025 18:38:21 +0200 Subject: [PATCH 816/988] accesslist-duplicates: print without paging --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 5e6cf0a0..1da03661 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /caps-man/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /caps-man/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /caps-man/access-list/print where mac-address=$Mac; + /caps-man/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index a6b4f417..03a97241 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /interface/wireless/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /interface/wireless/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /interface/wireless/access-list/print where mac-address=$Mac; + /interface/wireless/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index e51198d8..bf231475 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -27,9 +27,9 @@ :local Mac [ /interface/wifi/access-list/get $AccList mac-address ]; :local Mac [ /interface/wireless/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /caps-man/access-list/print where mac-address=$Mac; - /interface/wifi/access-list/print where mac-address=$Mac; - /interface/wireless/access-list/print where mac-address=$Mac; + /caps-man/access-list/print without-paging where mac-address=$Mac; + /interface/wifi/access-list/print without-paging where mac-address=$Mac; + /interface/wireless/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index cadacb6b..528a73ce 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /interface/wifi/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /interface/wifi/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /interface/wifi/access-list/print where mac-address=$Mac; + /interface/wifi/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ From 4c2c7e817a03202d8202bc4902f12990b0b06028 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 21 Jul 2025 10:47:19 +0200 Subject: [PATCH 817/988] netwatch-notify: give the number of failures... ... to indicated this happened several times. --- netwatch-notify.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 00f03cde..12f27214 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -127,7 +127,7 @@ $LogPrint [ $IfThenElse ($HostInfo->"no-resolve-fail" != true) warning debug ] \ $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ - $HostInfo->"name") "" ] . "' failed: " . $Err); + $HostInfo->"name") "" ] . "' failed third time: " . $Err); } } } From 721e786f68cccfa789874545889169212b37bf11 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 21 Jul 2025 10:52:22 +0200 Subject: [PATCH 818/988] netwatch-notify: increase the address-list timeout even further --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 12f27214..1fcc2034 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -62,14 +62,14 @@ :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); :if ([ :typeof [ :toip $Expected ] ] = "ip") do={ - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=30s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } } :if ([ :typeof [ :toip6 $Expected ] ] = "ip6") do={ - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=30s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From a856d309df956db8bd93647a1998c95afe38da02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Jul 2025 16:47:27 +0200 Subject: [PATCH 819/988] global-functions: $SymbolByUnicodeName: allow to add more symbols... ... for example from a module. Add a script `mod/symbols-extra` with something like: :global SymbolsExtra; :set ($SymbolsExtra->"rocket") "\F0\9F\9A\80"; --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 829cbf27..40c38174 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1608,7 +1608,9 @@ :global LogPrintOnce; - :local Symbols { + :global SymbolsExtra; + + :local Symbols ({ "abacus"="\F0\9F\A7\AE"; "alarm-clock"="\E2\8F\B0"; "arrow-down"="\E2\AC\87"; @@ -1643,7 +1645,7 @@ "star"="\E2\AD\90"; "warning-sign"="\E2\9A\A0"; "white-heavy-check-mark"="\E2\9C\85" - } + }, $SymbolsExtra); :if ([ :len ($Symbols->$Name) ] = 0) do={ $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!"); From fe080c0d3de677da9ac7a6831429e51c373a7b30 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 16 Aug 2025 23:06:56 +0200 Subject: [PATCH 820/988] global-functions: $CertificateAvailable: properly handle duplicate CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are CA certificates with identical CommonName out there... 🤪 Let's handle these. [admin@MikroTik] > /certificate/print proplist=common-name,skid where common-name="GlobalSign"; Flags: T - TRUSTED Columns: COMMON-NAME, SKID # COMMON-NAME SKID 0 T GlobalSign 8FF04B7FA82E4524AE4D50FA639A8BDEE2DD1BBC 1 T GlobalSign 3DE629489BEA07CA21444A26DE6EDED283D09F59 2 T GlobalSign AE6C05A39313E2A2E7E2D71CD6C7F07FC86753A0 3 T GlobalSign 54B07BAD45B8E2407FFB0A6EFBBE33C93CA384D5 --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 40c38174..10d1b412 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -133,6 +133,11 @@ } } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] > 1) do={ + $LogPrint info $0 ("There are " . $CertCount . " Certificates with CommonName '" . $CommonName . "'. Should be ok."); + :return true; + } + :local CertVal [ /certificate/get [ find where common-name=$CommonName ] ]; :while (($CertVal->"akid") != "" && ($CertVal->"akid") != ($CertVal->"skid")) do={ :if ([ :len [ /certificate/find where skid=($CertVal->"akid") ] ] = 0) do={ From 386ea2419f29c5948ff79bbb19adee8336612f40 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 25 Aug 2025 11:03:47 +0200 Subject: [PATCH 821/988] check-health: fix variable name --- check-health.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 4cb99408..8cffbfc8 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -92,10 +92,10 @@ :onerror Err { /system/script/run $Plugin; } do={ - $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run: " . $Err); + $LogPrint error $ScriptName ("Plugin '" . $PluginVal->"name" . "' failed to run: " . $Err); } } else={ - $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); + $LogPrint error $ScriptName ("Plugin '" . $PluginVal->"name" . "' failed syntax validation, skipping."); } } From 2fed8f967b9c60d8a5742aadb0004d18dccf466c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:20:51 +0200 Subject: [PATCH 822/988] check-health: pass script name to plugin --- check-health.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 8cffbfc8..760636db 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -101,7 +101,7 @@ :foreach PluginName,Discard in=$CheckHealthPlugins do={ ($CheckHealthPlugins->$PluginName) \ - ("\$CheckHealthPlugins->\"" . $PluginName . "\""); + ("\$CheckHealthPlugins->\"" . $PluginName . "\"") $ScriptName; } :set CheckHealthPlugins; From 907358cb857b9cc32171191e851e1de7894e225d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:13 +0200 Subject: [PATCH 823/988] check-health.d/state: use script name for origin in notification --- check-health.d/state.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index 29919359..5e4cbb82 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global Identity; @@ -32,13 +33,13 @@ :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ :if ($CheckHealthLast->$Name = "ok" && \ $Value != "ok") do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ message=("The device '" . $Name . "' on " . $Identity . " failed!") }); } :if ($CheckHealthLast->$Name != "ok" && \ $Value = "ok") do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ message=("The device '" . $Name . "' on " . $Identity . " recovered!") }); } From 62ca30b5d35d9f8c74ff8a8f4f05f4a2e8301a6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:29 +0200 Subject: [PATCH 824/988] check-health.d/temperature: use script name for origin in notification --- check-health.d/temperature.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index a2f632d2..9f3f1a5e 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global CheckHealthTemperature; @@ -54,7 +55,7 @@ } :if ($Value > $CheckHealthTemperature->$Name && \ $CheckHealthTemperatureNotified->$Name != true) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ $Value . "\C2\B0" . "C") }); @@ -62,7 +63,7 @@ } :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ $CheckHealthTemperatureNotified->$Name = true) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ $Value . "\C2\B0" . "C") }); From 22e6383e86cc345618aafc6401e9943696b3100b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:46 +0200 Subject: [PATCH 825/988] check-health.d/voltage: use script name for origin in notification --- check-health.d/voltage.rsc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 9071c886..5891fb4f 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global CheckHealthVoltageLow; @@ -39,7 +40,7 @@ :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ @@ -47,12 +48,12 @@ [ $FormatLine "new value" ($Value . " V") 12 ]) }); } else={ :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); } :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); } From 6b0c9ab17d2e7e3693cebf281e5300d1e4de3446 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 15 Sep 2025 13:10:12 +0200 Subject: [PATCH 826/988] packages-update: exit early if scheduler exists --- packages-update.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index d3140f29..cfe5222e 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,6 +41,11 @@ /system/reboot; } + :if ([ /system/scheduler/find where name="_RebootForUpdate" ] > 0) do={ + $LogPrint warning $ScriptName ("Scheduler for reboot already exists."); + :return false; + } + :local Interval [ $IfThenElse ([ :totime $PackagesUpdateDeferReboot ] >= 1d) \ $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; From 2773fef9d80fe8f7e2abdec767da5c5dcb64ddaf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Sep 2025 17:20:37 +0200 Subject: [PATCH 827/988] global-functions: $WaitForFile: try less expensive operation Checking a specific file is less expensive operation than finding one, especially when on hardware with huge storage and lots of files (like RDS). We have to keep the find command in the latter loop, though. --- global-functions.rsc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 10d1b412..98bc306c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1787,14 +1787,11 @@ :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 9); :do { - :retry { - :if ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :error false; - } + :retry { + /file/get $FileName; + :return true; } delay=$Delay max=10; - } on-error={ - :return false; - } + } on-error={ } :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ :do { From 2c715096b994811fbc914f68412db91f5bd62618 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Wed, 24 Sep 2025 15:17:36 +0200 Subject: [PATCH 828/988] mod/ssh-keys-import: $SSHKeysImportFile: fix file exists condition... ... which broke in commit 80aed200fd7400e4a4958ba314912488780be635. --- mod/ssh-keys-import.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 7bdc95da..dd32fd6b 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -85,7 +85,7 @@ :return false; } - :if ([ $FileExists $FileName ] = true) do={ + :if ([ $FileExists $FileName ] = false) do={ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } From 14b51d96b0b9fd80e0364407f377c26e8e0222ec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Sep 2025 12:01:32 +0200 Subject: [PATCH 829/988] generate valid HTML, including head & style --- Makefile | 4 ++-- contrib/html.sh | 9 +++++++++ contrib/html.sh.d/head.html | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 contrib/html.sh create mode 100644 contrib/html.sh.d/head.html diff --git a/Makefile b/Makefile index 89517410..0265a51a 100644 --- a/Makefile +++ b/Makefile @@ -11,8 +11,8 @@ HTML = $(MARKDOWN:.md=.html) all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -%.html: %.md Makefile - markdown $< | sed 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' > $@ +%.html: %.md contrib/html.sh contrib/html.sh.d/head.html + contrib/html.sh $< > $@ %.capsman.rsc: %.template.rsc Makefile sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ diff --git a/contrib/html.sh b/contrib/html.sh new file mode 100755 index 00000000..bbd8ba86 --- /dev/null +++ b/contrib/html.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" +markdown -f toc,idanchor "${1}" | sed \ + -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ + -e '/| id="\L\1">|' +printf '' diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html new file mode 100644 index 00000000..1b1dd03a --- /dev/null +++ b/contrib/html.sh.d/head.html @@ -0,0 +1,15 @@ + +RouterOS Scripts :: __TITLE__ + + + + From a931cb61a033949a9cc6a1b62bc1e267774b04a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 30 Sep 2025 10:02:20 +0200 Subject: [PATCH 830/988] packages-update: fix condition when checking for scheduler This broke with commit 6b0c9ab17d2e7e3693cebf281e5300d1e4de3446... --- packages-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index cfe5222e..379e818e 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,7 +41,7 @@ /system/reboot; } - :if ([ /system/scheduler/find where name="_RebootForUpdate" ] > 0) do={ + :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ $LogPrint warning $ScriptName ("Scheduler for reboot already exists."); :return false; } From 48d0f1f0b94fe6538bec54559e6e1f1609877039 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 2 Oct 2025 11:51:08 +0200 Subject: [PATCH 831/988] fw-addr-lists: check last character of line for JSON This is not a proof, but a line also ending with a curly bracket has higher probability of being valid JSON. Better safe than sorry... We are suffering a CVE in RouterOS: https://www.cve.org/CVERecord?id=CVE-2025-10948 --- fw-addr-lists.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 0c45f7ea..d56d40f0 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -103,7 +103,7 @@ :foreach Line in=[ :deserialize $Data delimiter="\n" from=dsv options=dsv.plain ] do={ :set Line ($Line->0); :local Address; - :if ([ :pick $Line 0 1 ] = "{") do={ + :if ([ :pick $Line 0 1 ] = "{" && [ :pick $Line ([ :len $Line ] - 1) ] = "}") do={ :do { :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; } on-error={ } From 5ffa85f8bfb5ed11c3f3886e3b8cd7b5346b6efa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 7 Oct 2025 16:02:53 +0200 Subject: [PATCH 832/988] mod/ssh-keys-import: handle new parameter With RouterOS 7.21beta2 the user SSH keys "key-owner" field was renamed to "info". Either of both is displayed in red by syntax highlighting, but it works anyway. --- doc/mod/ssh-keys-import.md | 5 +++-- mod/ssh-keys-import.rsc | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 344f4bc2..49276d04 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -38,8 +38,9 @@ import that key: $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; The third part of the key (`user` in this example) is inherited as -`key-owner` in RouterOS. Also the `MD5` fingerprint is recorded, this helps -to audit and verify the available keys. +`key-owner` in RouterOS (or `info` starting with RouterOS 7.21beta2). Also +the `MD5` fingerprint is recorded, this helps to audit and verify the +available keys. > ℹ️️ **Info**: Use `ssh-keygen` to show a fingerprint of an existing public > key file: `ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub` diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index dd32fd6b..8bea64ee 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -40,7 +40,9 @@ :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; - :if ([ :len [ /user/ssh-keys/find where user=$User key-owner~("\\bmd5=" . $FingerPrintMD5 . "\\b") ] ] > 0) do={ + :local RegEx ("\\bmd5=" . $FingerPrintMD5 . "\\b"); + :if ([ :len [ /user/ssh-keys/find where user=$User \ + (key-owner~$RegEx or info~$RegEx) ] ] > 0) do={ $LogPrint warning $0 ("The ssh public key (MD5:" . $FingerPrintMD5 . \ ") is already available for user '" . $User . "'."); :return false; From 9ceed0926a749c51ebc050d80cd33100ecdbcc5a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 Oct 2025 16:02:20 +0200 Subject: [PATCH 833/988] fw-addr-lists: do not use IPv6 net addresses smaller /64 This should reduce the number of addresses in list by aggregating them, and also fix addresses with host part set (like 2001:470:1:fb5::2a0/64, which should be 2001:470:1:fb5::/64 really). The latter caused new warnings with RouterOS 7.21beta2. --- fw-addr-lists.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index d56d40f0..2b5fd0cf 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -25,6 +25,7 @@ :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; + :global MIN; :global ScriptLock; :global WaitFullyConnected; @@ -120,9 +121,14 @@ :error true; } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ - :if ([ :typeof [ :find $Address "/" ] ] = "nil") do={ - :set Address ($Address . "/128"); + :local Net $Address; + :local Cidr 64; + :local Slash [ :find $Address "/" ]; + :if ([ :typeof $Slash ] = "num") do={ + :set Net [ :toip6 [ :pick $Address 0 $Slash ] ] + :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; } + :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } From 35b556f0b20f79e2beb5d99c25159b3255124833 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 Oct 2025 16:23:15 +0200 Subject: [PATCH 834/988] fw-addr-lists: calculate branch after post-processing... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as branch will likely change, and we want to avoid duplicates. 😉 --- fw-addr-lists.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 2b5fd0cf..cd136f95 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -112,11 +112,12 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ $GetBranch $Address ]; + :local Branch; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; } + :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :error true; } @@ -129,10 +130,12 @@ :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; } :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); + :set Branch [ $GetBranch $Address ]; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ + :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; From c81618b57166cbc066aa476a31a32cee421314a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 9 Oct 2025 09:22:39 +0200 Subject: [PATCH 835/988] log-forward: always use memo symbol... ... and add warning sign on top. --- log-forward.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log-forward.rsc b/log-forward.rsc index be7eff7b..3d7d0547 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -95,7 +95,7 @@ :set LogForwardRateLimit ($LogForwardRateLimit + 10); $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification [ $IfThenElse ($Warning = true) "warning-sign" "memo" ] ] . \ + subject=([ $SymbolForNotification ("memo" . [ $IfThenElse ($Warning = true) ",warning-sign" ]) ] . \ "Log Forwarding"); \ message=("The log on " . $Identity . " contains " . [ $IfThenElse ($Count = 1) "this message" \ ("these " . $Count . " messages") ] . " after " . [ /system/resource/get uptime ] . " uptime." . \ From 6630d35eea6510834287a7004e55718f49a6232f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 13 Oct 2025 12:06:01 +0200 Subject: [PATCH 836/988] mod/notification-telegram: $FlushTelegramQueue: check for cert, again Chances are that messages have been queued before system was fully up or connected. Thus the certificate may be missing, and it should be checked again for on flush. --- mod/notification-telegram.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 2eb90e12..ff9b4da2 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -21,6 +21,7 @@ :global TelegramQueue; :global TelegramMessageIDs; + :global CertificateAvailable; :global IsFullyConnected; :global LogPrint; @@ -29,6 +30,11 @@ :return false; } + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + $LogPrint warning $0 ("Downloading required certificate failed."); + :return false; + } + :local AllDone true; :local QueueLen [ :len $TelegramQueue ]; From 025b492783ad5a3dd084a6ecf4465878c970970c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:27:27 +0200 Subject: [PATCH 837/988] global-functions: remove trailing space --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 98bc306c..55b52922 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -465,7 +465,7 @@ :local Error [ :tostr $3 ]; :global IfThenElse; - :global LogPrint; + :global LogPrint; :if ($ExitOK = "false") do={ $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ From def540c965c40c28cce5ceef00e25132f5ab2d3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:26:50 +0200 Subject: [PATCH 838/988] global-functions: introduce $NetMask4 --- global-functions.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 55b52922..5c98a206 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -61,6 +61,7 @@ :global MAX; :global MIN; :global MkDir; +:global NetMask4; :global NotificationFunctions; :global ParseDate; :global ParseKeyValueStore; @@ -990,6 +991,13 @@ :return true; } +# return an IPv4 netmask for CIDR +:set NetMask4 do={ + :local CIDR [ :tonum $1 ]; + + :return ((255.255.255.255 << (32 - $CIDR)) & 255.255.255.255); +} + # prepare NotificationFunctions array :if ([ :typeof $NotificationFunctions ] != "array") do={ :set NotificationFunctions ({}); From 9fa11cb79a2d0e23ff73b1317fdff123636fca10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:42:23 +0200 Subject: [PATCH 839/988] mod/ipcalc: use $NetMask4 --- mod/ipcalc.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index eacff6d9..fecf6f26 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -34,9 +34,12 @@ # calculate and return netmask, network, min host, max host and broadcast :set IPCalcReturn do={ :local Input [ :tostr $1 ]; + + :global NetMask4; + :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ]; :local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ]; - :local Mask ((255.255.255.255 << (32 - $Bits)) & 255.255.255.255); + :local Mask [ $NetMask4 $Bits ]; :local Return { "address"=$Address; From 47309e5c03e32e05ed9435ed05f9549dfddd338f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 13:02:28 +0200 Subject: [PATCH 840/988] fw-addr-lists: normalize IPv4 addresses --- fw-addr-lists.rsc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index cd136f95..26e041aa 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -22,10 +22,12 @@ :global EitherOr; :global FetchHuge; :global HumanReadableNum; + :global IfThenElse; :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; :global MIN; + :global NetMask4; :global ScriptLock; :global WaitFullyConnected; @@ -114,8 +116,13 @@ :do { :local Branch; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ - :if ($Address ~ "/32\$") do={ - :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; + :local Net $Address; + :local CIDR 32; + :local Slash [ :find $Address "/" ]; + :if ([ :typeof $Slash ] = "num") do={ + :set Net [ :toip [ :pick $Address 0 $Slash ] ] + :set CIDR [ :pick $Address ($Slash + 1) [ :len $Address ] ]; + :set Address [ :tostr (([ :toip $Net ] & [ $NetMask4 $CIDR ]) . [ $IfThenElse ($CIDR < 32) ("/" . $CIDR) ]) ]; } :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; From 6ad6f9aa08d558ff2e8ff3010fe5daec3c600c4a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:30:20 +0200 Subject: [PATCH 841/988] global-functions: introduce $NetMask6 RouterOS does not support bit shifting on IPv6 data types, so we have to split the problem: * each 16 bit block is calculated separately, as number * the complete netmask is assembled in a loop, as string * the final string is casted to correct data type --- global-functions.rsc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5c98a206..ffa52776 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -62,6 +62,7 @@ :global MIN; :global MkDir; :global NetMask4; +:global NetMask6; :global NotificationFunctions; :global ParseDate; :global ParseKeyValueStore; @@ -998,6 +999,24 @@ :return ((255.255.255.255 << (32 - $CIDR)) & 255.255.255.255); } +# return an IPv6 netmask for CIDR +:set NetMask6 do={ + :local FuncName $0; + :local CIDR [ :tostr $1 ]; + + :global IfThenElse; + :global MAX; + :global MIN; + + :local Mask ""; + :for I from=0 to=7 do={ + :set Mask ($Mask . \ + [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - (16 * $I)) 0 ] 16 ] ])) ] . \ + [ $IfThenElse ($I < 7) ":" ]); + } + :return [ :toip6 $Mask ]; +} + # prepare NotificationFunctions array :if ([ :typeof $NotificationFunctions ] != "array") do={ :set NotificationFunctions ({}); From d7a6eb1d0083c1d788e8febedaea67464361d271 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 15:13:14 +0200 Subject: [PATCH 842/988] global-functions: $NetMask6: implement simple caching The calculation is quite complex for something that needs to be done frequently, for example by `fw-addr-lists`. The number of possible netmasks is limited, so let's cache the results that were calculated already. --- global-functions.rsc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ffa52776..5ede6546 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1008,13 +1008,25 @@ :global MAX; :global MIN; + :global NetMask6Cache; + + :if ([ :typeof ($NetMask6Cache->$CIDR) ] = "ip6") do={ + :return ($NetMask6Cache->$CIDR); + } + + :if ([ :typeof $NetMask6Cache ] = "nothing") do={ + :set NetMask6Cache ({}); + } + :local Mask ""; :for I from=0 to=7 do={ :set Mask ($Mask . \ [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - (16 * $I)) 0 ] 16 ] ])) ] . \ [ $IfThenElse ($I < 7) ":" ]); } - :return [ :toip6 $Mask ]; + :set Mask [ :toip6 $Mask ]; + :set ($NetMask6Cache->$CIDR) $Mask; + :return $Mask; } # prepare NotificationFunctions array From ea05b69f7cfb1506e24117020a115af2d1b19c4a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 13:02:14 +0200 Subject: [PATCH 843/988] fw-addr-lists: use $NetMask6 --- fw-addr-lists.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 26e041aa..c85cc8bf 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -26,8 +26,8 @@ :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; - :global MIN; :global NetMask4; + :global NetMask6; :global ScriptLock; :global WaitFullyConnected; @@ -130,13 +130,13 @@ } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ :local Net $Address; - :local Cidr 64; + :local CIDR 128; :local Slash [ :find $Address "/" ]; :if ([ :typeof $Slash ] = "num") do={ :set Net [ :toip6 [ :pick $Address 0 $Slash ] ] - :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; + :set CIDR [ :pick $Address ($Slash + 1) [ :len $Address ] ]; } - :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); + :set Address (([ :toip6 $Net ] & [ $NetMask6 $CIDR ]) . "/" . $CIDR); :set Branch [ $GetBranch $Address ]; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; From b80b872e557e2513c7e9ee4c6f119e3ad56d4116 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 17:31:15 +0200 Subject: [PATCH 844/988] mod/ipcalc: support IPv6 Well, some of these values do not make a lot of sense for IPv6... Something to be cleaned up later. --- mod/ipcalc.rsc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index fecf6f26..d65d4724 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -36,21 +36,32 @@ :local Input [ :tostr $1 ]; :global NetMask4; + :global NetMask6; - :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ]; + :local Address [ :pick $Input 0 [ :find $Input "/" ] ]; :local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ]; - :local Mask [ $NetMask4 $Bits ]; + :local Mask; + :local One; + :if ([ :typeof [ :toip $Address ] ] = "ip") do={ + :set Address [ :toip $Address ]; + :set Mask [ $NetMask4 $Bits ]; + :set One 0.0.0.1; + } else={ + :set Address [ :toip6 $Address ]; + :set Mask [ $NetMask6 $Bits ]; + :set One ::1; + } - :local Return { + :local Return ({ "address"=$Address; "netmask"=$Mask; "networkaddress"=($Address & $Mask); "networkbits"=$Bits; "network"=(($Address & $Mask) . "/" . $Bits); - "hostmin"=(($Address & $Mask) | 0.0.0.1); - "hostmax"=(($Address | ~$Mask) ^ 0.0.0.1); + "hostmin"=(($Address & $Mask) | $One); + "hostmax"=(($Address | ~$Mask) ^ $One); "broadcast"=($Address | ~$Mask); - } + }); :return $Return; } From 20987221d978c657fe453eefd1d8c284e93b6372 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Oct 2025 16:16:18 +0200 Subject: [PATCH 845/988] mod/notification-email: ignore errors (for now...) Errors are returned since RouterOS 7.21beta2. We keep the current logic for now, as we want to support older RouterOS versions. This is something to be reworked later... --- mod/notification-email.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ad9762a3..7c3a6ffb 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -101,8 +101,11 @@ $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; + :do { + /tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") \ + cc=($Message->"cc") subject=($Message->"subject") \ + body=($Message->"body") file=$Attach; + } on-error={ } :local Wait true; :do { :delay 1s; From c88953e44d9b922988e7d5638743e165a5196765 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:07:23 +0100 Subject: [PATCH 846/988] README: fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We had it there since 39d1027d697c09ec709a1b847a185ccff3b00540... 😜 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 243e1fc5..b0d26bdf 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ First time users should take the long way below. Want to see it in action? I've had a presentation [Repository based RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY) -including demonstation recorded live at [MUM Europe +including demonstration recorded live at [MUM Europe 2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna. > ⚠️ **Warning**: Some details changed. So see the presentation, then follow From d100cac9ed37e4b79c587daf7c2bdba45c5c2ee7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:20:29 +0100 Subject: [PATCH 847/988] README: add a line break before command --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b0d26bdf..529bb4c4 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ download the certificates. > 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You > can skip the steps regarding certificate download and import and jump > to [installation of scripts](#installation-of-scripts) if you set the -> trust for these builtin trust anchors: +> trust for these builtin trust anchors: > `/certificate/settings/set builtin-trust-anchors=trusted;` If you intend to download the scripts from a @@ -173,7 +173,7 @@ This last step is required when ever you make changes to your configuration. > ℹ️ **Info**: It is recommended to edit the configuration using the command > line interface. If using Winbox on Windows OS, the line endings may be -> missing. To fix this run: +> missing. To fix this run: > `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;` Updating scripts From 335266f2470593dfae33d6871abad7d2fe7297d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 16:18:10 +0100 Subject: [PATCH 848/988] README: update the screenshot for script update... ... to match commit 2c92c78b4647e43c44da567e98adee69b7857393. --- README.d/09-update-scripts.avif | Bin 1733 -> 1928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/09-update-scripts.avif b/README.d/09-update-scripts.avif index f549fef5bd7a33f883044d25f3fcac68134b130f..a31d60b3a0066d1ee68abbf79fd48aa6d77ffdd0 100644 GIT binary patch delta 1713 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 T^8jiU8*(U{VZwl~v4`?B()a82 From 1a1399d3026918d2b9f89f13878fe2a66855d06b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:20:47 +0100 Subject: [PATCH 849/988] README: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 529bb4c4..b77538dd 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,10 @@ download the certificates. > can skip the steps regarding certificate download and import and jump > to [installation of scripts](#installation-of-scripts) if you set the > trust for these builtin trust anchors: -> `/certificate/settings/set builtin-trust-anchors=trusted;` +> `/certificate/settings/set builtin-trust-anchors=trusted;` +> With RouterOS 7.21 the functionality was changed. Set this at minimum, +> but make sure not to drop other targets: +> `/certificate/settings/set builtin-trust-store=fetch;` If you intend to download the scripts from a different location (for example from github.com) install the corresponding From fbfeea30426ac9be62bdaf7392fbfc51d4143ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:38:31 +0100 Subject: [PATCH 850/988] INITIAL-COMMANDS: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- INITIAL-COMMANDS.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 40f609b9..6e70b66a 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -22,8 +22,11 @@ Run the complete base installation: :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - :if (!(([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ - [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ + :local CertSettings [ /certificate/settings/get ]; + :if (!((($CertSettings->"builtin-trust-anchors") = "trusted" || \ + ($CertSettings->"builtin-trust-store") ~ "fetch" || \ + ($CertSettings->"builtin-trust-store") = "all") && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ :put "Importing certificate..."; /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; From db0a5bf33ce5ff585f568affbea3d399466159de Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:47:55 +0100 Subject: [PATCH 851/988] global-functions: $CertificateAvailable: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- global-functions.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index eb837aa1..9f92b07a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -106,11 +106,15 @@ # check and download required certificate :set CertificateAvailable do={ :local CommonName [ :tostr $1 ]; + :local UseFor [ :tostr $2 ]; :global CertificateDownload; + :global EitherOr; :global LogPrint; :global ParseKeyValueStore; + :set UseFor [ $EitherOr $UseFor "undefined" ]; + :if ([ /system/resource/get free-hdd-space ] < 8388608 && \ [ /certificate/settings/get crl-download ] = true && \ [ /certificate/settings/get crl-store ] = "system") do={ @@ -123,7 +127,10 @@ :return false; } - :if (([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + :local CertSettings [ /certificate/settings/get ]; + :if ((($CertSettings->"builtin-trust-anchors") = "trusted" || \ + ($CertSettings->"builtin-trust-store") ~ $UseFor || \ + ($CertSettings->"builtin-trust-store") = "all") && \ [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={ :return true; } From 8eb397f79fafa90b078abe880dd3b2958ae95dad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:59:28 +0100 Subject: [PATCH 852/988] global-functions: $DownloadPackage: define certificate use --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 9f92b07a..412777c8 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -404,7 +404,7 @@ :return true; } - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={ $LogPrint error $0 ("Downloading required certificate failed."); :return false; } From f3e6e152bce0d2563f864a2d0652899c22c53918 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:01:11 +0100 Subject: [PATCH 853/988] global-functions: $GetMacVendor: define certificate use --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 412777c8..d4c37a20 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -640,7 +640,7 @@ } :do { - :if ([ $CertificateAvailable "GTS Root R4" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R4" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From b5a026966736f8c530e902d222dbf8dc4eea9cfd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:01:57 +0100 Subject: [PATCH 854/988] global-functions: $ScriptInstallUpdate: define certificate use --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d4c37a20..48aaf7fb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1248,7 +1248,7 @@ :global SymbolForNotification; :global ValidateSyntax; - :if ([ $CertificateAvailable "ISRG Root X2" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } @@ -1299,7 +1299,7 @@ } :if ([ :len ($ScriptInfo->"certificate") ] > 0) do={ - :if ([ $CertificateAvailable ($ScriptInfo->"certificate") ] = false) do={ + :if ([ $CertificateAvailable ($ScriptInfo->"certificate") "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } } From 876505c36dd2cafb9ce151a3051b1631fe09b3a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:05:10 +0100 Subject: [PATCH 855/988] check-certificates: define certificate use --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index f2d5c1f3..3300bee8 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -189,7 +189,7 @@ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; - :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") ] = false) do={ + :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") "fetch" ] = false) do={ $LogPrint warning $ScriptName ("The certificate chain is not available!"); } From 677b5b8069194fdd5c1c2ddbbcd4da2c5eb0c52b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 16:50:09 +0100 Subject: [PATCH 856/988] doc/mod/ssh-keys-import: create code block with indention --- doc/mod/ssh-keys-import.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 49276d04..abf4d392 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -51,12 +51,10 @@ The functions `$SSHKeysImportFile` can read an `authorized_keys`-style file and import all the keys. The user given to the function can be overwritting from comments in the file. Create a file `keys.pub` with this content: -``` -ssh-ed25519 AAAAC3Nza...3OcN8A user@client -ssh-rsa AAAAB3Nza...ozyts= worker@station -# user=example -ssh-rsa AAAAB3Nza...GXQVk= person@host -``` + ssh-ed25519 AAAAC3Nza...3OcN8A user@client + ssh-rsa AAAAB3Nza...ozyts= worker@station + # user=example + ssh-rsa AAAAB3Nza...GXQVk= person@host Then import it with: From 87787eefe3425b29e5fffe0c636adffc04208de6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:06:03 +0100 Subject: [PATCH 857/988] fw-addr-lists: define certificate use --- fw-addr-lists.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index c85cc8bf..e5a71aa6 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -74,7 +74,7 @@ :if ([ :len ($List->"cert") ] > 0) do={ :set CheckCertificate true; - :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ + :if ([ $CertificateAvailable ($List->"cert") "fetch" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \ " / " . $List->"url" . ") failed, trying anyway."); } From affb9b3baf44fe84089a5b4059b93b336f29b21c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 16:52:21 +0100 Subject: [PATCH 858/988] doc/mode-button: create code block with indention --- doc/mode-button.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/mode-button.md b/doc/mode-button.md index be15bc92..af95ddb6 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -26,17 +26,15 @@ can configure the reset button to act the same, see Copy this code to terminal to check: -``` -:if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={ - :put "Mode button is supported."; -} else={ - :if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={ - :put "Mode button is not supported, but reset button is."; - } else={ - :put "Neither mode button nor reset button is supported."; - } -} -``` + :if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={ + :put "Mode button is supported."; + } else={ + :if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={ + :put "Mode button is not supported, but reset button is."; + } else={ + :put "Neither mode button nor reset button is supported."; + } + } Requirements and installation ----------------------------- From 8ff34a2408b920dcdb59b2ea48d70148496553e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:10:22 +0100 Subject: [PATCH 859/988] mod/notification-ntfy: define certificate use --- mod/notification-ntfy.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 71140209..dd10812e 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -109,7 +109,7 @@ :onerror Err { :if ($Server = "ntfy.sh") do={ - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 090f25a82d862eaa5db86a18f9d570084e20e2b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:04:13 +0100 Subject: [PATCH 860/988] check-certificates: add missing semicolon --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index c10e33ba..f2d5c1f3 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -21,7 +21,7 @@ :global CertWarnTime; :global Identity; - :global CertificateAvailable + :global CertificateAvailable; :global EscapeForRegEx; :global IfThenElse; :global LogPrint; From f0910a44723feccbf5fb25340985cd654f310cd1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:09:43 +0100 Subject: [PATCH 861/988] mod/notification-telegram: define certificate use --- mod/notification-telegram.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index ff9b4da2..b1996a32 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -30,7 +30,7 @@ :return false; } - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :return false; } @@ -72,7 +72,7 @@ :global CertificateAvailable; :global LogPrint; - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :return false; } @@ -197,7 +197,7 @@ "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ "&disable_web_page_preview=true&parse_mode=MarkdownV2"); :onerror Err { - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 83b164d5115931209452940b2350dcd8077b139a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:58:23 +0100 Subject: [PATCH 862/988] global-functions: $CertificateDownload: drop unused function --- global-functions.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 5ede6546..3089d2e2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -161,7 +161,6 @@ :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; - :global CertificateAvailable; :global CertificateNameByCN; :global CleanName; :global FetchUserAgentStr; From 7772fbb22d6eb9118075c87230a43cf9b4926da5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:07:22 +0100 Subject: [PATCH 863/988] netwatch-dns: define certificate use --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 9e2f9bcf..eee5f854 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -112,7 +112,7 @@ :foreach DohServer in=$DohServers do={ :if ([ :len ($DohServer->"doh-cert") ] > 0) do={ - :if ([ $CertificateAvailable ($DohServer->"doh-cert") ] = false) do={ + :if ([ $CertificateAvailable ($DohServer->"doh-cert") "dns" ] = false) do={ $LogPrint warning $ScriptName ("Downloading certificate failed, trying without."); } } From 7d701483d333cec77c4b7cc6ce2bb4a8fc2eb81c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Oct 2025 11:07:38 +0100 Subject: [PATCH 864/988] contrib/checksums: output to stdout... ... and let the Makefile redirect. --- Makefile | 2 +- contrib/checksums.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0265a51a..d8f23876 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json < $< > $@ checksums.json: contrib/checksums.sh *.rsc */*.rsc - contrib/checksums.sh + contrib/checksums.sh > $@ clean: rm -f $(HTML) checksums.json diff --git a/contrib/checksums.sh b/contrib/checksums.sh index b472b49f..ab4e9738 100755 --- a/contrib/checksums.sh +++ b/contrib/checksums.sh @@ -6,4 +6,4 @@ set -e md5sum $(find -name '*.rsc' | sort) | \ sed -e "s| \./||" -e 's|.rsc$||' | \ - jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' > 'checksums.json' + jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' From 5ccb0d07b120f1fd7af738d5eed3b20345e2c971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:10:58 +0100 Subject: [PATCH 865/988] telegram-chat: define certificate use --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 7f7b7a79..54872fb9 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -61,7 +61,7 @@ :set TelegramRandomDelay 0; } - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); :set ExitOK true; :error false; From 20885c4620ec95e46d914fdbb4b63378e72c25d9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 2 Nov 2025 09:19:16 +0100 Subject: [PATCH 866/988] global-functions: $ScriptInstallUpdate: give hint on ignore Fixes: https://github.com/eworm-de/routeros-scripts/issues/112 --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 3089d2e2..b5fc0eb0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1313,6 +1313,11 @@ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; } + :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ + [ :len $CheckSum ] = 0) do={ + $LogPrintOnce warning $0 \ + ("Added the script manually? Skip updates with 'ignore=true' in comment."); + } :error false; } From 335bfc0a88e0a79e3ae03ee72a81edda9f5d0c32 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:03:33 +0100 Subject: [PATCH 867/988] update-tunnelbroker: define certificate use --- update-tunnelbroker.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 9057e1e4..5372f4c2 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -28,7 +28,7 @@ :error false; } - :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); :set ExitOK true; :error false; From 298a43a871b28bcdc057310dbc5b7819944e4bb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 00:00:03 +0100 Subject: [PATCH 868/988] global-functions: $ScriptInstallUpdate: either or... ... but not both. --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index b5fc0eb0..2379f9b9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1312,6 +1312,7 @@ :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; + :error false; } :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ [ :len $CheckSum ] = 0) do={ From 737a872a5f768eea07b1b74439580e3ce98752cd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:11:38 +0100 Subject: [PATCH 869/988] CERTIFICATES: define certificate use --- CERTIFICATES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 69d6c185..0e0a8671 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -61,7 +61,7 @@ Import a certificate by CommonName Running the function `$CertificateAvailable` with that name as parameter makes sure the certificate is available in the device's store: - $CertificateAvailable "ISRG Root X2"; + $CertificateAvailable "ISRG Root X2" "fetch"; If the certificate is actually available already nothing happens, and there is no output. Otherwise the certificate is downloaded and imported. From d002d1c0c04e90cd73e1b821e944c56321bfa1d8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Nov 2025 09:17:25 +0100 Subject: [PATCH 870/988] global-functions: $ScriptInstallUpdate: extra actions on 'not found' only --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 2379f9b9..eb837aa1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1309,6 +1309,10 @@ } } do={ $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err); + :if ($Err != "Fetch failed with status 404") do={ + :error false; + } + :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; From cc5aea22b357cebb54741be1d71a99f0b28d8c3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:08:49 +0100 Subject: [PATCH 871/988] doc/mod/notification-matrix: define certificate use --- doc/mod/notification-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index da6d6dea..ad4cf4f9 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -49,7 +49,7 @@ your server in device's certificate store. The example below is for `matrix.org`, which uses a trust chain from *Google Trust Services*. Run this to import the required certificate: - $CertificateAvailable "GTS Root R4"; + $CertificateAvailable "GTS Root R4" "fetch"; Replace the CA certificate name with what ever is needed for your server. You may want to find the From 8f6a38f2994a36742c6d200d74d4548bd9c2e356 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:56:49 +0100 Subject: [PATCH 872/988] mod/notification-email: remove schedule with find... ... as a race condition could occur and the scheduler is already gone. --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 7c3a6ffb..668dabac 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -132,7 +132,7 @@ } :if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={ - /system/scheduler/remove $Scheduler; + /system/scheduler/remove [ find where name="_FlushEmailQueue" ]; :set EmailQueue; :return true; } From c6cc8b9a51c0f399c36823b33a6d282344f16416 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:19:44 +0100 Subject: [PATCH 873/988] README: move the QR code --- README.md | 2 +- README.d/upstream.png => general/qr-code.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename README.d/upstream.png => general/qr-code.png (100%) diff --git a/README.md b/README.md index b77538dd..36408ec6 100644 --- a/README.md +++ b/README.md @@ -404,7 +404,7 @@ immediately remove the link in question. Upstream -------- -[![upstream](README.d/upstream.png)](https://rsc.eworm.de/) +[![upstream](general/qr-code.png)](https://rsc.eworm.de/) URL: [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) diff --git a/README.d/upstream.png b/general/qr-code.png similarity index 100% rename from README.d/upstream.png rename to general/qr-code.png From a2250a00e61edda3dadf7b253dc606713e036f56 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:19:15 +0100 Subject: [PATCH 874/988] README: add the upstream url verbatim --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 36408ec6..3c69017a 100644 --- a/README.md +++ b/README.md @@ -404,6 +404,8 @@ immediately remove the link in question. Upstream -------- +[rsc.eworm.de](https://rsc.eworm.de/) + [![upstream](general/qr-code.png)](https://rsc.eworm.de/) URL: From 97b4a41f238cbf6cb5417efa53a4ba7084356da1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 13:37:51 +0100 Subject: [PATCH 875/988] contrib/html: add empty lines... ... for easier rebasing. --- contrib/html.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/html.sh b/contrib/html.sh index bbd8ba86..6942ecfb 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -3,7 +3,9 @@ set -e sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" + markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ -e '/| id="\L\1">|' + printf '' From d610bf3582664a1a8fb5943b53f388a046ce8e33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:31:17 +0100 Subject: [PATCH 876/988] contrib/{logo-color,notification}: use a single style --- contrib/logo-color.d/style.css | 5 ----- contrib/logo-color.html | 2 +- contrib/notification.html | 4 ++-- {contrib/notification.d => general}/style.css | 3 ++- 4 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 contrib/logo-color.d/style.css rename {contrib/notification.d => general}/style.css (93%) diff --git a/contrib/logo-color.d/style.css b/contrib/logo-color.d/style.css deleted file mode 100644 index eb2ec6a1..00000000 --- a/contrib/logo-color.d/style.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - font-family: fira-sans, sans-serif; - font-size: 10pt; - background-color: transparent; -} diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 17942cea..507445bb 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -3,7 +3,7 @@ RouterOS-Scripts Logo Color Changer - + diff --git a/contrib/notification.html b/contrib/notification.html index 78750362..b7d6764d 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -3,8 +3,8 @@ RouterOS-Scripts Notification Generator - - + + diff --git a/contrib/notification.d/style.css b/general/style.css similarity index 93% rename from contrib/notification.d/style.css rename to general/style.css index 648ea23c..66d44f1c 100644 --- a/contrib/notification.d/style.css +++ b/general/style.css @@ -1,7 +1,8 @@ +/* stylesheet for RouterOS Scripts */ body { + background-color: transparent; font-family: fira-sans, sans-serif; font-size: 10pt; - background-color: transparent; } div.notification { position: relative; From a2d6671cf0db887dd25a122ccbf88d0709c6fb02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:46:01 +0100 Subject: [PATCH 877/988] contrib/html: include stylesheet via link --- Makefile | 2 +- contrib/html.sh | 7 ++++++- contrib/html.sh.d/head.html | 11 +---------- general/style.css | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index d8f23876..b799535e 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ HTML = $(MARKDOWN:.md=.html) all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -%.html: %.md contrib/html.sh contrib/html.sh.d/head.html +%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh $< > $@ %.capsman.rsc: %.template.rsc Makefile diff --git a/contrib/html.sh b/contrib/html.sh index 6942ecfb..6a32b5d7 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -2,7 +2,12 @@ set -e -sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" +RELTO="$(dirname "${1}")" + +sed \ + -e "s|__TITLE__|$(head -n1 "${1}")|" \ + -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ + < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 1b1dd03a..50653ae6 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,15 +1,6 @@ RouterOS Scripts :: __TITLE__ - + diff --git a/general/style.css b/general/style.css index 66d44f1c..be67afae 100644 --- a/general/style.css +++ b/general/style.css @@ -4,6 +4,28 @@ body { font-family: fira-sans, sans-serif; font-size: 10pt; } +h2 { + border-bottom: 1px solid #ccc; + color: #000; +} +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +blockquote { + border-left: 4px solid #ccc; + padding: 0 10px; + color: #777; +} +code { + margin: 0 2px; + padding: 2px 5px; + border: 1px solid #ccc; + background-color: #f8f8f8; + border-radius: 3px; +} div.notification { position: relative; float: right; @@ -31,6 +53,16 @@ p.hint { pre { font-family: fira-mono, monospace; white-space: pre-wrap; + background-color: #f8f8f8; + border: 1px solid #ccc; + overflow: auto; + padding: 6px 10px; + border-radius: 3px; +} +pre code { + margin: 0; + padding: 0; + border: 0; } span.link { color: #863600; From fae8dbd8ea2c9e5a38634c2db97dcfcb7e3f9693 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 12:51:34 +0100 Subject: [PATCH 878/988] contrib/html: add a margin on left and right... ... for windows in landscape (wider than high). Also make the notification float right for landscape only. --- general/style.css | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index be67afae..a9ede5e2 100644 --- a/general/style.css +++ b/general/style.css @@ -28,7 +28,7 @@ code { } div.notification { position: relative; - float: right; + float: none; width: 600px; border: 3px outset #6c5d53; /* border-radius: 5px; */ @@ -67,3 +67,12 @@ pre code { span.link { color: #863600; } +@media only screen and (orientation: landscape) { + body { + margin-left: 10vw; + margin-right: 10vw; + } + div.notification { + float: right; + } +} From 2d6fdc355e7b5f97fb421c00e5ccc78dd51fbe7a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:30:49 +0100 Subject: [PATCH 879/988] contrib/html: increase default line height --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index a9ede5e2..ad25c7c6 100644 --- a/general/style.css +++ b/general/style.css @@ -3,6 +3,7 @@ body { background-color: transparent; font-family: fira-sans, sans-serif; font-size: 10pt; + line-height: 1.6; } h2 { border-bottom: 1px solid #ccc; From a0399216fcf21797284bd281546ac6b47ef7b037 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:55:00 +0100 Subject: [PATCH 880/988] contrib/html: link the logo with relative path --- contrib/html.sh | 1 + contrib/html.sh.d/head.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index 6a32b5d7..d4a1a904 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -7,6 +7,7 @@ RELTO="$(dirname "${1}")" sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ + -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 50653ae6..779e246c 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -2,5 +2,5 @@ RouterOS Scripts :: __TITLE__ - + From 2e0787afd12178c363aff9346a7f331fe7d1b4e4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:34:00 +0100 Subject: [PATCH 881/988] contrib/html: properly handle anchors --- contrib/html.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index d4a1a904..603e6068 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -11,7 +11,7 @@ sed \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ - -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ + -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' printf '' From cbb282746fc3af91c8c872753a217c912ba307e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:16:04 +0100 Subject: [PATCH 882/988] README: add a sub-section for code hosting --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3c69017a..59c695e7 100644 --- a/README.md +++ b/README.md @@ -408,12 +408,11 @@ Upstream [![upstream](general/qr-code.png)](https://rsc.eworm.de/) -URL: -[GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) +### Code hosting -Mirror: -[eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/) -[GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts) +* [git.eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/) +* [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) +* [GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts) --- [⬆️ Go back to top](#top) From 719b662b76a3ad85455c1113d6f9c57f40f3300e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:57:17 +0100 Subject: [PATCH 883/988] contrib/html: drop ampersand, comma, dash, exclamation mark, ... ... parentesis & tick mark from id/anchor --- contrib/html.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index 603e6068..b1d25115 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -12,6 +12,7 @@ sed \ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ - -e '/| id="\L\1">|' + -e '/| id="\L\1">|' \ + -e '/' From ceb6f2353ea92ddf50ccb6ffa11707e71dc7b61c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 15:19:32 +0100 Subject: [PATCH 884/988] contrib/*: unify html code --- contrib/html.sh.d/head.html | 4 ++-- contrib/logo-color.html | 17 +++++++---------- contrib/notification.html | 17 +++++++---------- doc/mod/notification-telegram.md | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 779e246c..0ce3ff73 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,6 +1,6 @@ -RouterOS Scripts :: __TITLE__ - + +RouterOS Scripts :: __TITLE__ diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 507445bb..eb00492c 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -1,14 +1,12 @@ - - - - -RouterOS-Scripts Logo Color Changer + + +RouterOS Scripts :: Logo Color Changer + - - + -