From 1cac1c1b059a2a1fc6e4f6d37d7b6c499baf1e69 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:54:25 +0200 Subject: [PATCH 01/99] global-config: RouterOS v7 path syntax --- global-config | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global-config b/global-config index ea5176e..933ec2e 100644 --- a/global-config +++ b/global-config @@ -128,10 +128,10 @@ # Run different commands with multiple mode-button presses. :global ModeButton { - 1="/ system script run leds-toggle-mode;"; + 1="/system/script/run leds-toggle-mode;"; 2=":global SendNotification; :global Identity; \$SendNotification (\"Hello...\") (\"Hello world, \" . \$Identity . \" calling!\");"; - 3="/ system shutdown;"; - 4="/ system reboot;"; + 3="/system/shutdown;"; + 4="/system/reboot;"; 5=":global BridgePortVlan; \$BridgePortVlan alt;"; # add more here... }; @@ -141,8 +141,8 @@ # Run commands on SMS action. :global SmsAction { bridge-port-vlan-alt=":global BridgePortVlan; \$BridgePortVlan alt;"; - reboot="/ system reboot;"; - shutdown="/ system shutdown;"; + reboot="/system/reboot;"; + shutdown="/system/shutdown;"; # add more here... }; @@ -194,7 +194,7 @@ # load custom settings from overlay # Warning: Do *NOT* copy this code to overlay! :do { - / system script run global-config-overlay; + /system/script/run global-config-overlay; } on-error={ :log error ("Loading configuration from overlay failed!"); } From b996f00dd5f92493b211b59ae2a0db32a918c8b6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:58:02 +0200 Subject: [PATCH 02/99] global-config.changes: RouterOS v7 path syntax --- global-config.changes | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/global-config.changes b/global-config.changes index 7183619..0ee4eba 100644 --- a/global-config.changes +++ b/global-config.changes @@ -24,7 +24,7 @@ 15="New documentation is online! https://git.eworm.de/cgit/routeros-scripts/about/#available-scripts"; 16="Happy with RouterOS Scripts and have a GitHub and/or GitLab account? Please star!"; 17="Introduced script 'early-errors'"; - 18=("Added a simple IP calculation function, try: \$IPCalc " . [ / ip address get ([ find ]->0) address ]); + 18=("Added a simple IP calculation function, try: \$IPCalc " . [ /ip/address/get ([ find ]->0) address ]); 19="Commenting scripts with 'ignore', 'base-url=...' and 'url-suffix=...' is honored on update"; 20="Added support for hooks to 'netwatch-notify'"; 21="Added support for installing patch updates automatically by 'check-routeros-update'"; @@ -93,11 +93,11 @@ # Migration steps to be applied on script updates :global GlobalConfigMigration { 41=":global SendNotification; \$SendNotification (\"Migration mechanism\") (\"Congratulations!\nSuccessfully tested the new migration mechanism.\");"; - 47="/ certificate remove [ find where fingerprint=\"731d3d9cfaa061487a1d71445a42f67df0afca2a6c2d2f98ff7b3ce112b1f568\" or fingerprint=\"25847d668eb4f04fdd40b12b6b0740c567da7d024308eb6c2c96fe41d9de218d\" ];"; - 52=":global CertificateDownload; :if ([ :len [ / certificate find where fingerprint=\"67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd\" or fingerprint=\"96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6\" ] ] < 2) do={ \$CertificateDownload \"R3\"; }; / certificate remove [ find where fingerprint=\"0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739\" ];"; + 47="/certificate/remove [ find where fingerprint=\"731d3d9cfaa061487a1d71445a42f67df0afca2a6c2d2f98ff7b3ce112b1f568\" or fingerprint=\"25847d668eb4f04fdd40b12b6b0740c567da7d024308eb6c2c96fe41d9de218d\" ];"; + 52=":global CertificateDownload; :if ([ :len [ /certificate/find where fingerprint=\"67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd\" or fingerprint=\"96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6\" ] ] < 2) do={ \$CertificateDownload \"R3\"; }; /certificate/remove [ find where fingerprint=\"0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739\" ];"; 54=":global ScriptInstallUpdate; :global TelegramTokenId; :global TelegramChatId; :if ([ :len \$TelegramTokenId ] > 0 && [ :len \$TelegramChatId ] > 0) do={ \$ScriptInstallUpdate mod/notification-telegram; }"; - 61="/ system script remove [ find where name~\"^(early-errors|mode-button-(event|scheduler)|script-updates)\\\$\" source~\"^#!rsc by RouterOS\\n\" ];"; - 66=":global ScriptInstallUpdate; :if ([ :len [ / system script find where name=\"bridge-port-to-default\" ] ] > 0) do={ / system script remove [ find where name~\"^bridge-port-to(-default|ggle)\\\$\" ]; \$ScriptInstallUpdate mod/bridge-port-to; }"; - 67=":global ScriptInstallUpdate; :global CharacterReplace; :foreach Script in=[ / system script find where name~\"^global-functions.d/\" ] do={ / system script set name=[ \$CharacterReplace [ / system script get \$Script name ] \"global-functions.d/\" \"mod/\" ] \$Script; }; \$ScriptInstallUpdate;"; - 73=":global ScriptInstallUpdate; :global CharacterReplace; :foreach Old,New in={ \"cloud-backup\"=\"backup-cloud\"; \"email-backup\"=\"backup-email\"; \"upload-backup\"=\"backup-upload\" } do={ / system script set name=\$New [ find where name=\$Old ]; :foreach Scheduler in=[ / system scheduler find where on-event~\$Old ] do={ / system scheduler set \$Scheduler name=[ \$CharacterReplace [ get \$Scheduler name ] \$Old \$New ] on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Old \$New ]; }; }; \$ScriptInstallUpdate;"; + 61="/system/script/remove [ find where name~\"^(early-errors|mode-button-(event|scheduler)|script-updates)\\\$\" source~\"^#!rsc by RouterOS\\n\" ];"; + 66=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"bridge-port-to-default\" ] ] > 0) do={ /system/script/remove [ find where name~\"^bridge-port-to(-default|ggle)\\\$\" ]; \$ScriptInstallUpdate mod/bridge-port-to; }"; + 67=":global ScriptInstallUpdate; :global CharacterReplace; :foreach Script in=[ /system/script/find where name~\"^global-functions.d/\" ] do={ /system/script/set name=[ \$CharacterReplace [ /system/script/get \$Script name ] \"global-functions.d/\" \"mod/\" ] \$Script; }; \$ScriptInstallUpdate;"; + 73=":global ScriptInstallUpdate; :global CharacterReplace; :foreach Old,New in={ \"cloud-backup\"=\"backup-cloud\"; \"email-backup\"=\"backup-email\"; \"upload-backup\"=\"backup-upload\" } do={ /system/script/set name=\$New [ find where name=\$Old ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~\$Old ] do={ /system/scheduler/set \$Scheduler name=[ \$CharacterReplace [ get \$Scheduler name ] \$Old \$New ] on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Old \$New ]; }; }; \$ScriptInstallUpdate;"; }; From 0ccebc39c75672117b3f9e59fa1db97f6468b012 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:07:11 +0200 Subject: [PATCH 03/99] global-functions: RouterOS v7 path syntax --- global-functions | 161 +++++++++++++++++++++++------------------------ 1 file changed, 78 insertions(+), 83 deletions(-) diff --git a/global-functions b/global-functions index 0feeb1d..a12eb5d 100644 --- a/global-functions +++ b/global-functions @@ -14,7 +14,7 @@ # global variables not to be changed by user :global GlobalFunctionsReady false; -:global Identity [ / system identity get name ]; +:global Identity [ /system/identity/get name ]; # global functions :global CertificateAvailable; @@ -69,30 +69,30 @@ :global LogPrintExit2; :global ParseKeyValueStore; - :if ([ / system resource get free-hdd-space ] < 8388608 && \ - [ / certificate settings get crl-download ] = true && \ - [ / certificate settings get crl-store ] = "system") do={ + :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; } - :if ([ :len [ / certificate find where common-name=$CommonName ] ] = 0) do={ + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ $LogPrintExit2 info $0 ("Certificate with CommonName \"" . $CommonName . "\" not available.") false; :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } } - :local CertVal [ / certificate get [ find where common-name=$CommonName ] ]; + :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={ + :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; :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } } - :set CertVal [ / certificate get [ find where skid=($CertVal->"akid") ] ]; + :set CertVal [ /certificate/get [ find where skid=($CertVal->"akid") ] ]; } :return true; } @@ -114,16 +114,16 @@ :do { :local LocalFileName ($CommonName . ".pem"); :local UrlFileName ([ $UrlEncode $CommonName ] . ".pem"); - / tool fetch check-certificate=yes-without-crl \ + /tool/fetch check-certificate=yes-without-crl \ ($ScriptUpdatesBaseUrl . "certs/" . \ $UrlFileName . $ScriptUpdatesUrlSuffix) \ dst-path=$LocalFileName as-value; $WaitForFile $LocalFileName; - / certificate import file-name=$LocalFileName passphrase="" as-value; - / file remove $LocalFileName; + /certificate/import file-name=$LocalFileName passphrase="" as-value; + /file/remove $LocalFileName; - :foreach Cert in=[ / certificate find where name~("^" . $LocalFileName . "_[0-9]+\$") ] do={ - $CertificateNameByCN [ / certificate get $Cert common-name ]; + :foreach Cert in=[ /certificate/find where name~("^" . $LocalFileName . "_[0-9]+\$") ] do={ + $CertificateNameByCN [ /certificate/get $Cert common-name ]; } } on-error={ $LogPrintExit2 warning $0 ("Failed importing certificate with " . \ @@ -139,8 +139,8 @@ :global CharacterReplace; - :local Cert [ / certificate find where common-name=$CommonName ]; - / certificate set $Cert \ + :local Cert [ /certificate/find where common-name=$CommonName ]; + /certificate/set $Cert \ name=[ $CharacterReplace [ $CharacterReplace [ $CharacterReplace $CommonName "'" "-" ] " " "-" ] "---" "-" ]; } @@ -185,7 +185,7 @@ # default route is reachable :set DefaultRouteIsReachable do={ - :if ([ :len [ / ip route find where dst-address=0.0.0.0/0 active routing-table=main ] ] > 0) do={ + :if ([ :len [ /ip/route/find where dst-address=0.0.0.0/0 active routing-table=main ] ] > 0) do={ :return true; } :return false; @@ -199,13 +199,13 @@ :global IfThenElse; - :local Resource [ / system resource get ]; + :local Resource [ /system/resource/get ]; :local RouterBoard; :do { - :set RouterBoard [ / system routerboard get ]; + :set RouterBoard [[ :parse "/system/routerboard/get" ]]; } on-error={ } - :local License [ / system license get ]; - :local Update [ / system package update get ]; + :local License [ /system/license/get ]; + :local Update [ /system/package/update/get ]; :return ( \ "Hostname: " . $Identity . \ @@ -259,8 +259,8 @@ :global WaitForFile; :if ([ :len $PkgName ] = 0) do={ :return false; } - :if ([ :len $PkgVer ] = 0) do={ :set PkgVer [ / system package update get installed-version ]; } - :if ([ :len $PkgArch ] = 0) do={ :set PkgArch [ / system resource get architecture-name ]; } + :if ([ :len $PkgVer ] = 0) do={ :set PkgVer [ /system/package/update/get installed-version ]; } + :if ([ :len $PkgArch ] = 0) do={ :set PkgArch [ /system/resource/get architecture-name ]; } :if ($PkgName = "system") do={ :set PkgName "routeros"; } @@ -273,7 +273,7 @@ :return false; } - :if ([ :len [ / file find where name=$PkgDest type="package" ] ] > 0) do={ + :if ([ :len [ /file/find where name=$PkgDest type="package" ] ] > 0) do={ $LogPrintExit2 info $0 ("Package file " . $PkgName . " already exists.") false; :return true; } @@ -288,17 +288,17 @@ :local Retry 3; :while ($Retry > 0) do={ :do { - / tool fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; $WaitForFile $PkgDest; - :if ([ / file get [ find where name=$PkgDest ] type ] = "package") do={ + :if ([ /file/get [ find where name=$PkgDest ] type ] = "package") do={ :return true; } } on-error={ $LogPrintExit2 debug $0 ("Downloading package file failed.") false; } - / file remove [ find where name=$PkgDest ]; + /file/remove [ find where name=$PkgDest ]; :set Retry ($Retry - 1); } @@ -348,28 +348,28 @@ :local AllDone true; :local QueueLen [ :len $EmailQueue ]; - :if ([ :len [ / system scheduler find where name="FlushEmailQueue" ] ] > 0 && $QueueLen = 0) do={ + :if ([ :len [ /system/scheduler/find where name="FlushEmailQueue" ] ] > 0 && $QueueLen = 0) do={ $LogPrintExit2 warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty.") false; } - / system scheduler set interval=($QueueLen . "m") [ find where name="FlushEmailQueue" ]; + /system/scheduler/set interval=($QueueLen . "m") [ find where name="FlushEmailQueue" ]; :foreach Id,Message in=$EmailQueue do={ :if ([ :typeof $Message ] = "array" ) do={ :local Attach [ $EitherOr ($Message->"attach") "" ]; - :while ([ / tool e-mail get last-status ] = "in-progress") do={ :delay 1s; } - / tool e-mail send to=($Message->"to") cc=($Message->"cc") subject=($Message->"subject") \ + :while ([ /tool/e-mail/get last-status ] = "in-progress") do={ :delay 1s; } + /tool/e-mail/send 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 ]; + :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=[ :toarray $Attach ] do={ - / file remove $File; + /file/remove $File; } } } @@ -382,10 +382,10 @@ } :if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={ - / system scheduler remove [ find where name="FlushEmailQueue" ]; + /system/scheduler/remove [ find where name="FlushEmailQueue" ]; :set EmailQueue; } else={ - / system scheduler set interval=1m [ find where name="FlushEmailQueue" ]; + /system/scheduler/set interval=1m [ find where name="FlushEmailQueue" ]; } } @@ -400,12 +400,12 @@ :if ([ $CertificateAvailable "Cloudflare Inc ECC CA-3" ] = false) do={ $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; } - :local Vendor ([ / tool fetch check-certificate=yes-without-crl \ + :local Vendor ([ /tool/fetch check-certificate=yes-without-crl \ ("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data"); :return $Vendor; } on-error={ :do { - / tool fetch check-certificate=yes-without-crl ("https://api.macvendors.com/") \ + /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; } on-error={ @@ -417,7 +417,7 @@ # generate random 20 chars hex (0-9 and a-f) :set GetRandom20CharHex do={ - :return ([ / certificate scep-server otp generate minutes-valid=0 as-value ]->"password"); + :return ([ /certificate/scep-server/otp/generate minutes-valid=0 as-value ]->"password"); } # generate random number @@ -515,20 +515,20 @@ :return true; } - :if ([ :len [ / file find where name=$Dir type="directory" ] ] = 1) do={ + :if ([ :len [ /file/find where name=$Dir type="directory" ] ] = 1) do={ :return true; } :local Return true; :local Name ($Dir . "-" . [ $GetRandom20CharHex ]); :do { - / ip smb share add disabled=yes directory=$Dir name=$Name; + /ip/smb/share/add disabled=yes directory=$Dir name=$Name; $WaitForFile $Dir; } on-error={ $LogPrintExit2 warning $0 ("Making directory '" . $Dir . "' failed!") false; :set Return false; } - / ip smb share remove [ find where name=$Name ]; + /ip/smb/share/remove [ find where name=$Name ]; :return $Return; } @@ -555,7 +555,7 @@ :local To [ $EitherOr ($EmailGeneralToOverride->($Notification->"origin")) $EmailGeneralTo ]; :local Cc [ $EitherOr ($EmailGeneralCcOverride->($Notification->"origin")) $EmailGeneralCc ]; - :local EMailSettings [ / tool e-mail get ]; + :local EMailSettings [ /tool/e-mail/get ]; :if ([ :len $To ] = 0 || ($EMailSettings->"address") = "0.0.0.0" || ($EMailSettings->"from") = "<>") do={ :return false; } @@ -563,7 +563,7 @@ :if ([ :typeof $EmailQueue ] = "nothing") do={ :set EmailQueue [ :toarray "" ]; } - :local Signature [ / system note get note ]; + :local Signature [ /system/note/get note ]; :set ($EmailQueue->[ :len $EmailQueue ]) { to=$To; cc=$Cc; subject=[ $QuotedPrintable ("[" . $Identity . "] " . ($Notification->"subject")) ]; @@ -571,8 +571,8 @@ [ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n\n" . ($Notification->"link")) "" ] . \ [ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]); \ 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 \ + :if ([ :len [ /system/scheduler/find where name="FlushEmailQueue" ] ] = 0) do={ + /system/scheduler/add name=FlushEmailQueue interval=1s start-time=startup \ on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); } } @@ -653,7 +653,7 @@ :global IfThenElse; :global LogPrintExit2; :global VersionToNum; - :if ([ $VersionToNum $Required ] > [ $VersionToNum [ / system package update get installed-version ] ]) do={ + :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; @@ -669,10 +669,10 @@ :global LogPrintExit2; - :foreach Job in=[ / system script job find where script=$Script ] do={ - :set Job [ / system script job get $Job ]; + :foreach Job in=[ /system/script/job/find where script=$Script ] do={ + :set Job [ /system/script/job/get $Job ]; :while ([ :typeof ($Job->"parent") ] = "id") do={ - :set Job [ / system script job get [ find where .id=($Job->"parent") ] ]; + :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; @@ -712,9 +712,9 @@ } :foreach Script in=$Scripts do={ - :if ([ :len [ / system script find where name=$Script ] ] = 0) do={ + :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ $LogPrintExit2 info $0 ("Adding new script: " . $Script) false; - / system script add name=$Script owner=$Script source="#!rsc by RouterOS\n" comment=$NewComment; + /system/script/add name=$Script owner=$Script source="#!rsc by RouterOS\n" comment=$NewComment; } } @@ -722,17 +722,17 @@ :local ReloadGlobalFunctions false; :local ReloadGlobalConfig false; - :foreach Script in=[ / system script find where source~"^#!rsc by RouterOS\n" ] do={ - :local ScriptVal [ / system script get $Script ]; - :local ScriptFile [ / file find where name=("script-updates/" . $ScriptVal->"name") ]; + :foreach Script in=[ /system/script/find where source~"^#!rsc by RouterOS\n" ] do={ + :local ScriptVal [ /system/script/get $Script ]; + :local ScriptFile [ /file/find where name=("script-updates/" . $ScriptVal->"name") ]; :local SourceNew; :if ([ :len $ScriptFile ] > 0) do={ - :set SourceNew [ / file get $ScriptFile content ]; - / file remove $ScriptFile; + :set SourceNew [ /file/get $ScriptFile content ]; + /file/remove $ScriptFile; } - :foreach Scheduler in=[ / system scheduler find where on-event~("\\b" . $ScriptVal->"name" . "\\b") ] do={ - :local SchedulerVal [ / system scheduler get $Scheduler ]; + :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; @@ -750,7 +750,7 @@ :local Url ($BaseUrl . $ScriptVal->"name" . $UrlSuffix); $LogPrintExit2 debug $0 ("Fetching script '" . $ScriptVal->"name" . "' from url: " . $Url) false; - :local Result [ / tool fetch check-certificate=yes-without-crl $Url output=user as-value ]; + :local Result [ /tool/fetch check-certificate=yes-without-crl $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set SourceNew ($Result->"data"); } @@ -767,7 +767,7 @@ :local DontRequirePermissions \ ($SourceNew~"\n# requires: dont-require-permissions=yes\n"); $LogPrintExit2 info $0 ("Updating script: " . $ScriptVal->"name") false; - / system script set owner=($ScriptVal->"name") source=$SourceNew \ + /system/script/set owner=($ScriptVal->"name") source=$SourceNew \ dont-require-permissions=$DontRequirePermissions $Script; :if ($ScriptVal->"name" = "global-config") do={ :set ReloadGlobalConfig true; @@ -794,7 +794,7 @@ :if ($ReloadGlobalFunctions = true) do={ $LogPrintExit2 info $0 ("Reloading global functions.") false; :do { - / system script run global-functions; + /system/script/run global-functions; } on-error={ $LogPrintExit2 error $0 ("Reloading global functions failed!") false; } @@ -803,7 +803,7 @@ :if ($ReloadGlobalConfig = true) do={ $LogPrintExit2 info $0 ("Reloading global configuration.") false; :do { - / system script run global-config; + /system/script/run global-config; } on-error={ $LogPrintExit2 error $0 ("Reloading global configuration failed!" . \ " Syntax error or missing overlay\?") false; @@ -818,7 +818,7 @@ :do { :local Url ($ScriptUpdatesBaseUrl . "global-config.changes" . $ScriptUpdatesUrlSuffix); $LogPrintExit2 debug $0 ("Fetching news, changes and migration: " . $Url) false; - :local Result [ / tool fetch check-certificate=yes-without-crl $Url output=user as-value ]; + :local Result [ /tool/fetch check-certificate=yes-without-crl $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ :set ChangeLogCode ($Result->"data"); } @@ -918,7 +918,7 @@ :local JobCount do={ :local Script [ :tostr $1 ]; - :return [ :len [ / system script job find where script=$Script ] ]; + :return [ :len [ /system/script/job/find where script=$Script ] ]; } :local TicketCount do={ @@ -990,7 +990,7 @@ :set ($ScriptLockOrder->$Script) [ :toarray "" ]; } - :if ([ :len [ / system script find where name=$Script ] ] = 0) do={ + :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ $LogPrintExit2 error $0 ("A script named '" . $Script . "' does not exist!") true; } @@ -1001,7 +1001,7 @@ :if ([ $TicketCount $Script ] >= [ $JobCount $Script ]) do={ $LogPrintExit2 error $0 ("More tickets than running scripts '" . $Script . "', resetting!") false; :set ($ScriptLockOrder->$Script) [ :toarray "" ]; - / system script job remove [ find where script=$Script ]; + /system/script/job/remove [ find where script=$Script ]; } :local MyTicket [ $GetRandom20CharHex ]; @@ -1107,21 +1107,21 @@ :set TimeIsSync do={ :global LogPrintExit2; - :if ([ / system ntp client get enabled ] = true) do={ + :if ([ /system/ntp/client/get enabled ] = true) do={ :do { - :if ([ / system ntp client get status ] = "synchronized") do={ + :if ([ /system/ntp/client/get status ] = "synchronized") do={ :return true; } } on-error={ - :if ([ :typeof [ / system ntp client get last-adjustment ] ] = "time") do={ + :if ([ :typeof [ /system/ntp/client/get last-adjustment ] ] = "time") do={ :return true; } } :return false; } - :if ([ / ip cloud get ddns-enabled ] = true && [ / ip cloud get update-time ] = true) do={ - :if ([ :typeof [ / ip cloud get public-address ] ] = "ip") do={ + :if ([ /ip/cloud/get ddns-enabled ] = true && [ /ip/cloud/get update-time ] = true) do={ + :if ([ :typeof [ /ip/cloud/get public-address ] ] = "ip") do={ :return true; } :return false; @@ -1226,7 +1226,7 @@ :set FileName [ $CleanFilePath $FileName ]; :local I 0; - :while ([ :len [ / file find where name=$FileName ] ] = 0) do={ + :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ :if ($I > 20) do={ :return false; } @@ -1253,10 +1253,10 @@ :global TimeIsSync; :while ([ $TimeIsSync ] = false) do={ - :if ([ :len [ / system script find where name="rotate-ntp" ] ] > 0 && \ - ([ / system resource get uptime ] % (180 * 1000000000)) = 0s) do={ + :if ([ :len [ /system/script/find where name="rotate-ntp" ] ] > 0 && \ + ([ /system/resource/get uptime ] % (180 * 1000000000)) = 0s) do={ :do { - / system script run rotate-ntp; + /system/script/run rotate-ntp; } on-error={ $LogPrintExit2 debug $0 ("Running rotate-ntp failed.") false; } @@ -1266,11 +1266,11 @@ } # load modules -:foreach Script in=[ / system script find where name ~ "^mod/." ] do={ - :local ScriptVal [ / system script get $Script ]; +:foreach Script in=[ /system/script/find where name ~ "^mod/." ] do={ + :local ScriptVal [ /system/script/get $Script ]; :if ([ $ValidateSyntax ($ScriptVal->"source") ] = true) do={ :do { - / system script run $Script; + /system/script/run $Script; } on-error={ $LogPrintExit2 error $0 ("Module '" . $ScriptVal->"name" . "' failed to run.") false; } @@ -1280,12 +1280,7 @@ } # check for required RouterOS version -:if ([ $RequiredRouterOS $0 "7.0" false ] = true) do={ - $RequiredRouterOS $0 "7.1" true; -} else={ - $LogPrintExit2 warning $0 ("Still running RouterOS v6, please switch to branch " . \ - "'routeros-v6', see https://git.eworm.de/cgit/routeros-scripts/about/#changes-for-routeros-v6") false; -} +$RequiredRouterOS $0 "7.1" true; # signal we are ready :set GlobalFunctionsReady true; From d98d69a8c932c0c0bbc56efb27063d47c290761b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:27:53 +0200 Subject: [PATCH 04/99] Makefile: RouterOS v7 path syntax --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9f21255..930c1ae 100644 --- a/Makefile +++ b/Makefile @@ -15,11 +15,11 @@ all: $(CAPSMAN) $(LOCAL) $(HTML) markdown $< | sed 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' > $@ %.local: %.template Makefile - sed -e '/\/ caps-man/d' -e 's|%PATH%|interface wireless|' -e 's|%TEMPL%|$(suffix $@)|' \ + sed -e '/\/caps-man/d' -e 's|%PATH%|interface\/wireless|' -e 's|%TEMPL%|$(suffix $@)|' \ -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ %.capsman: %.template Makefile - sed -e '/\/ interface wireless/d' -e 's/%PATH%/caps-man/' -e 's/%TEMPL%/$(suffix $@)/' \ + sed -e '/\/interface\/wireless/d' -e 's/%PATH%/caps-man/' -e 's/%TEMPL%/$(suffix $@)/' \ -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ From ab410466dcb9198455978146cbcdf0a3eb85c7ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:28:18 +0200 Subject: [PATCH 05/99] accesslist-duplicates: RouterOS v7 path syntax --- accesslist-duplicates.capsman | 8 ++++---- accesslist-duplicates.local | 8 ++++---- accesslist-duplicates.template | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman b/accesslist-duplicates.capsman index 74cf3b3..e1f83a3 100644 --- a/accesslist-duplicates.capsman +++ b/accesslist-duplicates.capsman @@ -17,8 +17,8 @@ :local Seen [ :toarray "" ]; :local Shown [ :toarray "" ]; -: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 ]; +: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 ]; :foreach SeenMac in=$Seen do={ :if ($SeenMac = $Mac) do={ :local Skip 0; @@ -26,14 +26,14 @@ :if ($ShownMac = $Mac) do={ :set Skip 1; } } :if ($Skip = 0) do={ - / caps-man access-list print where mac-address=$Mac; + /caps-man/access-list/print where mac-address=$Mac; :set Shown ($Shown, $Mac); :put "\nNumeric id to remove, any key to skip!"; :local Remove [ :tonum [ $Read ] ]; :if ([ :typeof $Remove ] = "num") do={ :put ("Removing numeric id " . $Remove . "...\n"); - / caps-man access-list remove $Remove; + /caps-man/access-list/remove $Remove; } } } diff --git a/accesslist-duplicates.local b/accesslist-duplicates.local index 0aa946c..c1bf2a2 100644 --- a/accesslist-duplicates.local +++ b/accesslist-duplicates.local @@ -17,8 +17,8 @@ :local Seen [ :toarray "" ]; :local Shown [ :toarray "" ]; -: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 ]; +: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 ]; :foreach SeenMac in=$Seen do={ :if ($SeenMac = $Mac) do={ :local Skip 0; @@ -26,14 +26,14 @@ :if ($ShownMac = $Mac) do={ :set Skip 1; } } :if ($Skip = 0) do={ - / interface wireless access-list print where mac-address=$Mac; + /interface/wireless/access-list/print where mac-address=$Mac; :set Shown ($Shown, $Mac); :put "\nNumeric id to remove, any key to skip!"; :local Remove [ :tonum [ $Read ] ]; :if ([ :typeof $Remove ] = "num") do={ :put ("Removing numeric id " . $Remove . "...\n"); - / interface wireless access-list remove $Remove; + /interface/wireless/access-list/remove $Remove; } } } diff --git a/accesslist-duplicates.template b/accesslist-duplicates.template index f1862bb..8ad8e8f 100644 --- a/accesslist-duplicates.template +++ b/accesslist-duplicates.template @@ -18,8 +18,8 @@ :local Seen [ :toarray "" ]; :local Shown [ :toarray "" ]; -:foreach AccList in=[ / %PATH% access-list find where mac-address!="00:00:00:00:00:00" ] do={ - :local Mac [ / %PATH% access-list get $AccList mac-address ]; +:foreach AccList in=[ /%PATH%/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ + :local Mac [ /%PATH%/access-list/get $AccList mac-address ]; :foreach SeenMac in=$Seen do={ :if ($SeenMac = $Mac) do={ :local Skip 0; @@ -27,14 +27,14 @@ :if ($ShownMac = $Mac) do={ :set Skip 1; } } :if ($Skip = 0) do={ - / %PATH% access-list print where mac-address=$Mac; + /%PATH%/access-list/print where mac-address=$Mac; :set Shown ($Shown, $Mac); :put "\nNumeric id to remove, any key to skip!"; :local Remove [ :tonum [ $Read ] ]; :if ([ :typeof $Remove ] = "num") do={ :put ("Removing numeric id " . $Remove . "...\n"); - / %PATH% access-list remove $Remove; + /%PATH%/access-list/remove $Remove; } } } From 18a0bee80f191037afec4f3579ee8ef2ee0ee1bb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:36:41 +0200 Subject: [PATCH 06/99] backup-cloud: RouterOS v7 path syntax --- backup-cloud | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backup-cloud b/backup-cloud index d1d9f14..38aed1f 100644 --- a/backup-cloud +++ b/backup-cloud @@ -33,15 +33,15 @@ $WaitFullyConnected; :do { # we are not interested in output, but print is # required to fetch information from cloud - / system backup cloud print as-value; - :if ([ :len [ / system backup cloud find ] ] > 0) do={ - / system backup cloud upload-file action=create-and-upload \ + /system/backup/cloud/print as-value; + :if ([ :len [ /system/backup/cloud/find ] ] > 0) do={ + /system/backup/cloud/upload-file action=create-and-upload \ password=$BackupPassword replace=[ get ([ find ]->0) name ]; } else={ - / system backup cloud upload-file action=create-and-upload \ + /system/backup/cloud/upload-file action=create-and-upload \ password=$BackupPassword; } - :local Cloud [ / system backup cloud get ([ find ]->0) ]; + :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; $SendNotification2 ({ origin=$0; \ subject=([ $SymbolForNotification "floppy-disk,cloud" ] . "Cloud backup"); \ From dffd634885a640ca060d1658820f4999cae5b408 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:36:53 +0200 Subject: [PATCH 07/99] backup-email: RouterOS v7 path syntax --- backup-email | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-email b/backup-email index ccbd4de..55f2309 100644 --- a/backup-email +++ b/backup-email @@ -54,7 +54,7 @@ $WaitFullyConnected; # binary backup :if ($BackupSendBinary = true) do={ - / system backup save encryption=aes-sha256 name=$FilePath password=$BackupPassword; + /system/backup/save encryption=aes-sha256 name=$FilePath password=$BackupPassword; $WaitForFile ($FilePath . ".backup"); :set BackupFile ($FileName . ".backup"); :set Attach ($Attach, ($FilePath . ".backup")); @@ -62,7 +62,7 @@ $WaitFullyConnected; # create configuration export :if ($BackupSendExport = true) do={ - / export terse show-sensitive file=$FilePath; + /export terse show-sensitive file=$FilePath; $WaitForFile ($FilePath . ".rsc"); :set ConfigFile ($FileName . ".rsc"); :set Attach ($Attach, ($FilePath . ".rsc")); From 21c4520d1729e4865f81b3e4ae0ea9e389bf6890 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:37:04 +0200 Subject: [PATCH 08/99] backup-partition: RouterOS v7 path syntax --- backup-partition | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backup-partition b/backup-partition index c72c7f9..a8aecac 100644 --- a/backup-partition +++ b/backup-partition @@ -14,20 +14,20 @@ :global LogPrintExit2; -:if ([ :len [ / partitions find ] ] < 2) do={ +:if ([ :len [ /partitions/find ] ] < 2) do={ $LogPrintExit2 error $0 ("Device does not have a fallback partition.") true; } -:local ActiveRunning [ / partitions find where active running ]; +:local ActiveRunning [ /partitions/find where active running ]; :if ([ :len $ActiveRunning ] < 1) do={ $LogPrintExit2 error $0 ("Device is not running from active partition.") true; } -:local ActiveRunningVar [ / partitions get $ActiveRunning ]; +:local ActiveRunningVar [ /partitions/get $ActiveRunning ]; :do { - / partitions save-config-to ($ActiveRunningVar->"fallback-to"); + /partitions/save-config-to ($ActiveRunningVar->"fallback-to"); $LogPrintExit2 info $0 ("Saved configuration to partition '" . \ ($ActiveRunningVar->"fallback-to") . "'.") false; } on-error={ From 219fd994d7f0efddc6533e0de306368d5b32088a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:37:13 +0200 Subject: [PATCH 09/99] backup-upload: RouterOS v7 path syntax --- backup-upload | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backup-upload b/backup-upload index c482b42..8ed4149 100644 --- a/backup-upload +++ b/backup-upload @@ -58,11 +58,11 @@ $WaitFullyConnected; # binary backup :if ($BackupSendBinary = true) do={ - / system backup save encryption=aes-sha256 name=$FilePath password=$BackupPassword; + /system/backup/save encryption=aes-sha256 name=$FilePath password=$BackupPassword; $WaitForFile ($FilePath . ".backup"); :do { - / tool fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".backup") \ + /tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".backup") \ user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".backup"); :set BackupFile ($FileName . ".backup"); } on-error={ @@ -71,16 +71,16 @@ $WaitFullyConnected; :set Failed 1; } - / file remove ($FilePath . ".backup"); + /file/remove ($FilePath . ".backup"); } # create configuration export :if ($BackupSendExport = true) do={ - / export terse show-sensitive file=$FilePath; + /export terse show-sensitive file=$FilePath; $WaitForFile ($FilePath . ".rsc"); :do { - / tool fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".rsc") \ + /tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".rsc") \ user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".rsc"); :set ConfigFile ($FileName . ".rsc"); } on-error={ @@ -89,7 +89,7 @@ $WaitFullyConnected; :set Failed 1; } - / file remove ($FilePath . ".rsc"); + /file/remove ($FilePath . ".rsc"); } $SendNotification2 ({ origin=$0; \ From ac4eb87be68dd40de63f59950a1b474f76283506 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:39:09 +0200 Subject: [PATCH 10/99] capsman-download-packages: RouterOS v7 path syntax --- capsman-download-packages | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/capsman-download-packages b/capsman-download-packages index 10585ec..1e901d8 100644 --- a/capsman-download-packages +++ b/capsman-download-packages @@ -21,15 +21,15 @@ $ScriptLock $0; $WaitFullyConnected; -:local PackagePath [ $CleanFilePath [ / caps-man manager get package-path ] ]; -:local InstalledVersion [ / system package update get installed-version ]; +:local PackagePath [ $CleanFilePath [ /caps-man/manager/get package-path ] ]; +:local InstalledVersion [ /system/package/update/get installed-version ]; :local Updated false; :if ([ :len $PackagePath ] = 0) do={ $LogPrintExit2 warning $0 ("The CAPsMAN package path is not defined, can not download packages.") true; } -:if ([ :len [ / file find where name=$PackagePath type="directory" ] ] = 0) do={ +:if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrintExit2 warning $0 ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!") true; @@ -38,34 +38,34 @@ $WaitFullyConnected; "). Please place your packages!") false; } -:foreach Package in=[ / file find where type=package \ +:foreach Package in=[ /file/find where type=package \ package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ - :local File [ / file get $Package ]; + :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; } :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - / file remove $Package; + /file/remove $Package; } } -:if ([ :len [ / system logging find where topics~"error" !(topics~"!error") \ +:if ([ :len [ /system/logging/find where topics~"error" !(topics~"!error") \ !(topics~"!caps") action=memory !disabled !invalid ] ] < 1) do={ $LogPrintExit2 warning $0 ("Looks like error messages for 'caps' are not sent to memory. " . \ "Probably can not download packages automatically.") false; } else={ - :if ($Updated = false && [ / system resource get uptime ] < 2m) do={ + :if ($Updated = false && [ /system/resource/get uptime ] < 2m) do={ $LogPrintExit2 info $0 ("No packages downloaded, yet. Delaying for logs.") false; :delay 2m; } } -:foreach Log in=[ / log find where topics=({"caps", "error"}) \ +:foreach Log in=[ /log/find where topics=({"caps", "error"}) \ message~("upgrade status: failed, failed to download file '.*-" . $InstalledVersion . \ "-.*\\.npk', no such file") ] do={ - :local Message [ / log get $Log message ]; + :local Message [ /log/get $Log message ]; :local Package [ :pick $Message \ ([ :find $Message "'" ] + 1) \ [ :find $Message ("-" . $InstalledVersion . "-") ] ]; @@ -78,9 +78,9 @@ $WaitFullyConnected; } :if ($Updated = true) do={ - :if ([ :len [ / system script find where name="capsman-rolling-upgrade" ] ] > 0) do={ - / system script run capsman-rolling-upgrade; + :if ([ :len [ /system/script/find where name="capsman-rolling-upgrade" ] ] > 0) do={ + /system/script/run capsman-rolling-upgrade; } else={ - / caps-man remote-cap upgrade [ find where version!=$InstalledVersion ]; + /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } From f17342ed6ec05d15cefcc00cfd6b1677175f1fd4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:40:08 +0200 Subject: [PATCH 11/99] capsman-rolling-upgrade: RouterOS v7 path syntax --- capsman-rolling-upgrade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/capsman-rolling-upgrade b/capsman-rolling-upgrade index 2893915..e6b1c51 100644 --- a/capsman-rolling-upgrade +++ b/capsman-rolling-upgrade @@ -16,18 +16,18 @@ $ScriptLock $0; -:local InstalledVersion [ / system package update get installed-version ]; +:local InstalledVersion [ /system/package/update/get installed-version ]; -:local RemoteCapCount [ :len [ / caps-man remote-cap find ] ]; +:local RemoteCapCount [ :len [ /caps-man/remote-cap/find ] ]; :if ($RemoteCapCount > 0) do={ :local Delay (600 / $RemoteCapCount); :if ($Delay > 120) do={ :set Delay 120; } - :foreach RemoteCap in=[ / caps-man remote-cap find where version!=$InstalledVersion ] do={ - :local RemoteCapVal [ / caps-man remote-cap get $RemoteCap ]; + :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 $0 ("Starting upgrade for " . $RemoteCapVal->"name" . \ " (" . $RemoteCapVal->"identity" . ")...") false; - / caps-man remote-cap upgrade $RemoteCap; + /caps-man/remote-cap/upgrade $RemoteCap; } else={ $LogPrintExit2 warning $0 ("Remote CAP vanished, skipping upgrade.") false; } From 0f3166d4275d9cb2ae3a2fe3337ee042394921ec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:41:16 +0200 Subject: [PATCH 12/99] certificate-renew-issued: RouterOS v7 path syntax --- certificate-renew-issued | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/certificate-renew-issued b/certificate-renew-issued index 72b723f..29aaa93 100644 --- a/certificate-renew-issued +++ b/certificate-renew-issued @@ -15,16 +15,16 @@ :global LogPrintExit2; :global MkDir; -:foreach Cert in=[ / certificate find where issued expires-after<3w ] do={ - :local CertVal [ / certificate get $Cert ]; - / certificate issued-revoke $Cert; - / certificate set name=($CertVal->"name" . "-revoked-" . [ / system clock get date ]) $Cert; - / certificate add name=($CertVal->"name") common-name=($CertVal->"common-name") \ +:foreach Cert in=[ /certificate/find where issued expires-after<3w ] do={ + :local CertVal [ /certificate/get $Cert ]; + /certificate/issued-revoke $Cert; + /certificate/set name=($CertVal->"name" . "-revoked-" . [ /system/clock/get date ]) $Cert; + /certificate/add name=($CertVal->"name") common-name=($CertVal->"common-name") \ key-usage=($CertVal->"key-usage") subject-alt-name=($CertVal->"subject-alt-name"); - / certificate sign ($CertVal->"name") ca=($CertVal->"ca"); + /certificate/sign ($CertVal->"name") ca=($CertVal->"ca"); :if ([ :typeof ($CertIssuedExportPass->($CertVal->"common-name")) ] = "str") do={ :if ([ $MkDir "cert-issued" ] = true) do={ - / certificate export-certificate ($CertVal->"name") type=pkcs12 \ + /certificate/export-certificate ($CertVal->"name") type=pkcs12 \ file-name=("cert-issued/" . $CertVal->"common-name") \ export-passphrase=($CertIssuedExportPass->($CertVal->"common-name")); $LogPrintExit2 info $0 ("Issued a new certificate for \"" . $CertVal->"common-name" . \ From 3ed153520ef510bf556ef9c53d01d1aeaf4e2a15 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:42:19 +0200 Subject: [PATCH 13/99] check-certificates: RouterOS v7 path syntax --- check-certificates | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/check-certificates b/check-certificates index 1f40496..99da7d5 100644 --- a/check-certificates +++ b/check-certificates @@ -33,8 +33,8 @@ $WaitFullyConnected; -:foreach Cert in=[ / certificate find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ - :local CertVal [ / certificate get $Cert ]; +:foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ + :local CertVal [ /certificate/get $Cert ]; :do { :if ([ :len $CertRenewUrl ] = 0) do={ @@ -45,24 +45,24 @@ $WaitFullyConnected; :foreach Type in={ ".pem"; ".p12" } do={ :local CertFileName ([ $UrlEncode ($CertVal->"common-name") ] . $Type); :do { - / tool fetch check-certificate=yes-without-crl \ + /tool/fetch check-certificate=yes-without-crl \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; $WaitForFile $CertFileName; :foreach PassPhrase in=$CertRenewPass do={ - / certificate import file-name=$CertFileName passphrase=$PassPhrase as-value; + /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value; } - / file remove [ find where name=$CertFileName ]; + /file/remove [ find where name=$CertFileName ]; - :foreach CertInChain in=[ / certificate find where name~("^" . $CertFileName . "_[0-9]+\$") common-name!=($CertVal->"common-name") ] do={ - $CertificateNameByCN [ / certificate get $CertInChain common-name ]; + :foreach CertInChain in=[ /certificate/find where name~("^" . $CertFileName . "_[0-9]+\$") common-name!=($CertVal->"common-name") ] do={ + $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } } on-error={ $LogPrintExit2 debug $0 ("Could not download certificate file " . $CertFileName) false; } } - :local CertNew [ / certificate find where common-name=($CertVal->"common-name") fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; - :local CertNewVal [ / certificate get $CertNew ]; + :local CertNew [ /certificate/find where common-name=($CertVal->"common-name") fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; + :local CertNewVal [ /certificate/get $CertNew ]; :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") ] = false) do={ $LogPrintExit2 warning $0 ("The certificate chain is not available!") false; @@ -72,27 +72,19 @@ $WaitFullyConnected; $LogPrintExit2 debug $0 ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced.") false; :if (($CertVal->"private-key") = true && ($CertVal->"private-key") != ($CertNewVal->"private-key")) do={ - / certificate remove $CertNew; + /certificate/remove $CertNew; $LogPrintExit2 warning $0 ("Old certificate '" . ($CertVal->"name") . "' has a private key, new certificate does not. Aborting renew.") true; } - / ip service set certificate=($CertNewVal->"name") [ find where certificate=($CertVal->"name") ]; + /ip/service/set certificate=($CertNewVal->"name") [ find where certificate=($CertVal->"name") ]; - :do { - / ip ipsec identity set certificate=($CertNewVal->"name") [ / ip ipsec identity find where certificate=($CertVal->"name") ]; - / ip ipsec identity set remote-certificate=($CertNewVal->"name") [ / ip ipsec identity find where remote-certificate=($CertVal->"name") ]; - } on-error={ - $LogPrintExit2 debug $0 ("Setting IPSEC certificates failed. Package 'security' not installed?") false; - } + /ip/ipsec/identity/set certificate=($CertNewVal->"name") [ find where certificate=($CertVal->"name") ]; + /ip/ipsec/identity/set remote-certificate=($CertNewVal->"name") [ find where remote-certificate=($CertVal->"name") ]; - :do { - / ip hotspot profile set ssl-certificate=($CertNewVal->"name") [ / ip hotspot profile find where ssl-certificate=($CertVal->"name") ]; - } on-error={ - $LogPrintExit2 debug $0 ("Setting hotspot certificates failed. Package 'hotspot' not installed?") false; - } + /ip/hotspot/profile/set ssl-certificate=($CertNewVal->"name") [ find where ssl-certificate=($CertVal->"name") ]; - / certificate remove $Cert; - / certificate set $CertNew name=($CertVal->"name"); + /certificate/remove $Cert; + /certificate/set $CertNew name=($CertVal->"name"); } $SendNotification2 ({ origin=$0; \ @@ -111,10 +103,10 @@ $WaitFullyConnected; } } -:foreach Cert in=[ / certificate find where !revoked !scep-url !(expires-after=[]) expires-after<2w !(fingerprint=[]) ] do={ - :local CertVal [ / certificate get $Cert ]; +:foreach Cert in=[ /certificate/find where !revoked !scep-url !(expires-after=[]) expires-after<2w !(fingerprint=[]) ] do={ + :local CertVal [ /certificate/get $Cert ]; - :if ([ :len [ / certificate scep-server find where ca-cert=($CertVal->"ca") ] ] > 0) do={ + :if ([ :len [ /certificate/scep-server/find where ca-cert=($CertVal->"ca") ] ] > 0) do={ $LogPrintExit2 debug $0 ("Certificate \"" . ($CertVal->"name") . "\" is handled by SCEP, skipping.") false; } else={ :local State [ $IfThenElse (($CertVal->"expired") = true) "expired" "is about to expire" ]; From af8a24b959a3e731fb925304170e99576936a296 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:43:04 +0200 Subject: [PATCH 14/99] check-health: RouterOS v7 path syntax --- check-health | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/check-health b/check-health index ca379c4..903c496 100644 --- a/check-health +++ b/check-health @@ -30,7 +30,7 @@ :return ($T->0 * 10 + $T->1); } -:if ([ :len [ / system health find ] ] = 0) do={ +:if ([ :len [ /system/health/find ] ] = 0) do={ $LogPrintExit2 error $0 ("Your device does not provide any health values.") true; } @@ -43,9 +43,9 @@ $ScriptLock $0; -:foreach Voltage in=[ / system health find where type="V" ] do={ - :local Name [ / system health get $Voltage name ]; - :local Value [ / system health get $Voltage value ]; +: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 ]; @@ -75,9 +75,9 @@ $ScriptLock $0; :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 ]; +: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" && \ @@ -96,19 +96,19 @@ $ScriptLock $0; :set ($CheckHealthLast->$Name) $Value; } -:foreach Temperature in=[ / system health find where type="C" ] do={ - :local Name [ / system health get $Temperature name ]; - :local Value [ / system health get $Temperature value ]; +: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={ $LogPrintExit2 info $0 ("No threshold given for " . $Name . ", assuming 50C.") false; :set ($CheckHealthTemperature->$Name) 50; } - :local Validate [ / system health get [ find where name=$Name ] value ]; + :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 ]; + :set Validate [ /system/health/get [ find where name=$Name ] value ]; } :if ($Value > $CheckHealthTemperature->$Name && \ $CheckHealthTemperatureNotified->$Name != true) do={ From 602933baec637cd89ccb15d0bd2471e5e9398ef2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:44:15 +0200 Subject: [PATCH 15/99] check-lte-firmware-upgrade: RouterOS v7 path syntax --- check-lte-firmware-upgrade | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/check-lte-firmware-upgrade b/check-lte-firmware-upgrade index 6918c7b..759b138 100644 --- a/check-lte-firmware-upgrade +++ b/check-lte-firmware-upgrade @@ -28,12 +28,12 @@ :global SendNotification2; :global SymbolForNotification; - :local IntName [ / interface lte get $Interface name ]; + :local IntName [ /interface/lte/get $Interface name ]; :local Firmware; :local Info; :do { - :set Firmware [ / interface lte firmware-upgrade $Interface once as-value ]; - :set Info [ / interface lte monitor $Interface once as-value ]; + :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; + :set Info [ /interface/lte/monitor $Interface once as-value ]; } on-error={ $LogPrintExit2 debug $0 ("Could not get latest LTE firmware version for interface " . \ $IntName . ".") false; @@ -48,10 +48,10 @@ } :if ([ $ScriptFromTerminal "check-lte-firmware-upgrade" ] = true && \ - [ :len [ / system script find where name="unattended-lte-firmware-upgrade" ] ] > 0) do={ + [ :len [ /system/script/find where name="unattended-lte-firmware-upgrade" ] ] > 0) do={ :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; + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + /system/script/run unattended-lte-firmware-upgrade; $LogPrintExit2 info $0 ("Scheduled lte firmware upgrade for interface " . $IntName . "...") false; :return true; } else={ @@ -77,6 +77,6 @@ :set ($SentLteFirmwareUpgradeNotification->$IntName) ($Firmware->"latest"); } -:foreach Interface in=[ / interface lte find ] do={ +:foreach Interface in=[ /interface/lte/find ] do={ $CheckInterface $Interface; } From 4837b4747ebb26e9abef80c5ecc01697cb1b2f90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:45:58 +0200 Subject: [PATCH 16/99] check-routeros-update: RouterOS v7 path syntax --- check-routeros-update | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/check-routeros-update b/check-routeros-update index 8cad07a..3d4f14a 100644 --- a/check-routeros-update +++ b/check-routeros-update @@ -27,10 +27,10 @@ :global WaitFullyConnected; :local DoUpdate do={ - :if ([ :len [ / system script find where name="packages-update" ] ] > 0) do={ - / system script run packages-update; + :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ + /system/script/run packages-update; } else={ - / system package update install without-paging; + /system/package/update/install without-paging; } :error "Waiting for system to reboot."; } @@ -39,21 +39,21 @@ $ScriptLock $0; $WaitFullyConnected; -:if ([ :len [ / system package find where name="wireless" disabled=no ] ] > 0) do={ - :if ([ / interface wireless cap get enabled ] = true && \ - [ / caps-man manager get enabled ] = false && \ +:if ([ :len [ /system/package/find where name="wireless" disabled=no ] ] > 0) do={ + :if ([ /interface/wireless/cap/get enabled ] = true && \ + [ /caps-man/manager/get enabled ] = false && \ $SafeUpdateOnCap != true) do={ $LogPrintExit2 error $0 ("System is managed by CAPsMAN, not checking for RouterOS version.") true; } } -:if ([ :len [ / system scheduler find where name="reboot-for-update" ] ] > 0) do={ +:if ([ :len [ /system/scheduler/find where name="reboot-for-update" ] ] > 0) do={ :error "A reboot for update is already scheduled."; } $LogPrintExit2 debug $0 ("Checking for updates...") false; -/ system package update check-for-updates without-paging as-value; -:local Update [ / system package update get ]; +/system/package/update/check-for-updates without-paging as-value; +:local Update [ /system/package/update/get ]; :if ([ :len ($Update->"latest-version") ] = 0) do={ $LogPrintExit2 info $0 ("An empty string is not a valid version.") true; @@ -77,7 +77,7 @@ $LogPrintExit2 debug $0 ("Checking for updates...") false; $DoUpdate; } - :if ($SafeUpdateNeighbor = true && [ :len [ / ip neighbor find where \ + :if ($SafeUpdateNeighbor = true && [ :len [ /ip/neighbor/find where \ version=($Update->"latest-version" . " (" . $Update->"channel" . ")") ] ] > 0) do={ $LogPrintExit2 info $0 ("Seen a neighbor running version " . $Update->"latest-version" . ", updating...") false; $SendNotification2 ({ origin=$0; \ @@ -90,7 +90,7 @@ $LogPrintExit2 debug $0 ("Checking for updates...") false; :if ([ :len $SafeUpdateUrl ] > 0) do={ :local Result; :do { - :set Result [ / tool fetch check-certificate=yes-without-crl \ + :set Result [ /tool/fetch check-certificate=yes-without-crl \ ($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \ "&latest=" . $Update->"latest-version") output=user as-value ]; } on-error={ @@ -108,7 +108,7 @@ $LogPrintExit2 debug $0 ("Checking for updates...") false; :if ([ $ScriptFromTerminal $0 ] = true) do={ :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); - :if (([ / terminal inkey timeout=60 ] % 32) = 25) do={ + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $DoUpdate; } else={ :put "Canceled..."; From 8af4db9f53622ab4886799e2c2815a28a62e1d87 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:48:32 +0200 Subject: [PATCH 17/99] collect-wireless-mac: RouterOS v7 path syntax --- collect-wireless-mac.capsman | 28 ++++++++++++++-------------- collect-wireless-mac.local | 30 +++++++++++++++--------------- collect-wireless-mac.template | 30 +++++++++++++++--------------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/collect-wireless-mac.capsman b/collect-wireless-mac.capsman index 326aa14..9e502e3 100644 --- a/collect-wireless-mac.capsman +++ b/collect-wireless-mac.capsman @@ -25,47 +25,47 @@ $ScriptLock $0 false 10; -:if ([ :len [ / caps-man access-list find where comment="--- collected above ---" disabled ] ] = 0) do={ - / caps-man access-list add comment="--- collected above ---" disabled=yes; +: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 $0 ("Added disabled access-list entry with comment '--- collected above ---'.") false; } -:local PlaceBefore ([ / caps-man access-list find where comment="--- collected above ---" disabled ]->0); +:local PlaceBefore ([ /caps-man/access-list/find where comment="--- collected above ---" disabled ]->0); -:foreach Reg in=[ / caps-man registration-table find ] do={ +:foreach Reg in=[ /caps-man/registration-table/find ] do={ :local RegVal; :do { - :set RegVal [ / caps-man registration-table get $Reg ]; + :set RegVal [ /caps-man/registration-table/get $Reg ]; } on-error={ $LogPrintExit2 debug $0 ("Device already gone... Ignoring.") false; } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ - :local AccessList ([ / caps-man access-list find where mac-address=($RegVal->"mac-address") ]->0); + :local AccessList ([ /caps-man/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ $LogPrintExit2 debug $0 ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ / caps-man access-list get $AccessList comment ]) false; + [ /caps-man/access-list/get $AccessList comment ]) false; } :if ([ :len $AccessList ] = 0) do={ :local Address "no dhcp lease"; :local DnsName "no dhcp lease"; :local HostName "no dhcp lease"; - :local Lease ([ / ip dhcp-server lease find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); + :local Lease ([ /ip/dhcp-server/lease/find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); :if ([ :len $Lease ] > 0) do={ - :set Address [ / ip dhcp-server lease get $Lease address ]; - :set HostName [ $EitherOr [ / ip dhcp-server lease get $Lease host-name ] "no hostname" ]; + :set Address [ /ip/dhcp-server/lease/get $Lease address ]; + :set HostName [ $EitherOr [ /ip/dhcp-server/lease/get $Lease host-name ] "no hostname" ]; :set DnsName "no dns name"; - :local DnsRec ([ / ip dns static find where address=$Address ]->0); + :local DnsRec ([ /ip/dns/static/find where address=$Address ]->0); :if ([ :len $DnsRec ] > 0) do={ - :set DnsName [ / ip dns static get $DnsRec name ]; + :set DnsName [ /ip/dns/static/get $DnsRec name ]; } } - :local DateTime ([ / system clock get date ] . " " . [ / system clock get time ]); + :local DateTime ([ /system/clock/get date ] . " " . [ /system/clock/get time ]); :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 $0 $Message false; - / caps-man access-list add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; + /caps-man/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; $SendNotification2 ({ origin=$0; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ message=("A device with unknown MAC address connected to " . $RegVal->"ssid" . " on " . $Identity . ".\n\n" . \ diff --git a/collect-wireless-mac.local b/collect-wireless-mac.local index 3f9fddb..a6dbd24 100644 --- a/collect-wireless-mac.local +++ b/collect-wireless-mac.local @@ -25,48 +25,48 @@ $ScriptLock $0 false 10; -:if ([ :len [ / interface wireless access-list find where comment="--- collected above ---" disabled ] ] = 0) do={ - / interface wireless access-list add comment="--- collected above ---" disabled=yes; +: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 $0 ("Added disabled access-list entry with comment '--- collected above ---'.") false; } -:local PlaceBefore ([ / interface wireless access-list find where comment="--- collected above ---" disabled ]->0); +:local PlaceBefore ([ /interface/wireless/access-list/find where comment="--- collected above ---" disabled ]->0); -:foreach Reg in=[ / interface wireless registration-table find ] do={ +:foreach Reg in=[ /interface/wireless/registration-table/find ] do={ :local RegVal; :do { - :set RegVal [ / interface wireless registration-table get $Reg ]; + :set RegVal [ /interface/wireless/registration-table/get $Reg ]; } on-error={ $LogPrintExit2 debug $0 ("Device already gone... Ignoring.") false; } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ - :local AccessList ([ / interface wireless 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 $0 ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ / interface wireless access-list get $AccessList comment ]) false; + [ /interface/wireless/access-list/get $AccessList comment ]) false; } :if ([ :len $AccessList ] = 0) do={ :local Address "no dhcp lease"; :local DnsName "no dhcp lease"; :local HostName "no dhcp lease"; - :local Lease ([ / ip dhcp-server lease find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); + :local Lease ([ /ip/dhcp-server/lease/find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); :if ([ :len $Lease ] > 0) do={ - :set Address [ / ip dhcp-server lease get $Lease address ]; - :set HostName [ $EitherOr [ / ip dhcp-server lease get $Lease host-name ] "no hostname" ]; + :set Address [ /ip/dhcp-server/lease/get $Lease address ]; + :set HostName [ $EitherOr [ /ip/dhcp-server/lease/get $Lease host-name ] "no hostname" ]; :set DnsName "no dns name"; - :local DnsRec ([ / ip dns static find where address=$Address ]->0); + :local DnsRec ([ /ip/dns/static/find where address=$Address ]->0); :if ([ :len $DnsRec ] > 0) do={ - :set DnsName [ / ip dns static get $DnsRec name ]; + :set DnsName [ /ip/dns/static/get $DnsRec name ]; } } - :set ($RegVal->"ssid") [ / interface wireless get [ find where name=($RegVal->"interface") ] ssid ]; - :local DateTime ([ / system clock get date ] . " " . [ / system clock get time ]); + :set ($RegVal->"ssid") [ /interface/wireless/get [ find where name=($RegVal->"interface") ] ssid ]; + :local DateTime ([ /system/clock/get date ] . " " . [ /system/clock/get time ]); :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 $0 $Message false; - / interface wireless 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; $SendNotification2 ({ origin=$0; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ message=("A device with unknown MAC address connected to " . $RegVal->"ssid" . " on " . $Identity . ".\n\n" . \ diff --git a/collect-wireless-mac.template b/collect-wireless-mac.template index b3c1c04..42a3d0a 100644 --- a/collect-wireless-mac.template +++ b/collect-wireless-mac.template @@ -26,48 +26,48 @@ $ScriptLock $0 false 10; -:if ([ :len [ / %PATH% access-list find where comment="--- collected above ---" disabled ] ] = 0) do={ - / %PATH% access-list add comment="--- collected above ---" disabled=yes; +:if ([ :len [ /%PATH%/access-list/find where comment="--- collected above ---" disabled ] ] = 0) do={ + /%PATH%/access-list/add comment="--- collected above ---" disabled=yes; $LogPrintExit2 warning $0 ("Added disabled access-list entry with comment '--- collected above ---'.") false; } -:local PlaceBefore ([ / %PATH% access-list find where comment="--- collected above ---" disabled ]->0); +:local PlaceBefore ([ /%PATH%/access-list/find where comment="--- collected above ---" disabled ]->0); -:foreach Reg in=[ / %PATH% registration-table find ] do={ +:foreach Reg in=[ /%PATH%/registration-table/find ] do={ :local RegVal; :do { - :set RegVal [ / %PATH% registration-table get $Reg ]; + :set RegVal [ /%PATH%/registration-table/get $Reg ]; } on-error={ $LogPrintExit2 debug $0 ("Device already gone... Ignoring.") false; } :if ([ :len ($RegVal->"mac-address") ] > 0) do={ - :local AccessList ([ / %PATH% access-list find where mac-address=($RegVal->"mac-address") ]->0); + :local AccessList ([ /%PATH%/access-list/find where mac-address=($RegVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ $LogPrintExit2 debug $0 ("MAC address " . $RegVal->"mac-address" . " already known: " . \ - [ / %PATH% access-list get $AccessList comment ]) false; + [ /%PATH%/access-list/get $AccessList comment ]) false; } :if ([ :len $AccessList ] = 0) do={ :local Address "no dhcp lease"; :local DnsName "no dhcp lease"; :local HostName "no dhcp lease"; - :local Lease ([ / ip dhcp-server lease find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); + :local Lease ([ /ip/dhcp-server/lease/find where mac-address=($RegVal->"mac-address") dynamic=yes status=bound ]->0); :if ([ :len $Lease ] > 0) do={ - :set Address [ / ip dhcp-server lease get $Lease address ]; - :set HostName [ $EitherOr [ / ip dhcp-server lease get $Lease host-name ] "no hostname" ]; + :set Address [ /ip/dhcp-server/lease/get $Lease address ]; + :set HostName [ $EitherOr [ /ip/dhcp-server/lease/get $Lease host-name ] "no hostname" ]; :set DnsName "no dns name"; - :local DnsRec ([ / ip dns static find where address=$Address ]->0); + :local DnsRec ([ /ip/dns/static/find where address=$Address ]->0); :if ([ :len $DnsRec ] > 0) do={ - :set DnsName [ / ip dns static get $DnsRec name ]; + :set DnsName [ /ip/dns/static/get $DnsRec name ]; } } - :set ($RegVal->"ssid") [ / interface wireless get [ find where name=($RegVal->"interface") ] ssid ]; - :local DateTime ([ / system clock get date ] . " " . [ / system clock get time ]); + :set ($RegVal->"ssid") [ /interface/wireless/get [ find where name=($RegVal->"interface") ] ssid ]; + :local DateTime ([ /system/clock/get date ] . " " . [ /system/clock/get time ]); :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 $0 $Message false; - / %PATH% access-list add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; + /%PATH%/access-list/add place-before=$PlaceBefore comment=$Message mac-address=($RegVal->"mac-address") disabled=yes; $SendNotification2 ({ origin=$0; \ subject=([ $SymbolForNotification "mobile-phone" ] . $RegVal->"mac-address" . " connected to " . $RegVal->"ssid"); \ message=("A device with unknown MAC address connected to " . $RegVal->"ssid" . " on " . $Identity . ".\n\n" . \ From 71053fec408799e3cba9d6ebbfacf1334fc93c14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:50:03 +0200 Subject: [PATCH 18/99] daily-psk: RouterOS v7 path syntax --- daily-psk.capsman | 14 +++++++------- daily-psk.local | 14 +++++++------- daily-psk.template | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/daily-psk.capsman b/daily-psk.capsman index 944d52c..9f81be5 100644 --- a/daily-psk.capsman +++ b/daily-psk.capsman @@ -56,20 +56,20 @@ $WaitFullyConnected; } :local Seen [ :toarray "" ]; -:local Date [ / system clock get date ]; +:local Date [ /system/clock/get date ]; :local NewPsk [ $GeneratePSK $Date ]; -:foreach AccList in=[ / caps-man access-list find where comment~$DailyPskMatchComment ] do={ - :local Ssid [ / caps-man access-list get $AccList ssid-regexp ]; - :local Configuration [ / caps-man configuration get ([ find where ssid=$Ssid ]->0) name ]; - :local OldPsk [ / caps-man access-list get $AccList private-passphrase ]; +:foreach AccList in=[ /caps-man/access-list/find where comment~$DailyPskMatchComment ] do={ + :local Ssid [ /caps-man/access-list/get $AccList ssid-regexp ]; + :local Configuration [ /caps-man/configuration/get ([ find where ssid=$Ssid ]->0) name ]; + :local OldPsk [ /caps-man/access-list/get $AccList private-passphrase ]; :local Skip 0; :if ($NewPsk != $OldPsk) do={ $LogPrintExit2 info $0 ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; - / caps-man access-list set $AccList private-passphrase=$NewPsk; + /caps-man/access-list/set $AccList private-passphrase=$NewPsk; - :if ([ :len [ / caps-man interface find where configuration=$Configuration ] ] > 0) do={ + :if ([ :len [ /caps-man/interface/find where configuration=$Configuration ] ] > 0) do={ :foreach SeenSsid in=$Seen do={ :if ($SeenSsid = $Ssid) do={ $LogPrintExit2 debug $0 ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; diff --git a/daily-psk.local b/daily-psk.local index 022b4a3..23df467 100644 --- a/daily-psk.local +++ b/daily-psk.local @@ -56,20 +56,20 @@ $WaitFullyConnected; } :local Seen [ :toarray "" ]; -:local Date [ / system clock get date ]; +:local Date [ /system/clock/get date ]; :local NewPsk [ $GeneratePSK $Date ]; -:foreach AccList in=[ / interface wireless access-list find where comment~$DailyPskMatchComment ] do={ - :local IntName [ / interface wireless access-list get $AccList interface ]; - :local Ssid [ / interface wireless get $IntName ssid ]; - :local OldPsk [ / interface wireless access-list get $AccList private-pre-shared-key ]; +:foreach AccList in=[ /interface/wireless/access-list/find where comment~$DailyPskMatchComment ] do={ + :local IntName [ /interface/wireless/access-list/get $AccList interface ]; + :local Ssid [ /interface/wireless/get $IntName ssid ]; + :local OldPsk [ /interface/wireless/access-list/get $AccList private-pre-shared-key ]; :local Skip 0; :if ($NewPsk != $OldPsk) do={ $LogPrintExit2 info $0 ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; - / interface wireless access-list set $AccList private-pre-shared-key=$NewPsk; + /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; - :if ([ :len [ / interface wireless find where name=$IntName disabled=no ] ] = 1) do={ + :if ([ :len [ /interface/wireless/find where name=$IntName disabled=no ] ] = 1) do={ :foreach SeenSsid in=$Seen do={ :if ($SeenSsid = $Ssid) do={ $LogPrintExit2 debug $0 ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; diff --git a/daily-psk.template b/daily-psk.template index 5f7a832..aa05748 100644 --- a/daily-psk.template +++ b/daily-psk.template @@ -57,25 +57,25 @@ $WaitFullyConnected; } :local Seen [ :toarray "" ]; -:local Date [ / system clock get date ]; +:local Date [ /system/clock/get date ]; :local NewPsk [ $GeneratePSK $Date ]; -:foreach AccList in=[ / %PATH% access-list find where comment~$DailyPskMatchComment ] do={ - :local IntName [ / interface wireless access-list get $AccList interface ]; - :local Ssid [ / interface wireless get $IntName ssid ]; - :local Ssid [ / caps-man access-list get $AccList ssid-regexp ]; - :local Configuration [ / caps-man configuration get ([ find where ssid=$Ssid ]->0) name ]; - :local OldPsk [ / interface wireless access-list get $AccList private-pre-shared-key ]; - :local OldPsk [ / caps-man access-list get $AccList private-passphrase ]; +:foreach AccList in=[ /%PATH%/access-list/find where comment~$DailyPskMatchComment ] do={ + :local IntName [ /interface/wireless/access-list/get $AccList interface ]; + :local Ssid [ /interface/wireless/get $IntName ssid ]; + :local Ssid [ /caps-man/access-list/get $AccList ssid-regexp ]; + :local Configuration [ /caps-man/configuration/get ([ find where ssid=$Ssid ]->0) name ]; + :local OldPsk [ /interface/wireless/access-list/get $AccList private-pre-shared-key ]; + :local OldPsk [ /caps-man/access-list/get $AccList private-passphrase ]; :local Skip 0; :if ($NewPsk != $OldPsk) do={ $LogPrintExit2 info $0 ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")") false; - / interface wireless access-list set $AccList private-pre-shared-key=$NewPsk; - / caps-man access-list set $AccList private-passphrase=$NewPsk; + /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; + /caps-man/access-list/set $AccList private-passphrase=$NewPsk; - :if ([ :len [ / interface wireless find where name=$IntName disabled=no ] ] = 1) do={ - :if ([ :len [ / caps-man interface find where configuration=$Configuration ] ] > 0) do={ + :if ([ :len [ /interface/wireless/find where name=$IntName disabled=no ] ] = 1) do={ + :if ([ :len [ /caps-man/interface/find where configuration=$Configuration ] ] > 0) do={ :foreach SeenSsid in=$Seen do={ :if ($SeenSsid = $Ssid) do={ $LogPrintExit2 debug $0 ("Already sent a mail for SSID " . $Ssid . ", skipping.") false; From a01b9b9347f3fa3e8bdf0dc06900030c42b51187 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:51:07 +0200 Subject: [PATCH 19/99] dhcp-lease-comment: RouterOS v7 path syntax --- dhcp-lease-comment.capsman | 10 +++++----- dhcp-lease-comment.local | 10 +++++----- dhcp-lease-comment.template | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/dhcp-lease-comment.capsman b/dhcp-lease-comment.capsman index c4844bf..fa34539 100644 --- a/dhcp-lease-comment.capsman +++ b/dhcp-lease-comment.capsman @@ -16,15 +16,15 @@ :global LogPrintExit2; -:foreach Lease in=[ / ip dhcp-server lease find where dynamic=yes status=bound ] do={ - :local LeaseVal [ / ip dhcp-server lease get $Lease ]; +:foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic=yes status=bound ] do={ + :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; :local NewComment; - :local AccessList ([ / caps-man access-list find where mac-address=($LeaseVal->"mac-address") ]->0); + :local AccessList ([ /caps-man/access-list/find where mac-address=($LeaseVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - :set NewComment [ / caps-man access-list get $AccessList comment ]; + :set NewComment [ /caps-man/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ $LogPrintExit2 info $0 ("Updating comment for DHCP lease " . $LeaseVal->"mac-address" . ": " . $NewComment) false; - / ip dhcp-server lease set comment=$NewComment $Lease; + /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } diff --git a/dhcp-lease-comment.local b/dhcp-lease-comment.local index 55a2e3c..71e6d5e 100644 --- a/dhcp-lease-comment.local +++ b/dhcp-lease-comment.local @@ -16,15 +16,15 @@ :global LogPrintExit2; -:foreach Lease in=[ / ip dhcp-server lease find where dynamic=yes status=bound ] do={ - :local LeaseVal [ / ip dhcp-server lease get $Lease ]; +:foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic=yes status=bound ] do={ + :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; :local NewComment; - :local AccessList ([ / interface wireless access-list find where mac-address=($LeaseVal->"mac-address") ]->0); + :local AccessList ([ /interface/wireless/access-list/find where mac-address=($LeaseVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - :set NewComment [ / interface wireless access-list get $AccessList comment ]; + :set NewComment [ /interface/wireless/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ $LogPrintExit2 info $0 ("Updating comment for DHCP lease " . $LeaseVal->"mac-address" . ": " . $NewComment) false; - / ip dhcp-server lease set comment=$NewComment $Lease; + /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } diff --git a/dhcp-lease-comment.template b/dhcp-lease-comment.template index fea0c14..a31812b 100644 --- a/dhcp-lease-comment.template +++ b/dhcp-lease-comment.template @@ -17,15 +17,15 @@ :global LogPrintExit2; -:foreach Lease in=[ / ip dhcp-server lease find where dynamic=yes status=bound ] do={ - :local LeaseVal [ / ip dhcp-server lease get $Lease ]; +:foreach Lease in=[ /ip/dhcp-server/lease/find where dynamic=yes status=bound ] do={ + :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; :local NewComment; - :local AccessList ([ / %PATH% access-list find where mac-address=($LeaseVal->"mac-address") ]->0); + :local AccessList ([ /%PATH%/access-list/find where mac-address=($LeaseVal->"mac-address") ]->0); :if ([ :len $AccessList ] > 0) do={ - :set NewComment [ / %PATH% access-list get $AccessList comment ]; + :set NewComment [ /%PATH%/access-list/get $AccessList comment ]; } :if ([ :len $NewComment ] != 0 && $LeaseVal->"comment" != $NewComment) do={ $LogPrintExit2 info $0 ("Updating comment for DHCP lease " . $LeaseVal->"mac-address" . ": " . $NewComment) false; - / ip dhcp-server lease set comment=$NewComment $Lease; + /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } From f5f41a8aa72f840a58b059f1ed7bad5763eab94d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:52:21 +0200 Subject: [PATCH 20/99] dhcp-to-dns: RouterOS v7 path syntax --- dhcp-to-dns | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/dhcp-to-dns b/dhcp-to-dns index eb73ca3..368d68f 100644 --- a/dhcp-to-dns +++ b/dhcp-to-dns @@ -32,28 +32,28 @@ $ScriptLock $0 false 10; :local CommentPrefix ("managed by " . $0 . " for "); :local CommentString ("--- " . $0 . " above ---"); -:if ([ :len [ / ip dns static find where comment=$CommentString name=- type=NXDOMAIN disabled ] ] = 0) do={ - / ip dns static add comment=$CommentString name=- type=NXDOMAIN disabled=yes; +:if ([ :len [ /ip/dns/static/find where comment=$CommentString name=- type=NXDOMAIN disabled ] ] = 0) do={ + /ip/dns/static/add comment=$CommentString name=- type=NXDOMAIN disabled=yes; $LogPrintExit2 warning $0 ("Added disabled static dns record with comment '" . $CommentString . "'.") false; } -:local PlaceBefore ([ / ip dns static find where comment=$CommentString name=- type=NXDOMAIN disabled ]->0); +:local PlaceBefore ([ /ip/dns/static/find where comment=$CommentString name=- type=NXDOMAIN disabled ]->0); -:foreach DnsRecord in=[ / ip dns static find where comment ~ $CommentPrefix ] do={ - :local DnsRecordVal [ / ip dns static get $DnsRecord ]; +:foreach DnsRecord in=[ /ip/dns/static/find where comment ~ $CommentPrefix ] do={ + :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; :local MacAddress [ $CharacterReplace ($DnsRecordVal->"comment") $CommentPrefix "" ]; - :if ([ :len [ / ip dhcp-server lease find where mac-address=$MacAddress address=($DnsRecordVal->"address") status=bound ] ] > 0) do={ + :if ([ :len [ /ip/dhcp-server/lease/find where mac-address=$MacAddress address=($DnsRecordVal->"address") status=bound ] ] > 0) do={ $LogPrintExit2 debug $0 ("Lease for " . $MacAddress . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting DNS entry.") false; } else={ :local Found false; $LogPrintExit2 info $0 ("Lease expired for " . $MacAddress . " (" . $DnsRecordVal->"name" . "), deleting DNS entry.") false; - / ip dns static remove $DnsRecord; + /ip/dns/static/remove $DnsRecord; } } -:foreach Lease in=[ / ip dhcp-server lease find where status=bound ] do={ +:foreach Lease in=[ /ip/dhcp-server/lease/find where status=bound ] do={ :local LeaseVal; :do { - :set LeaseVal [ / ip dhcp-server lease get $Lease ]; + :set LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; } on-error={ $LogPrintExit2 debug $0 ("A lease just vanished, ignoring.") false; } @@ -65,19 +65,19 @@ $ScriptLock $0 false 10; [ $CharacterReplace ($LeaseVal->"host-name") " " "" ] ]; :local Fqdn ($HostName . "." . [ $IfThenElse ($ServerNameInZone = true) ($LeaseVal->"server" . ".") ] . $Zone); - :local DnsRecord [ / ip dns static find where name=$Fqdn ]; + :local DnsRecord [ /ip/dns/static/find where name=$Fqdn ]; :if ([ :len $DnsRecord ] > 0) do={ - :local DnsIp [ / ip dns static get $DnsRecord address ]; + :local DnsIp [ /ip/dns/static/get $DnsRecord address ]; - :local DupMacLeases [ / ip dhcp-server lease find where mac-address=($LeaseVal->"mac-address") status=bound ]; + :local DupMacLeases [ /ip/dhcp-server/lease/find where mac-address=($LeaseVal->"mac-address") status=bound ]; :if ([ :len $DupMacLeases ] > 1) do={ - :set ($LeaseVal->"address") [ / ip dhcp-server lease get ($DupMacLeases->([ :len $DupMacLeases ] - 1)) address ]; + :set ($LeaseVal->"address") [ /ip/dhcp-server/lease/get ($DupMacLeases->([ :len $DupMacLeases ] - 1)) address ]; } :if ([ :len ($LeaseVal->"host-name") ] > 0) do={ - :local HostNameLeases [ / ip dhcp-server lease find where host-name=($LeaseVal->"host-name") status=bound ]; + :local HostNameLeases [ /ip/dhcp-server/lease/find where host-name=($LeaseVal->"host-name") status=bound ]; :if ([ :len $HostNameLeases ] > 1) do={ - :set ($LeaseVal->"address") [ / ip dhcp-server lease get ($HostNameLeases->0) address ]; + :set ($LeaseVal->"address") [ /ip/dhcp-server/lease/get ($HostNameLeases->0) address ]; } } @@ -85,11 +85,11 @@ $ScriptLock $0 false 10; $LogPrintExit2 debug $0 ("DNS entry for " . $Fqdn . " does not need updating.") false; } else={ $LogPrintExit2 info $0 ("Replacing DNS entry for " . $Fqdn . ", new address is " . $LeaseVal->"address" . ".") false; - / ip dns static set name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment $DnsRecord; + /ip/dns/static/set name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment $DnsRecord; } } else={ $LogPrintExit2 info $0 ("Adding new DNS entry for " . $Fqdn . ", address is " . $LeaseVal->"address" . ".") false; - / ip dns static add name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; + /ip/dns/static/add name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } else={ $LogPrintExit2 debug $0 ("No address available... Ignoring.") false; From 294aff9c02fd1a40f982654fb4f22b2afa0e4096 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:53:25 +0200 Subject: [PATCH 21/99] firmware-upgrade-reboot: RouterOS v7 path syntax --- firmware-upgrade-reboot | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/firmware-upgrade-reboot b/firmware-upgrade-reboot index ac2cb55..27bbe41 100644 --- a/firmware-upgrade-reboot +++ b/firmware-upgrade-reboot @@ -13,7 +13,7 @@ :global LogPrintExit2; :global VersionToNum; -:local RouterBoard [ / system routerboard get ]; +:local RouterBoard [ /system/routerboard/get ]; :if ($RouterBoard->"current-firmware" = $RouterBoard->"upgrade-firmware") do={ $LogPrintExit2 info $0 ("Firmware is already up to date.") true; } @@ -21,21 +21,21 @@ $LogPrintExit2 info $0 ("Different firmware version is available, but it is a downgrade. Ignoring.") true; } -:if ([ / system routerboard settings get auto-upgrade ] = false) do={ +:if ([ /system/routerboard/settings/get auto-upgrade ] = false) do={ $LogPrintExit2 info $0 ("Firmware version " . $RouterBoard->"upgrade-firmware" . \ " is available, upgrading.") false; - / system routerboard upgrade; + /system/routerboard/upgrade; } -:while ([ :len [ / log find where topics=({"system";"info";"critical"}) \ +:while ([ :len [ /log/find where topics=({"system";"info";"critical"}) \ message="Firmware upgraded successfully, please reboot for changes to take effect!" ] ] = 0) do={ :delay 1s; } -:local Uptime [ / system resource get uptime ]; +:local Uptime [ /system/resource/get uptime ]; :if ($Uptime < 1m) do={ :delay $Uptime; } $LogPrintExit2 info $0 ("Firmware upgrade successful, rebooting.") false; -/ system reboot; +/system/reboot; From 270e608d566a6b2807b604a138b1bfcdbddf99ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 14:59:00 +0200 Subject: [PATCH 22/99] gps-track: RouterOS v7 path syntax --- gps-track | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track b/gps-track index 7c582e2..56a26c5 100644 --- a/gps-track +++ b/gps-track @@ -15,11 +15,11 @@ :global LogPrintExit2; -:local CoordinateFormat [ / system gps get coordinate-format ]; -:local Gps [ / system gps monitor once as-value ]; +:local CoordinateFormat [ /system/gps/get coordinate-format ]; +:local Gps [ /system/gps/monitor once as-value ]; :if ($Gps->"valid" = true) do={ - / tool fetch check-certificate=yes-without-crl $GpsTrackUrl output=none \ + /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") . "\"," . \ From b8f753d8b8bad556a933d53288348d26032e8f13 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:00:33 +0200 Subject: [PATCH 23/99] hotspot-to-wpa: RouterOS v7 path syntax --- hotspot-to-wpa | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/hotspot-to-wpa b/hotspot-to-wpa index 628d748..add2893 100644 --- a/hotspot-to-wpa +++ b/hotspot-to-wpa @@ -16,23 +16,23 @@ :local MacAddress $"mac-address"; :local UserName $username; -:local Date [ / system clock get date ]; -:local UserVal [ / ip hotspot user get [ find where name=$UserName ] ]; +:local Date [ /system/clock/get date ]; +:local UserVal [ /ip/hotspot/user/get [ find where name=$UserName ] ]; :local UserInfo [ $ParseKeyValueStore ($UserVal->"comment") ]; -:local Hotspot [ / ip hotspot host get [ find where mac-address=$MacAddress authorized ] server ]; +:local Hotspot [ /ip/hotspot/host/get [ find where mac-address=$MacAddress authorized ] server ]; -: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; +: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 $0 ("Added disabled access-list entry with comment '--- hotspot-to-wpa above ---'.") false; } -:local PlaceBefore ([ / caps-man access-list find where comment="--- hotspot-to-wpa above ---" disabled ]->0); +:local PlaceBefore ([ /caps-man/access-list/find where comment="--- hotspot-to-wpa above ---" disabled ]->0); -:if ([ :len [ / caps-man access-list find where \ +: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; + /caps-man/access-list/add comment=("hotspot-to-wpa template " . $Hotspot) disabled=yes place-before=$PlaceBefore; $LogPrintExit2 warning $0 ("Added template in access-list for hotspot '" . $Hotspot . "'.") false; } -:local Template [ / caps-man access-list get ([ find where \ +:local Template [ /caps-man/access-list/get ([ find where \ comment=("hotspot-to-wpa template " . $Hotspot) disabled ]->0) ]; :if ($Template->"action" = "reject") do={ @@ -42,31 +42,31 @@ # allow login page to load :delay 1s; -$LogPrintExit2 info $0 ("Adding/updating accesslist entry for mac address " . $MacAddress . \ +$LogPrintExit2 info $0 ("Adding/updating access-list entry for mac address " . $MacAddress . \ " (user " . $UserName . ").") false; -/ caps-man access-list remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; -/ caps-man access-list add comment=("hotspot-to-wpa: " . $UserName . ", " . $MacAddress . ", " . $Date) \ +/caps-man/access-list/remove [ find where mac-address=$MacAddress comment~"^hotspot-to-wpa: " ]; +/caps-man/access-list/add comment=("hotspot-to-wpa: " . $UserName . ", " . $MacAddress . ", " . $Date) \ mac-address=$MacAddress private-passphrase=($UserVal->"password") ssid-regexp="-wpa\$" place-before=$PlaceBefore; -:local Entry [ / caps-man access-list find where mac-address=$MacAddress \ +:local Entry [ /caps-man/access-list/find where mac-address=$MacAddress \ comment=("hotspot-to-wpa: " . $UserName . ", " . $MacAddress . ", " . $Date) ]; :local PrivatePassphrase [ $EitherOr ($UserInfo->"private-passphrase") ($Template->"private-passphrase") ]; :if ([ :len $PrivatePassphrase ] > 0) do={ :if ($PrivatePassphrase = "ignore") do={ - / caps-man access-list set $Entry !private-passphrase; + /caps-man/access-list/set $Entry !private-passphrase; } else={ - / caps-man access-list set $Entry private-passphrase=$PrivatePassphrase; + /caps-man/access-list/set $Entry private-passphrase=$PrivatePassphrase; } } :local SsidRegexp [ $EitherOr ($UserInfo->"ssid-regexp") ($Template->"ssid-regexp") ]; :if ([ :len $SsidRegexp ] > 0) do={ - / caps-man access-list set $Entry ssid-regexp=$SsidRegexp; + /caps-man/access-list/set $Entry ssid-regexp=$SsidRegexp; } :local VlanId [ $EitherOr ($UserInfo->"vlan-id") ($Template->"vlan-id") ]; :if ([ :len $VlanId ] > 0) do={ - / caps-man access-list set $Entry vlan-id=$VlanId; + /caps-man/access-list/set $Entry vlan-id=$VlanId; } :local VlanMode [ $EitherOr ($UserInfo->"vlan-mode") ($Template->"vlan-mode") ]; :if ([ :len $VlanMode] > 0) do={ - / caps-man access-list set $Entry vlan-mode=$VlanMode; + /caps-man/access-list/set $Entry vlan-mode=$VlanMode; } From c1d406fd4a6f54319011b27099429065514e03eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:00:41 +0200 Subject: [PATCH 24/99] hotspot-to-wpa-cleanup: RouterOS v7 path syntax --- hotspot-to-wpa-cleanup | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/hotspot-to-wpa-cleanup b/hotspot-to-wpa-cleanup index f54edc6..26610ae 100644 --- a/hotspot-to-wpa-cleanup +++ b/hotspot-to-wpa-cleanup @@ -17,35 +17,35 @@ $ScriptLock $0 false 10; -:foreach Client in=[ / caps-man registration-table find where comment~"^hotspot-to-wpa:" ] do={ - :local ClientVal [ / caps-man registration-table get $Client ]; - :local Lease [ / ip dhcp-server lease find where server~"wpa" dynamic \ +:foreach Client in=[ /caps-man/registration-table/find where comment~"^hotspot-to-wpa:" ] do={ + :local ClientVal [ /caps-man/registration-table/get $Client ]; + :local Lease [ /ip/dhcp-server/lease/find where server~"wpa" dynamic \ mac-address=($ClientVal->"mac-address") ]; :if ([ :len $Lease ] > 0) do={ $LogPrintExit2 info $0 ("Client with mac address " . ($ClientVal->"mac-address") . \ " connected to WPA, making lease static.") false; - / ip dhcp-server lease make-static $Lease; - / ip dhcp-server lease set comment=($ClientVal->"comment") $Lease; + /ip/dhcp-server/lease/make-static $Lease; + /ip/dhcp-server/lease/set comment=($ClientVal->"comment") $Lease; } } -:foreach Client in=[ / caps-man access-list find where comment~"^hotspot-to-wpa:" and \ - !(comment~[ / system clock get date ]) ] do={ - :local ClientVal [ / caps-man access-list get $Client ]; - :if ([ :len [ / ip dhcp-server lease find where server~"wpa" !dynamic \ +:foreach Client in=[ /caps-man/access-list/find where comment~"^hotspot-to-wpa:" and \ + !(comment~[ /system/clock/get date ]) ] do={ + :local ClientVal [ /caps-man/access-list/get $Client ]; + :if ([ :len [ /ip/dhcp-server/lease/find where server~"wpa" !dynamic \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ $LogPrintExit2 info $0 ("Client with mac address " . ($ClientVal->"mac-address") . \ " did not connect to WPA, removing from access list.") false; - / caps-man access-list remove $Client; + /caps-man/access-list/remove $Client; } } -:foreach Lease in=[ / ip dhcp-server lease find where !dynamic status=waiting \ +:foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status=waiting \ last-seen>4w comment~"^hotspot-to-wpa:" ] do={ - :local LeaseVal [ / ip dhcp-server lease get $Lease ]; + :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrintExit2 info $0 ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for long time, removing.") false; - / caps-man access-list remove [ find where comment~"^hotspot-to-wpa:" \ + /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; - / ip dhcp-server lease remove $Lease; + /ip/dhcp-server/lease/remove $Lease; } From 7979fb01085d610ade45387d40d098ffc0a60eaa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:01:19 +0200 Subject: [PATCH 25/99] ipsec-to-dns: RouterOS v7 path syntax --- ipsec-to-dns | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ipsec-to-dns b/ipsec-to-dns index 0131f62..c6cfdc4 100644 --- a/ipsec-to-dns +++ b/ipsec-to-dns @@ -26,43 +26,43 @@ :local CommentPrefix ("managed by " . $0 . " for "); :local CommentString ("--- " . $0 . " above ---"); -:if ([ :len [ / ip dns static find where comment=$CommentString name=- type=NXDOMAIN disabled ] ] = 0) do={ - / ip dns static add comment=$CommentString name=- type=NXDOMAIN disabled=yes; +:if ([ :len [ /ip/dns/static/find where comment=$CommentString name=- type=NXDOMAIN disabled ] ] = 0) do={ + /ip/dns/static/add comment=$CommentString name=- type=NXDOMAIN disabled=yes; $LogPrintExit2 warning $0 ("Added disabled static dns record with comment '" . $CommentString . "'.") false; } -:local PlaceBefore ([ / ip dns static find where comment=$CommentString name=- type=NXDOMAIN disabled ]->0); +:local PlaceBefore ([ /ip/dns/static/find where comment=$CommentString name=- type=NXDOMAIN disabled ]->0); -:foreach DnsRecord in=[ / ip dns static find where comment ~ $CommentPrefix ] do={ - :local DnsRecordVal [ / ip dns static get $DnsRecord ]; +:foreach DnsRecord in=[ /ip/dns/static/find where comment ~ $CommentPrefix ] do={ + :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; :local PeerId [ $CharacterReplace ($DnsRecordVal->"comment") $CommentPrefix "" ]; - :if ([ :len [ / ip ipsec active-peers find where id=$PeerId dynamic-address=($DnsRecordVal->"address") ] ] > 0) do={ + :if ([ :len [ /ip/ipsec/active-peers/find where id=$PeerId dynamic-address=($DnsRecordVal->"address") ] ] > 0) do={ $LogPrintExit2 debug $0 ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") still exists. Not deleting DNS entry.") false; } else={ :local Found false; $LogPrintExit2 info $0 ("Peer " . $PeerId . " (" . $DnsRecordVal->"name" . ") has gone, deleting DNS entry.") false; - / ip dns static remove $DnsRecord; + /ip/dns/static/remove $DnsRecord; } } -:foreach Peer in=[ / ip ipsec active-peers find where !(dynamic-address=[]) ] do={ - :local PeerVal [ / ip ipsec active-peers get $Peer ]; +:foreach Peer in=[ /ip/ipsec/active-peers/find where !(dynamic-address=[]) ] do={ + :local PeerVal [ /ip/ipsec/active-peers/get $Peer ]; :local Comment ($CommentPrefix . $PeerVal->"id"); :put ($PeerVal->"id"); :local HostName [ :pick ($PeerVal->"id") 0 [ :find ($PeerVal->"id" . ".") "." ] ]; :put $HostName; :local Fqdn ($HostName . "." . $Zone); - :local DnsRecord [ / ip dns static find where name=$Fqdn ]; + :local DnsRecord [ /ip/dns/static/find where name=$Fqdn ]; :if ([ :len $DnsRecord ] > 0) do={ - :local DnsIp [ / ip dns static get $DnsRecord address ]; + :local DnsIp [ /ip/dns/static/get $DnsRecord address ]; :if ($DnsIp = $PeerVal->"dynamic-address") do={ $LogPrintExit2 debug $0 ("DNS entry for " . $Fqdn . " does not need updating.") false; } else={ $LogPrintExit2 info $0 ("Replacing DNS entry for " . $Fqdn . ", new address is " . $PeerVal->"dynamic-address" . ".") false; - / ip dns static set name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment $DnsRecord; + /ip/dns/static/set name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment $DnsRecord; } } else={ $LogPrintExit2 info $0 ("Adding new DNS entry for " . $Fqdn . ", address is " . $PeerVal->"dynamic-address" . ".") false; - / ip dns static add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; + /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } From 3befc38d21f22e08d15ccb7996f49f25a18f557d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:02:43 +0200 Subject: [PATCH 26/99] ipv6-update: RouterOS v7 path syntax --- ipv6-update | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ipv6-update b/ipv6-update index 742a7cf..b81a0ec 100644 --- a/ipv6-update +++ b/ipv6-update @@ -19,44 +19,44 @@ $LogPrintExit2 error $0 ("This script is supposed to run from ipv6 dhcp-client.") true; } -: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); +: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 $0 ("Added ipv6 address list entry for ipv6-pool-" . $Pool) false; } -:local AddrList [ / ipv6 firewall address-list find where comment=("ipv6-pool-" . $Pool) ]; -:local OldPrefix [ / ipv6 firewall address-list get ($AddrList->0) address ]; +: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 $0 ("Updating IPv6 address list with new IPv6 prefix " . $PdPrefix) false; - / ipv6 firewall address-list set address=$PdPrefix $AddrList; + /ipv6/firewall/address-list/set address=$PdPrefix $AddrList; # give the interfaces a moment to receive their addresses :delay 2s; - :foreach ListEntry in=[ / ipv6 firewall address-list find where comment~("^ipv6-pool-" . $Pool . ",") ] do={ - :local ListEntryVal [ / ipv6 firewall address-list get $ListEntry ]; + :foreach ListEntry in=[ /ipv6/firewall/address-list/find where comment~("^ipv6-pool-" . $Pool . ",") ] do={ + :local ListEntryVal [ /ipv6/firewall/address-list/get $ListEntry ]; :local Comment [ $ParseKeyValueStore ($ListEntryVal->"comment") ]; - :local Address [ / ipv6 address find where from-pool=$Pool interface=($Comment->"interface") ]; + :local Address [ /ipv6/address/find where from-pool=$Pool interface=($Comment->"interface") ]; :if ([ :len $Address ] = 1) do={ - :set Address [ / ipv6 address get $Address address ]; + :set Address [ /ipv6/address/get $Address address ]; $LogPrintExit2 info $0 ("Updating IPv6 address list with new IPv6 prefix " . $Address . \ " from interface " . ($Comment->"interface")) false; - / ipv6 firewall address-list set address=$Address $ListEntry; + /ipv6/firewall/address-list/set address=$Address $ListEntry; } } - :foreach Record in=[ / ip dns static find where comment~("^ipv6-pool-" . $Pool . ",") ] do={ - :local RecordVal [ / ip dns static get $Record ]; + :foreach Record in=[ /ip/dns/static/find where comment~("^ipv6-pool-" . $Pool . ",") ] do={ + :local RecordVal [ /ip/dns/static/get $Record ]; :local Comment [ $ParseKeyValueStore ($RecordVal->"comment") ]; - :local Prefix [ / ipv6 address get [ find where interface=($Comment->"interface") from-pool=$Pool global ] address ]; + :local Prefix [ /ipv6/address/get [ find where interface=($Comment->"interface") from-pool=$Pool global ] address ]; :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 $0 ("Updating DNS record for " . ($RecordVal->"name") . \ ($RecordVal->"regexp") . " to " . $Address) false; - / ip dns static set address=$Address $Record; + /ip/dns/static/set address=$Address $Record; } } From 0fec08c0cdd17667ea2eb8fbdf64ca73169272ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:03:30 +0200 Subject: [PATCH 27/99] ip-addr-bridge: RouterOS v7 path syntax --- ip-addr-bridge | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ip-addr-bridge b/ip-addr-bridge index 783ff2f..218eb2e 100644 --- a/ip-addr-bridge +++ b/ip-addr-bridge @@ -6,13 +6,13 @@ # enable or disable ip addresses based on bridge port state # https://git.eworm.de/cgit/routeros-scripts/about/doc/ip-addr-bridge.md -:foreach Bridge in=[ / interface bridge find ] do={ - :local BrName [ / interface bridge get $Bridge name ]; - :if ([ :len [ / interface bridge port find where bridge=$BrName ] ] > 0) do={ - :if ([ :len [ / interface bridge port find where bridge=$BrName and inactive=no ] ] = 0) do={ - / ip address disable [ find where !dynamic interface=$BrName ]; +:foreach Bridge in=[ /interface/bridge/find ] do={ + :local BrName [ /interface/bridge/get $Bridge name ]; + :if ([ :len [ /interface/bridge/port/find where bridge=$BrName ] ] > 0) do={ + :if ([ :len [ /interface/bridge/port/find where bridge=$BrName and inactive=no ] ] = 0) do={ + /ip/address/disable [ find where !dynamic interface=$BrName ]; } else={ - / ip address enable [ find where !dynamic interface=$BrName ]; + /ip/address/enable [ find where !dynamic interface=$BrName ]; } } } From 2ab87f5143191915c27b8d4fe2bb50a032c2d2a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:05:56 +0200 Subject: [PATCH 28/99] learn-mac-based-vlan: RouterOS v7 path syntax --- learn-mac-based-vlan | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/learn-mac-based-vlan b/learn-mac-based-vlan index e05fb7e..ce8957d 100644 --- a/learn-mac-based-vlan +++ b/learn-mac-based-vlan @@ -7,7 +7,7 @@ :local NewVlanId 33; -:if ([ :len [ / interface ethernet switch mac-based-vlan find where src-mac-address=$leaseActMAC ] ] = 0 ) do={ +:if ([ :len [ /interface/ethernet/switch/mac-based-vlan/find where src-mac-address=$leaseActMAC ] ] = 0 ) do={ :log info ("MAC-based-VLAN: learning MAC address " . $leaseActMAC . " for VLAN " . $NewVlanId . "."); - / interface ethernet switch mac-based-vlan add src-mac-address=$leaseActMAC new-customer-vid=$NewVlanId; + /interface/ethernet/switch/mac-based-vlan/add src-mac-address=$leaseActMAC new-customer-vid=$NewVlanId; } From 7d5418718ce02a4ff471ebbb9a4cb1c8fc750be7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:06:01 +0200 Subject: [PATCH 29/99] lease-script: RouterOS v7 path syntax --- lease-script | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lease-script b/lease-script index 2b873c8..fa03e11 100644 --- a/lease-script +++ b/lease-script @@ -27,15 +27,15 @@ $LogPrintExit2 debug $0 ("DHCP Server " . $leaseServerName . " " . [ $IfThenElse $ScriptLock $0 false 10; -:if ([ :len [ / system script job find where script=$0 ] ] > 1) do={ +:if ([ :len [ /system/script/job/find where script=$0 ] ] > 1) do={ $LogPrintExit2 debug $0 ("More invocations are waiting, exiting early.") true; } :local RunOrder [ :toarray "" ]; -:foreach Script in=[ / system script find where source~("\n# provides: lease-script, ") ] do={ - :local Name [ / system script get $Script name ]; - :local Store [ / system script get $Script source ]; +:foreach Script in=[ /system/script/find where source~("\n# provides: lease-script, ") ] do={ + :local Name [ /system/script/get $Script name ]; + :local Store [ /system/script/get $Script source ]; :set Store [ :pick $Store ([ :find $Store "\n# provides: lease-script, " ] + 27) [ :len $Store ] ]; :set Store [ :pick $Store 0 [ :find $Store "\n" ] ]; @@ -47,7 +47,7 @@ $ScriptLock $0 false 10; :foreach Order,Script in=$RunOrder do={ :do { $LogPrintExit2 debug $0 ("Running script with order " . $Order . ": " . $Script) false; - / system script run $Script; + /system/script/run $Script; } on-error={ $LogPrintExit2 warning $0 ("Running script '" . $Script . "' failed!") false; } From efc3e997ef4e4ad22cbfe9213693981e0f6b0694 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:07:47 +0200 Subject: [PATCH 30/99] leds-{day,night,toggle}-mode: RouterOS v7 path syntax --- leds-day-mode | 2 +- leds-night-mode | 2 +- leds-toggle-mode | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/leds-day-mode b/leds-day-mode index ed6f68d..78e1fae 100644 --- a/leds-day-mode +++ b/leds-day-mode @@ -6,4 +6,4 @@ # enable LEDs # https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md -/ system leds settings set all-leds-off=never; +/system/leds/settings/set all-leds-off=never; diff --git a/leds-night-mode b/leds-night-mode index af2388c..112f9a1 100644 --- a/leds-night-mode +++ b/leds-night-mode @@ -6,4 +6,4 @@ # disable LEDs # https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md -/ system leds settings set all-leds-off=immediate; +/system/leds/settings/set all-leds-off=immediate; diff --git a/leds-toggle-mode b/leds-toggle-mode index 8ec66e3..225ceb2 100644 --- a/leds-toggle-mode +++ b/leds-toggle-mode @@ -6,8 +6,8 @@ # 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; +: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; } From 1c56809cd4303ab1c38ffddf5d429ec22a57bd1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:08:30 +0200 Subject: [PATCH 31/99] log-forward: RouterOS v7 path syntax --- log-forward | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward b/log-forward index 3cd83d5..1aa0363 100644 --- a/log-forward +++ b/log-forward @@ -52,10 +52,10 @@ $WaitFullyConnected; :local LogForwardFilterLogForwarding ("^" . [ $EscapeForRegEx ("Error sending e-mail <" . \ [ $QuotedPrintable ("[" . $Identity . "] " . [ $SymbolForNotification "warning-sign" ] . \ "Log Forwarding") ] . ">:") ]); -:foreach Message in=[ / log find where (!(message="") and !(message~$LogForwardFilterLogForwarding) and \ +:foreach Message in=[ /log/find where (!(message="") and !(message~$LogForwardFilterLogForwarding) and \ !(topics~$LogForwardFilter) and !(message~$LogForwardFilterMessage)) or \ topics~$LogForwardInclude or message~$LogForwardIncludeMessage ] do={ - :set MessageVal [ / log get $Message ]; + :set MessageVal [ /log/get $Message ]; :if ($Last < [ $HexToNum ($MessageVal->".id") ]) do={ :local DupCount ($MessageDups->($MessageVal->"message")); @@ -75,7 +75,7 @@ $WaitFullyConnected; subject=([ $SymbolForNotification "warning-sign" ] . "Log Forwarding"); \ message=("The log on " . $Identity . " contains " . [ $IfThenElse ($Count = 1) \ "this message" ("these " . $Count . " messages") ] . " after " . \ - [ / system resource get uptime ] . " uptime." . [ $IfThenElse ($Duplicates = true) \ + [ /system/resource/get uptime ] . " uptime." . [ $IfThenElse ($Duplicates = true) \ (" Multi-repeated messages have been skipped.") ] . "\n" . $Messages) }); :set LogForwardRateLimit ($LogForwardRateLimit + 10); From 8c5348737024038754314d62f1af13eb007c7132 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:09:08 +0200 Subject: [PATCH 32/99] manage-umts: RouterOS v7 path syntax --- manage-umts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manage-umts b/manage-umts index 8f782ec..0cd3e8f 100644 --- a/manage-umts +++ b/manage-umts @@ -9,21 +9,21 @@ :local WlanInt "wl-station"; :local UmtsInt "t-mobile"; -:local EtherStatus [ / interface ethernet get $EtherInt running ]; -:local WlanStatus [ / interface wireless get $WlanInt running ]; +:local EtherStatus [ /interface/ethernet/get $EtherInt running ]; +:local WlanStatus [ /interface/wireless/get $WlanInt running ]; :if ($EtherStatus = true || $WlanStatus = true) do={ - :if ([ / interface get $UmtsInt disabled ] = false) do={ + :if ([ /interface/get $UmtsInt disabled ] = false) do={ :log info ("Ethernet (" . $EtherInt . " / " . $EtherStatus . ") or " . \ "wireless (" . $WlanInt . " / " . $WlanStatus . ") is running, " . \ "UMTS interface " . $UmtsInt . " is enabled. Disabling..."); - / interface set disabled=yes $UmtsInt; + /interface/set disabled=yes $UmtsInt; } } else={ - :if ([ / interface get $UmtsInt disabled ] = true) do={ + :if ([ /interface/get $UmtsInt disabled ] = true) do={ :log info ("Neither ethernet (" . $EtherInt . ") nor wireless (" . \ $WlanInt . ") interface is running, UMTS interface " . $UmtsInt . \ " is disabled. Enabling..."); - / interface set disabled=no $UmtsInt; + /interface/set disabled=no $UmtsInt; } } From 158aea4756edf1d013a910d3fb06fccd8ac2142f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:09:42 +0200 Subject: [PATCH 33/99] mod/bridge-port-to: RouterOS v7 path syntax --- mod/bridge-port-to | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mod/bridge-port-to b/mod/bridge-port-to index d88b1cd..c2ab55b 100644 --- a/mod/bridge-port-to +++ b/mod/bridge-port-to @@ -15,34 +15,34 @@ :global LogPrintExit2; :global ParseKeyValueStore; - :foreach BridgePort in=[ / interface bridge port find where !(comment=[]) ] do={ - :local BridgePortVal [ / interface bridge port get $BridgePort ]; + :foreach BridgePort in=[ /interface/bridge/port/find where !(comment=[]) ] do={ + :local BridgePortVal [ /interface/bridge/port/get $BridgePort ]; :foreach Config,BridgeDefault in=[ $ParseKeyValueStore ($BridgePortVal->"comment") ] do={ :if ($Config = $BridgePortTo) do={ - :local DHCPClient [ / ip dhcp-client find where interface=$BridgePortVal->"interface" comment="toggle with bridge port" ]; + :local DHCPClient [ /ip/dhcp-client/find where interface=$BridgePortVal->"interface" comment="toggle with bridge port" ]; :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; } - :local DHCPClientDisabled [ / ip dhcp-client get $DHCPClient disabled ]; + :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; - / interface bridge port disable $BridgePort; + /interface/bridge/port/disable $BridgePort; :delay 200ms; - / ip dhcp-client enable $DHCPClient; + /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; :if ([ :len $DHCPClient ] = 1) do={ - / ip dhcp-client disable $DHCPClient; + /ip/dhcp-client/disable $DHCPClient; :delay 200ms; } - / interface bridge port set disabled=no bridge=$BridgeDefault $BridgePort; + /interface/bridge/port/set disabled=no bridge=$BridgeDefault $BridgePort; } else={ $LogPrintExit2 debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $BridgePortTo . \ " bridge " . $BridgeDefault . ".") false; From 9bd9f4b4bac56ad1a8278e634d3e64e5fd10102b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:09:50 +0200 Subject: [PATCH 34/99] mod/bridge-port-vlan: RouterOS v7 path syntax --- mod/bridge-port-vlan | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mod/bridge-port-vlan b/mod/bridge-port-vlan index db9cbfd..6255dff 100644 --- a/mod/bridge-port-vlan +++ b/mod/bridge-port-vlan @@ -16,29 +16,29 @@ :global LogPrintExit2; :global ParseKeyValueStore; - :foreach BridgePort in=[ / interface bridge port find where !(comment=[]) ] do={ - :local BridgePortVal [ / interface bridge port get $BridgePort ]; + :foreach BridgePort in=[ /interface/bridge/port/find where !(comment=[]) ] do={ + :local BridgePortVal [ /interface/bridge/port/get $BridgePort ]; :foreach Config,Vlan in=[ $ParseKeyValueStore ($BridgePortVal->"comment") ] do={ :if ($Config = $ConfigTo) do={ - :local DHCPClient [ / ip dhcp-client find where interface=$BridgePortVal->"interface" comment="toggle with bridge port" ]; + :local DHCPClient [ /ip/dhcp-client/find where interface=$BridgePortVal->"interface" comment="toggle with bridge port" ]; :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; } - :local DHCPClientDisabled [ / ip dhcp-client get $DHCPClient disabled ]; + :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; - / interface bridge port disable $BridgePort; + /interface/bridge/port/disable $BridgePort; :delay 200ms; - / ip dhcp-client enable $DHCPClient; + /ip/dhcp-client/enable $DHCPClient; } } else={ :if ($Vlan != [ :tostr [ :tonum $Vlan ] ]) do={ :do { - :set $Vlan ([ / interface bridge vlan get [ find where comment=$Vlan ] vlan-ids ]->0); + :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; } @@ -47,10 +47,10 @@ $LogPrintExit2 info $0 ("Enabling bridge port for interface " . $BridgePortVal->"interface" . ", changing to " . $ConfigTo . \ " vlan " . $Vlan . ", disabling dhcp client.") false; :if ([ :len $DHCPClient ] = 1) do={ - / ip dhcp-client disable $DHCPClient; + /ip/dhcp-client/disable $DHCPClient; :delay 200ms; } - / interface bridge port set disabled=no pvid=$Vlan $BridgePort; + /interface/bridge/port/set disabled=no pvid=$Vlan $BridgePort; } else={ $LogPrintExit2 debug $0 ("Interface " . $BridgePortVal->"interface" . " already connected to " . $ConfigTo . \ " vlan " . $Vlan . ".") false; From 50a139248ff4e9e026d2330c41781f915d39a115 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:11:53 +0200 Subject: [PATCH 35/99] mod/notification-matrix: RouterOS v7 path syntax --- mod/notification-matrix | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mod/notification-matrix b/mod/notification-matrix index 4ec5f6c..c3cf24f 100644 --- a/mod/notification-matrix +++ b/mod/notification-matrix @@ -18,14 +18,14 @@ :local AllDone true; :local QueueLen [ :len $MatrixQueue ]; - :if ([ :len [ / system scheduler find where name="FlushMatrixQueue" ] ] > 0 && $QueueLen = 0) do={ + :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; } :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-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" . "\"," . \ @@ -40,7 +40,7 @@ } :if ($AllDone = true && $QueueLen = [ :len $MatrixQueue ]) do={ - / system scheduler remove [ find where name="FlushMatrixQueue" ]; + /system/scheduler/remove [ find where name="FlushMatrixQueue" ]; :set MatrixQueue; } } @@ -113,7 +113,7 @@ } :do { - / tool fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ "/send/m.room.message?access_token=" . $AccessToken) \ http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Plain . "\"," . \ @@ -126,15 +126,15 @@ :set MatrixQueue [ :toarray "" ]; } :local Text ([ $SymbolForNotification "alarm-clock" ] . \ - "This message was queued since " . [ / system clock get date ] . \ - " " . [ / system clock get time ] . " and may be obsolete."); + "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); :set ($MatrixQueue->[ :len $MatrixQueue ]) { room=$Room; \ accesstoken=$AccessToken; homeserver=$HomeServer; \ plain=$Plain; formatted=$Formatted }; - :if ([ :len [ / system scheduler find where name="FlushMatrixQueue" ] ] = 0) do={ - / system scheduler add name=FlushMatrixQueue interval=1m start-time=startup \ + :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;"); } } From 20b5ca4918b8e087c500f44c5d243feb3674e9ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:13:34 +0200 Subject: [PATCH 36/99] mod/notification-telegram: RouterOS v7 path syntax --- mod/notification-telegram | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mod/notification-telegram b/mod/notification-telegram index d42d459..230dd57 100644 --- a/mod/notification-telegram +++ b/mod/notification-telegram @@ -17,14 +17,14 @@ :local AllDone true; :local QueueLen [ :len $TelegramQueue ]; - :if ([ :len [ / system scheduler find where name="FlushTelegramQueue" ] ] > 0 && $QueueLen = 0) do={ + :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; } :foreach Id,Message in=$TelegramQueue 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-method=post \ ("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \ http-data=("chat_id=" . ($Message->"chatid") . \ "&disable_notification=" . ($Message->"silent") . \ @@ -39,7 +39,7 @@ } :if ($AllDone = true && $QueueLen = [ :len $TelegramQueue ]) do={ - / system scheduler remove [ find where name="FlushTelegramQueue" ]; + /system/scheduler/remove [ find where name="FlushTelegramQueue" ]; :set TelegramQueue; } } @@ -125,7 +125,7 @@ :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; } - / tool fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ ("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \ http-data=("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ "&disable_web_page_preview=true&parse_mode=" . $ParseMode . "&text=" . $Text) as-value; @@ -136,12 +136,12 @@ :set TelegramQueue [ :toarray "" ]; } :set Text ($Text . [ $UrlEncode ("\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; parsemode=$ParseMode; text=$Text; silent=($Notification->"silent") }; - :if ([ :len [ / system scheduler find where name="FlushTelegramQueue" ] ] = 0) do={ - / system scheduler add name=FlushTelegramQueue interval=1m start-time=startup \ + :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 2f46495be164e3ec8785ed7e25d2e4fe39c33d64 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:14:02 +0200 Subject: [PATCH 37/99] mod/scriptrunonce: RouterOS v7 path syntax --- mod/scriptrunonce | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/scriptrunonce b/mod/scriptrunonce index 3e02236..6cca175 100644 --- a/mod/scriptrunonce +++ b/mod/scriptrunonce @@ -25,7 +25,7 @@ :local Source; :do { - :set Source ([ / tool fetch check-certificate=yes-without-crl $Script output=user as-value ]->"data"); + :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; } From 0e466c3b81017c582c851e2dbf15fe8a7cee46a4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:09:45 +0200 Subject: [PATCH 38/99] mode-button: RouterOS v7 path syntax --- mode-button | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mode-button b/mode-button index e1b2a23..e4d33cc 100644 --- a/mode-button +++ b/mode-button @@ -16,7 +16,7 @@ :set ($ModeButton->"count") ($ModeButton->"count" + 1); -:local Scheduler [ / system scheduler find where name="ModeButtonScheduler" ]; +:local Scheduler [ /system/scheduler/find where name="ModeButtonScheduler" ]; :if ([ :len $Scheduler ] = 0) do={ $LogPrintExit2 info $0 ("Creating scheduler ModeButtonScheduler, counting presses...") false; @@ -32,11 +32,11 @@ :global IfThenElse; - :local LED [ / system leds find where leds=$ModeButtonLED type~"^(on|off)\$" interface=[] ]; + :local LED [ /system/leds/find where leds=$ModeButtonLED type~"^(on|off)\$" interface=[] ]; :if ([ :len $LED ] = 0) do={ :return false; } - / system leds set type=[ $IfThenElse ([ get $LED type ] = "on") "off" "on" ] $LED; + /system/leds/set type=[ $IfThenElse ([ get $LED type ] = "on") "off" "on" ] $LED; } :local Count ($ModeButton->"count"); @@ -44,7 +44,7 @@ :set ($ModeButton->"count") 0; :set ModeButtonScheduler; - / system scheduler remove ModeButtonScheduler; + /system/scheduler/remove ModeButtonScheduler; :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ @@ -52,7 +52,7 @@ :for I from=1 to=$Count do={ $LEDInvert; - :if ([ / system routerboard settings get silent-boot ] = false) do={ + :if ([ /system/routerboard/settings/get silent-boot ] = false) do={ :beep length=200ms; } :delay 200ms; @@ -68,9 +68,9 @@ $LogPrintExit2 info $0 ("No action defined for " . $Count . " mode-button presses.") false; } } - / system scheduler add name="ModeButtonScheduler" \ + /system/scheduler/add name="ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; } else={ $LogPrintExit2 debug $0 ("Updating scheduler ModeButtonScheduler...") false; - / system scheduler set $Scheduler start-time=[ /system clock get time ]; + /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } From 0696c6ca889dc0b154aaa171f9746e3adebfb1a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:11:33 +0200 Subject: [PATCH 39/99] netwatch-dns: RouterOS v7 path syntax --- netwatch-dns | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/netwatch-dns b/netwatch-dns index e2fcfa3..64c2d8e 100644 --- a/netwatch-dns +++ b/netwatch-dns @@ -17,16 +17,16 @@ $ScriptLock $0; -:if ([ / system resource get uptime ] < 5m) do={ +:if ([ /system/resource/get uptime ] < 5m) do={ $LogPrintExit2 info $0 ("System just booted, giving netwatch some time to settle.") true; } :local DnsServers [ :toarray "" ]; :local DnsFallback [ :toarray "" ]; -:local DnsCurrent [ / ip dns get servers ]; +:local DnsCurrent [ /ip/dns/get servers ]; -:foreach Host in=[ / tool netwatch find where comment~"dns" disabled=no ] do={ - :local HostVal [ / tool netwatch get $Host ]; +:foreach Host in=[ /tool/netwatch/find where comment~"dns" disabled=no ] do={ + :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; :if ($HostVal->"status" = "up" && $HostInfo->"disabled" != true) do={ @@ -42,24 +42,24 @@ $ScriptLock $0; :if ([ :len $DnsServers ] > 0) do={ :if ($DnsServers != $DnsCurrent) do={ $LogPrintExit2 info $0 ("Updating DNS servers: " . [ :tostr $DnsServers ]) false; - / ip dns set servers=$DnsServers; - / ip dns cache flush; + /ip/dns/set servers=$DnsServers; + /ip/dns/cache/flush; } } else={ :if ([ :len $DnsFallback ] > 0) do={ :if ($DnsFallback != $DnsCurrent) do={ $LogPrintExit2 info $0 ("Updating DNS servers to fallback: " . [ :tostr $DnsFallback ]) false; - / ip dns set servers=$DnsFallback; - / ip dns cache flush; + /ip/dns/set servers=$DnsFallback; + /ip/dns/cache/flush; } } } :local DohServer ""; -:local DohCurrent [ / ip dns get use-doh-server ]; +:local DohCurrent [ /ip/dns/get use-doh-server ]; -:foreach Host in=[ / tool netwatch find where comment~"doh" disabled=no ] do={ - :local HostVal [ / tool netwatch get $Host ]; +:foreach Host in=[ /tool/netwatch/find where comment~"doh" disabled=no ] do={ + :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; :if ($HostVal->"status" = "up" && $HostInfo->"doh" = true && $HostInfo->"disabled" != true && $DohServer = "") do={ @@ -70,13 +70,13 @@ $ScriptLock $0; :if ($DohServer != "") do={ :if ($DohServer != $DohCurrent) do={ $LogPrintExit2 info $0 ("Updating DoH server: " . $DohServer) false; - / ip dns set use-doh-server=$DohServer; - / ip dns cache flush; + /ip/dns/set use-doh-server=$DohServer; + /ip/dns/cache/flush; } } else={ :if ($DohCurrent != "") do={ $LogPrintExit2 info $0 ("DoH server (" . $DohCurrent . ") is down, disabling.") false; - / ip dns set use-doh-server=""; - / ip dns cache flush; + /ip/dns/set use-doh-server=""; + /ip/dns/cache/flush; } } From b368ee9902eea02c9e4ea4222cc02af0561e6441 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:11:44 +0200 Subject: [PATCH 40/99] netwatch-notify: RouterOS v7 path syntax --- netwatch-notify | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netwatch-notify b/netwatch-notify index 34a9e8f..47b7fa1 100644 --- a/netwatch-notify +++ b/netwatch-notify @@ -46,7 +46,7 @@ $ScriptLock $0; -:if ([ / system resource get uptime ] < 5m) do={ +:if ([ /system/resource/get uptime ] < 5m) do={ $LogPrintExit2 info $0 ("System just booted, giving netwatch some time to settle.") true; } @@ -54,8 +54,8 @@ $ScriptLock $0; :set NetwatchNotify [ :toarray "" ]; } -:foreach Host in=[ / tool netwatch find where comment~"notify" disabled=no ] do={ - :local HostVal [ / tool netwatch get $Host ]; +:foreach Host in=[ /tool/netwatch/find where comment~"notify" disabled=no ] do={ + :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; :if ($HostInfo->"notify" = true && $HostInfo->"disabled" != true) do={ @@ -74,7 +74,7 @@ $ScriptLock $0; $LogPrintExit2 info $0 ("Name '" . $HostInfo->"resolve" . [ $IfThenElse ($HostInfo->"resolve" != \ $HostInfo->"hostname") ("' for host '" . $HostInfo->"hostname") "" ] . \ "' resolves to different address " . $Resolve . ", updating.") false; - / tool netwatch set host=$Resolve $Host; + /tool/netwatch/set host=$Resolve $Host; :set ($Metric->"resolve-failed") false; } } on-error={ From c18821deb5b1a1128ae6b4bb16a53d11affaa356 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:11:51 +0200 Subject: [PATCH 41/99] netwatch-syslog: RouterOS v7 path syntax --- netwatch-syslog | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netwatch-syslog b/netwatch-syslog index 42e5c52..1d9f37b 100644 --- a/netwatch-syslog +++ b/netwatch-syslog @@ -8,10 +8,10 @@ # manage remote logging facilities # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-syslog.md -:local Remote [ /system logging action get ([ find where target=remote ]->0) remote ]; +:local Remote [ /system/logging/action/get ([ find where target=remote ]->0) remote ]; -if ([ / tool netwatch get [ find where host=$Remote up-script="netwatch-syslog" down-script="netwatch-syslog" ] status ] = "up") do={ - / system logging set disabled=no [ find where action=remote disabled=yes ]; +if ([ /tool/netwatch/get [ find where host=$Remote up-script="netwatch-syslog" down-script="netwatch-syslog" ] status ] = "up") do={ + /system/logging/set disabled=no [ find where action=remote disabled=yes ]; } else={ - / system logging set disabled=yes [ find where action=remote disabled=no ]; + /system/logging/set disabled=yes [ find where action=remote disabled=no ]; } From 008046d569a995d393fc8be1cd8c1fbeb1d76641 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:12:28 +0200 Subject: [PATCH 42/99] ospf-to-leds: RouterOS v7 path syntax --- ospf-to-leds | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ospf-to-leds b/ospf-to-leds index 39501c9..c4acb30 100644 --- a/ospf-to-leds +++ b/ospf-to-leds @@ -13,23 +13,23 @@ :global LogPrintExit2; :global ParseKeyValueStore; -:foreach Instance in=[ / routing ospf instance find where comment~"^ospf-to-leds," ] do={ - :local InstanceVal [ / routing ospf instance get $Instance ]; +:foreach Instance in=[ /routing/ospf/instance/find where comment~"^ospf-to-leds," ] do={ + :local InstanceVal [ /routing/ospf/instance/get $Instance ]; :local LED ([ $ParseKeyValueStore ($InstanceVal->"comment") ]->"leds"); - :local LEDType [ / system leds get [ find where leds=$LED ] type ]; + :local LEDType [ /system/leds/get [ find where leds=$LED ] type ]; :local NeighborCount 0; - :foreach Area in=[ / routing ospf area find where instance=($InstanceVal->"name") ] do={ - :local AreaName [ / routing ospf area get $Area name ]; - :set NeighborCount ($NeighborCount + [ :len [ / routing ospf neighbor find where area=$AreaName ] ]); + :foreach Area in=[ /routing/ospf/area/find where instance=($InstanceVal->"name") ] do={ + :local AreaName [ /routing/ospf/area/get $Area name ]; + :set NeighborCount ($NeighborCount + [ :len [ /routing/ospf/neighbor/find where area=$AreaName ] ]); } :if ($NeighborCount > 0 && $LEDType = "off") do={ $LogPrintExit2 info $0 ("OSPF instance " . $InstanceVal->"name" . " has " . $NeighborCount . " neighbors, led on!") false; - / system leds set type=on [ find where leds=$LED ]; + /system/leds/set type=on [ find where leds=$LED ]; } :if ($NeighborCount = 0 && $LEDType = "on") do={ $LogPrintExit2 info $0 ("OSPF instance " . $InstanceVal->"name" . " has no neighbors, led off!") false; - / system leds set type=off [ find where leds=$LED ]; + /system/leds/set type=off [ find where leds=$LED ]; } } From ba0bb3d2d4fcc1b44681f846630cbabc3c9c96b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:13:05 +0200 Subject: [PATCH 43/99] packages-update: RouterOS v7 path syntax --- packages-update | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages-update b/packages-update index 2e6d8be..2922759 100644 --- a/packages-update +++ b/packages-update @@ -18,7 +18,7 @@ $ScriptLock $0; -:local Update [ / system package update get ]; +:local Update [ /system/package/update/get ]; :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ $LogPrintExit2 warning $0 ("Latest version is not known.") true; @@ -35,7 +35,7 @@ $ScriptLock $0; :if ($NumInstalled > $NumLatest) do={ :if ([ $ScriptFromTerminal $0 ] = true) do={ :put "Latest version is older than installed one. Want to downgrade? [y/N]"; - :if (([ / terminal inkey timeout=60 ] % 32) = 25) do={ + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ :set DoDowngrade true; } else={ :put "Canceled..."; @@ -45,23 +45,23 @@ $ScriptLock $0; } } -:foreach Package in=[ / system package find where !bundle ] do={ - :local PkgName [ / system package get $Package name ]; +: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 $0 ("Download for package " . $PkgName . " failed, update aborted.") true; } } -:foreach Script in=[ / system script find where source~"\n# provides: backup-script\n" ] do={ - :local ScriptName [ / system script get $Script name ]; +:foreach Script in=[ /system/script/find where source~"\n# provides: backup-script\n" ] do={ + :local ScriptName [ /system/script/get $Script name ]; :do { $LogPrintExit2 info $0 ("Running backup script " . $ScriptName . " before update.") false; - / system script run $Script; + /system/script/run $Script; } on-error={ $LogPrintExit2 warning $0 ("Running backup script " . $ScriptName . " before update failed!") false; :if ([ $ScriptFromTerminal $0 ] = true) do={ :put "Do you want to continue anyway? [y/N]"; - :if (([ / terminal inkey timeout=60 ] % 32) = 25) do={ + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $LogPrintExit2 info $0 ("User requested to continue anyway.") false; } else={ $LogPrintExit2 info $0 ("Canceled update...") true; @@ -75,19 +75,19 @@ $ScriptLock $0; :if ($DoDowngrade = true) do={ $LogPrintExit2 info $0 ("Rebooting for downgrade.") false; :delay 1s; - / system package downgrade; + /system/package/downgrade; } :if ([ $ScriptFromTerminal $0 ] = true) do={ :put "Do you want to (s)chedule reboot or (r)eboot now? [s/R]"; - :if (([ / terminal inkey timeout=60 ] % 32) = 19) do={ - / system scheduler add name="reboot-for-update" start-time=03:00:00 interval=1d \ + :if (([ /terminal/inkey timeout=60 ] % 32) = 19) do={ + /system/scheduler/add name="reboot-for-update" start-time=03:00:00 interval=1d \ on-event=(":global RandomDelay; \$RandomDelay 3600; " . \ - "/ system scheduler remove reboot-for-update; / system reboot;"); + "/system/scheduler/remove reboot-for-update; /system/reboot;"); $LogPrintExit2 info $0 ("Scheduled reboot for update between 03:00 and 04:00.") true; } } $LogPrintExit2 info $0 ("Rebooting for update.") false; :delay 1s; -/ system reboot; +/system/reboot; From b90585f69095e6250dac65a25045fb83bcbd487c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:13:53 +0200 Subject: [PATCH 44/99] ppp-on-up: RouterOS v7 path syntax --- ppp-on-up | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ppp-on-up b/ppp-on-up index eebe81c..0529352 100644 --- a/ppp-on-up +++ b/ppp-on-up @@ -18,16 +18,16 @@ $LogPrintExit2 error $0 ("This script is supposed to run from ppp on-up script hook.") true; } -:local IntName [ / interface get $Interface name ]; +:local IntName [ /interface/get $Interface name ]; $LogPrintExit2 info $0 ("PPP interface " . $IntName . " is up.") false; -/ ipv6 dhcp-client release [ find where interface=$IntName !disabled ]; +/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 ]; +: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 $0 ("Running script: " . $ScriptName) false; - / system script run $Script; + /system/script/run $Script; } on-error={ $LogPrintExit2 warning $0 ("Running script '" . $ScriptName . "' failed!") false; } From 735df85b450be430999384e947d1c7b473e691ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:14:34 +0200 Subject: [PATCH 45/99] rotate-ntp: RouterOS v7 path syntax --- rotate-ntp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rotate-ntp b/rotate-ntp index dd3483a..2a095f8 100644 --- a/rotate-ntp +++ b/rotate-ntp @@ -17,7 +17,7 @@ :local Ntp1; :local Ntp2; -:if ([ / system ntp client get enabled ] != true) do={ +:if ([ /system/ntp/client/get enabled ] != true) do={ $LogPrintExit2 warning $0 ("NTP client is not enabled!") true; } @@ -29,4 +29,4 @@ } $LogPrintExit2 info $0 ("Updating NTP servers to " . $Ntp1 . " and " . $Ntp2) false; -/ system ntp client set servers=($Ntp1, $Ntp2); +/system/ntp/client/set servers=($Ntp1, $Ntp2); From fbc6852687ab964a4303d4fa1b29ab6321ad38b7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:15:47 +0200 Subject: [PATCH 46/99] sms-forward: RouterOS v7 path syntax --- sms-forward | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sms-forward b/sms-forward index 436985d..b392805 100644 --- a/sms-forward +++ b/sms-forward @@ -21,27 +21,27 @@ $ScriptLock $0; -:if ([ / tool sms get receive-enabled ] = false) do={ +:if ([ /tool/sms/get receive-enabled ] = false) do={ $LogPrintExit2 warning $0 ("Receiving of SMS is not enabled.") true; } $WaitFullyConnected; -:local Settings [ / tool sms get ]; +:local Settings [ /tool/sms/get ]; # forward SMS in a loop -:while ([ :len [ / tool sms inbox find ] ] > 0) do={ - :local Phone [ / tool sms inbox get ([ find ]->0) phone ]; +:while ([ :len [ /tool/sms/inbox/find ] ] > 0) do={ + :local Phone [ /tool/sms/inbox/get ([ find ]->0) phone ]; :local Messages ""; :local Delete [ :toarray "" ]; - :foreach Sms in=[ / tool sms inbox find where phone=$Phone ] do={ - :local SmsVal [ / tool sms inbox get $Sms ]; + :foreach Sms in=[ /tool/sms/inbox/find where phone=$Phone ] do={ + :local SmsVal [ /tool/sms/inbox/get $Sms ]; :if ($Phone = $Settings->"allowed-number" && \ ($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={ $LogPrintExit2 debug $0 ("Removing SMS, which started a script.") false; - / tool sms inbox remove $Sms; + /tool/sms/inbox/remove $Sms; } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); @@ -56,7 +56,7 @@ $WaitFullyConnected; 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; + /tool/sms/inbox/remove $Sms; } } } From c35eec0f22dd5c3ecba21b7fc670a384738c2728 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 16:16:30 +0200 Subject: [PATCH 47/99] ssh-keys-import: RouterOS v7 path syntax --- ssh-keys-import | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssh-keys-import b/ssh-keys-import index abf0350..70ddf3d 100644 --- a/ssh-keys-import +++ b/ssh-keys-import @@ -6,6 +6,6 @@ # import ssh keys from file # https://git.eworm.de/cgit/routeros-scripts/about/doc/ssh-keys-import.md -:foreach Key in=[ / file find where type="ssh key" ] do={ - / user ssh-key import user=admin public-key-file=[ / file get $Key name ]; +:foreach Key in=[ /file/find where type="ssh key" ] do={ + /user/ssh-key/import user=admin public-key-file=[ /file/get $Key name ]; } From 2cd0fb88fa79b595f05af18112786f8280058702 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:17:17 +0200 Subject: [PATCH 48/99] unattended-lte-firmware-upgrade: RouterOS v7 path syntax --- unattended-lte-firmware-upgrade | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/unattended-lte-firmware-upgrade b/unattended-lte-firmware-upgrade index 14b03e5..d38b917 100644 --- a/unattended-lte-firmware-upgrade +++ b/unattended-lte-firmware-upgrade @@ -6,11 +6,11 @@ # schedule unattended lte firmware upgrade # https://git.eworm.de/cgit/routeros-scripts/about/doc/unattended-lte-firmware-upgrade.md -:foreach Interface in=[ / interface lte find where running ] do={ +:foreach Interface in=[ /interface/lte/find where running ] do={ :local Firmware; - :local IntName [ / interface lte get $Interface name ]; + :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 once as-value ]; } on-error={ :log debug ("Could not get latest LTE firmware version for interface " . $IntName . "."); } @@ -21,14 +21,14 @@ :global LTEFirmwareUpgrade do={ :global LTEFirmwareUpgrade; :set LTEFirmwareUpgrade; - / system scheduler remove ($1 . "-firmware-upgrade"); - / interface lte firmware-upgrade $1 upgrade=yes; + /system/scheduler/remove ($1 . "-firmware-upgrade"); + /interface/lte/firmware-upgrade $1 upgrade=yes; :log info ("LTE firmware upgrade finished, waiting for installation before reset."); :delay 150s; - / interface lte at-chat $1 input="AT+RESET"; + /interface/lte/at-chat $1 input="AT+RESET"; :log info ("Reset device, waiting to finish and reconnect."); } - / system scheduler add name=($IntName . "-firmware-upgrade") start-time=startup interval=2s \ + /system/scheduler/add name=($IntName . "-firmware-upgrade") start-time=startup interval=2s \ on-event=(":global LTEFirmwareUpgrade; \$LTEFirmwareUpgrade \"" . $IntName . "\";"); } else={ :log info ("The LTE firmware is up to date on interface " . $IntName . "."); From 67bd3a32a8a7dfd372bb804444f6cfbe2b60ad13 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:18:39 +0200 Subject: [PATCH 49/99] update-gre-address: RouterOS v7 path syntax --- update-gre-address | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/update-gre-address b/update-gre-address index 475b30c..d1402e3 100644 --- a/update-gre-address +++ b/update-gre-address @@ -13,19 +13,19 @@ :global LogPrintExit2; -/ interface gre set remote-address=0.0.0.0 disabled=yes [ find where !running !disabled ]; +/interface/gre/set remote-address=0.0.0.0 disabled=yes [ find where !running !disabled ]; -:foreach Peer in=[ / ip ipsec active-peers find ] do={ - :local PeerVal [ / ip ipsec active-peers get $Peer ]; - :local GreInt [ / interface gre find where comment=$PeerVal->"id" ]; +:foreach Peer in=[ /ip/ipsec/active-peers/find ] do={ + :local PeerVal [ /ip/ipsec/active-peers/get $Peer ]; + :local GreInt [ /interface/gre/find where comment=$PeerVal->"id" ]; :if ([ :len $GreInt ] > 0) do={ - :local GreIntVal [ / interface gre get $GreInt ]; + :local GreIntVal [ /interface/gre/get $GreInt ]; :if ([ :typeof ($PeerVal->"dynamic-address") ] = "str" && \ ($PeerVal->"dynamic-address" != $GreIntVal->"remote-address" || \ $GreIntVal->"disabled" = true)) do={ $LogPrintExit2 info $0 ("Updating remote address for interface " . $GreIntVal->"name" . " to " . $PeerVal->"dynamic-address") false; - / 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; + /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 a71a3d5466548d05d27d31c446c62afdf2412070 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 May 2022 15:18:51 +0200 Subject: [PATCH 50/99] update-tunnelbroker: RouterOS v7 path syntax --- update-tunnelbroker | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/update-tunnelbroker b/update-tunnelbroker index d454cd7..0075273 100644 --- a/update-tunnelbroker +++ b/update-tunnelbroker @@ -17,19 +17,19 @@ :global LogPrintExit2; :global ParseKeyValueStore; -:if ([ / ip cloud get ddns-enabled ] != true) do={ +:if ([ /ip/cloud/get ddns-enabled ] != true) do={ $LogPrintExit2 error $0 ("IP cloud DDNS is not enabled.") true; } # Get the current ip address from cloud -/ ip cloud force-update; -:while ([ / ip cloud get status ] != "updated") do={ +/ip/cloud/force-update; +:while ([ /ip/cloud/get status ] != "updated") do={ :delay 1s; } -:local PublicAddress [ / ip cloud get public-address ]; +:local PublicAddress [ /ip/cloud/get public-address ]; -:foreach Interface in=[ / interface 6to4 find where comment~"^tunnelbroker" !disabled ] do={ - :local InterfaceVal [ / interface 6to4 get $Interface ]; +:foreach Interface in=[ /interface/6to4/find where comment~"^tunnelbroker" !disabled ] do={ + :local InterfaceVal [ /interface/6to4/get $Interface ]; :if ($PublicAddress != $InterfaceVal->"local-address") do={ :local Comment [ $ParseKeyValueStore ($InterfaceVal->"comment") ]; @@ -38,10 +38,10 @@ $LogPrintExit2 error $0 ("Downloading required certificate failed.") true; } $LogPrintExit2 info $0 ("Local address changed, sending UPDATE to tunnelbroker! New address: " . $PublicAddress) false; - / tool fetch check-certificate=yes-without-crl \ + /tool/fetch check-certificate=yes-without-crl \ ("https://ipv4.tunnelbroker.net/nic/update\?hostname=" . $Comment->"id") \ user=($Comment->"user") password=($Comment->"pass") output=none as-value; - / interface 6to4 set $Interface local-address=$PublicAddress; + /interface/6to4/set $Interface local-address=$PublicAddress; } else={ $LogPrintExit2 debug $0 ("All tunnelbroker configuration is up to date for interface " . $InterfaceVal->"name" . ".") false; } From b6ddc5968e7a3393bb6e9b0c0ccf96379efc62b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:42:44 +0200 Subject: [PATCH 51/99] README: RouterOS v7 path syntax --- README.d/01-download-certs.avif | Bin 2115 -> 2105 bytes README.d/02-import-certs.avif | Bin 2356 -> 2266 bytes README.d/03-check-certs.avif | Bin 5059 -> 4850 bytes README.d/04-import-scripts.avif | Bin 4599 -> 3782 bytes README.d/05-edit-global-config-overlay.avif | Bin 6600 -> 6602 bytes README.d/06-run-and-schedule-scripts.avif | Bin 2994 -> 1946 bytes README.d/07-schedule-update.avif | Bin 2312 -> 2200 bytes README.d/08-update-scripts.avif | Bin 1917 -> 1733 bytes README.d/09-install-scripts.avif | Bin 2493 -> 2423 bytes README.d/10-schedule-script.avif | Bin 2009 -> 1847 bytes README.d/11-setup-lease-script.avif | Bin 3712 -> 1686 bytes README.d/12-install-custom-script.avif | Bin 2349 -> 2242 bytes README.d/hello-world.rsc | 2 +- README.md | 47 +++++++------------- global-config.changes | 4 +- 15 files changed, 20 insertions(+), 33 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index 41fa5caba52eb91d1144a9d21f2e7a1a00acc096..4da73fabdc93faddeca4f6dba83f23f877ac6edf 100644 GIT binary patch delta 1827 zcmV+;2i*9>5V;VLe*qtnfRz*{ZDe6|5&#MbI3@BpHV_cdX)=$KDFGjU%$D8P}@0~z=St$no-d3wG)1IH&Rq8dj!LKl4fpvp?_RmdSwc#PC_8D@~u zjcTPkY^NjfwHWgt_7{91x>dx@EBa6M#)gg>PkLn6cyo(95f3!&h%W=Ef#SoCx@`G1 z^%}k7r$wJI44O1=sU$aS#zEBEs_BS7ENNbm)d`%qIS=?`Db|;NAhVxF&g0p)83hO} z6~q2~J`#`gg?)&z6rH@psFf=3SKAu(H@!C*z9m*H&>CkqIpw{4%>SG=wGQK9OYu zLP(lSoIHFGw8ZutYjtK~baM4>+rt&bGACSiXJ2;CW@oP+Rk@rEoZl$IdjS({KwZmLQVfFqNZ)lG>?4bB$>SJ)sANv{oT*B zKoY5+tZBY~x-P4M)(dfkZp6yms*jMo!v{0(E@Yi{c-x7Cgd!yTi9|vyGvE*!DvyOU zAX3&cGWR{bfqp^_hn9-QRtD^bVcWntpvdqALIl=WhKI*r(8&-JNipt!By8pqb znJr9<9;>;xrNzlo@ZX|=(e~qST96WJRHX388M*N)!V!8tTR)MC?9Q^~F4ibDq$5y(_Fm7(5>}At^<_Fl} zL?0RYBiMxxS>OE%$@E}cWMuSrHAMSBrV~1GS-#-y84e4gN_=x6dF{dM)V=36htsYS z8d0bB$~p>Nk%`GvJB@fOyyr_lqfh7_Bh+$#Di$OA~cksgi(YDh-cn>tMndx~-sDZXrZ86k&1$ zU`ve$cTs6_<}G#7^~0nZQ-St7P&gYbfGMqgQT949;TpKS|& z5{J9S&=(yJiMs~up^8@e-{l^>GVjk}&X~N>(2l@gR8GG%+dN?ic;z}eKm`XBy#3R2 zQ;dMem*teV<*h9L=cHT3aQXtJUr9qQg0k?pzX6=`3J=yCi@xU7x!7v{loAmo+ zK`fPwUZEZNh%yZn9d-FKZD0YtqnCnz8ygjMuIF5Z5_aIO8AYL$q`ihR#|jgJ)y~vr z^|c5NK7Wq5Rb46Mq5q?5jw6V{!_6J1-JMfeMT+f;?Pvgp7<=MG=VVfJuPWt|Jz zyn1NDMiC9ZXX!FP{uh)*`0<`!DY^_y15wsuffQP+=WBc=SyUyOg7EwQtM@;DN65`| zG-Eit`vm5T=JU`W>Qstb@d{;zG#+G450Gu;>{rgn?1*E1;B&Lk|F?UKBanz$C;a)l ztlad&6lju<3Gm}uEEVXhe6_thS^e8=K0qg7r-cv0I(?k<#gb@p*>TdtIJRV6cjAt_ z(hg0Y#p~WU%RH)bzcqFG&ibll)YYIUB%7tY0?z5(SWcuT;vhggiwMa|CrNjhe9}t zhsCao$Lq||3lR3_$W7`=y%#Muz%#R=^UBlc?c6v#Z_A`6^j}E8LK8=RcrIf5gQu88 zS$~KU`7M}ttsgl(d27@Xa8kvYii R(#l=^4MrI>Ggx84qg1d=kFfv% delta 1838 zcmV+}2hsSs5W^6Ve*r0xfRz+6ZDe6|5&#MbI3@BpHV_cdX)>9UDFGjUz($XtcK^=X zD%xMYBTpzNb^9<@-V23NE z%K8vd>;b+$KR9~dUF27lU-^cH_G!%MjFt)%I6b661*)WV{Ftw{dwN+M#1nT_1&NlR zpr7Q#7{>7?2g9NQAabUEkUo3?NqUzZ1LciAbY@V~^Iq15NcmLv^m(b{m%XZ1|1Tx6 zzqX$ifYt*KY!_pgB{yb0B$?uNy+e*WRx`{@SRW!@F;=&!EC1MIpgvno%Dwx$ck!ln zk)wir_;Yl1BM31S-DLIh(JL?X|GFOn7Ig~9`P6>`oGH?Q&^Bvnr85UAQ*wrY+F^&Oo%^eA*n35D}ucuB;#F4oul4^op#{cH1Na_^cF-u+Yh= z=mp_tPl%j6Y2wm-+$j5$J?P`36Z zzq2tc!jL8#+f*x~$E79$b7AtFq8n2;K<#Lc3n~3(Pt?dY*vGzaM>Xa+)RP|Pn|W#? z8N6OUBBzR;FYG`Vd`Rm(uJ5@OW_GCkmT-GFnUKLw!1iT-ZG>{^*cs}onVN#rZ=wMj z89e<3+niC>;$TH@Thq_Pez8t^l3Hh*S9EC1aO$?7hl`sX_NfO-Wql`m+p|YS}j!QaH8L=C#`5 z<1t3dKGHhLJ)Uh4>pzf6!cvecF*RtO6Nr*6el*UJ=m9taO?^qrJ)Tu_I!O8)?<|A zqGsQIZs3*v4^EBe>>ay*r8bfi!7(S4bh2`PzT;b=@EW&4)BDma?63&d1$SA^CBl^S2^@>r~|8TAW1*t$)G!L1{p#&E+9ESmJ)qU{)IALFFi5C8kOO+a3M z(+n&gEFcuS+nvK*$vEmzN1(IkWYV(mDh~3;9&O8LYc7M4nGoYf6D954qCjtamtDj1 zBBfZ}H-ZYbYl(F3IT(yNldnmF2UJ7jvI&arMnIW}=oo(@$4dRf;8Q|*h#T0sJME3r zI;CCK?2fVWWsQDCkUyHG9qrME&|G7GbWYxEeHj|w;_BPn9zkFNeW6NXPD2DX2j@U< znH47bx$veRAV#7XKHsAPUrkD>zQ=!aNE zSE0Cxt~sTRtU!y}Z=A^?B!rCAM%MTNr((*kKkqSYcV!dK4=4!xcvm$3BPIcVx+Czo zwpKEKgwZ?{+w5atdV??6rOnwqI{pF0~2=TydcNIYK5Zq4;P$UF(`LAj?r6tq* z%}s+h@cIUmWnWr4P1{C~$W6#acexjDUGmF_YLzM5BXwRQtGj2K=}a5&r@@suS?`-Y zxgv&rMwmT(i?gi)ciYpU?Ijg|40Ww{wgYX<9%IUiW72cVA(kaxF(XHW8negAx(h;5 zZ*Z+s!y9COw)|?3Iq*trvUJy8oKc2PY~-q3xZa4hmET~*!=vGm;P`g6J8%%3$`+S8;;SZC;deQRa_j_OB0`7# z6kZ)%Frjl3?wyJbA_R3X3d%uj@kOigVz5?Lb5YNvI2?ZbH> c5NRsl{`k*+>z$v3EbN5|d&Q@HlX9L#L@B|8(f|Me diff --git a/README.d/02-import-certs.avif b/README.d/02-import-certs.avif index 09fe58604b4e17f73b188e222eb458514693d5da..308be5b93a610328562c5b242af9f837b1e11829 100644 GIT binary patch delta 1901 zcmV-z2a@=-650`vegX%;k${vI2gq$?VRRAz3JEwR@;EjS5YTBdun&_e0eOGiZ|IDD ze+;%*l+A6S=w*NZxl0Xz5@XkUms0Ij%E*y%W^ybm{zRMfa3y04FPH~mE=`l*xC$$l z8OlC4vAB)Pd$^-n^^tKkPQ-L8ED^yQJRQ2aZwlcgU_Q@+$tJpdG;`a+IV-Ox_<=L8 z;R$($vj|+np}RjYsAj1J3p{_y42x+><~d6*xJQd;KQI7L`hfiG?p_@a(uGFGr2<{w z1?Lmyv3?3NQ2fX@Ji#cfKXnj{&P93swSWOtXU<@K#XJpdzt6D2ELY>gpNCP}iU3sS zu%Th+4fnotYT_1YC#p5E{ro@iwnO_(xMvNy25qhrx?9n#|Daf3oHKuFYm48Dq}^95 zbg2Qn?Y^lJjEJEzy7so-S``0Lt^stV)>@oF6s0Y9DQid!+0De9Ayhm-+eNr^$@Uqt zp5j!tW^g}x5S{9({1;+0!#8zTfC2SQkOi>HNcQ&7Xp&YgzY15_TO({kf??)!sS)Q* zk!tk@-Xos~;X~DzM9+VyC?f`fGTB;S;2 zQ$2}a$(?IMlebzCrgFWuHk$UF4W7D;be6AdPIAw#?l?_zrBZ(}&xMtPL&*!O^0L-o zFNg*&^2wTNW+1E+D;3moqCDkOv9v~-eNSy-B2IBs<5q-wpHcgC+%fwpJQcvWa`4WD zY49wzFkf~j8tSB}rK8ZCRKFXz8wXLn*Au^}a`x(d!qbn?@j(l44svoo{!;2CR!9zoBqVY+Y7hbUB#!(wB;Rrtg;q2puq2 zo}Eq*r%(PH<;=UxU|lGqCovkVq#6;P7g+Myp+ZV3hH`(s0HS9+6PesTegse9#Dnb^ z>=&KybD^S?b8fTrz>goMduUGB61yXvp5QzPW~cU@ED||JH}AgM7kEqQTjz|mCTbPu zyv1uTMpBa^@t72zBv{{CCT;!l@h-cHk+Fn)PiwDS+h!z9SY%tCU2h@fm&uPH{q?qz zu`Et~bJ>3+zZk^?vx>uFQ;m$3x1#IpZo29`WycTsVeq%1##U5jqCbH6d z#o6o{XHO6{_Y3@TCQiA$fKi8V+MX|?%Id<(>`o$ z=r7p)Ah+Auu7yYo8Xtj0Py)l7m^?Q;U4I1a6GW6Ogo!ygyS9w-i!|hSO=}?XZ)Ql) zFCTxnaKs3Kk6yF zR5PjEbQ*V;o={cM~UjX^7~v3zIOUyd~exua%w- zY|+s98uCwIbspSn0ndYVb;!GB&D~hoh-QCu^8&g3PR*aC0u{2x#SAJXCn@6ZJvLOUC)5=0xr@C=6?(P`# z!hUPLCOOuVNt2G+dyLRP5`-g)A_xL*KET`2stg&t!l8 z(Pv10N|p9%P2(~;n$>8GIre;nQod^;As`%v1H7!PBSLzSeVvyhd_-P0OYP!q3Td#% zAp8wmC48=DNiLQcyaMdWkb(9Jg|=afBHO>mAVC(HnhCCO>+o5+O|W(li`QxnYehpS z7sCE9HpfWQ%GzsB`@`3cYG@bNI(>h&Y2NywH`3RCoyd5z7o|D$R@Y#Z=wP;WDXAP! z$(9H?$4dnk2^WG6Gr#*fWi}&h6lmO(1*9tAd|N;LqsyLm!{J*)V@V{0H~_ zy|M+OFa*7~T_~<`PrN&fJ%N?x0C*E=&Z=Cst2EVJvwJyyw+x;N# zzZjaV>$`bj^qLdkK1jd6)rlI-%$=NbMhUjG$5cbYCzV;@=$aq%?U`cWrlKNq6pZIN z+xjqxLa-Z6cPq6qMydB=t!{sE?rAyO`OSX{JZx?D@J|{#*~n z7+|1|;POGr{!wqhRQ7?hZ-?NT9dlM#PJl2%j4d(CCG zU`5fB>U`Kz!)*Gsj(h%F@S^+K%wf-3ikf}BrV;-qi)b_K+J_lm`8GC<3a>r9!|^k5=BM|DFRUS>+5l9I-1jYMBpbi=NH-yS z!OECKm2*gOzW`gH!{7vZ&0(e&aWJ{RWKF}=gk5UqMK%n3Ax(dzmSuDlp5s4jP^8FF zyE25))Kwp*_E>h{%~-F z^N5wEYMK{26)~`R7e2F7%0{vSTqCr{8#WsFsG8{3y+18aZm9Xr35*8OCsrv_dCK*O zAr6 zHIJ3SYlWs245!+CeOtiNBLE;+wMW&?-1V*(PKpAXNlUEwwL|#f{=ENjXWIy2?=E~lI-52+3~y_dWS6d8L3M0yc1Lr|Ng&7&-wWq6kHHqA^!~X_%A{Ij@CbhqIP=l$aU}z|tJ&*N!_hw_X4Wm9 zn&OU{vcD{smFc$8LTNHJ*d4T^*p>HvYon9V|EZi+8O_M2nDJ4K&yp-r?UIgqD_4Q*@kS zLQQ|qpinPZS;?<`3c&JeEl!G>U;wmcq2nu>WdF;fb5~zs)*B_gIv2!2o9_t}9v$?i z5;YTx%z!#0>GEc4)_QoSNH#drZimImIH2~1xE|#@| zZ%G?gmq<}LULTJHd{u%|F>fKyC@MAY4eJP@3*Sv0pSOjQyYKjA1Sbu{b?kK;<_Ld= z9QVM=&CH$$ot*>ST0!ru(NxTVN)xRED+z4$gDE&cy&!0S$I@AaG?@|KwawB&?hWSn zwe^|bp5xMJ>(5!*TH-lAs@)vxWN^Ylp58E(T8Z2BGH!sEBV0J+Lkjh$Tj+c9(cX~= z$gP-!kqc`^*Y%h$WEV=gWI%s+HvoT>2907u_>rT(PmKJ?;TixAL&^dGGd!9#-TOT( z_4agwgcP?u3}oaRj0XdGeg*B=`vtrwEarJs%Nx*f5?KbXRH?eb-RYn^{K|jG8#JTl zk>`@TI($UerWG*uuDgDY?;FKD>WTlY$~y9zyB7+R#SKSY>8QaS@?#;{8-{=J+i=4h z2@|PFEaes`kblom{1I<^By+>b&!?A_cbeBLS)Yp~r_nW%NQ<6K`N<#q=j9W%qAfZw z+?k}2pEBgjhXej_sZ&)nxjBEhT){{1SY&fUww8>U?a`2QfCBf~qRZ;?{7WA#wJBbG zo~w3w^%OI{K<}=2wI8K?9PVgTM^%>#r$21Q-S9-(;GFI|hy<;^+ya|4Z=3uZh?kjt zN~sJQJEdwcEofLTlQ@&9SL1t4_QhEVZg$@8Iyb62zzis&_mtXUUhxPDT*`+ a)^2$m7X(QQ=^GVZWty^P`GJNZV9JLgzR|q^ diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 52c4df8105721f466da3108f442694ecbe13c3fc..adf1161c9646f9f4575624e675abf927a9b4da13 100644 GIT binary patch delta 4573 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 H@zfYi(OT={ delta 4784 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 K0mAWzW=}v29YWgx diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index c86a5c8ac6161a17d181165b83e0447f1178c67a..53439e4e5f832c7cd7e8a424f1b70e471ac8e31a 100644 GIT binary patch delta 3526 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 HncDe)5%vam delta 6131 zcmVI)5*2rzj*h6gK$o&k!%T19{&dV M;~lzn zd7j{JU>WQTwM?{z2UAQ8W@CnBW^SaumjL_<3=YY24?2j?f2xt1E1qZ;S_}fQV0Q1! zR8@d4g5oj^W}U~)Hb&9ZlXnY&Yyd6j561^gQXAsTHb7JYDDNB-vvHWdcEx=1H)}K*cG{B%?g9 zl_<#>4n4);z!_v(E5F@g7F04I9`srMc}MQ*2j{AU>?D-jmb9f|58O=c;t79_WlQv= zIoC!r;MZ%i6|3vpHNPC64H zw<)$KM!kW)_JFpD?a(?u?dFiBcOhCAFW|$j%T=2I_hSZ99eUl_U0&eq_p@$s%!WbyAM zcnVhRYtof-;A2YO91&v0*GGJbhT!ka_+Fsdt4q;^W?{Ξp>_32-=D>*TStIzLtS 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 delta 2757 zcmV;$3OeC9*hdAR(aAGKdvSWCGnZ zLt@_EzNFZoAL8!h0nhP*F}ICR16%HaRKP}$pmzVx+bY^$y(3R3Cw2QUR^AJS14go1 zdTq)lWKyC=-BgZj94kPfX4SM|XCaJ?2K*5ua#?dqaV4$p#a$@=_lqJUUA1UUf9SnJ z2c|cZupDS&`y}7PvNu$`%~$&avZb=aoc!K<+piT8^|ZK+=7WGs4kz9ua-Xyx{mDJY z5KE;0@){iX+_$q?uA?IE(-`y%pU~ZCIb=z}A2H!Jnx#zZ$nJpda@bcyYJj* zABYTr7%D7H9s(;t|LlZt$9dcwI&M?#nxK|sTTbLDb zNj}kqPgzG;Q5j075xJ;~>YmXA-L`DMzh$zj@wj(?-=Zg{Ut}vtCSEI6e*_v4u3^F& zRi2mc#GpsX<sI$S!T)>hVmc!dX%-V^ zmz7r4*ZRZQE?J9n2WykXmTQ1Al7q5YCpkDpYr-==RUoTnoVT~sWJ~)M&s)$g8fr4_ zJ&RCuEv7Xwk8r!rs+7oqe~*`;Lm+ajv?1)He4fqiDDoe3J7tVh`{&wPBP>!)@c2pJ zBg#PpoSc1xAIq0uWma zAW$r8$k+tidXh(~Rl;t5+jQeVc>qARfW|q)<_a3c9Cdi}WZyA1f6&=HXlGYDr6%I= zS9YV*1U;QCW^Hd$Nru?%;6eifp~cvXYH-u;wyKB6c9a=rb(HOx`xwlO$1!Mh#dCK1 zwN!@4@Dy?WY{Mbx6=CWflI2!1t$}?A9rlUf!)RlSOW`?snwj^eLlK+DOFf+|z2ba) zEJYmGMFSDNyh(vme{TA*X^0vn_$px(MAmh#f7apcuWJ@SS+>~q%lAaaWu{5|sM`g9 zWDxW4CRLNd5#CNsbmbXiM1)KLci<=7ufD2hi!CDj_0@AZaK5-UnS{eQ`!d;v^JPrq zwB|9ngyYOVmkZH{j*=-UjU@c5;Kn<5=TV3?6LS1BK~dYLe^=rb{pYxqk~>PH_tqWu zpralHsfz4aPQRFNJ-TlmR!ssOMz(sSh4;t{(!V$ONGmv{E4Oztu6wy?OaEcP3qW05 zs&2y`H(~w0Sbv%BUHTp(YlhK$|C?MgK>6Zk63K-C{3X=}nh63-E3-9wz;NP=O{Z}1f zs`1@lF0&3%B{91+g;`>W42d7P1mPH_tFY6@aX%(TL`eRthJo3UUJiZ!6m(6YUsBaw z)>AifB=G#6aLwB5Bo%9?zMlX0Su`0o0;PUAe-Y1!y{QY5Ijk4T@%K4=x-=@S+s;o( z80*CQdgn1$fbU$2kEeKlkz{Q3cWyn7VQ3)5V21sFt zxP(DR^jxA02*4+Qug42VdfQ%J|9@YGz{ZM@*5*4H`6Bf7+og zXu8g*jpK8X#WO$-3pskV4%G0OXtrG#$ozSa=|R`@);#Mqm=epp=0#AQ3h>3af!fND zoXR3GPdiz(X%!!tpZ2aIrJW3fn*V7rd$6ADN$Ey*xl$q;?RI7FJ~=&eVdAsuD+V~aL`F$7a3R?cQw+zlD!*o*Jd$5rgV)OsP* zWvW4V35-m7H2gDmXOaaq{*zD9cE;yEZH8|K*Mh|6Y*&(?ut!iLy$X$YF{tx2z-54= zlqY$RQeQ&lliohY|+^4Se7YAfvIIt!j?VsDIu~K`SeYl%^Fjl)X1}z z%3RAd4@)&agI5&hJY$?d^Y7rUa(Ik8{M&DeTwJ}qJ#Jm&eb~=meEMs`&7GuWBx|i_WG7SM-gC^MB}a*DZEWy@{5S#_|`=wW0ER zy1RUZT0ge?Kv0uh$cqOXSdX-l26R;SKB4msr2=%~r%Gttf1+gDtgM4VTM5=}g(8Lq zF;?rexKPjeC!L*ErB9Ab3G5kW*RUl9{HxjEAb+ghUA_%~nr(I3@0m2z|FzlrHBxKC zoflu?`sAVXP6?85S^1~LRSiUiI|#pmTFFH}g!g=2yPOS5y+544{Cf%k_v#jF(WW#u z{v_3Hqy6KSGXaT`!!sP0&Kc(;kfwDTu~SrN6t6)kcxNqZyW9rY7N_n$QE~hCjd}>c LHeiK@{J7{S@=jI8 diff --git a/README.d/07-schedule-update.avif b/README.d/07-schedule-update.avif index cb43b48e0598a62d7974ea8ab3ada4ac6b3c36d9..7c96f3aa6f71be5f821c1eb1b78ef947e447a330 100644 GIT binary patch delta 1899 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 delta 1515 zcmV!4$Bk$*a^`{7_TiAlDgpYYj$|K0c7opYn3 zv+*X&pluNxC?&90QC_pRC$JOO_fgERsQwvOhqgR_Mrj<3^KHHibnDdMO&f-I56{=z0mD{+&E|y3B-7^^f#>gk zOPJm>2c11-4hMh6;uGaoxmDbf=Fifkw1S*bcFk(s5j>&>z;=-x(s|c4<;;;5~dwAf?gaq$~^h7>YEE} z{={9B{RIYhcTM07(_1BZ=*~{1a0ZLahC9R&D51E(*@^a8J`Kui26n&7Ea#R_PdQ68 zy0c5xKtkc*%$(E1@xE&kyd0eZ_8PNo9p^t*MN_kW^Ks+XhK+wsRE&#^IZ4$Nno^Z&U0iE*DqT`p<6vk!kRU!;XLA=#__(~i81c&VeTwapgs2#)FY@?Fr4|4sbuUN*(@t}-pn z%^OvXW6_xtJ#pdd|DT%sAFCesF2< zc`=r=RI^y2+)PePv4J(PpD)5*EFvokVvp3!ke@40;jy^f+%D4s~G&*lMU3k9(y5LoTi z`5)r!=Fxv>AWz03B^{x8@68&39VPF3(^}=_K1wcoYT|onyIhEuL1WpKL!!N0INqNs z8$;RXG$5d$-d$Qg)|Ri0g- z0X@{|BcwJr@am&GZv(|2DAf0r>Y}xuzVawSfH? zS|5L~sTZEY{i;^`!XJW_w(B(U>2QA%T|w5hC@jb1eL3#(A>Owjz>%5^Zd(`336z-r zqq6doOv4!V^o$7BUWj?_Izzi~Tkt*HN1GhAX`aQ<89ls>is2z<@V`6VI^t;chQ zkCvWqp#O8l3M8W!&T*0eYA}p|a*$Zn)#-oad|q=4%WbUg)tqt0*;`P<;@&#N_czTL zEmO&>q?07jw_kHLvbFD_RFMY<*b)GE*~t|(AskI?UYly7K&|w)gND8JZAK%>giS5& zFR*e)2G<2d-UBgJ_p?{&v<2eWZkw! diff --git a/README.d/09-install-scripts.avif b/README.d/09-install-scripts.avif index 467b9e4b50387a6e74c2ab74a6c81b2a48d4869e..00225b16e2ffeaea8b0513a34e8ee6765c79c188 100644 GIT binary patch delta 2027 zcmVJ2q2U1;9T(IfIT`xR<>1@WZ0;0p5-ld4x1M8-EOW6;thc9_+HcC1qEC5P|C zk}n4f^g8f7rPt9zn%S0nv{oiUOT8+>oA&=vWYeA;){f&p;QNolio<|+krIVd?7V4p zk8f_0CQ74g`dz_Wr)%Eh@oX1Q1Fo0=9{C<>=p)!D50xqtMowlow9RH|OzvkfiQJtt z80)8nz~@UgSnbkXJ`?N|1GFe6N#Py+A^av`5#v6(tzQRx-c6^nf6)%0_d=aG+F<>I z8vg&q){fn#nSu18L3-A$YAst#unO0uil?jAu^zF!G>3k{!e57g8gx}?Ttb9*HizdC zm+(-<54JaWHE%Ie;5dgorNg$DUjaCay=WVrTa*fkP}0^>_@>?|SBH(sG9t=6*ir+4 zJ*Ifw!kiq?f1_)Q`r*7?5S-3p% zHxyELWJ5_DkjbbUmdTN1zu+6@(Qx|7+G9AomMuJNm^%Ocml-lX2GI-Un*5Q;6N+c4 z$WBpPINmqMe_Dpi3D^@VMsTcOn5&tv`xI^R8}8Rg1l3m8SN4R+Jrbfq4oE1iG@`*J zq}8tV;A@Kb))A!t7TOKJec{eqM=ay4Qko;06G7^0_JFZ2xq~qiA|I%|%0ds82=>)M zWg~QWNGL(2jE+*~qS>=s!G9$I-~`Nc2-1rJ&KX`ee{bGtZ8&2=HFVR(l(3gQz71^m zb=(rBAG>X6i0Zn5<;huCRL!H^s)LTIz23m0zu!ZY31Gq619s->QAMaYO%0_}6Z&X6 zh8npd=f9FXZsN55)p|?T#tJN8sXjE;PSu3R~yOZ0HdZ}BNDje89CC})b9e(h@7O# za*+WKriQVZW;E@=dpSAdTdHZH0BLY;miN0(e;$cvMd-4m>E4G-H#Z5NX7Tcj#JEEQ zAA)Td0FFET_>6HH6b5+m0W;FMR~77jNtou1Np%DKqik5rbpf{O~dJ!+en^$;Dz%u-hZUjyW9C ze;3IZGtauyv1F9bXi(l(@#Zoi48C?@?37_z^LS(TG1uF(A^gc>ven{buLXTBJqX{2rNUI?}5jsjBqV?~H?z?<% zp6&nk3Ci7(Db}BcykHQpuSyC)^>j_Ak9mi8H0u_M^s;k9?&A*5$^6~@YR zWx!WXDaqX4mHbuVo|N7S+1!|vwa`3EN6t(gfm=Vo+JKZ9MPR<)14Cu#?+usP$f9=fpXh>x* zgHMB^jm$i6aLq=JW=5?mw@bzSWHE+jg}geMEDcqH%c+T2bt}a=*Ykn;!pLgvr?_`Q zQR&h;ZQzo}xj7sUAqa8{?k0J%(IHB|dBEj`thESR+0514LL|xy-;;#5ik}?fFxVfH zcs!oD7tc~%=bo0sU@llof9f$@1y8i~jChpC6TT48CD-ZMbcN1lRob?y-GO2fIwQIx zBh&)LBgiKx?ge~XC4vtf8R=PMz$w?1m0>IQanbR?6WNmo)`*_q zB!)h3?$8^_ha$(BHua&d=)MMKnEwaQ5>M%s^%Q z^Je+{&u$EL()!IgPekt{Hp)} delta 2098 zcmV-22+jBR61@|Ue*vSBfRz=iZDe6|5&#MbI3=qz!zQcfQ(C`%q~|1q~~Q%Fx@U6tQ)jh{DQy&DXO#uY1FlpR_G zRfck#kfuVNmP;-I-~gl;#;@hi+7Tm8mX+y69;fMUL@`6IR*p~np$g|=W+g%t>D;CB(_VB?|uLPn(8dbOumq6J+H^jPdo~(?g{16(^XMZ!S zC$Shzr!S5T8_;$xPS~>_^RkH6YE$wTA@F8cO-1 z@q7`hLl1D*yjE(iD>AXssOQLVnx$%n+cDzI5F@{hFP=hofW~^;TZ8YpKI)a}6Kh)0yEK5Kw##*Ohqbv&LH^9P9JbQIV+hPNv)MoK%VI^*Ugk0_ zz6{K;CDwEO)UC=V?EEN=}VGUmV0HC#By9rhcFkvOR- z*8y+iY{H4x`1h_25_Y(ge}~Z)KgJUtqsNYAs3J}}QjspH<$wtckulzCs$$Y%!}u~Q zK}8OKq$@>i{2D+yeb}feUUUXSB5Hr+<#|lZOVa7aP<~4rX^d z`+gB=QlRrux{P8#d!(S#x`wp+dxFoa@*{Gm0PgTb@+}zQO}NHeJ~Pz-4l7Z=82q@JS<`5w{kBBz`dPOKbray6lqcL>3 ze^Y;3zk!2ujPrI-c@#a-;~M2W;gCXJ`0-&ESm;k=?~6YM(2)|ojY+(s$M3E%?;854|^ja6Iedz*$ZTN zl~q8ImbF^8=~^8-pG)m+sTDTsvl-C7$M0XJWq(N_K3$-Ibiy9o`Wl~DwJOFEdMCjP zn>}5CFqpXJ`y>obl~tJ&lW2X*UQ#z`--t3T_k#1D+i#h-Q-;I~f&qnJBacXof0^?( z62bI*Q)qAx3_K1ia3p4?*P4QKt5F)o)NioBu5?YUf6!+GqpA63(xvh*XivMKyLSxhM4MNn>u`wxPSl5bPde0bpi7RLg1 z^(h!A@_}jAv#9q1#ct(C`1{U!5&_TISS{Gj`8$IxI|-xKD_IL(ySH>qz%J z><$1>;Qd{z1 z9^M2pyPH*O;EmZ|pDHYtpawtWtEy*7>-)%!4#LZfPXOSb4q%3UR04KX;i|{oYJy){kWOL|LB1(yjLaU_we;RGy%VAj-z3+#4 zkJ>vI>Y{6<GPEeOu=(3?od*OWAL!xqtoGU{C@T)Bpeg diff --git a/README.d/10-schedule-script.avif b/README.d/10-schedule-script.avif index 945a7df0e12bc2a6bb78f6148c5d974534510b57..27541b75d69575591c432fe49b06da2b47a5ebf3 100644 GIT binary patch delta 1550 zcmV+p2J!jX54R4Ge*qnlfRz;`ZDe6|5&#MbI3;pC*g!);q%w^RlPUo)e_#R=S`z=epHhw(~evt!%^uMj)r&7@jU}Nf= z#0KA>&%;8N3F!K`X-Z5k6Gzt&NZT9tgYK~t<>{Y_~sCos?3;mbIV5NQL0ej6^R83P_z+PQC9AR+L ziUF>#uY1%Hl|JmbCq(|XVgE419KkP%*b_H38~sfsrngj$HQI<-f1svrQY|bFW}Y%v zj3pR^A!`H33XiR-{WT}C!Me7D>@ZS-+Zv10!Ml{3n}v7;FAViLH}2R+M6RuR^v?xzVOltI25 zrVUk6|BFf+avZI#e^HbP6&(ZXsMq9c=*Q0qjb46+8182m3lJRN9QOUAV!q+Oe~>?* zRF?y1vJT$?g;~yz`gH0K3l%xErPzZJ#9bVeT)VjZyQ5%c`bJ@|iUT#cYK%wEOhg1A zkZp!NEO>ArP)Bv#p2Xd&&WwhT4gEZ@P`?s~OU|=n(f8^oe~KYE??AkdMvb>Gg0^BE z$wU10uc%v9Foh!Z&^1Ec62->F^b^V$;#q7dwIipqEJrPy`EhOa#kRL4Pi1;%XG}|$ zcnpfw!CvgqjX?#{I&jvy{Bl?!6bUN8Oca5_py$!07f$Sti=;%o77*Y^VxxIBDe;;s z;8Z(?h4Aube@vIufJk|12;ISn-xX9{nd~ExfJ}+ZPjtV(l|DEqzz&FkL&<)#EmJI& z*(zHx!HBdkR)iG@nAdV%)#fWsijt{=77&tUfkt&NuUqSn^MxBi0RAZJEqDs>voUf; zGfrK-leBm)L|hHq5r|}=`|uGop773mGiq7$dnV24f4@M)<4!&2W?C88mj_+#hETp( z!~FkL;P^BzN{Cpb_wyMePw zWZua(68y^P^3+Z2SoN2?z50l8SZnpaO*SXF@!uR13(T?(QqM2;rzz)1Br#3(F7eVl zCLxc@fBt~QE1Aq`qU`Gk{`U$SllXU(L*PZ;M$~;F`t8Jw_-*2B=!Iilla^G`HM7l}+(GOMIsO`ciuLU3EXV zq$e0I?Bg8d^!;pa8Z)LYQ&Pv*(aK6C$~Spcf1}c#HC(kFO1f^gGr%M|;ojqvI$iYn zfRc6-CWcxK?XWJWXs_v@uW(?93gM{FA#_u-R!$g$F}cL#Dr#!|)`Fs?PSAumQl`W( z>;tt(N_`V09 zf3-e&ShYWJc`Q{1_BZ-^04E`h>KFS76PB8&vt!-Dzy>1c$Uf4>|Fr7bfp1)T=rwAe z-d*#{j7e;JMs|_z2^H3>EDRvmQE)|k7Iuzz3rn-O>f|y;pz$@yrhl>d2iPC?1{!}Y zCDo#&kNvMw1YzcprtNX%I^1IRNg;+|e{tXg3`)f`pkwYJVh`f9;%6xgZs)ppI^r;X zc`&zrtLKE9J0&8~f;^)I1Rl!VsBi37gbUIc+21A}a7+zyDjFW+wR%dh)X@jV2uBMh z9Iqf|L=t%DS32?qjl7A)Q)7@2SF!My!wg AwEzGB delta 1714 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 D*@VR6 delta 2076 zcmV+%2;=v{5v>xCegX&+k${vI2per=VRRAz3JEwRvN~)aA)wMSgAkJ{0Um$MmfhFn z)eP|dEkt}WwIy=wZ6qtegg0)QQPA+U6Ml6!QdBB?1l07)KnfIV+w-N|La;3xg3+`a zS+pO@S~Z(o@3hi#f^vk~bQT5Z+k}*HSC}ZmMz#$NOy5>>56AE+OBAg#{aT!niQ$s2 zMmk8+-^m#PIb&Jqidy2`Jg9#S_hu+2h%7^D>ESYNvHSAY9j>L9Ks->=`#0iC2n*w{ z8|j#@;oZKaFwjN%8OI!1w!m5DnC8>FC_Q0eDp*e`K{0UgoAA#a8^LCa>)9)b9bYSW|w46_g{xdQqg7n~gR!Zug- zr6a~GkKdk1{c%Beqq=`Sl`=&tqJYI|RSrU98ir_N2p_2BgX(irbY*XRDA$cSY-$Q% zqBrhlJ9`T8>z_hM=Hgl%HTZvklPwr9MT8&ztCWCafKOwQ7Y=LoI;|7|*wVjkv|Xq{ z&v$k5G-on&X~HW_DDDl;IfNQ^IuB6O^3?rx{x<8%CP2)}onwDoL=|?^9etn=#j{0b z!|&QnmxG|x&*jW>dD&vQlyK;F{PH&{@xwt8`%SBi1XL}dvqz6gUKs=iTLv&w)Fa|1 zmsG~j5|LOJoqTRoX3}NDRVdXz5AuAGx`;eJq4)*H^3(@IX~Mbo--e$jcYiD;R1cV^ zjupW4IMEaF&}x4!SX_JnBmZeHQ9;5Xu4O`A@yp~o65k?Xm(_~6cc)s%&6DY?*4`89 z;L)K>KF~OX;I?|Xe}3gjxTIP(bZtr?fivn6q&wEIZ1n~sf-HKxVj}l%2q6`Qmsl8g z$U!P`_;}1X{b##NR@$iklY)h}i+&8_S9LRBH?vahE?s}I%n4!wU8dw+DTIIdMYAg; zV~v?Ze0&mPpCer2j%Z-glMMyczcL@UBAL}(`ig7pp_I0E-(hHV@`kSS59eY)H-#1) z6dwr|n1k6Zw@f|)SkmG75^2!$0jF}*C1wreg4TO9bY?*}2fIb_EQEAJKL;}kZV215 zjXN2ou>^mBxz2bLoJjooZQ{amE2kfr@bfOWr064|2ed8MmlnhAGM%_|I-bX>SuI3p zU4i7yjQyLv^e3M*sUMOjTN<%^HeOfpQFOGgRJ}y-!>H(MqgHiD#(kQ5GVQineh}|s z4V8i!hKKa2^X=5^&5?YD8DB zDt&8u*Wc_RMdbGo-WL`M_}Gr5>iy3eny*G?e*Mp`8HH}7aq*)CaYya8__u~2jP_i1 z{}X?GJri7*6ddHx$9QGIO`3|-!cs6V)(eTWD`0X(JBf~nm2F2 z;>_wR?b#jZZJ$&Peo=*?SaYi@MC)5)TLyn>){;55tJV7aJSj{5ljP=#F=q}-kpsaf zcE!NSh8g2#$l74+5xndU#7rg%1g_@dSg(2VCKR*M-(rschDP$Py~Ebt7_l6Amf+om~$x>9!oNa94KFK=h)h z7ma>$7z`sx+NA5*`cx2B#gxGY@;ObIj(0XbtD51^wU+iOmBS^O&)eHp)J}iz6#790 zi|&j=f#PQN-6I#h5JN@hsraRPV63q(8>jdJ_`mNG`OU?6BW-7mVyyboXN8YO4qN@nqgW{?Qp!6Pz2mdlQ*^{=y&m_KLc-d%nN*Cf*4yi%9*@wOFQhADMj zR)|3>T_2vUBU2+Thc@8&?wswcvjGh#V3|Z3YgM7DcH{{UKaSuAY<+a#A3kst(-rV( zIyN5ZM0fnTLJnr6y`%e64gUU=)a_cxZCHk8q{M3HZ| zvmg>uZ@%T>Pt9TYo{VY6%g?OyybjL;V!Wz87=YTp#fq-sSc* GtwP*Id<^XX diff --git a/README.d/hello-world.rsc b/README.d/hello-world.rsc index 17ec575..6404781 100644 --- a/README.d/hello-world.rsc +++ b/README.d/hello-world.rsc @@ -1,3 +1,3 @@ #!rsc by RouterOS -:put ("Hello World from " . [ / system identity get name ] . "!"); +:put ("Hello World from " . [ /system/identity/get name ] . "!"); diff --git a/README.md b/README.md index 23d1254..df3cb9e 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ Make sure to install latest updates before you begin. 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! + Initial setup ------------- @@ -50,7 +53,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/R3.pem" dst-path="letsencrypt-R3.pem"; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/R3.pem" dst-path="letsencrypt-R3.pem"; ![screenshot: download certs](README.d/01-download-certs.avif) @@ -63,16 +66,16 @@ files to your MikroTik device. Then we import the certificates. - / certificate import file-name=letsencrypt-R3.pem passphrase=""; + /certificate/import file-name=letsencrypt-R3.pem passphrase=""; ![screenshot: import certs](README.d/02-import-certs.avif) For basic verification we rename the certificates and print their count. Make sure the certificate count is **two**. - / certificate set name="R3" [ find where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" ]; - / certificate set name="ISRG-Root-X1" [ find where fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6" ]; - / certificate print count-only where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" or fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6"; + /certificate/set name="R3" [ find where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" ]; + /certificate/set name="ISRG-Root-X1" [ find where fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6" ]; + /certificate/print count-only where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" or fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6"; ![screenshot: check certs](README.d/03-check-certs.avif) @@ -82,14 +85,9 @@ 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! -One extra step is required if you run RouterOS v6: - - :global ScriptUpdatesUrlSuffix "\?h=routeros-v6"; - Now let's download the main scripts and add them in configuration on the fly. - :global ScriptUpdatesUrlSuffix; - :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ / system script add name=$Script source=([ / tool fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . $ScriptUpdatesUrlSuffix) output=user as-value]->"data"); }; + :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script) output=user as-value]->"data"); }; ![screenshot: import scripts](README.d/04-import-scripts.avif) @@ -98,35 +96,24 @@ The configuration needs to be tweaked for your needs. Edit [`global-config`](global-config) (the one without `-overlay`). Save changes and exit with `Ctrl-o`. - / system script edit global-config-overlay source; + /system/script edit global-config-overlay source; ![screenshot: edit global-config-overlay](README.d/05-edit-global-config-overlay.avif) And finally load configuration and functions and add the scheduler. - / 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; }"; + /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/06-run-and-schedule-scripts.avif) The last step is optional: Add this scheduler **only** if you want the scripts to be updated automatically! - / system scheduler add name="ScriptInstallUpdate" start-time=startup interval=1d on-event=":global ScriptInstallUpdate; \$ScriptInstallUpdate;"; + /system/scheduler/add name="ScriptInstallUpdate" start-time=startup interval=1d on-event=":global ScriptInstallUpdate; \$ScriptInstallUpdate;"; ![screenshot: schedule update](README.d/07-schedule-update.avif) -### Changes for RouterOS v6 - -RouterOS v7 is the way to go, let's consider RouterOS v6 deprecated. -If you want to stay with RouterOS v6 for some time add these lines -to your `global-config-overlay`, if missing: - - # Use branch routeros-v6 with RouterOS v6: - :global ScriptUpdatesUrlSuffix "\?h=routeros-v6"; - -Then reload the configuration. - Updating scripts ---------------- @@ -155,7 +142,7 @@ Most scripts are designed to run regularly from added `check-routeros-update`, so let's run it every hour to make sure not to miss an update. - / system scheduler add name="check-routeros-update" interval=1h on-event="/ system script run check-routeros-update;"; + /system/scheduler/add name="check-routeros-update" interval=1h on-event="/system/script/run check-routeros-update;"; ![screenshot: schedule script](README.d/10-schedule-script.avif) @@ -164,8 +151,8 @@ in DNS use `dhcp-to-dns` with the events from dhcp server. For a regular 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;"; + /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;"; ![screenshot: setup lease script](README.d/11-setup-lease-script.avif) @@ -240,7 +227,7 @@ still use my scripts to manage and deploy yours, by specifying `base-url` This will fetch and install a script `hello-world.rsc` from the given url: - $ScriptInstallUpdate hello-world.rsc "base-url=https://git.eworm.de/cgit/routeros-scripts/plain/README.d/" + $ScriptInstallUpdate hello-world.rsc "base-url=https://git.eworm.de/cgit/routeros-scripts/plain/README.d/"; ![screenshot: install custom script](README.d/12-install-custom-script.avif) diff --git a/global-config.changes b/global-config.changes index 0ee4eba..4bb87a9 100644 --- a/global-config.changes +++ b/global-config.changes @@ -77,13 +77,13 @@ 68="Reintroduced 'global-wait' for functions in scheduler."; 69="Support hard lower limit for voltage in 'check-health'."; 70="MikroTik started pushing RouterOS v7. Changes are no longer required."; - 71="MikroTik is pushing RouterOS v7 even more, in parallel branches. If you want to keep RouterOS v6 for some time see https://git.eworm.de/cgit/routeros-scripts/about/#changes-for-routeros-v6"; + 71="MikroTik is pushing RouterOS v7 even more, in parallel branches. If you want to keep RouterOS v6 for some time see https://git.eworm.de/cgit/routeros-scripts/about/#requirements"; 72="Introduced new script 'netwatch-dns' to manage DNS and DoH servers from netwatch."; 73="Renamed backup scripts ('cloud-backup' -> 'backup-cloud', 'email-backup' -> 'backup-email', 'upload-backup' -> 'backup-upload')."; 74="Extended 'hotspot-to-wpa', it can now read additional configuration from templates and hotspot users."; 75=("Finally merged the RouterOS v7 code into the main branch. " . [ $IfThenElse ([ $RequiredRouterOS "global-config.changes" "7.0" false ] = true) \ ("You may now drop '\$ScriptUpdatesUrlSuffix' from 'global-config-overlay'.") \ - ("Still running RouterOS v6, so last reminder to see https://git.eworm.de/cgit/routeros-scripts/about/#changes-for-routeros-v6") ]); + ("Still running RouterOS v6, so last reminder to see https://git.eworm.de/cgit/routeros-scripts/about/#requirements") ]); 76="Added an option to suppress notifications on host down with 'netwatch-notify'."; 77="Introduced new script 'firmware-upgrade-reboot'. Handle with care!"; 78="New documentation is online for notifications via Telegram & Matrix, variable inspection, ip address calculation and running scripts once."; From 44c7d56858da3a10ec9f990a499ec3339394da20 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:43:14 +0200 Subject: [PATCH 52/99] INITIAL-COMMANDS: RouterOS v7 path syntax --- INITIAL-COMMANDS.md | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 66db40c..e8be3e1 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -7,35 +7,30 @@ Initial commands > not aware of the procedure please follow > [the long way in detail](README.md#the-long-way-in-detail). -One extra step is required if you run RouterOS v6: - - :global ScriptUpdatesUrlSuffix "\?h=routeros-v6"; - -Then run the complete base installation: +Run the complete base installation: { - :global ScriptUpdatesUrlSuffix; - / tool fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/R3.pem" dst-path="letsencrypt-R3.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/R3.pem" dst-path="letsencrypt-R3.pem" as-value; :delay 1s; - / certificate import file-name=letsencrypt-R3.pem passphrase=""; - :if ([ :len [ / certificate find where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" or fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6" ] ] != 2) do={ + /certificate/import file-name=letsencrypt-R3.pem passphrase=""; + :if ([ :len [ /certificate/find where fingerprint="67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd" or fingerprint="96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6" ] ] != 2) do={ :error "Something is wrong with your certificates!"; }; - / file remove "letsencrypt-R3.pem"; + /file/remove "letsencrypt-R3.pem"; :delay 1s; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ - / system script add name=$Script source=([ / tool fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . $ScriptUpdatesUrlSuffix) output=user as-value]->"data"); + /system/script/add name=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script) output=user as-value]->"data"); }; - / 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; }"; + /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; }"; :global CertificateNameByCN; $CertificateNameByCN "R3"; $CertificateNameByCN "ISRG Root X1"; - } + }; Optional to update the scripts automatically: - / system scheduler add name="ScriptInstallUpdate" start-time=startup interval=1d on-event=":global ScriptInstallUpdate; \$ScriptInstallUpdate;"; + /system/scheduler/add name="ScriptInstallUpdate" start-time=startup interval=1d on-event=":global ScriptInstallUpdate; \$ScriptInstallUpdate;"; --- [◀ Go back to main README](README.md) From 6c2a7faedd0de6e01b0a4b9df078978722506b98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:49:19 +0200 Subject: [PATCH 53/99] doc/accesslist-duplicates: RouterOS v7 path syntax --- doc/accesslist-duplicates.d/01-example.avif | Bin 5172 -> 5208 bytes doc/accesslist-duplicates.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/accesslist-duplicates.d/01-example.avif b/doc/accesslist-duplicates.d/01-example.avif index 9b26451f371110d1539602b9a7d5fe636be664bd..11b3fc5f21ace72fe8f36ff62b9439e90cd39a90 100644 GIT binary patch delta 4986 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 E$@uTM!2kdN delta 4950 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 Date: Wed, 11 May 2022 09:50:23 +0200 Subject: [PATCH 54/99] doc/backup-cloud: RouterOS v7 path syntax --- doc/backup-cloud.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 6a15688..b0dc3ef 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -45,11 +45,11 @@ Usage and invocation Just run the script: - / system script run backup-cloud; + /system/script/run backup-cloud; Creating a scheduler may be an option: - / system scheduler add interval=1w name=backup-cloud on-event="/ system script run backup-cloud;" start-time=09:20:00; + /system/scheduler/add interval=1w name=backup-cloud on-event="/system/script/run backup-cloud;" start-time=09:20:00; See also -------- From 81b0ed6675e153c70f5acbcc02f6412cadcc0e7b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:51:23 +0200 Subject: [PATCH 55/99] doc/backup-email: RouterOS v7 path syntax --- doc/backup-email.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/backup-email.md b/doc/backup-email.md index 701f10a..e04a988 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -9,8 +9,8 @@ Send backup via e-mail Description ----------- -This script sends binary backup (`/ system backup save`) and complete -configuration export (`/ export terse show-sensitive`) via e-mail. +This script sends binary backup (`/system/backup/save`) and complete +configuration export (`/export terse show-sensitive`) via e-mail. Requirements and installation ----------------------------- @@ -36,11 +36,11 @@ Usage and invocation Just run the script: - / system script run backup-email; + /system/script/run backup-email; Creating a scheduler may be an option: - / system scheduler add interval=1w name=backup-email on-event="/ system script run backup-email;" start-time=09:15:00; + /system/scheduler/add interval=1w name=backup-email on-event="/system/script/run backup-email;" start-time=09:15:00; See also -------- From d4df7467b3c38cb9a9f8cc6b9d06ea5f54f986dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:52:07 +0200 Subject: [PATCH 56/99] doc/backup-partition: RouterOS v7 path syntax --- doc/backup-partition.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index c31c780..b502330 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -27,11 +27,11 @@ Usage and invocation Just run the script: - / system script run backup-partition; + /system/script/run backup-partition; 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; + /system/scheduler/add interval=1w name=backup-partition on-event="/system/script/run backup-partition;" start-time=09:30:00; See also -------- From fedf74300d53896dfa6614a73d4200b3c9584597 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:54:12 +0200 Subject: [PATCH 57/99] doc/backup-upload: RouterOS v7 path syntax --- doc/backup-upload.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index a3620c4..58c1e56 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -9,8 +9,8 @@ Upload backup to server Description ----------- -This script uploads binary backup (`/ system backup save`) and complete -configuration export (`/ export terse show-sensitive`) to external server. +This script uploads binary backup (`/system/backup/save`) and complete +configuration export (`/export terse show-sensitive`) to external server. > ⚠️ **Warning**: The used command can hit errors that a script can not handle. > This may result in script termination (where no notification is sent) or @@ -60,11 +60,11 @@ Usage and invocation Just run the script: - / system script run backup-upload; + /system/script/run backup-upload; Creating a scheduler may be an option: - / system scheduler add interval=1w name=backup-upload on-event="/ system script run backup-upload;" start-time=09:25:00; + /system/scheduler/add interval=1w name=backup-upload on-event="/system/script/run backup-upload;" start-time=09:25:00; See also -------- From fe88af2d5f265631932058e6ea32cff3f96b511e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:54:24 +0200 Subject: [PATCH 58/99] doc/capsman-download-packages: RouterOS v7 path syntax --- doc/capsman-download-packages.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index bac8a3c..0fdd6cb 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -24,7 +24,7 @@ Just install the script on CAPsMAN device: Optionally add a scheduler to run after startup: - / system scheduler add name=capsman-download-packages on-event="/ system script run capsman-download-packages;" start-time=startup; + /system/scheduler/add name=capsman-download-packages on-event="/system/script/run capsman-download-packages;" start-time=startup; Packages available in local storage in older version are downloaded unconditionally. The script tries to download missing packages by guessing @@ -35,7 +35,7 @@ Usage and invocation Run the script manually: - / system script run capsman-download-packages; + /system/script/run capsman-download-packages; ... or from scheduler. From b3ec0f7fb9926ebf8e3ad1e9ef1ee9f1b62ade14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:54:35 +0200 Subject: [PATCH 59/99] doc/capsman-rolling-upgrade: RouterOS v7 path syntax --- doc/capsman-rolling-upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index 34e3c91..94a2a79 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -33,7 +33,7 @@ that script when required. Alternatively run it manually: - / system script run capsman-rolling-upgrade; + /system/script/run capsman-rolling-upgrade; See also -------- From c4831366892224d69aa16fbef43e5a0de421923e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:55:14 +0200 Subject: [PATCH 60/99] doc/certificate-renew-issued: RouterOS v7 path syntax --- doc/certificate-renew-issued.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index d7c4676..d8201a7 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -33,7 +33,7 @@ Usage and invocation Run the script to renew certificates issued from a local CA. - / system script run certificate-renew-issued; + /system/script/run certificate-renew-issued; Only scripts with a remaining lifetime of three weeks or less are renewed. The old certificate is revoked automatically. If a passphrase for a specific From c52f69b98d9ae280e172ea575c3224f0657d041b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:56:21 +0200 Subject: [PATCH 61/99] doc/check-certificates: RouterOS v7 path syntax --- doc/check-certificates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index a553e6a..f8a4eae 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -44,15 +44,15 @@ Usage and invocation Just run the script: - / system script run check-certificates; + /system/script/run check-certificates; ... or create a scheduler for periodic execution: - / system scheduler add interval=1d name=check-certificates on-event="/ system script run check-certificates;" start-time=startup; + /system/scheduler/add interval=1d name=check-certificates on-event="/system/script/run check-certificates;" start-time=startup; Alternatively running on startup may be desired: - / system scheduler add name=check-certificates-startup on-event="/ system script run check-certificates;" start-time=startup; + /system/scheduler/add name=check-certificates-startup on-event="/system/script/run check-certificates;" start-time=startup; See also -------- From 6086064129692011a1e7c9a196f84cf5a63ef576 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:57:09 +0200 Subject: [PATCH 62/99] doc/check-health: RouterOS v7 path syntax --- doc/check-health.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/check-health.md b/doc/check-health.md index f6900ce..52efa4c 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -21,7 +21,7 @@ Note that bad initial state will not trigger an event. Only sensors available in hardware can be checked. See what your hardware supports: - / system health print; + /system/health/print; ### Sample notifications @@ -45,7 +45,7 @@ Requirements and installation Just install the script and create a scheduler: $ScriptInstallUpdate check-health; - / system scheduler add interval=1m name=check-health on-event="/ system script run check-health;" start-time=startup; + /system/scheduler/add interval=1m name=check-health on-event="/system/script/run check-health;" start-time=startup; Configuration ------------- From 578ef72c8910057426c838f15d2120f21c2e90d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:57:50 +0200 Subject: [PATCH 63/99] doc/check-lte-firmware-upgrade: RouterOS v7 path syntax --- doc/check-lte-firmware-upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 704a86b..6550734 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -30,7 +30,7 @@ Just install the script: ... and create a scheduler: - / system scheduler add interval=1d name=check-lte-firmware-upgrade on-event="/ system script run check-lte-firmware-upgrade;" start-time=startup; + /system/scheduler/add interval=1d name=check-lte-firmware-upgrade on-event="/system/script/run check-lte-firmware-upgrade;" start-time=startup; Configuration ------------- From 15035cd70d35e4c0b503d86c5e70e0e9058108bb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:58:53 +0200 Subject: [PATCH 64/99] doc/check-routeros-update: RouterOS v7 path syntax --- 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 0710b76..f43cec9 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -41,7 +41,7 @@ Just install the script: And add a scheduler for automatic update notification: - / system scheduler add interval=1d name=check-routeros-update on-event="/ system script run check-routeros-update;" start-time=startup; + /system/scheduler/add interval=1d name=check-routeros-update on-event="/system/script/run check-routeros-update;" start-time=startup; Configuration ------------- @@ -65,7 +65,7 @@ Usage and invocation Be notified when run from scheduler or run it manually: - / system script run check-routeros-update; + /system/script/run check-routeros-update; If an update is found you can install it right away. From 847892c09f17815d326b75a5ccb99965a0ade5cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 09:59:32 +0200 Subject: [PATCH 65/99] doc/collect-wireless-mac: RouterOS v7 path syntax --- doc/collect-wireless-mac.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 5425f76..afdf73a 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -22,8 +22,8 @@ and modify it to your needs. Requirements and installation ----------------------------- -Depending on whether you use CAPsMAN (`/ caps-man`) or local wireless -interface (`/ interface wireless`) you need to install a different script. +Depending on whether you use CAPsMAN (`/caps-man`) or local wireless +interface (`/interface/wireless`) you need to install a different script. For CAPsMAN: From 2f52057e84f2488bb08c873d6a50be5917a8db79 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:00:56 +0200 Subject: [PATCH 66/99] doc/daily-psk: RouterOS v7 path syntax --- doc/daily-psk.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/daily-psk.md b/doc/daily-psk.md index d204691..e27c2c9 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -21,8 +21,8 @@ Requirements and installation Just install this script. -Depending on whether you use CAPsMAN (`/ caps-man`) or local wireless -interface (`/ interface wireless`) you need to install a different script. +Depending on whether you use CAPsMAN (`/caps-man`) or local wireless +interface (`/interface/wireless`) you need to install a different script. For CAPsMAN: @@ -34,8 +34,8 @@ For local interface: And add schedulers to run the script: - / system scheduler add interval=1d name=daily-psk-nightly on-event="/ system script run daily-psk.local;" start-date=may/23/2018 start-time=03:00:00; - / system scheduler add name=daily-psk-startup on-event="/ system script run daily-psk.local;" start-time=startup; + /system/scheduler/add interval=1d name=daily-psk-nightly on-event="/system/script/run daily-psk.local;" start-date=may/23/2018 start-time=03:00:00; + /system/scheduler/add name=daily-psk-startup on-event="/system/script/run daily-psk.local;" start-time=startup; These will update the passphrase on boot and nightly at 3:00. @@ -49,7 +49,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Then add an access list entry: - / interface wireless access-list add comment="Daily PSK" interface=wl-daily private-pre-shared-key="ToBeChangedDaily"; + /interface/wireless/access-list/add comment="Daily PSK" interface=wl-daily private-pre-shared-key="ToBeChangedDaily"; Also notification settings are required for e-mail, [matrix](mod/notification-matrix.md) and/or From d9201aa29a914a0d0e89bf106c6ab69939d32850 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:01:30 +0200 Subject: [PATCH 67/99] doc/dhcp-lease-comment: RouterOS v7 path syntax --- doc/dhcp-lease-comment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 8679bfa..bb9222e 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -15,8 +15,8 @@ from wireless access list. Requirements and installation ----------------------------- -Depending on whether you use CAPsMAN (`/ caps-man`) or local wireless -interface (`/ interface wireless`) you need to install a different script. +Depending on whether you use CAPsMAN (`/caps-man`) or local wireless +interface (`/interface/wireless`) you need to install a different script. For CAPsMAN: From 7aea231940caf043104df04638b4a2548149b042 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:02:15 +0200 Subject: [PATCH 68/99] doc/dhcp-to-dns: RouterOS v7 path syntax --- doc/dhcp-to-dns.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index 245b457..bde7f12 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -23,7 +23,7 @@ Then run it from dhcp server as lease script. You may want to use A scheduler cares about cleanup: - / system scheduler add interval=15m name=dhcp-to-dns on-event="/ system script run dhcp-to-dns;" start-time=startup; + /system/scheduler/add interval=15m name=dhcp-to-dns on-event="/system/script/run dhcp-to-dns;" start-time=startup; Configuration ------------- From 474c4f7a62faa763d3064bd668a1cf343bf32a63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:03:01 +0200 Subject: [PATCH 69/99] doc/firmware-upgrade-reboot: RouterOS v7 path syntax --- doc/firmware-upgrade-reboot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index c913d8e..0215ce9 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -21,7 +21,7 @@ Requirements and installation Just install the script and create a scheduler: $ScriptInstallUpdate firmware-upgrade-reboot; - / system scheduler add name=firmware-upgrade-reboot on-event="/ system script run firmware-upgrade-reboot;" start-time=startup; + /system/scheduler/add name=firmware-upgrade-reboot on-event="/system/script/run firmware-upgrade-reboot;" start-time=startup; Enjoy firmware being up to date and in sync with RouterOS. From 3e1802a1a032237f927b26e0dab3e26a284b7160 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:03:38 +0200 Subject: [PATCH 70/99] doc/global-wait: RouterOS v7 path syntax --- doc/global-wait.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/global-wait.md b/doc/global-wait.md index 2a7fbfa..ac3e5cc 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -27,7 +27,7 @@ Just install the script: ... and add it to your scheduler, for example in combination with the module to [manage VLANs on bridge ports](mod/bridge-port-vlan.md): - / system scheduler add name=bridge-port-vlan on-event="/ system script run global-wait; :global BridgePortVlan; \$BridgePortVlan default;" start-time=startup; + /system/scheduler/add name=bridge-port-vlan on-event="/system/script/run global-wait; :global BridgePortVlan; \$BridgePortVlan default;" start-time=startup; See also -------- From 060d12d273b0fabab36914138c06e02ee1043ba1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:04:20 +0200 Subject: [PATCH 71/99] doc/gps-track: RouterOS v7 path syntax --- doc/gps-track.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/gps-track.md b/doc/gps-track.md index 3b9c94f..c7d28f6 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -23,7 +23,7 @@ Just install the script: ... and create a scheduler: - / system scheduler add interval=1m name=gps-track on-event="/ system script run gps-track;" start-time=startup; + /system/scheduler/add interval=1m name=gps-track on-event="/system/script/run gps-track;" start-time=startup; Configuration ------------- @@ -32,7 +32,7 @@ The configuration goes to `global-config-overlay`, the only parameter is: * `GpsTrackUrl`: the url to send json data to -The configured coordinate format (see `/ system gps`) defines the format +The configured coordinate format (see `/system/gps`) defines the format sent to the server. --- From d68958dd77d8bb5d4dbf4c4504fef8a2ecd58439 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:05:47 +0200 Subject: [PATCH 72/99] doc/hotspot-to-wpa: RouterOS v7 path syntax --- doc/hotspot-to-wpa.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 8733a7c..211d4fb 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -25,7 +25,7 @@ Then install the script: Configure your hotspot to use this script as `on-login` script: - / ip hotspot user profile set on-login=hotspot-to-wpa [ find ]; + /ip/hotspot/user/profile/set on-login=hotspot-to-wpa [ find ]; ### Automatic cleanup @@ -36,11 +36,11 @@ access list forever. Install the optional script for automatic cleanup: Create a scheduler: - / system scheduler add interval=1d name=hotspot-to-wpa-cleanup on-event="/ system script run hotspot-to-wpa-cleanup;" start-time=startup; + /system/scheduler/add interval=1d name=hotspot-to-wpa-cleanup on-event="/system/script/run hotspot-to-wpa-cleanup;" start-time=startup; And add the lease script to your wpa interfaces' dhcp server: - / ip dhcp-server set lease-script=lease-script [ find where name~"wpa" ]; + /ip/dhcp-server/set lease-script=lease-script [ find where name~"wpa" ]; Configuration ------------- @@ -51,8 +51,8 @@ entries are to be added. Create hotspot login credentials: - / ip hotspot user add add comment="Test User 1" name=user1 password=v3ry; - / ip hotspot user add add comment="Test User 2" name=user2 password=s3cr3t; + /ip/hotspot/user/add comment="Test User 1" name=user1 password=v3ry; + /ip/hotspot/user/add comment="Test User 2" name=user2 password=s3cr3t; Additionally templates can be created to give more options for access list: @@ -66,12 +66,12 @@ Additionally templates can be created to give more options for access list: For a hotspot called `example` the template could look like this: - / caps-man access-list add comment="hotspot-to-wpa template example" disabled=yes private-passphrase="ignore" ssid-regexp="^example\$" vlan-id=10 vlan-mode=use-tag; + /caps-man/access-list/add comment="hotspot-to-wpa template example" disabled=yes private-passphrase="ignore" ssid-regexp="^example\$" vlan-id=10 vlan-mode=use-tag; The same settings are available in hotspot user's comment and take precedence over the template settings: - / ip hotspot user add comment="private-passphrase=ignore, ssid-regexp=^example\\\$, vlan-id=10, vlan-mode=use-tag" name=user password=v3ry-s3cr3t; + /ip/hotspot/user/add comment="private-passphrase=ignore, ssid-regexp=^example\\\$, vlan-id=10, vlan-mode=use-tag" name=user password=v3ry-s3cr3t; Usage and invocation -------------------- From ea619c8efcc16b4a5dfcc05f0ffca58cac60967a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:06:27 +0200 Subject: [PATCH 73/99] doc/ipsec-to-dns: RouterOS v7 path syntax --- doc/ipsec-to-dns.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index 349ae63..87ad21a 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -21,7 +21,7 @@ Just install the script: This script is run from scheduler: - / system scheduler add interval=1m name=ipsec-to-dns on-event="/ system script run ipsec-to-dns;" start-time=startup; + /system/scheduler/add interval=1m name=ipsec-to-dns on-event="/system/script/run ipsec-to-dns;" start-time=startup; Configuration ------------- From ad6dc85320ed6d4f6051203a5702b63cbf6a20b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:07:33 +0200 Subject: [PATCH 74/99] doc/ipv6-update: RouterOS v7 path syntax --- doc/ipv6-update.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index ae4eb6a..7c5a943 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -23,14 +23,14 @@ Just install the script: Your ISP needs to provide an IPv6 prefix, your device receives it via dhcp: - / ipv6 dhcp-client add add-default-route=yes interface=ppp-isp pool-name=isp request=prefix script=ipv6-update; + /ipv6/dhcp-client/add add-default-route=yes interface=ppp-isp pool-name=isp request=prefix script=ipv6-update; Note this already adds this script as `script`. The pool name (here: "`isp`") is important, we need it later. Also this expects there is an address assigned from pool to an interface: - / ipv6 address add from-pool=isp interface=br-local; + /ipv6/address/add from-pool=isp interface=br-local; Sometimes dhcp client is stuck on reconnect and needs to be released. Installing [ppp-on-up](ppp-on-up.md) may solve this. @@ -41,7 +41,7 @@ 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: - / ipv6 firewall address-list add address=2003:cf:2f0f:de00::/56 comment=ipv6-pool-isp list=extern; + /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. @@ -50,13 +50,13 @@ 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 has to be associated to an interface in comment: - / ipv6 firewall address-list add address=2003:cf:2f0f:de01::/64 comment="ipv6-pool-isp, interface=br-local" list=local; + /ipv6/firewall/address-list/add address=2003:cf:2f0f:de01::/64 comment="ipv6-pool-isp, interface=br-local" list=local; Static DNS records need a special comment to be updated. Again it has to start with "`ipv6-pool-`" and actual pool name, followed by a comma, "`interface=`" and the name of interface this address is connected to: - / ip dns static add address=2003:cf:2f0f:de00:1122:3344:5566:7788 comment="ipv6-pool-isp, interface=br-local" name=test.example.com ttl=15m; + /ip/dns/static/add address=2003:cf:2f0f:de00:1122:3344:5566:7788 comment="ipv6-pool-isp, interface=br-local" name=test.example.com ttl=15m; See also -------- From 77ef9c09194c74e58ce16d1531be106b4a61fa72 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:08:11 +0200 Subject: [PATCH 75/99] doc/ip-addr-bridge: RouterOS v7 path syntax --- doc/ip-addr-bridge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index 44dac6a..75685bb 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -19,7 +19,7 @@ Just install the script: ... and make it run from scheduler: - / system scheduler add name=ip-addr-bridge on-event="/ system script run ip-addr-bridge;" start-time=startup; + /system/scheduler/add name=ip-addr-bridge on-event="/system/script/run ip-addr-bridge;" start-time=startup; This will disable IP addresses on bridges without at lease one running port. The IP address is enabled if at least one port is running. From e25f13fe17e6dc6b75df8e39ecad3c5ce7cb2358 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:08:41 +0200 Subject: [PATCH 76/99] doc/lease-script: RouterOS v7 path syntax --- doc/lease-script.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lease-script.md b/doc/lease-script.md index 16fc73e..a435d43 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -32,7 +32,7 @@ Just install the script: ... and add it as `lease-script` to your dhcp server: - / ip dhcp-server set lease-script=lease-script [ find ]; + /ip/dhcp-server/set lease-script=lease-script [ find ]; See also -------- From 36ec2e1595e1d7fb746c0ed050546d7196544ff8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:09:58 +0200 Subject: [PATCH 77/99] doc/leds-mode: RouterOS v7 path syntax --- doc/leds-mode.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index b525220..65f9f01 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -21,21 +21,21 @@ Usage and invocation To switch the device to dark mode: - / system script run leds-night-mode; + /system/script/run leds-night-mode; ... and back to normal mode: - / system script run leds-day-mode; + /system/script/run leds-day-mode; To toggle between the two modes: - / system script run leds-toggle-mode; + /system/script/run leds-toggle-mode; Add these schedulers to switch to dark mode in the evening and back to normal mode in the morning: - / system scheduler add interval=1d name=leds-day-mode on-event="/ system script run leds-day-mode;" start-time=07:00:00; - / system scheduler add interval=1d name=leds-night-mode on-event="/ system script run leds-night-mode;" start-time=21:00:00; + /system/scheduler/add interval=1d name=leds-day-mode on-event="/system/script/run leds-day-mode;" start-time=07:00:00; + /system/scheduler/add interval=1d name=leds-night-mode on-event="/system/script/run leds-night-mode;" start-time=21:00:00; The script `leds-toggle-mode` can be used from [mode button](mode-button.md) to toggle mode. From c5044e10cebf0b6d93550084afd1be3a91119bb4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:10:34 +0200 Subject: [PATCH 78/99] doc/log-forward: RouterOS v7 path syntax --- 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 1f3eae5..c91f09a 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -33,7 +33,7 @@ Just install the script: ... and add a scheduler: - / system scheduler add interval=1m name=log-forward on-event="/ system script run log-forward;" start-time=startup; + /system/scheduler/add interval=1m name=log-forward on-event="/system/script/run log-forward;" start-time=startup; Configuration ------------- From e88a547f60b6c8b8f3575751eb49b89ebb91c995 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:15:05 +0200 Subject: [PATCH 79/99] doc/mod/bridge-port-to: RouterOS v7 path syntax --- doc/mod/bridge-port-to.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 02d1e8d..2b42a9b 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -22,20 +22,20 @@ Just install the module: Configuration ------------- -The configuration goes to ports' comments (`/ interface bridge port`). +The configuration goes to ports' comments (`/interface/bridge/port`). - / interface bridge port add bridge=br-guest comment="default=dhcp-client, alt=br-guest" disabled=yes interface=en1; - / interface bridge port add bridge=br-intern comment="default=br-intern, alt=br-guest" interface=en2; - / interface bridge port add bridge=br-guest comment="default=br-guest, extra=br-extra" interface=en3; + /interface/bridge/port/add bridge=br-guest comment="default=dhcp-client, alt=br-guest" disabled=yes interface=en1; + /interface/bridge/port/add bridge=br-intern comment="default=br-intern, alt=br-guest" interface=en2; + /interface/bridge/port/add bridge=br-guest comment="default=br-guest, extra=br-extra" interface=en3; Also dhcp client can be handled: - / ip dhcp-client add comment="toggle with bridge port" disabled=no interface=en1; + /ip/dhcp-client/add comment="toggle with bridge port" disabled=no interface=en1; Add a scheduler to start with default setup on system startup: $ScriptInstallUpdate global-wait; - / system scheduler add name=bridge-port-vlan on-event="/ system script run global-wait; :global BridgePortTo; \$BridgePortTo default;" start-time=startup; + /system/scheduler/add name=bridge-port-vlan on-event="/system/script/run global-wait; :global BridgePortTo; \$BridgePortTo default;" start-time=startup; Usage and invocation -------------------- From 21416c42ef2aa249a96abc83b880e46a9174a622 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:15:14 +0200 Subject: [PATCH 80/99] doc/mod/bridge-port-vlan: RouterOS v7 path syntax --- doc/mod/bridge-port-vlan.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index 290826e..0e6c28f 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -23,24 +23,24 @@ Configuration Using named VLANs you have to add comments in bridge vlan menu: - / interface bridge vlan add bridge=bridge comment=intern tagged=br-local vlan-ids=10; - / interface bridge vlan add bridge=bridge comment=geust tagged=br-local vlan-ids=20; - / interface bridge vlan add bridge=bridge comment=extra tagged=br-local vlan-ids=30; + /interface/bridge/vlan/add bridge=bridge comment=intern tagged=br-local vlan-ids=10; + /interface/bridge/vlan/add bridge=bridge comment=geust tagged=br-local vlan-ids=20; + /interface/bridge/vlan/add bridge=bridge comment=extra tagged=br-local vlan-ids=30; -The configuration goes to ports' comments (`/ interface bridge port`). +The configuration goes to ports' comments (`/interface/bridge/port`). - / interface bridge port add bridge=bridge comment="default=dhcp-client, alt=guest" disabled=yes interface=en1; - / interface bridge port add bridge=bridge comment="default=intern, alt=guest, extra=30" interface=en2; - / interface bridge port add bridge=bridge comment="default=guest, extra=extra" interface=en3; + /interface/bridge/port/add bridge=bridge comment="default=dhcp-client, alt=guest" disabled=yes interface=en1; + /interface/bridge/port/add bridge=bridge comment="default=intern, alt=guest, extra=30" interface=en2; + /interface/bridge/port/add bridge=bridge comment="default=guest, extra=extra" interface=en3; Also dhcp client can be handled: - / ip dhcp-client add comment="toggle with bridge port" disabled=no interface=en1; + /ip/dhcp-client/add comment="toggle with bridge port" disabled=no interface=en1; Add a scheduler to start with default setup on system startup: $ScriptInstallUpdate global-wait; - / system scheduler add name=bridge-port-vlan on-event="/ system script run global-wait; :global BridgePortVlan; \$BridgePortVlan default;" start-time=startup; + /system/scheduler/add name=bridge-port-vlan on-event="/system/script/run global-wait; :global BridgePortVlan; \$BridgePortVlan default;" start-time=startup; Usage and invocation -------------------- From f00ff997a446fa4f53d4a1906d5cf08e5008afcb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 12:03:56 +0200 Subject: [PATCH 81/99] doc/mod/inspectvar: RouterOS v7 path syntax --- doc/mod/inspectvar.d/inspectvar.avif | Bin 2891 -> 2838 bytes doc/mod/inspectvar.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/inspectvar.d/inspectvar.avif b/doc/mod/inspectvar.d/inspectvar.avif index d4a745f2c26446eb02c053a96294bfe35219a984..f1da1d4d1bd2685dd596c851d4100623463bd455 100644 GIT binary patch delta 2469 zcmV;W30n5c7M2!}egX;nk${yJ1Z`wtbP@mx3OHsmIGYFvXf%K_>l2eJ0f2w4tDLI( z`l6$)U(b9+RMP+* zNDtTQ$M|kdLcdUk`up0qNYxKD=>S>G2@dIexd6C8XVB1Fc#YfUQcAVr`|vs|d+Gnz zkS;~2j5|=;Z71|4)7;D2gvNhYs=K-yfC8moI(n;c@lr@>1E}H)ZN+L z$vNwor(BexXF)cC+BZ|NtsRN^5y{+R)&_Bivj_Zkr;gQ~B_(lLD!nRXS*~#H%I|kG zG=RGXoxeb>42+24P6|Y)v+;KUOV_yfTt+bs!n&jPQFJzc4JdDEt^`cXmSLaf$jqL_ zhlXjiSmkI&@sAt0numWGd507oE)vOH9$G?dn8VkUt)dDxgr?_N5qlHUrx#El;_Iva zODm(@w4?A{o!$@c{CgotaJ8SXJ(u-A(?h>3v?~dN3*zjtqiYg??sTyma@=Q@ieJ{@j0oI+P5RS#k-J3kZD( z9q}+LmH2nLf^{A4^s-)ik*1rGbL;M+T1oZJm{{ z2^FxUPZ2-Dd~rXOwpRSyW%Afv#LZAOEC?hK^pe)h8EZ6}x~{wX%-Um1UW(rT_wcx{vZ4Vh`8$u-EC zFpbQhW%3!z=kzzX<32zX0sWGX7iAM|Mv(kALm3!r5Pm##Xvax|i9hz%h;y_>6EXILqHXnQiNq#)ggIPHc zF_ujAj4OYy2{-?@R6*226w#eX)|)qS1vzN)WHkNf<1WOoPs`{dcvW%&I%H!V%Mq8Z zKWFGI4Q3aGl{zB(^T01g7D4*>LPQ(I-8~Xsw%&U_=5~rMjE9@-Dx*79TDrb05HC& zGbaaK_WDUe_rKKbj(D30e z+>>{4&Dl6bH?iR$%+*!38Ew%5!{HH`%4l}oe@f5Z)PuEaUf_Q|`R2!in_wKYWf4fMd${m>P}eKxC5Hvem-J)Rjoy;x8A*V#<(+>> z<}MtNE-XTRMA(>_;+O=x$!hCPPQLHLS6vj)n#*J@vso1;DI*`9NCo^nkdlk*O9ZY{++&T*?X)OZPwSSTXH!d@nUBQz$PAcVd0v@HLKuR#SFm-v8HR!ZrFlie=Y+q%bID{ zBayRA{*m5_xTh|w=SEdg{ONTU=H7et@759JnCM4!&sQ}l=bbp{B(ZHYS2}s2|SKN|L9GgiLaOp;3QTZFSTlWE~T0=!_`1u4+ zhEmt57^={t3UkxcQhrUt`uCUj!?{j6=n|!x3;nz^#Mj@R@NohXh6sQE1y&E~m~D;b zq-X=b5T8~xc_|3mq(G@FWseaVO`mU0LduvXhs{v55AwhNzv=Fx0WLMZFq8rkjkmNZ zPbVvISua-MY`BLEOMa++=CNq|<4Yl-)q|)1W>`No_W9Yh8ma=w27rr`p9Lu0IxL~4 zsAggw4#57x2W}D-kWPP+_4ZmD4tHHe?Nv)eE>&!szF*~=z7p^<9@p0~v|zaoqTzpld!?1!xFQ^?_uxb zA5%iMIl|0-Oi78e3=a@ir0@$=gpUw5>#2a6rn6FTx+ESq&K-Xs&Pa%5aMJ~8IVtIX z{IX!SjmMMP&OI2!g9+oJh{p3TAD<=3^T3PVTK9P7)cxb0hTxwk01}b3gW$kWA=6tp zKl|F**2Vgl^=4!+FDIC@6OD73P*06YOf`0mOux>_EON*8vK?#Jqr+8?tJ7BSZmJQW z|H`-_M8`fUqv?Ivj4su3cReVu#2uD7B;IYX(y`Lh delta 2523 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 diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index d3fb3b2..7782c8a 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -24,7 +24,7 @@ Usage and invocation Call the function `$InspectVar` with a variable as parameter: - $InspectVar $ModeButton + $InspectVar $ModeButton; ![InspectVar](inspectvar.d/inspectvar.avif) From 344ae8a55d0a797bc1601f08d0e492be1d45c478 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 13:12:32 +0200 Subject: [PATCH 82/99] doc/mod/ipcalc.d/ipcalc: RouterOS v7 path syntax --- doc/mod/ipcalc.d/ipcalc.avif | Bin 1791 -> 1729 bytes doc/mod/ipcalc.d/ipcalcreturn.avif | Bin 1283 -> 1247 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/mod/ipcalc.d/ipcalc.avif b/doc/mod/ipcalc.d/ipcalc.avif index 022f325bc4637fbb9e4cee8a8d9ad66eab3ba49e..fe726e8c323ea28cda327d70c16ad80fbfcdac4e 100644 GIT binary patch delta 1341 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 VOzhxFmE=C(S3DQ2F494|Ti{ZHy8{3K From 76127ed53c527641a31e069e2f525ac22982463f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:15:25 +0200 Subject: [PATCH 83/99] doc/mod/notification-matrix: RouterOS v7 path syntax --- .../notification-matrix.d/01-home-server.avif | Bin 2402 -> 2317 bytes .../02-access-token.avif | Bin 4278 -> 4105 bytes .../notification-matrix.d/03-join-room.avif | Bin 3143 -> 3166 bytes doc/mod/notification-matrix.md | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/mod/notification-matrix.d/01-home-server.avif b/doc/mod/notification-matrix.d/01-home-server.avif index 8a79ae6a1d304cc01e0f4c12021f9da3d0ee737f..683c7b581bbf141e83a831ddfec8c47a8383d6e0 100644 GIT binary patch delta 1952 zcmV;R2VeN&5{(j&egX&ck${vI2m5VgVRRAz3JEwRvN~)aA)wMS;}4T60eOGiZ|IDD ze+;%*l+A6S=w*NZxl0Xz5@XkUms0Ij%E*yqFI|c$`4B2iaYxL`e43M&BmUboenS61 z=Sj!$NJ%$zfB(9F(xdRYg75NfV`jWT@L|Ha121Ol%Zxv48pO>c^J!(3SzR&31-u@z z1$dq6U5)@_w3A=r`z_rfKqP;Si13$-`9z$|Z)uv$(wNiKK!Z|ZPFnkfc(!x%00g)W zheNsNk_fh?1SR1J8Usf#;iP;3u*iNd+vj&$V{c;U$F@EDMFGh@Wyp4)Rtx)sjGrWi zx%ufg9QSoGzBvBiEa>t<5iRAsFrneZPAjU{Zo-*_2z5E&hP*5~3x0pzv1b)AfLU6C zKS9!dGRYn6C=x?yI<0fb;NRH}G7KfuT%zJHs$vq?*S3iD&pYyt%}QnJ@Nv0LzoAHd zwdq^I%MqS#!cbW3jg3ze`q!Ox(po&DSfdJ9d@RKb&vi+IlA=OyqBAFH0|9ifPghoG zh;u9ORh^Gr`O_@8w?%(hb#M=GC%+=ALpy9`f0$+F4P4B#?~l)Uy~G!PN#ipPztmtrvWcq)KpX@lqXj|**njq3W zl#I*ivCniB2g`USj|co=nbM$hL^wk|U}hpC#VPoz1npTJTJ!L4bNL<(vjF2n%u*{O zcpQf%y##6y1+pvp@z=>CNHmV}3$*#9!$p+Q)wM`(=lsrGbw51Bc7yNw^l_a(g1z=` zs-9NsTwFAMA8~&ij5WKY5dsCWn{zV=7mz=uwJGgYS_jY<5m14cIJy2aNf^$ht%^wn zcRG|l5QATFLevwd%US%nquynC+Vp$($6gff6kLnP`;5k9?36wi-~NME{hQ5cT$-Sh z+j1=u+MfguG+xf*RQ%?2!;FGO26p)Y?z728q>$oBlaGgXdjMIRAox7#hXRXT_@hYoyo=@(&%s3sqI#XPQ=)G}|3j z5(pql;`&1XE}_0>y&IT~u#!@H0fZs+X6&hX98nJAJJq9rhIC&ZPdw8X47rc?5d*Bu zS22L@&XIqO5>dUO*B&#uj)i zKoJLLIk$__P*njfWUPt4xv0Eqz}7Tfj>e zOQL^5p4%Kx1<}XsXf^Kp2FHD%Bh^LrQbuYL&J(+=)+OLe%+`MF@awdTeB|Fy%&Kcu zu4YZiC6xQ{DBB{Jd|n1rOqq!oW#p2ug4(zaE%~f|^kpqCJ>u!yffvQ?j@YesHYBNU zHqpc;#OBxMUX?_XPjj514sP8g4jVafP-}mEVQYca_lFx=dv@UPL%AN`I!-}kR&3~18;=+XUt8!>#I-z0;MwhBs2rEkOTa%PC8mFWTJ)%O!*iiJ&(Hb{-^+x8G z-_%pC^`MT3oYxh8MIIVngc7jyAdi1gFDDC%T0SxUMZGxZhn9JUq)s*#k_?kMoVtZn zcTS;Km=h9bt8xCepfA=SqEMmzdv9O&M5ipRiutS^x<^nejh=DC@7i5FTgZQcV=7ts zN$p6qg#5}8F>apxUT6W{Bhj#fRxP0_IG{h~7A8&E6@z2kvjw~U=6Z@lsoG9NB+M+2dFu(P=|`1c4B zL44hBG;q|nf-V2D58)a~$76=0YRe7|ko(-_{u>BM+etGU`WnBTyo|BQM2wE8w9mn} mUoyw-H4G9LUuh(Z?k{qp6}^^JRGLXg_5;YOAXWUduvie=W6odz delta 2038 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 delta 4021 zcmV;m4@&TfAhscpegY4ik${vI52S5mVRRAz3JEwR@;WvU5YTBdj31LK0Um$MmfhFn z)eP|dEkt}WwIy=wZ6qtegg0)QQPA+U6Ml6!QdBB?1l0G1W37G1zGsR72%yKPRIn{* z`4|<6~StMqvN|poEdhe?)+Ccf40_ZJtDW+>fK-CJWiy11t;uG5k#SF#P2*KH5 z88#~&I#N-hD6bv?v;4pvBE~$Mjt*cAXXPxXCuXw^*yF0l~>lkt{r;Q15H5JPsA58A3 z@%VHnb%MBu`-vcG=AmTX2vOKLWTSdlClH3X+4`^pWuG{J0tgGh0FnBVUq zl(*8HK~bpSzr}wo^?>HA3d=a>qqt_phr}@7qnaDNE9ScwTZYz2Pkm z@dk0@m9W4Qg_{>h;iz_vbqv3;+#n->l&v|uO?>E82gU;8LiT!G~5XVm^lB8`zo>bm@tn{h~t6-JR>DQ!bh==M|CqUFB}IN*1`JR z3TX0Vfc~9mi#oohtnxspQ01*1^<9-&BiZXd7DwujCJW|8>S5-ylzwfS<49ZH1IY$6 zmi~;6VaTsyZ#^O2W=j+S8?Vk@>g}Aj{7w`mhW>v*>R>%DLYuG(S@6))C-WstForvS zX%|t2U#&Lwf^Eax;FmpY zO!F?1KVxR2tBp$sSmCHDmHto8&mo&c$NPoDb|rg#U_U<4enf$my0u9KecQQ@TSd-- zDhhud^>PC%4)Y^V7tC?+dRjlv!g%IE26iD)bh)86_bJQz!_lm!kxM+Z`h1xZPC}RS z&V0s~B{hI_88L3vC^0Hp0!f)?#-^E_xRn4igI*2E{uMOHAZ!x=)##po zfbgK;^0OVTi{HLu2YqdJ!C8v>`X7UHBhY^q4p52dsN97}L$5@Mb55p}r3>_SvlrY| zIru$n+N?M^P}4ekIm&Qp>l&GDS-9$D5dq`E4rjwx@%}SmNi>}_pFJWJ2RutPj~_Cy z(G52{GP8lr#IfqczWvEYS8T%gK6!AYVnOuGQ|LMHw`z3+IJx(Ie#Ue5POs=T?GG3mWnCVCexuE#g$nbSw6ZAL+H*?m$yq=#2q zt(_`BI?x*4$FZvv;g1(*+kgmMFQA_8CNjYtU6uj)STt^$dU9GV2EYFZGN7?m@7E?# zZ9F;y34LxGqPAwlWHJ;fU4+FIx}9Oqj(O9%IyU0L4)sCB0Z{_3bQg zTNUb$yoU|wE!iAVWAd=1FTlKb>jQN2TbQrFa_;vN)BBnz>1@@SZitmQeer+pvT*ZGum{`b zXD?b9;OG(P0$W4l!tBb|CY#k05oHk(+;;5Tv)0>Q zg@9-jPu~V9DMXS}#U%cR?Fjp2+cMDKg5TBkOhkn6&o>+q7MfO+z}%axIZ=wj}?2dF*JEh?2BP=*%r$ z*mUiQQ8z9=IIe$NaO;Z!C#ttz|8sw{;)>6|PmC8Ah|RIiPky62d-#&#ChTMpFs~MR zEkK{d>MDUbkB0i3lIOfQAan=@2oYPz!$d}Yh$lW4er4r_y>DRxjI~xtVNLQCb^W3Q ze~FNQZJhyI52~<#@_vB*X{^~le&`5ahBBFB$1f%Q0aJg0hO3l&kSr-A`Wz2oD>wAC z+J^aVNF0h%uZvuEYz1qMUu9A6U*2ljzN(z0C(!msY8o zKEADBa&RSJ5!U!>VzN#*2VH9us3C+S>>!7!zY4b|LIr*gtS*nt7V;Kf`NtfXv87es z_iKmOJeq%O!~=BW@7a^>czywG+yG7M>QeNb_*9%R(t(ABg`a^(EC{IZVTyV9d9nPt z$!|lMWAo}+dTpQMFpX{3UU0+*p4l0GExP4S>p-uot!}fwX^aJSnbhL(?IrihbTA(( z1#Z^rcRGW)x0Qg(W7jKbQtIP7L1Kr(uV43e4sw4Du%-e+_?1~ZoI~-t=MI{oJR28^k)i6B z)3(chO}v}U{p&m6K0U$IGJwrpWkV>7R4t|T)mq%?5)_*an(v6O&Cv|8O8gv<24#1{7oe_&U$6MR@`BOG122DT{)-5Of4_jj4Q82jau2MU*apgO+cjyu z&E^QhK0_$kx?O}f>4UplnuRSwOtC%s$FQR5kxd4wi{!JbOVctxQ4$LzmsK3MHVfpW z5O;$ffc3t8KIcFlR5x+0j=Xyg!dDf-(1xlgj^Vx}N4CvR&nR@)89YvEdHaPzDj9!P zCmGEoves_B z4)*UVd%A$D4$zxASAbDAFyU%@M+H7>E&%yRe*>I5A+tN5#mC=d(}U1&#HS=oo32S; zKMxe}EsrPoMLTXKJ6cd#B~4XXv4lQ{bXAb;gwE}jyyaCC*`>F?wN6r6c+7uOA7b%& z;!WSJCN7i@E_QQ}0wlpG=GbOH0_iQbRl#!{D-m;)!F7Vls#Q=N-KTnRP1fs)bH%g? z*;QxsL`@VES~JonaHysn?buAu(I8h!Ev87eQaA*6i#W>s5k*BNYFlGOR5+AHr!l{8 zUI({xXVhKKkr(npcHFXTgsOl2WkGddc}VNG1@$O861ROcHNzlyFk*N0LOVWaVGcfH zGSA7Mthawg_;W%mg>wR}p_{b|u^>29oG^Iz+( zm-=672~Fei#z!O8OI?X%3_JG%uLhEb5n*HZjBeB=ndpHMg09ue@Tq?gjA}m4n6rfL z!*F)aw=ml0i8dlB_nI&t!r)j^QRb7ddl+t+9cBn=x00_m*1zuG zesD@b3v~B$HB?zXh3tQ{jD;(qAp_*T)FD!Q=GEjW0s|7Ytx2@?mm`=_)_$+gXVdU&^4kqDiC|@J7$2LQx5R(6D;=o~wBT=m(CYPV z<@Bm!%1Ch$MJn{CNIz&BMhIKJw3cR-Qn(8g5^9%{DvogrjSpgb b_ah!0Uq(lM4ZRIr9YnIu@0w9$w69sf+swI9 diff --git a/doc/mod/notification-matrix.d/03-join-room.avif b/doc/mod/notification-matrix.d/03-join-room.avif index c7fad4e8f04277b9dc5e4d3a78646af120b60448..45974b86b5fc39c652591cebd32650bcc78f0b5f 100644 GIT binary patch delta 2873 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 diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 91a39e5..3da5659 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -42,7 +42,7 @@ Your best bet is to query the server at `domain` with the [well-known uri](https://spec.matrix.org/latest/client-server-api/#well-known-uri). For "*matrix.org*" this query is: - / tool fetch "https://matrix.org/.well-known/matrix/client" output=user; + /tool/fetch "https://matrix.org/.well-known/matrix/client" output=user; ![home server](notification-matrix.d/01-home-server.avif) @@ -59,7 +59,7 @@ account must be sent to the home server via We use the home server discovered above, "*matrix-client.matrix.org*". The user is "*example*" and password is "*v3ry-s3cr3t*". - / tool fetch "https://matrix-client.matrix.org/_matrix/client/r0/login" http-method=post http-data="{\"type\":\"m.login.password\", \"user\":\"example\", \"password\":\"v3ry-s3cr3t\"}" output=user; + /tool/fetch "https://matrix-client.matrix.org/_matrix/client/r0/login" http-method=post http-data="{\"type\":\"m.login.password\", \"user\":\"example\", \"password\":\"v3ry-s3cr3t\"}" output=user; ![access token](notification-matrix.d/02-access-token.avif) @@ -80,7 +80,7 @@ this can be done with Make sure to replace room id ("*!*" is escaped with "*%21*") and access token with your data. - / tool fetch "https://matrix-client.matrix.org/_matrix/client/r0/rooms/%21WUcxpSjKyxSGelouhA:matrix.org/join?access_token=yt_ZXdvcm0tdGVzdA_NNqUyvKHRhBLZmnzVVSK_0xu6yN" http-method=post http-data="" output=user; + /tool/fetch "https://matrix-client.matrix.org/_matrix/client/r0/rooms/%21WUcxpSjKyxSGelouhA:matrix.org/join?access_token=yt_ZXdvcm0tdGVzdA_NNqUyvKHRhBLZmnzVVSK_0xu6yN" http-method=post http-data="" output=user; ![join room](notification-matrix.d/03-join-room.avif) From 95a75b3fa19f501fe5db8404a1c59a970cc8d7cd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:32:48 +0200 Subject: [PATCH 84/99] doc/mod/scriptrunonce: RouterOS v7 path syntax --- doc/mod/scriptrunonce.d/hello-world.rsc | 2 +- doc/mod/scriptrunonce.d/scriptrunonce.avif | Bin 2466 -> 2356 bytes doc/mod/scriptrunonce.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mod/scriptrunonce.d/hello-world.rsc b/doc/mod/scriptrunonce.d/hello-world.rsc index 17ec575..6404781 100644 --- a/doc/mod/scriptrunonce.d/hello-world.rsc +++ b/doc/mod/scriptrunonce.d/hello-world.rsc @@ -1,3 +1,3 @@ #!rsc by RouterOS -:put ("Hello World from " . [ / system identity get name ] . "!"); +:put ("Hello World from " . [ /system/identity/get name ] . "!"); diff --git a/doc/mod/scriptrunonce.d/scriptrunonce.avif b/doc/mod/scriptrunonce.d/scriptrunonce.avif index 614c72c670ff87f31bbd59d11c73927d62630129..27ccd41fa5541090b5c12e9f50c653e14f6f0e47 100644 GIT binary patch delta 2055 zcmV+i2>AD+6SNYLe*qeifRz*?ZDe6|5&#MbI3=<=Y#o331rEXy|uaRzf#~dVA2?e=<;%>=+=q{V9X?* zVrWfD3^X@ufY<`RIVUTBQlzXr<5ekp$};v`~EW+|Dm)QIiZV`$85s zkbz2k5rV1GMaJq;N)c2LnG`!@*q)K`26Ts$MEQpByff_pQa5RTPr?hJYn&bEfCu{N zUAp;n_A=j4HtL=my4eQd7YpISxs*}}y}E+ywB?5;8I3%Q(bAs4KC|ks-nsfMPUB%< zbrP4Sd_S9mF4K5@srW4}9<|^29CL%bRVYX}d}9x!qt@nJz=yArBWJyC2>oCoh~%~t z)~ZvQeloU*Rq)z>_7OrFEyJ`A)h_P_Q0K`lw;Mqu^#{z{q`|^AV)kTP9UEbU!gAnR z(B|O+L(dG9W7`xyF|4K~>udcSdQcp2MprL{M60$*Nnn+HfvA1a&Y+3*T2huqit^RG zl*y*sd*$5871kZ0qB-$+O7GxhU)Ypwbm?Fdn9pbPwUh~e-3C*h)0H^*?S5aKN}2rT zhR}qYS;B31`#L*K1FroS&rwVvT53vd`^=@ER;F8y$U+eDxn{Oh#%V)oUF%VwHScDC zy}afV=rmZFv&u%62P`X*^oZf3};>P<< zPpcM(wy%|cmxq6maWi@qV2JtRhDle|*9l9APi~nzSk^GswbZWgiSzEGG(DD-whqn5 zpxo411yebIAe2FqQ7B?KYX5jNUA2fy22=3GFb9M@X}G}9ap4>74Kpjn@w>+8J@_dJ zD%i}%a#T*!JxS^MJ>BdW#zZ^Z``5vdR3D8%)Dy7n>ENZwf`S|%aZ+C3TeYx80! z#tPE3{Pbs#IXid4P1i0f-j30cpTejF<^+H9tK3suXQ^cfixbQC6wfXb4{UdoME1!Zp;YG&v3`%Oj1LNkCm@QtFw{bIHFVnABUR4hw z)G?PKlI*S~mQ}?K2d@Zf^!$utLUom6eup!Eb+L}WF9#X2cYHibgXCv;8y{&vv)t_ENJjiBWvO28ie*e~b`Y@|4rwEX)Bp0%(}$OnSTRc9hFBydVOCb88w@P?Z@-h?BEIMqrTJBe z;pH_)FGISZBoj4K%o4{B#{Ej zw64)mLqgdCYgZ}s0 zQ^CDIXclM;>+d+Oxz&vvVB@E(3*E5Drf}R@(Z4vI8MAo!)XIA}1*%~VO-;Jq%J9DsSG7$wx z&-8W@29L>|h==T_P}Xn=8E|f#;`A5}yPwV`TOmnyl^t-~gS2ug@oIJ$&SXEZ9x4AS z@oIu^GB<~sd#H%UP~dQfPo3j(Zb+R24nM-A0wZQki3v#l~-%)b*=6 zhFGI}nB|F$7JqF%=FMg0>CrlRv~;%cRKhufj$mnhz0EUwfsEeBsA-_;)9z~bj7{jZ zTHk>KCk_MJ5~i8}eP@5+Dt#}u7)#8T4x&$WN*3F#@I~S`Q}2>u6Vd}*&2ELn=$Qk& z+eLO6Z`C0W!Y{aLK*_Fv+B8P~I7vKDnmkIc{*#oF5o{CVO$ku+RtWWJC!1pu+w4#_ lo#R>h*_LYC1%R4Rwqnt=5*ghP);yMo1aYFjUSzgzv@b6A1*HH0 delta 2166 zcmV-+2#NQ!5~353e*uV*fRz-GZDe6|5&#MbI3=<=Y#-JVir2($N8M!?X8&M4%OY+xuvt}UJK{gN`A9;s~ zQTBjG#U-bH>p^9x`29q%MTpZM{WElB5OnbHXhZ;PU^HG@mI#DEv*cTQDc4KShe;2f zu0-efitEF~*RXC}HVz&%>3KvCvPwHhh)dXD6FR?H&8=@yfD(6q+^BWS^gc2>#?CsI z#Iaj`3E4L^e6Om~*))PoXzyp7RE>Lv3P^BZs2I0{AI;*P*F5+~EKCu{D$&IV(j zzkT&QtTwY9v*yuDzBG%j>*or14oeU}q;ZX&I%}FK46c24lpKleJpKW-D%&fc#gDw~ z;E@|UPj5nr#h9CaJ!MXVm1h08ZBaIJ7&PAEBb&B%KBcbhidjVyYx}W3ErTLVQTCll zGj;sdB@s}dv*acMHc5b#XvmAa$7j1`i*rTXu`xxV(w>dHf>#(4twhkcwO+)a)_-HI z(N#i>Un^|btXgwvCp=pF*Ap(1C(d!qTGE zvmFA4YHJ9STOtNH_HBCWMOmVn_W^6&+5z%o2KKxw9pVndjJHHvN@mXtyw=efw@m!4crI!w zt$OutO82*Yqa9;$Mu=Hgv@Zj@>?rVl8^Pl=-p>?LfjK%&-bn3vBxw@ zomq+Y$oL~IsQKmNppo8qI!w;efL;&lG1RhxwrB2t=vl_Zm{_fH)x(&gG|T^JanHI+ zb8~u99H>MY&|9nXglcWwlUpH*G{$mVyDzsts8>IgeI-~Y3bD@}W!H-^#+%Lf86-P~ z4b%<|i|iJDV9Yx|rP_L3MuQf@E=g7#f+K|n8*kZYSffJVDmE$TO{f8AQ!NYTox>sl z5g!|WHd-CpqBNo-JU|X4Q(j3 zOd|!`tO&Dh6JHAMKB$q70xZI+z^sE~5Qfx`Lp!f2-$j;!YBMFMcBIDzR5$A@TwXJO zLlT+n^z)hc%H!q5ta!+xcp}*0@5J3!YOc35j?Y%QoZy5Y>nbsYUcsYdNM=oOe*%Xc z`jtjes&cvXHS~6h2S&d#wIfuvCFolrEB3xYI+gR@3Khz6(I?JmM@)w-?s>1gXGTmB zqBxkz37i4JOnD3B`mvz0>*Q)Lk9!?|p+Ejioa>Hx@9%Kq9K}@+`Q$!35nkGZG<#Y} zrBSUb@jS&QJp4=M#T|FuBX{K3V&%RYIEmAJ5cT4NY{Y?%m`$kH>E^06zC**3gaK2& z@Mc^0+i|{D2aI{lcoJuvQ*N43M{km)IQZjy0W1rlyi~XKMfdOdy}nl9{ayoqT|7pC z*@<74#eCp(p+`?6J!!`ys*f>>RlkoO9(at;Uik-(akEQVkHz)DmE^UNGHt07;8bP~ zg;^?4pOaAMeS$tG+kLoG6=6r4udmKbO36Sma`w2QQnR2piJQ3*VdMY`2|lH*rNdch z`AtzFIe^Qt9SoFrzoD;~SyV57UHQ6j9Iy`z*zC{s9+FX`XpP!!#{L>YN8Olpd%63L zWIs7bZ1v7O_Gg)BCExy+4MB3!YepMWQ1A-vHCMU(Hc7fAy!LH>s4_|HAz`Dl4t zB%dU7p}F>T2VYHoPBEkcU64}BuS%iIzBY|mfQ(#wkq@xMv2RzmnIj;tn`e~_ z8@-$gRZn3Xksr=@AoCM!n`K{~PksB?!q9 Date: Wed, 11 May 2022 10:17:53 +0200 Subject: [PATCH 85/99] doc/mode-button: RouterOS v7 path syntax --- doc/mode-button.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/mode-button.md b/doc/mode-button.md index c1c059e..ef7754c 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -13,17 +13,17 @@ This script extend the functionality of mode button. Instead of just one you can trigger several actions by pressing the mode button several times. The hardware needs to have a mode button, see -`/ system routerboard mode-button`. Starting with RouterOS 6.47beta60 you +`/system/routerboard/mode-button`. Starting with RouterOS 6.47beta60 you can configure the reset button to act the same, see -`/ system routerboard reset-button`. +`/system/routerboard/reset-button`. Copy this code to terminal to check: ``` -:if ([ :len [ /system routerboard mode-button print as-value ] ] > 0) do={ +: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={ + :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."; @@ -40,11 +40,11 @@ Just install the script: Then configure the mode button to run `mode-button`: - / system routerboard mode-button set enabled=yes on-event="/ system script run mode-button;"; + /system/routerboard/mode-button/set enabled=yes on-event="/system/script/run mode-button;"; To use the reset button instead: - / system routerboard reset-button set enabled=yes on-event="/ system script run mode-button;"; + /system/routerboard/reset-button/set enabled=yes on-event="/system/script/run mode-button;"; Configuration ------------- @@ -57,7 +57,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Usage and invocation -------------------- -Press the mode button. :) +Press the mode button. 😜 --- [◀ Go back to main README](../README.md) From 9ef2718c6dc209b5774193c76c9e18e019fac5d6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:19:11 +0200 Subject: [PATCH 86/99] doc/netwatch-dns: RouterOS v7 path syntax --- doc/netwatch-dns.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 4fbfc2b..798ad92 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -21,7 +21,7 @@ Just install the script: Then add a scheduler to run it periodically: - / system scheduler add interval=1m name=netwatch-dns on-event="/ system script run netwatch-dns;" start-time=startup; + /system/scheduler/add interval=1m name=netwatch-dns on-event="/system/script/run netwatch-dns;" start-time=startup; Configuration ------------- @@ -29,9 +29,9 @@ Configuration The DNS and DoH servers to be checked have to be added to netwatch with specific comment: - / tool netwatch add comment="doh, hostname=cloudflare-dns" host=1.1.1.1; - / tool netwatch add comment="dns, hostname=google-dns" host=8.8.8.8; - / tool netwatch add comment="doh, dns, hostname=quad-nine" host=9.9.9.10; + /tool/netwatch/add comment="doh, hostname=cloudflare-dns" host=1.1.1.1; + /tool/netwatch/add comment="dns, hostname=google-dns" host=8.8.8.8; + /tool/netwatch/add comment="doh, dns, hostname=quad-nine" host=9.9.9.10; This will configure *cloudflare-dns* for DoH (`https://1.1.1.1/dnsquery`), and *google-dns* and *quad-nine* for regular DNS (`8.8.8.8,9.9.9.10`) if up. @@ -39,15 +39,15 @@ If *cloudflare-dns* is down the script will fall back to *quad-nine* for DoH. Giving a specific query url for DoH is possible: - / tool netwatch add comment="doh, hostname=nextdns, doh-url=https://dns.nextdns.io/dns-query" host=199.247.16.158; + /tool/netwatch/add comment="doh, hostname=nextdns, doh-url=https://dns.nextdns.io/dns-query" host=199.247.16.158; Note that using a name in DoH url may introduce a chicken-and-egg issue! Sometimes using just one specific (possibly internal) DNS server may be desired, with fallback in case it fails. This is possible as well: - / tool netwatch add comment="dns, hostname=pi-hole" host=10.0.0.10; - / tool netwatch add comment="dns-fallback, hostname=cloudflare-dns" host=1.1.1.1; + /tool/netwatch/add comment="dns, hostname=pi-hole" host=10.0.0.10; + /tool/netwatch/add comment="dns-fallback, hostname=cloudflare-dns" host=1.1.1.1; Tips & Tricks ------------- @@ -57,7 +57,7 @@ Tips & Tricks Netwatch entries can be created to work with both - this script and [netwatch-notify](netwatch-notify.md). Just give options for both: - / tool netwatch add comment="doh, notify, hostname=cloudflare-dns" host=1.1.1.1; + /tool/netwatch/add comment="doh, notify, hostname=cloudflare-dns" host=1.1.1.1; Also this allows to update host address, see option `resolve`. From 7561c719d1ca8747c9fddf10d3f4dd473528848b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:24:18 +0200 Subject: [PATCH 87/99] doc/netwatch-notify: RouterOS v7 path syntax --- doc/netwatch-notify.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index b2f6dd0..85bfb73 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -10,7 +10,7 @@ Description ----------- This script sends notifications about host UP and DOWN events. In comparison -to just netwatch (`/ tool netwatch`) and its `up-script` and `down-script` +to just netwatch (`/tool/netwatch`) and its `up-script` and `down-script` this script implements a simple state machine and dependency model. Host down events are triggered only if the host is down for several checks and optional parent host is not down to avoid false alerts. @@ -29,14 +29,14 @@ Just install the script: Then add a scheduler to run it periodically: - / system scheduler add interval=1m name=netwatch-notify on-event="/ system script run netwatch-notify;" start-time=startup; + /system/scheduler/add interval=1m name=netwatch-notify on-event="/system/script/run netwatch-notify;" start-time=startup; Configuration ------------- The hosts to be checked have to be added to netwatch with specific comment: - / tool netwatch add comment="notify, hostname=example.com" host=[ :resolve "example.com" ]; + /tool/netwatch/add comment="notify, hostname=example.com" host=[ :resolve "example.com" ]; ### Hooks @@ -44,7 +44,7 @@ It is possible to run an up hook command (`up-hook`) or down hook command (`down-hook`) when a notification is triggered. This has to be added in comment, note that some characters need extra escaping: - / tool netwatch add comment=("notify, hostname=device, down-hook=/ interface ethernet \\{ disable \\\"en2\\\"; enable \\\"en2\\\"; \\}") host=10.0.0.20; + /tool/netwatch/add comment=("notify, hostname=device, down-hook=/interface/ethernet \\{ disable \\\"en2\\\"; enable \\\"en2\\\"; \\}") host=10.0.0.20; Also there is a `pre-down-hook` that fires at two thirds of failed checks required for the notification. The idea is to fix the issue before a @@ -54,15 +54,15 @@ notification is sent. The count threshould (default is 5 checks) is configurable as well: - / tool netwatch add comment="notify, hostname=example.com, count=10" host=104.18.144.11; + /tool/netwatch/add comment="notify, hostname=example.com, count=10" host=104.18.144.11; ### Parents & dependencies If the host is behind another checked host add a dependency, this will suppress notification if the parent host is down: - / tool netwatch add comment="notify, hostname=gateway" host=93.184.216.1; - / tool netwatch add comment="notify, hostname=example.com, parent=gateway" host=93.184.216.34; + /tool/netwatch/add comment="notify, hostname=gateway" host=93.184.216.1; + /tool/netwatch/add comment="notify, hostname=example.com, parent=gateway" host=93.184.216.34; Note that every configured parent in a chain increases the check count threshould by one. @@ -72,7 +72,7 @@ threshould by one. The host address can be updated dynamically. Give extra parameter `resolve` with a resolvable name: - / tool netwatch add comment="notify, hostname=example.com, resolve=example.com"; + /tool/netwatch/add comment="notify, hostname=example.com, resolve=example.com"; But be warned: Dynamic updates will probably cause issues if the name has more than one record in dns - a high rate of configuration changes (and flash @@ -84,7 +84,7 @@ Also suppressing the notification on host down is possible with parameter `no-down-notification`. This may be desired for devices that are usually powered off, but accessibility is of interest. - / tool netwatch add comment="notify, hostname=printer, no-down-notification" host=10.0.0.30; + /tool/netwatch/add comment="notify, hostname=printer, no-down-notification" host=10.0.0.30; Go and get your coffee ☕️ before sending the print job. @@ -101,8 +101,8 @@ Sometimes it is sufficient if one of a number of hosts is available. You can make `netwatch-notify` check for that by adding several items with same `hostname`. Note that `count` has to be multiplied to keep the actual time. - / tool netwatch add comment="notify, hostname=service, count=10" host=10.0.0.10; - / tool netwatch add comment="notify, hostname=service, count=10" host=10.0.0.20; + /tool/netwatch/add comment="notify, hostname=service, count=10" host=10.0.0.10; + /tool/netwatch/add comment="notify, hostname=service, count=10" host=10.0.0.20; ### Checking internet connectivity @@ -112,11 +112,11 @@ check `1.1.1.1` (Cloudflare DNS), `9.9.9.9` (Quad-nine DNS), `8.8.8.8` (Google DNS) or any other reliable address that indicates internet connectivity. - / tool netwatch add comment="notify, hostname=internet" host=1.1.1.1; + /tool/netwatch/add comment="notify, hostname=internet" host=1.1.1.1; A target like this suits well to be parent for other checks. - / tool netwatch add comment="notify, hostname=example.com, parent=internet" host=93.184.216.34; + /tool/netwatch/add comment="notify, hostname=example.com, parent=internet" host=93.184.216.34; ### Checking specific ISP @@ -124,12 +124,13 @@ Having several ISPs for redundancy a failed link may go unnoticed without proper monitoring. You can use routing-mark to monitor specific connections. Create a route and firewall mangle rule. - / ip route add distance=1 gateway=isp1 routing-mark=via-isp1; - / ip firewall mangle add action=mark-routing chain=output new-routing-mark=via-isp1 dst-address=1.0.0.1 passthrough=yes; + /routing/table/add fib name=via-isp1; + /ip/route/add distance=1 gateway=isp1 routing-table=via-isp1; + /ip/firewall/mangle/add action=mark-routing chain=output new-routing-mark=via-isp1 dst-address=1.0.0.1 passthrough=yes; Finally monitor the address with `netwatch-notify`. - / tool netwatch add comment="notify, hostname=quad-one via isp1" host=1.0.0.1; + /tool/netwatch/add comment="notify, hostname=quad-one via isp1" host=1.0.0.1; Note that *all* traffic to the given address is routed that way. In case of link failure this address is not available, so use something reliable but @@ -141,7 +142,7 @@ non-essential. In this example the address `1.0.0.1` is used, the same service Netwatch entries can be created to work with both - this script and [netwatch-dns](netwatch-dns.md). Just give options for both: - / tool netwatch add comment="doh, notify, hostname=cloudflare-dns" host=1.1.1.1; + /tool/netwatch/add comment="doh, notify, hostname=cloudflare-dns" host=1.1.1.1; See also -------- From 6f76a41962ccf7ad756e99c8155418d281ef5452 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:24:59 +0200 Subject: [PATCH 88/99] doc/netwatch-syslog: RouterOS v7 path syntax --- doc/netwatch-syslog.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-syslog.md b/doc/netwatch-syslog.md index 9a28bb9..760d98f 100644 --- a/doc/netwatch-syslog.md +++ b/doc/netwatch-syslog.md @@ -16,8 +16,8 @@ Requirements and installation Let's assume there is a remote log action and associated logging rule: - / system logging action set remote=10.0.0.1 [ find where name="remote" ]; - / system logging add action=remote topics=info; + /system/logging/action/set remote=10.0.0.1 [ find where name="remote" ]; + /system/logging/add action=remote topics=info; Just install the script: @@ -25,7 +25,7 @@ Just install the script: ... and create a netwatch matching the IP address from logging action above: - / tool netwatch add down-script=netwatch-syslog host=10.0.0.1 up-script=netwatch-syslog; + /tool/netwatch/add down-script=netwatch-syslog host=10.0.0.1 up-script=netwatch-syslog; All logging rules are disabled when host is down. From 47b6f8941aaa71fcbcee5329118517ffe92b306d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:25:45 +0200 Subject: [PATCH 89/99] doc/ospf-to-leds: RouterOS v7 path syntax --- doc/ospf-to-leds.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index 2fba33e..5ab5c75 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -22,7 +22,7 @@ Just install the script: ... and add a scheduler to run the script periodically: - / system scheduler add interval=20s name=ospf-to-leds on-event="/ system script run ospf-to-leds;" start-time=startup; + /system/scheduler/add interval=20s name=ospf-to-leds on-event="/system/script/run ospf-to-leds;" start-time=startup; Configuration ------------- @@ -30,7 +30,7 @@ Configuration The configuration goes to OSPF instance's comment. To visualize state for instance `default` via LED `user-led` set this: - / routing ospf instance set default comment="ospf-to-leds, leds=user-led"; + /routing/ospf/instance/set default comment="ospf-to-leds, leds=user-led"; --- [◀ Go back to main README](../README.md) From eb014b26b2053e993cfa9ec8e97bd48c53c848f9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:26:26 +0200 Subject: [PATCH 90/99] doc/packages-update: RouterOS v7 path syntax --- doc/packages-update.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/packages-update.md b/doc/packages-update.md index 243e72b..57f02d9 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -10,7 +10,7 @@ Description ----------- In rare cases RouterOS fails to properly downlaod package on update -(`/ system package update install`), resulting in borked system with missing +(`/system/package/update/install`), resulting in borked system with missing packages. This script tries to avoid this situation by doing some basic verification. @@ -35,7 +35,7 @@ Usage and invocation Alternatively run it manually: - / system script run packages-update; + /system/script/run packages-update; See also -------- From d9d2d67a4e66bd7df0bb0d3ae89f0acc88ed5b3b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:26:51 +0200 Subject: [PATCH 91/99] doc/ppp-on-up: RouterOS v7 path syntax --- doc/ppp-on-up.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index ae58da5..7545c5e 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -24,7 +24,7 @@ Just install the script: ... and make it the `on-up` script for ppp profile: - / ppp profile set on-up=ppp-on-up [ find ]; + /ppp/profile/set on-up=ppp-on-up [ find ]; See also -------- From 45232019f4462d1a979eee5b935432888dbfad0b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:27:23 +0200 Subject: [PATCH 92/99] doc/rotate-ntp: RouterOS v7 path syntax --- doc/rotate-ntp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rotate-ntp.md b/doc/rotate-ntp.md index 775b977..f548eba 100644 --- a/doc/rotate-ntp.md +++ b/doc/rotate-ntp.md @@ -36,7 +36,7 @@ addresses from pool if required. Alternatively a scheduler can be created: - / system scheduler add interval=5d name=rotate-ntp on-event="/ system script run rotate-ntp;" start-time=startup; + /system/scheduler/add interval=5d name=rotate-ntp on-event="/system/script/run rotate-ntp;" start-time=startup; --- [◀ Go back to main README](../README.md) From 25d11f798d63788dcfa89fecb4962d65edc25d1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:28:24 +0200 Subject: [PATCH 93/99] doc/sms-action: RouterOS v7 path syntax --- doc/sms-action.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sms-action.md b/doc/sms-action.md index 8442774..d2e3252 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -30,7 +30,7 @@ The configuration goes to `global-config-overlay`, this is the only parameter: Then enable SMS actions: - / tool sms set allowed-number=+491234567890 receive-enabled=yes secret=s3cr3t; + /tool/sms/set allowed-number=+491234567890 receive-enabled=yes secret=s3cr3t; Usage and invocation -------------------- From 06509f6af424a6a30aa2bc630729414d83e67593 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:28:35 +0200 Subject: [PATCH 94/99] doc/sms-forward: RouterOS v7 path syntax --- doc/sms-forward.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 9ebae69..80cb7ad 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -26,7 +26,7 @@ Just install the script: ... and add a scheduler to run it periodically: - / system scheduler add interval=2m name=sms-forward on-event="/ system script run sms-forward;" start-time=startup; + /system/scheduler/add interval=2m name=sms-forward on-event="/system/script/run sms-forward;" start-time=startup; Configuration ------------- @@ -36,7 +36,7 @@ Notification settings are required for e-mail, [telegram](mod/notification-telegram.md). Also you have to enable receiving of SMS: - / tool sms set receive-enabled=yes; + /tool/sms/set receive-enabled=yes; See also -------- From 4ca43dcde3de7680d83f989e398686da587550d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:29:01 +0200 Subject: [PATCH 95/99] doc/ssh-keys-import: RouterOS v7 path syntax --- doc/ssh-keys-import.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ssh-keys-import.md b/doc/ssh-keys-import.md index 3dc8ccf..d83311f 100644 --- a/doc/ssh-keys-import.md +++ b/doc/ssh-keys-import.md @@ -22,7 +22,7 @@ Usage and invocation Copy files with extension "`pub`" containing public SSH keys for your device. Then run the script: - / system script run ssh-keys-import; + /system/script/run ssh-keys-import; Starting with an `authorized_keys` file you can split it on a shell: From c2637ee72c454c9df46ca3ac37a6eacc283a9cfe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:29:25 +0200 Subject: [PATCH 96/99] doc/super-mario-theme: RouterOS v7 path syntax --- doc/super-mario-theme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index 68484dc..8142cda 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -22,7 +22,7 @@ Usage and invocation Just run the script to play: - / system script run super-mario-theme; + /system/script/run super-mario-theme; For extra fun use it for dhcp lease script. :) From 347cb4f3b66634df0bfebfdf73ca111fe4dc7cb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:29:49 +0200 Subject: [PATCH 97/99] doc/unattended-lte-firmware-upgrade: RouterOS v7 path syntax --- doc/unattended-lte-firmware-upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index 65801a6..63f2793 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -32,7 +32,7 @@ Usage and invocation Run the script if an upgrade for your LTE hardware is available: - / system script run unattended-lte-firmware-upgrade; + /system/script/run unattended-lte-firmware-upgrade; Then be patient, go for a coffee and wait for the upgrade process to finish. From f759a9a52e21b8bd3c2fa79991689ce3270a7723 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:31:03 +0200 Subject: [PATCH 98/99] doc/update-gre-address: RouterOS v7 path syntax --- doc/update-gre-address.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index c19e138..7e87743 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -26,7 +26,7 @@ Just install the script: ... and add a scheduler to run the script periodically: - / system scheduler add interval=30s name=update-gre-address on-event="/ system script run update-gre-address;" start-time=startup; + /system/scheduler/add interval=30s name=update-gre-address on-event="/system/script/run update-gre-address;" start-time=startup; Configuration ------------- @@ -34,7 +34,7 @@ Configuration The configuration goes to interface's comment. Add the client's IKEv2 certificate CN into the comment: - / interface gre set comment="ikev2-client1" gre-client1; + /interface/gre/set comment="ikev2-client1" gre-client1; --- [◀ Go back to main README](../README.md) From 09d926ed2fefb570d9810970306037910d6926d9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 May 2022 10:31:17 +0200 Subject: [PATCH 99/99] doc/update-tunnelbroker: RouterOS v7 path syntax --- doc/update-tunnelbroker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 9dd7f19..bfe8e25 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -28,11 +28,11 @@ Configuration The configuration goes to interface's comment: - / interface 6to4 set comment="tunnelbroker, user=user, pass=s3cr3t, id=12345" tunnelbroker; + /interface/6to4/set comment="tunnelbroker, user=user, pass=s3cr3t, id=12345" tunnelbroker; Also enabling dynamic DNS in Mikrotik cloud is required: - / ip cloud set ddns-enabled=yes; + /ip/cloud/set ddns-enabled=yes; See also --------