From cb9daa622bc36dbd8076b0e90728c2adcc91af18 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Thu, 30 Apr 2026 10:00:15 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 30 10:00:15. --- .../20260430/20260430100005-Binary.backup | Bin 0 -> 118648 bytes .../20260430/20260430100005-Config.rsc | 2453 +++++++++++++++++ .../20260430/20260430100005-Diff-Config.rsc | 381 +++ 3 files changed, 2834 insertions(+) create mode 100644 MikroYellow/20260430/20260430100005-Binary.backup create mode 100644 MikroYellow/20260430/20260430100005-Config.rsc create mode 100644 MikroYellow/history/20260430/20260430100005-Diff-Config.rsc diff --git a/MikroYellow/20260430/20260430100005-Binary.backup b/MikroYellow/20260430/20260430100005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..ca1b513d1aa25bb0b79733c1eccb7deda4d47a79 GIT binary patch literal 118648 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%0DD^Un^*X8D39mQxz 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

I9oLSId0 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 literal 0 HcmV?d00001 diff --git a/MikroYellow/20260430/20260430100005-Config.rsc b/MikroYellow/20260430/20260430100005-Config.rsc new file mode 100644 index 0000000..27ffa5b --- /dev/null +++ b/MikroYellow/20260430/20260430100005-Config.rsc @@ -0,0 +1,2453 @@ +# 2026-04-30 08:59:46 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 scrypt 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 scrypt 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/266/c0a5c627\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 03:10:03 28.04.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 :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$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={\$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\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$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={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\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\ + \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:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\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 \$LogPrint 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 \$LogPrint 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 \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint 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 \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\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:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \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 (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint 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 \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' 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:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :global LogPrint;\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 \$LogPrint 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: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 :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint 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/20260430/20260430100005-Diff-Config.rsc b/MikroYellow/history/20260430/20260430100005-Diff-Config.rsc new file mode 100644 index 0000000..b0207c2 --- /dev/null +++ b/MikroYellow/history/20260430/20260430100005-Diff-Config.rsc @@ -0,0 +1,381 @@ +448c448 +< \n:global CommitId \"main/266/c0a5c627\";\r\ +--- +> \n:global CommitId \"main/247/016960a4\";\r\ +451c451 +< r: root, in 03:10:03 28.04.2026.\";\r\ +--- +> r: root, in 03:45:02 16.04.2026.\";\r\ +503c503 +< \n:global ROsVerAvail;\r\ +--- +> \n#:global ROsVerAvail;\r\ +579,581d578 +< \n :global currentUpdateChannel;\r\ +< \n :global ROsVerAvail;\r\ +< \n :global arrDeviceInfo;\r\ +584,585c581 +< \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ +< el) do={\r\ +--- +> \n :if (\$CurrentChannel != \$updateChannel) do={\r\ +593,594c589 +< \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ +< \n :set currentUpdateChannel \$Channel;\r\ +--- +> \n :local Channel (\$Update->\"channel\");\r\ +597d591 +< \n\r\ +606,607d599 +< \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ +< ] ];\r\ +611,612c603,606 +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +--- +> \n :if ([:len \$arrDeviceInfo] = 0) do={\r\ +> \n :global arrDeviceInfo ({});\r\ +> \n :local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};}\ +> );\r\ +614,616c608,621 +< \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={:local arrDeviceInfo ({})}\r\ +> \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [[ :parse \"/\ +> system/package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"\ +> Error\")};\r\ +> \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannel\"; \$Cu\ +> rrentChannel;};\r\ +> \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentVersion\"; (\$U\ +> pdate->\"installed-version\");};\r\ +> \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannelVersion\ +> \"; [/system/resource/get version];};\r\ +> \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateChannel\"; [\$up\ +> dateChannel];};\r\ +> \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateVersion\"; (\$Up\ +> date->\"latest-version\");};\r\ +618c623 +< \n :return \$PkgUpdStatus;\r\ +--- +> \n :return \$PkgUpdStatus;\r\ +622,664d626 +< \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\ +674d635 +< \n :global arrDeviceInfo;\r\ +678,679c639,643 +< \n :global devRunning;\r\ +< \n :global devCurArch;\r\ +--- +> \n\r\ +> \n :global arrDeviceInfo [:toarray {\"section\"={\"key\"=\"\"; \"value\"\ +> =\"\";} }];\r\ +> \n #:do {:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system/package\ +> /update/get\" ]]} on-error={}\r\ +682c646,655 +< \n :global devBuildTime;\r\ +--- +> \n :global devRbCurrentFw;\r\ +> \n :global devRbUpgradeFw;\r\ +> \n\r\ +> \n :global devRunning;\r\ +> \n :global devCurArch;\r\ +> \n :global ROsVerCurrent;\r\ +> \n :global ROsChannelCurrent;\r\ +> \n :global ROsVerAvail;\r\ +> \n\r\ +> \n :global ParseCustom;\r\ +686,687c659,660 +< \n :global currentUpdateChannel;\r\ +< \n :global ROsVerAvail;\r\ +--- +> \n :global devBuildTime;\r\ +> \n :global GetPubIp;\r\ +689c662 +< \n :local DeviceInfo;\r\ +--- +> \n :local License [/system/license/get];\r\ +691,714c664,668 +< \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 :set devBuildTime (\$Resource->\"build-time\");\r\ +> \n :set runningChannelVersion (\$Resource->\"version\");\r\ +> \n :set runningChannel [\$ParseCustom \$runningChannelVersion \"(\" \")\ +> \" 1];\r\ +> \n :set runningVersion [\$ParseCustom \$runningChannelVersion \" \"];\r\ +715a670 +> \n :do {\r\ +718,725c673,686 +< \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 :local RouterBoard;\r\ +> \n :do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on\ +> -error={}\r\ +> \n :set devModel (\$RouterBoard->\"model\");\r\ +> \n :set devRbRevision (\$RouterBoard->\"revision\");\r\ +> \n :set devRbSerialNumber (\$RouterBoard->\"serial-number\");\r\ +> \n #:set devRbCurrentFw (\$RouterBoard->\"current-firmware\");\r\ +> \n #:set devRbUpgradeFw (\$RouterBoard->\"upgrade-firmware\");\r\ +> \n :if (\$devCurArch = \"mipsbe\" || \$devCurArch = \"arm\") do={\r\ +> \n :global devRunning [ /system/device-mode/get mode ];\r\ +> \n } else={\r\ +> \n :global devRunning [/system/device-mode/get running];}\r\ +> \n } else={\r\ +> \n :set devModel \$devBoardName;\r\ +727,728c688,695 +< \n :do {\r\ +< \n :set RunningMode [ /system/device-mode/get mode ];\r\ +--- +> \n :set devRbRevision false;\r\ +> \n :set devRbSerialNumber false;\r\ +> \n# :set devRbCurrentFw false;\r\ +> \n# :set devRbUpgradeFw false;\r\ +> \n #:set devCurrentFw \$runningVersion;#:set devUpgradeFw \$ROsVerAvail\ +> ;\r\ +> \n :set devRunning [/system/device-mode/get running];\r\ +> \n }\r\ +730,746c697,698 +< \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 \$LogPrint error \$0 (\"Error in Function getDevice!\");\r\ +> \n :return false;\r\ +748,776c700 +< \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:return true;\r\ +780c704,713 +< \n :global GetArrDeviceInfo;\r\ +--- +> \n :global WaitArrDeviceInfo;\r\ +> \n # \$WaitDeviceInfo;\r\ +> \n :global devBoardName;\r\ +> \n :global devCurArch;\r\ +> \n :global devModel;\r\ +> \n :global devRunning;\r\ +> \n :global devRbRevision;\r\ +> \n :global devRbSerialNumber;\r\ +> \n :global PiblicIpAddress;\r\ +> \n\r\ +785,786c718 +< \n :global CommitBrief;\r\ +< \n\r\ +--- +> \n :local Return;\r\ +787a720 +> \n :local Resource [/system/resource/get];\r\ +789,793c722 +< \n :local Info [ \$GetArrDeviceInfo ];\r\ +< \n\r\ +< \n :if ([ :typeof \$Info ] != \"array\") do={\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \n :local Update [ /system/package/update/get ];\r\ +795,796c724,725 +< \n :return ( \\\r\ +< \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ +--- +> \n :set Return ([ \$FormatLine \"Hostname:\" \$Identity ] . \"\\n\" . \\\ +> \r\ +798,799c727,728 +< \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ +< \_. \\\r\ +--- +> \n ([ \$FormatLine \"Location:\" (\$Snmp->\"location\") ] . \"\\n\") \ +> ] . \\\r\ +801,813c730,740 +< \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 ([ \$FormatLine \"Contact:\" (\$Snmp->\"contact\") ] . \"\\n\") ] \ +> . \\\r\ +> \n \"Hardware:\\n\" . \\\r\ +> \n [ \$FormatLine \" Board:\" . \$devBoardName ] . \"\\n\" . \\\r\ +> \n [ \$FormatLine \" Arch:\" . \$devCurArch ] . \"\\n\" . \\\r\ +> \n [ \$FormatLine \" Model:\" \$devModel ] . \\\r\ +> \n [ \$IfThenElse ([ :len \$devRbRevision ] > 0) \\\r\ +> \n (\" \" . \$devRbRevision) ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len \$devRbSerialNumber ] > 0) \\\r\ +> \n ([ \$FormatLine \" Serial:\" . \$devRbSerialNumber ] . \"\\n\"\ +> ) ] . \\\r\ +815,817c742,743 +< \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ +< \")) ] . \"\\n\") ] . \\\r\ +< \n \"RouterOS:\\n\" . \\\r\ +--- +> \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"nleve\ +> l\")) ] . \"\\n\") ] . \"RouterOS:\\n\" . \\\r\ +819c745 +< \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ +--- +> \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"level\ +821,831c747,753 +< \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\"))\ +--- +> \n [ \$FormatLine \"Running Channel\" \$runningChannel ] . \"\\n\" . \\\ +> \r\ +> \n [ \$FormatLine \" Installed:\" (\$Update->\"installed-version\") \ +> ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :typeof (\$Update->\"latest-version\") ] != \"noth\ +> ing\" && \\\r\ +> \n \$Update->\"installed-version\" != \$Update->\"latest-version\")\ +833,842c755,764 +< \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 ([ \$FormatLine \" Available\" (\$Update->\"latest-version\") ]\ +> \_. \"\\n\") ] . \\\r\ +> \n [ \$IfThenElse (\$RouterBoard->\"routerboard\" = true && \\\r\ +> \n \$RouterBoard->\"current-firmware\" != \$RouterBoard->\"upgrade-\ +> firmware\") \\\r\ +> \n ([ \$FormatLine \" Firmware\" (\$RouterBoard->\"current-firmwar\ +> e\") ] . \"\\n\") ] . \\ \r\ +> \n \"RouterOS-Scripts:\\n\" . \\\r\ +> \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ +> \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ -- 2.52.0