From 65621a9fc3377956416aed39587fc65c1dc2288e Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 24 Apr 2026 22:00:15 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 24 22:00:15. --- .../20260424/20260424220005-Binary.backup | Bin 0 -> 116182 bytes .../20260424/20260424220005-Config.rsc | 2375 +++++++++++++++++ .../20260424/20260424220005-Diff-Config.rsc | 8 + 3 files changed, 2383 insertions(+) create mode 100644 MikroYellow/20260424/20260424220005-Binary.backup create mode 100644 MikroYellow/20260424/20260424220005-Config.rsc create mode 100644 MikroYellow/history/20260424/20260424220005-Diff-Config.rsc diff --git a/MikroYellow/20260424/20260424220005-Binary.backup b/MikroYellow/20260424/20260424220005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..6f5e43fb641d44d547f00c766d48a035ca662b1f GIT binary patch literal 116182 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

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