From a8e091dde75ff79571cc681297ad9359c8ac8e71 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:31:51 +0100 Subject: [PATCH 01/28] global-functions: introduce $ExitOnError This is just like $ExitError, but first parameter is dropped. We will not need it now that we can exit a script with :exit. --- global-functions.rsc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index b81cda3e..4301d171 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -36,6 +36,7 @@ :global EitherOr; :global EscapeForRegEx; :global ExitError; +:global ExitOnError; :global FetchHuge; :global FetchUserAgentStr; :global FileExists; @@ -489,6 +490,19 @@ } } +# simple macro to print error message on unintentional error +:set ExitOnError do={ + :local Name [ :tostr $1 ]; + :local Error [ :tostr $2 ]; + + :global IfThenElse; + :global LogPrint; + + $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ + "Function" "Script" ] . " '" . $Name . "' exited with error" . \ + [ $IfThenElse (!($Error ~ "^(|true|false)\$")) (": " . $Error) "." ]); +} + # fetch huge data to file, read in chunks :set FetchHuge do={ :local ScriptName [ :tostr $1 ]; From 544303489788d3ca75471257e06ce77bcf30ac6d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:35:12 +0100 Subject: [PATCH 02/28] global-functions: make $ExitError a wrapper for $ExitOnError --- global-functions.rsc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4301d171..b9dc633e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -474,19 +474,16 @@ :return $Return; } -# simple macro to print error message on unintentional error +# wrapper for $ExitOnError with additional parameter :set ExitError do={ :local ExitOK [ :tostr $1 ]; :local Name [ :tostr $2 ]; :local Error [ :tostr $3 ]; - :global IfThenElse; - :global LogPrint; + :global ExitOnError; :if ($ExitOK = "false") do={ - $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ - "Function" "Script" ] . " '" . $Name . "' exited with error" . \ - [ $IfThenElse (!($Error ~ "^(|true|false)\$")) (": " . $Error) "." ]); + $ExitOnError $Name $Error; } } From f3d81f7e0d0f90f3c45c254289f9e5d21650f80f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:39:38 +0100 Subject: [PATCH 03/28] global-functions: $ScriptInstallUpdate: use $ExitOnError --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index b9dc633e..4b86aae7 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1527,7 +1527,7 @@ :set GlobalConfigMigration; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # lock script against multiple invocation From d0f2ae00330cc368fcd99d70d4f29a7b661951f3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:40:13 +0100 Subject: [PATCH 04/28] global-functions: $SendNotification: use $ExitOnError --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4b86aae7..5a388e48 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1673,7 +1673,7 @@ $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via NotificationFunctions - expects one array argument From 87b80e05cbc8ff88636b2d62f25670969ff29935 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:40:42 +0100 Subject: [PATCH 05/28] accesslist-duplicates: use $ExitOnError --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index d9017472..56c34731 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -32,5 +32,5 @@ :set ($Seen->$Mac) 1; } } do={ - :global ExitError; $ExitError false [ :jobname ] $Err; + :global ExitOnError; $ExitOnError [ :jobname ] $Err; } diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 614b4da6..37eb7168 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -32,5 +32,5 @@ :set ($Seen->$Mac) 1; } } do={ - :global ExitError; $ExitError false [ :jobname ] $Err; + :global ExitOnError; $ExitOnError [ :jobname ] $Err; } diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index dad9fc63..cf869c05 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -41,5 +41,5 @@ :set ($Seen->$Mac) 1; } } do={ - :global ExitError; $ExitError false [ :jobname ] $Err; + :global ExitOnError; $ExitOnError [ :jobname ] $Err; } diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index c935420f..88c39e59 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -32,5 +32,5 @@ :set ($Seen->$Mac) 1; } } do={ - :global ExitError; $ExitError false [ :jobname ] $Err; + :global ExitOnError; $ExitOnError [ :jobname ] $Err; } From 920785c25b7234cd6fbd8e5ca9b630046f1f8679 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:41:26 +0100 Subject: [PATCH 06/28] mod/bridge-port-to: use $ExitOnError --- 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 b14926bb..c4d0e0a9 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -66,5 +66,5 @@ /interface/ethernet/enable $InterfaceReEnable; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } From 345c8ef6b264264f4e9c39e4a482137c87be465d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:41:38 +0100 Subject: [PATCH 07/28] mod/bridge-port-vlan: use $ExitOnError --- mod/bridge-port-vlan.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 3d9567a9..15e7afa5 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -75,5 +75,5 @@ /interface/ethernet/enable $InterfaceReEnable; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } From c0e802eab9ce7e29292d038055e58d447263de34 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:41:55 +0100 Subject: [PATCH 08/28] mod/inspectvar: use $ExitOnError --- mod/inspectvar.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index d8c0bc79..cc745b1a 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -17,7 +17,7 @@ :put [ :tocrlf [ $InspectVarReturn $1 ] ]; } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # inspect variable and return formatted string From 2366122a36a831208faafe7c82911ee00b6b3347 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:42:20 +0100 Subject: [PATCH 09/28] mod/ipcalc: use $ExitOnError --- mod/ipcalc.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index a485468e..2a6fd1b5 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -28,7 +28,7 @@ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # calculate and return netmask, network, min host, max host and broadcast From d4624689ae2fb5a603ea49c19983e1e768b50e98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:42:31 +0100 Subject: [PATCH 10/28] mod/notification-email: use $ExitOnError --- 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 1ca76f62..832174e0 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -146,7 +146,7 @@ /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ comment="Waiting for retry..." $Scheduler; } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # generate filter for log-forward @@ -274,7 +274,7 @@ $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via e-mail - expects one array argument From ddf7a015c59733f6546a51afbae437be861e9827 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:42:42 +0100 Subject: [PATCH 11/28] mod/notification-gotify: use $ExitOnError --- mod/notification-gotify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index 677d993c..e919cf42 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -54,7 +54,7 @@ :set GotifyQueue; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via Gotify - expects one array argument @@ -126,7 +126,7 @@ $SendGotify2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via Gotify - expects one array argument From 005b80b4c527e322c6c423b892ebc648b5328f25 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:19:20 +0100 Subject: [PATCH 12/28] global-functions: introduce $CommitBrief --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5a388e48..17d2b25c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -30,6 +30,7 @@ :global CharacterReplace; :global CleanFilePath; :global CleanName; +:global CommitBrief; :global DeviceInfo; :global Dos2Unix; :global DownloadPackage; @@ -320,6 +321,18 @@ :return $Return; } +# return a brief commit description +:set CommitBrief do={ + :global CommitId; + :global CommitInfo; + + :if ($CommitId = "unknown") do={ + :return "unknown"; + } + + :return ($CommitInfo . "/" . [ :pick $CommitId 0 8 ]); +} + # get readable device info :set DeviceInfo do={ :global CommitId; From 6dd37e45d6c4316bdee8cb2aa5660fc411253db7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:42:52 +0100 Subject: [PATCH 13/28] mod/notification-matrix: use $ExitOnError --- 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 b78b1132..0dacf836 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -59,7 +59,7 @@ :set MatrixQueue; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via Matrix - expects one array argument @@ -172,7 +172,7 @@ $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via Matrix - expects one array argument From c81967f63a8df83a5a0b0e1afd274bbc31a12aed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:20:58 +0100 Subject: [PATCH 14/28] global-functions: $DeviceInfo: use $CommitBrief --- global-functions.rsc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 17d2b25c..3634c74a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -335,11 +335,10 @@ # get readable device info :set DeviceInfo do={ - :global CommitId; - :global CommitInfo; :global ExpectedConfigVersion; :global Identity; + :global CommitBrief; :global IfThenElse; :global FormatLine; @@ -380,8 +379,7 @@ $RouterBoard->"current-firmware" != $RouterBoard->"upgrade-firmware") \ ([ $FormatLine " Firmware" ($RouterBoard->"current-firmware") ] . "\n") ] . \ "RouterOS-Scripts:\n" . \ - [ $IfThenElse ($CommitId != "unknown") \ - ([ $FormatLine " Commit" ($CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . "\n") ] . \ + [ $FormatLine " Commit" [ $CommitBrief ] ] . "\n" . \ [ $FormatLine " Version" $ExpectedConfigVersion ]); } From 969658da1654dd72b35967995a685b12bceb44e0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:43:00 +0100 Subject: [PATCH 15/28] mod/notification-ntfy: use $ExitOnError --- 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 ac1792d4..cc48e748 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -53,7 +53,7 @@ :set NtfyQueue; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via ntfy - expects one array argument @@ -148,7 +148,7 @@ $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via ntfy - expects one array argument From 7f888b197e83280651582ebcb1cd878631d17aae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:23:17 +0100 Subject: [PATCH 16/28] global-functions: $FetchUserAgentStr: user $CommitBrief --- global-functions.rsc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3634c74a..14605d39 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -572,16 +572,13 @@ :set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; - :global CommitId; - :global CommitInfo; - + :global CommitBrief; :global IfThenElse; :local Resource [ /system/resource/get ]; :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . $Resource->"architecture-name" . \ - " " . $Caller . "/Fetch (https://rsc.eworm.de/" . [ $IfThenElse ($CommitId != "unknown") \ - ("; " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . ")"); + " " . $Caller . "/Fetch (https://rsc.eworm.de/; " . [ $CommitBrief ] . ")"); } # check for existence of file, optionally with type From 5f8f5e22a720f177d043c8ece0eb9ab8de236438 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:43:10 +0100 Subject: [PATCH 17/28] mod/notification-telegram: use $ExitOnError --- 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 9e9ae57e..f75d2fc4 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -62,7 +62,7 @@ :set TelegramQueue; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # get the chat id @@ -101,7 +101,7 @@ $LogPrint info $0 ("The thread id is: " . ($Message->"message_thread_id")); } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via telegram - expects one array argument @@ -237,7 +237,7 @@ $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # send notification via telegram - expects one array argument From 8b3fae745d37d7e1c0977b2d13989e051cf4a10e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 21 Jan 2026 06:52:03 +0100 Subject: [PATCH 18/28] global-functions: $NetMask6: drop unused variable --- global-functions.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 5f84c286..7601d9d2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1024,7 +1024,6 @@ # return an IPv6 netmask for CIDR :set NetMask6 do={ - :local FuncName $0; :local CIDR [ :tostr $1 ]; :global IfThenElse; From 03010ad9d95ae4859a5488fe09e1c8dc77b263ad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:27:06 +0100 Subject: [PATCH 19/28] global-functions: $ScriptInstallUpdate: use $CommitBrief --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 14605d39..be6e4039 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1259,7 +1259,6 @@ :local NewComment [ :tostr $2 ]; :global CommitId; - :global CommitInfo; :global ExpectedConfigVersion; :global GlobalConfigReady; :global GlobalFunctionsReady; @@ -1271,6 +1270,7 @@ :global ScriptUpdatesUrlSuffix; :global CertificateAvailable; + :global CommitBrief; :global EitherOr; :global FetchUserAgentStr; :global Grep; @@ -1435,8 +1435,8 @@ } } - :if ($CommitId != "unknown" && $CommitIdBefore != $CommitId) do={ - $LogPrint info $0 ("Updated to commit: " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]); + :if ($CommitIdBefore != $CommitId) do={ + $LogPrint info $0 ("Updated to commit: " . [ $CommitBrief ]); } :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ From b7df0d393a58065d1f744b1cbdb04dfc10d96ba6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:43:29 +0100 Subject: [PATCH 20/28] mod/scriptrunonce: use $ExitOnError --- mod/scriptrunonce.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 598c7602..39067d95 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -52,5 +52,5 @@ :return true; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } From ad8299824c9893975a38a5c98715ec825fd4cda4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 16:19:54 +0100 Subject: [PATCH 21/28] global-functions: make the scheduler fix a block --- global-functions.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 7601d9d2..2747d600 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1920,12 +1920,14 @@ } # 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; +/system/scheduler { + :local OnEvent "/system/script { run global-config; run global-functions; }"; + :if ([ :len [ find where name="global-scripts" ] ] = 0) do={ + add name="global-scripts" start-time=startup; + } + :if ([ get "global-scripts" on-event ] != $OnEvent) do={ + set "global-scripts" on-event=$OnEvent; + } } # Log success From 4fe77ef23800959c918748d1b3a4db7eaeea2c2a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:35:57 +0100 Subject: [PATCH 22/28] global-functions: give commit info when laoding --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index be6e4039..710b755c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1950,8 +1950,9 @@ # Log success :local Resource [ /system/resource/get ]; -$LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \ - " with RouterOS " . $Resource->"version" . "."); +$LogPrintOnce info $ScriptName ("Loaded " . \ + [ $IfThenElse ($CommitId != "unknown") ([ $CommitBrief ] . " ") ] . \ + "on " . $Resource->"board-name" . " with RouterOS " . $Resource->"version" . "."); # signal we are ready :set GlobalFunctionsReady true; From 80746d4dad3ad8fc7553afa71acd47b55609e503 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:43:40 +0100 Subject: [PATCH 23/28] mod/ssh-keys-import: use $ExitOnError --- 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 16a02859..1bb283d4 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -68,7 +68,7 @@ :return false; } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } # import keys from a file @@ -110,5 +110,5 @@ } } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } From 86bf200bb5cb652f59184d2cd8c4d65145a387d9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 15:34:05 +0100 Subject: [PATCH 24/28] global-functions: simplify the scheduler fix --- global-functions.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2747d600..ae1d6b31 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1925,9 +1925,7 @@ :if ([ :len [ find where name="global-scripts" ] ] = 0) do={ add name="global-scripts" start-time=startup; } - :if ([ get "global-scripts" on-event ] != $OnEvent) do={ - set "global-scripts" on-event=$OnEvent; - } + set on-event=$OnEvent [ find where name="global-scripts" on-event!=$OnEvent ]; } # Log success From c76c9591d5b2405e9f688228d2dc1d1a2998c57c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 11:41:18 +0100 Subject: [PATCH 25/28] global-functions: $ScriptInstallUpdate: drop output on commit... ... now that we have it on loading global functions. --- global-functions.rsc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 710b755c..1d5f55c3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1270,7 +1270,6 @@ :global ScriptUpdatesUrlSuffix; :global CertificateAvailable; - :global CommitBrief; :global EitherOr; :global FetchUserAgentStr; :global Grep; @@ -1435,10 +1434,6 @@ } } - :if ($CommitIdBefore != $CommitId) do={ - $LogPrint info $0 ("Updated to commit: " . [ $CommitBrief ]); - } - :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ $LogPrint warning $0 ("The configuration version decreased from " . \ $ExpectedConfigVersionBefore . " to " . $ExpectedConfigVersion . \ From 3baf0bd060e85274f324af83ff05610cb0d5d729 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 10:44:03 +0100 Subject: [PATCH 26/28] mode-button: use $ExitOnError --- mode-button.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index b5c89c7a..6dc1e43e 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -82,7 +82,7 @@ $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } } do={ - :global ExitError; $ExitError false $0 $Err; + :global ExitOnError; $ExitOnError $0 $Err; } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; @@ -91,5 +91,5 @@ /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } } do={ - :global ExitError; $ExitError false [ :jobname ] $Err; + :global ExitOnError; $ExitOnError [ :jobname ] $Err; } From 0db4306795e3010f40224a972b7bb5acb5df813e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 16:18:07 +0100 Subject: [PATCH 27/28] global-functions: enable scheduler if disabled --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index ae1d6b31..b81cda3e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1926,6 +1926,7 @@ add name="global-scripts" start-time=startup; } set on-event=$OnEvent [ find where name="global-scripts" on-event!=$OnEvent ]; + enable [ find where name="global-scripts" disabled ]; } # Log success From 3b98e676c511fac5385e6a2b1cacd2d2b96f5158 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 20 Jan 2026 15:52:41 +0100 Subject: [PATCH 28/28] README: update screenshots --- README.d/05-run-scripts.avif | Bin 2388 -> 2572 bytes README.d/09-update-scripts.avif | Bin 2641 -> 2865 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/05-run-scripts.avif b/README.d/05-run-scripts.avif index 12d812c0cfd1c9fcc1ce63d5c8ff1d0ce8fedbbe..f8ccf5bd6cb30b24c11371845a8822851c87bb20 100644 GIT binary patch delta 2317 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 diff --git a/README.d/09-update-scripts.avif b/README.d/09-update-scripts.avif index e713ac2c48e8902e88b1309c660128a9d47032f5..39ff98e846fe8fd313aebf26bb950fd54280e2be 100644 GIT binary patch delta 2255 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 Lj_m#T@-JaXthn8D