From ca778f88f9d50addf0be6f58fca915d39e04d83c Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 1 May 2026 10:00:14 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at May 01 10:00:14. --- .../20260501/20260501100005-Binary.backup | Bin 0 -> 119204 bytes .../20260501/20260501100005-Config.rsc | 2466 +++++++++++++++++ .../20260501/20260501100005-Diff-Config.rsc | 211 ++ 3 files changed, 2677 insertions(+) create mode 100644 MikroYellow/20260501/20260501100005-Binary.backup create mode 100644 MikroYellow/20260501/20260501100005-Config.rsc create mode 100644 MikroYellow/history/20260501/20260501100005-Diff-Config.rsc diff --git a/MikroYellow/20260501/20260501100005-Binary.backup b/MikroYellow/20260501/20260501100005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..3728c3d87df4da690878308b022cafeed4f4c771 GIT binary patch literal 119204 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 literal 0 HcmV?d00001 diff --git a/MikroYellow/20260501/20260501100005-Config.rsc b/MikroYellow/20260501/20260501100005-Config.rsc new file mode 100644 index 0000000..4495cef --- /dev/null +++ b/MikroYellow/20260501/20260501100005-Config.rsc @@ -0,0 +1,2466 @@ +# 2026-05-01 08:59:45 by RouterOS 7.22.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/disk +add slot=tmpfs tmpfs-max-size=22369621 type=tmpfs +/interface list +add name=WAN +add name=LAN +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroTik +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n#root.mnuc.backuper\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n#:local Script AM-setup\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub" +add comment="Script for setup routeros script system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros script system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global RunOnce;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix \"\";\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass {\r\ + \n \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass {\r\ + \n \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/368/b69ddb1c\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 09:35:02 01.05.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global ExitError;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n\r\ + \n\r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n# check and download required certificate\r\ + \n# Usage: \$CertificateAvailable \"Common Name\" \"intended use for certi\ + ficate (e.g. \"fetch\", \"tls\", \"all\", \"undefined\")\"\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# download and import certificate\r\ + \n# Usage: \$CertificateDownload \"Common Name\"\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonN\ + ame '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# name a certificate by its common-name\r\ + \n# Usage: \$CertificateNameByCN \"Common Name\"\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {:set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :global LogPrint;\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\r\ + \n \r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\r\ + \n \r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Setup Global Environment for scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BC auto-mac=no mlag-peer-port=ether1 name=\ + Bridge-LAN port-cost-mode=short +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface list member +add interface=ether1 list=WAN +add interface=ether2 list=LAN +add interface=ether3 list=LAN +add interface=ether4 list=LAN +add interface=ether5 list=LAN +add interface=wlan2 list=LAN +add interface=wlan1 list=LAN +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +/ip dns +set servers=10.30.30.81 +/ip route +add disabled=no dst-address=0.0.0.0/0 gateway=10.30.30.81 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set www disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system identity +set name=MikroYellow +/system scheduler +add comment="Setup Global Environment for scripts" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup diff --git a/MikroYellow/history/20260501/20260501100005-Diff-Config.rsc b/MikroYellow/history/20260501/20260501100005-Diff-Config.rsc new file mode 100644 index 0000000..14304b3 --- /dev/null +++ b/MikroYellow/history/20260501/20260501100005-Diff-Config.rsc @@ -0,0 +1,211 @@ +25c25 +< add comment="Script for setup routeros script system" \ +--- +> add comment="Script for setup routeros scrypt system" \ +30c30 +< \n# Script comment: Script for setup routeros script system\r\ +--- +> \n# Script comment: Script for setup routeros scrypt system\r\ +448c448 +< \n:global CommitId \"main/368/b69ddb1c\";\r\ +--- +> \n:global CommitId \"main/266/c0a5c627\";\r\ +451c451 +< r: root, in 09:35:02 01.05.2026.\";\r\ +--- +> r: root, in 03:10:03 28.04.2026.\";\r\ +958c958,959 +< \n\r\ +--- +> \n :global LogPrint;\r\ +> \n \r\ +961d961 +< \n :local JobName [ :jobname ];\r\ +962a963 +> \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ +964,965c965,966 +< \n :log debug (\$0 . \" Trying to detect public IP using default serv\ +< ice: \" . \$Url . \"...\");\r\ +--- +> \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ +> ervice: \" . \$Url . \"...\");\r\ +969,970c970,973 +< \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ +< detect public IP using default service: \" . \$Url . \".\")}\r\ +--- +> \n delay=50ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fail\ +> ed to detect public IP using default service: \" . \$Url . \".\")}\r\ +> \n #:error \"Failed to detect public IP using default service: \$Url\ +> .\"};\r\ +972,973c975,976 +< \n :log error (\$0 . \" Failed to detect public IP using default serv\ +< ice: \" . \$Url . \".\");\r\ +--- +> \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ +> ervice: \" . \$Url . \".\");\r\ +975,976c978,979 +< \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ +< vice: \" . \$Url . \"...\");\r\ +--- +> \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ +> service: \" . \$Url . \"...\");\r\ +980,981c983,984 +< \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ +< \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ +--- +> \n delay=200ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fai\ +> led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ +983,986c986,991 +< \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ +< \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ +< {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ +< \n :return \$PubIpAddr;\r\ +--- +> \n :if (\$PubIpAddr = false) do={\r\ +> \n :set PubIpAddr \"not-detected\";\r\ +> \n } else={\r\ +> \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ +> \n }\r\ +> \n :return \$PubIpAddr;\r\ +1049,1051d1053 +< \n# check and download required certificate\r\ +< \n# Usage: \$CertificateAvailable \"Common Name\" \"intended use for certi\ +< ficate (e.g. \"fetch\", \"tls\", \"all\", \"undefined\")\"\r\ +1055d1056 +< \n\r\ +1056a1058,1059 +> \n :global EitherOr;\r\ +> \n :global LogPrint;\r\ +1058,1062c1061 +< \n\r\ +< \n :if ([ :len \$UseFor ] = 0) do={\r\ +< \n :log warning (\$0 . \"The intended use is undefined!\");\r\ +< \n :set UseFor \"undefined\";\r\ +< \n }\r\ +--- +> \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\r\ +1066,1067c1065,1066 +< \n :log warning (\$0 . \"This system has low free flash space but \" . \ +< \\\r\ +--- +> \n \$LogPrint warning \$0 (\"This system has low free flash space but \ +> \" . \\\r\ +1071c1070 +< \n :log warning (\$0 . \"No CommonName given!\");\r\ +--- +> \n \$LogPrint warning \$0 (\"No CommonName given!\");\r\ +1085,1089c1084,1087 +< \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ +< \"' not available.\");\r\ +< \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \n \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ +> e . \"' not available.\");\r\ +> \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ +> se}\r\ +1093,1094c1091,1092 +< \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ +< \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +--- +> \n \$LogPrint info \$0 (\"There are \" . \$CertCount . \" Certificates \ +> with CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +1105,1109c1103,1106 +< \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ +< is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +< \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \n \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ +> \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +> \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ +> se}\r\ +1117,1118d1113 +< \n# download and import certificate\r\ +< \n# Usage: \$CertificateDownload \"Common Name\"\r\ +1121,1122c1116,1117 +< \n :global ScriptUpdatesBaseUrl;\r\ +< \n :global ScriptUpdatesUrlSuffix;\r\ +--- +> \n :global GlobalScriptsUrl;\r\ +> \n :global GlobalScriptsUrlSuffix;\r\ +1125a1121 +> \n :global LogPrint;\r\ +1128,1131c1124,1127 +< \n\r\ +< \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ +< \r\ +< \n \"CommonName '\" . \$CommonName . \"'.\");\r\ +--- +> \n \r\ +> \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ +> onName '\" . \$CommonName . \"'.\");\r\ +> \n \r\ +1136,1138c1132,1133 +< \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ +< sUrlSuffix) \\\r\ +< \n dst-path=\$FileName as-value;\r\ +--- +> \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ +> Suffix) dst-path=\$FileName as-value;\r\ +1141,1142c1136,1137 +< \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ +< e '\" . \$CommonName . \\\r\ +--- +> \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ +> Name '\" . \$CommonName . \\\r\ +1145d1139 +< \n :local CertSettings [ /certificate/settings/get ];\r\ +1147,1157c1141,1143 +< \_] ] = 0 && \\\r\ +< \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ +< || \\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ +< \\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +< \r\ +< \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ +< \_Root X1\" ] ] > 0)) do={\r\ +< \n :log error (\$0 . \" Required certificate is not available.\");\ +< \r\ +--- +> \_] ] = 0) do={\r\ +> \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ +> );\r\ +1171,1172c1157,1158 +< \n :log warning (\$0 . \" Failed downloading certificate with CommonN\ +< ame '\" . \$CommonName . \"'!\");\r\ +--- +> \n \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ +> onName '\" . \$CommonName . \"'!\");\r\ +1175a1162 +> \n\r\ +1178a1166 +> \n\r\ +1183,1184c1171,1172 +< \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ +< e . \"' still unavailable!\");\r\ +--- +> \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ +> Name . \"' still unavailable!\");\r\ +1194,1195d1181 +< \n# name a certificate by its common-name\r\ +< \n# Usage: \$CertificateNameByCN \"Common Name\"\r\ +1198a1185 +> \n :global LogPrint;\r\ +1202c1189 +< \n :log warning (\$0 .\" No matching certificate found.\");\r\ +--- +> \n \$LogPrint warning \$0 (\"No matching certificate found.\");\r\ +1313d1299 +< \n\r\ +1318a1305 +> \n :global LogPrint;\r\ +1320,1321c1307,1308 +< \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ +< \\\r\ +--- +> \n \$LogPrint error \$Name ([ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\ +> \$\") \\\r\ -- 2.52.0