From 75fb1c8586985217c2e8eb7d9d4a17c81ee75cad Mon Sep 17 00:00:00 2001 From: vados-dev Date: Thu, 16 Apr 2026 20:20:17 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 16 20:20:17. --- .../20260416/20260416202008-Binary.backup | Bin 0 -> 116182 bytes .../20260416/20260416202008-Config.rsc | 2375 +++++++++++++++++ .../20260416/20260416202008-Diff-Config.rsc | 16 + 3 files changed, 2391 insertions(+) create mode 100644 MikroYellow/20260416/20260416202008-Binary.backup create mode 100644 MikroYellow/20260416/20260416202008-Config.rsc create mode 100644 MikroYellow/history/20260416/20260416202008-Diff-Config.rsc diff --git a/MikroYellow/20260416/20260416202008-Binary.backup b/MikroYellow/20260416/20260416202008-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..f2e83ad4175a2c15ea6daa02360eb01af297bf99 GIT binary patch literal 116182 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

L0RUCiK6Ise6$C8Ev3C43{7$C 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 H#xtiC+=l>1 literal 0 HcmV?d00001 diff --git a/MikroYellow/20260416/20260416202008-Config.rsc b/MikroYellow/20260416/20260416202008-Config.rsc new file mode 100644 index 0000000..d1c5f45 --- /dev/null +++ b/MikroYellow/20260416/20260416202008-Config.rsc @@ -0,0 +1,2375 @@ +# 2026-04-16 19:19: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: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface list member +add interface=ether1 list=WAN +add interface=ether2 list=LAN +add interface=ether3 list=LAN +add interface=ether4 list=LAN +add interface=ether5 list=LAN +add interface=wlan2 list=LAN +add interface=wlan1 list=LAN +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +/ip dns +set servers=10.30.30.81 +/ip route +add disabled=no dst-address=0.0.0.0/0 gateway=10.30.30.81 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set www disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system identity +set name=MikroYellow +/system scheduler +add comment="Setup Global Environment for scripts" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup diff --git a/MikroYellow/history/20260416/20260416202008-Diff-Config.rsc b/MikroYellow/history/20260416/20260416202008-Diff-Config.rsc new file mode 100644 index 0000000..6bc6988 --- /dev/null +++ b/MikroYellow/history/20260416/20260416202008-Diff-Config.rsc @@ -0,0 +1,16 @@ +2286c2286 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +2296c2296 +< # channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +--- +> # channel: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +2307c2307 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +2310c2310 +< # channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +--- +> # channel: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding -- 2.52.0