From 5981a23e555a43578061c8c93359c3968120dd59 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Wed, 15 Apr 2026 12:57:35 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 15 12:57:35. --- .../20260415/20260415125724-Binary.backup | Bin 0 -> 116186 bytes .../20260415/20260415125724-Config.rsc | 2375 +++++++++++++++++ .../20260415/20260415125724-Diff-Config.rsc | 16 + 3 files changed, 2391 insertions(+) create mode 100644 MikroYellow/20260415/20260415125724-Binary.backup create mode 100644 MikroYellow/20260415/20260415125724-Config.rsc create mode 100644 MikroYellow/history/20260415/20260415125724-Diff-Config.rsc diff --git a/MikroYellow/20260415/20260415125724-Binary.backup b/MikroYellow/20260415/20260415125724-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..a2f637f8988d2547a83085657fc0d0223ffd2b81 GIT binary patch literal 116186 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 LMq%4k_$(`Kzlfj! literal 0 HcmV?d00001 diff --git a/MikroYellow/20260415/20260415125724-Config.rsc b/MikroYellow/20260415/20260415125724-Config.rsc new file mode 100644 index 0000000..e2d8e12 --- /dev/null +++ b/MikroYellow/20260415/20260415125724-Config.rsc @@ -0,0 +1,2375 @@ +# 2026-04-15 11:57:15 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: 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: 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: 2422/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/20260415125724-Diff-Config.rsc b/MikroYellow/history/20260415/20260415125724-Diff-Config.rsc new file mode 100644 index 0000000..f34bc33 --- /dev/null +++ b/MikroYellow/history/20260415/20260415125724-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: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +--- +> # channel: 5200/20-eCee/ac/P(21dBm), 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: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +--- +> # channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding -- 2.52.0