From 14869272ff3eedfe184a77600c9ebfd2c0debce4 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Wed, 15 Apr 2026 14:43:41 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 15 14:43:41. --- .../20260415/20260415144330-Binary.backup | Bin 0 -> 116186 bytes .../20260415/20260415144330-Config.rsc | 2375 +++++++++++++++++ .../20260415/20260415144330-Diff-Config.rsc | 8 + 3 files changed, 2383 insertions(+) create mode 100644 MikroYellow/20260415/20260415144330-Binary.backup create mode 100644 MikroYellow/20260415/20260415144330-Config.rsc create mode 100644 MikroYellow/history/20260415/20260415144330-Diff-Config.rsc diff --git a/MikroYellow/20260415/20260415144330-Binary.backup b/MikroYellow/20260415/20260415144330-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..378fac5233ed8bc0cfdc1afa03f00fe14973f62e GIT binary patch literal 116186 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 literal 0 HcmV?d00001 diff --git a/MikroYellow/20260415/20260415144330-Config.rsc b/MikroYellow/20260415/20260415144330-Config.rsc new file mode 100644 index 0000000..efabbe4 --- /dev/null +++ b/MikroYellow/20260415/20260415144330-Config.rsc @@ -0,0 +1,2375 @@ +# 2026-04-15 13:43:21 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/226/e1cd7257\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 09:45:02 01.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/20260415/20260415144330-Diff-Config.rsc b/MikroYellow/history/20260415/20260415144330-Diff-Config.rsc new file mode 100644 index 0000000..05621f6 --- /dev/null +++ b/MikroYellow/history/20260415/20260415144330-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