From e4736d6ace8724c2944c2afae19ad6d297707e70 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Thu, 16 Apr 2026 10:00:16 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 16 10:00:16. --- .../20260416/20260416100007-Binary.backup | Bin 0 -> 116182 bytes .../20260416/20260416100007-Config.rsc | 2375 +++++++++++++++++ .../20260416/20260416100007-Diff-Config.rsc | 12 + 3 files changed, 2387 insertions(+) create mode 100644 MikroYellow/20260416/20260416100007-Binary.backup create mode 100644 MikroYellow/20260416/20260416100007-Config.rsc create mode 100644 MikroYellow/history/20260416/20260416100007-Diff-Config.rsc diff --git a/MikroYellow/20260416/20260416100007-Binary.backup b/MikroYellow/20260416/20260416100007-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..acb611687f313817f60d083a351b6dffd461457f GIT binary patch literal 116182 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 H!>mf}xXI^n literal 0 HcmV?d00001 diff --git a/MikroYellow/20260416/20260416100007-Config.rsc b/MikroYellow/20260416/20260416100007-Config.rsc new file mode 100644 index 0000000..98c08ad --- /dev/null +++ b/MikroYellow/20260416/20260416100007-Config.rsc @@ -0,0 +1,2375 @@ +# 2026-04-16 08:59:58 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: 5260/20-Ceee/ac/DP(18dBm), 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: 5260/20-Ceee/ac/DP(18dBm), 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/20260416/20260416100007-Diff-Config.rsc b/MikroYellow/history/20260416/20260416100007-Diff-Config.rsc new file mode 100644 index 0000000..8678b79 --- /dev/null +++ b/MikroYellow/history/20260416/20260416100007-Diff-Config.rsc @@ -0,0 +1,12 @@ +448c448 +< \n:global CommitId \"main/247/016960a4\";\r\ +--- +> \n:global CommitId \"main/226/e1cd7257\";\r\ +451c451 +< r: root, in 03:45:02 16.04.2026.\";\r\ +--- +> r: root, in 09:45:02 01.04.2026.\";\r\ +687c687 +< \n\r\ +--- +> \n \r\ -- 2.52.0