From b81c58dacff29a66e5a7a1c72a5196ae91e97c7c Mon Sep 17 00:00:00 2001 From: vados-dev Date: Wed, 22 Apr 2026 08:20:14 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 22 08:20:14. --- .../20260422/20260422082005-Binary.backup | Bin 0 -> 116182 bytes .../20260422/20260422082005-Config.rsc | 2375 +++++++++++++++++ .../20260422/20260422082005-Diff-Config.rsc | 8 + 3 files changed, 2383 insertions(+) create mode 100644 MikroYellow/20260422/20260422082005-Binary.backup create mode 100644 MikroYellow/20260422/20260422082005-Config.rsc create mode 100644 MikroYellow/history/20260422/20260422082005-Diff-Config.rsc diff --git a/MikroYellow/20260422/20260422082005-Binary.backup b/MikroYellow/20260422/20260422082005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..42bdafb44598945b8c661b334d5cb3e889d49a5d GIT binary patch literal 116182 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 r^`|X(L%dXyc5h-& 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\"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/20260422/20260422082005-Diff-Config.rsc b/MikroYellow/history/20260422/20260422082005-Diff-Config.rsc new file mode 100644 index 0000000..2cdd2ed --- /dev/null +++ b/MikroYellow/history/20260422/20260422082005-Diff-Config.rsc @@ -0,0 +1,8 @@ +2286c2286 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +2307c2307 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding -- 2.52.0