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