From d44b4492dc81fab65d7249a37fb89f1dc4169d1b Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 3 Jul 2026 14:23:01 +0300 Subject: [PATCH] Backup for MikroGig created successfully at Jul 03 14:23:01. --- .../20260703/20260703142257-Binary.backup | Bin 0 -> 193280 bytes MikroGig/20260703/20260703142257-Config.rsc | 3393 +++++++++++++++++ .../20260703/20260703142257-Diff-Config.rsc | 268 ++ 3 files changed, 3661 insertions(+) create mode 100644 MikroGig/20260703/20260703142257-Binary.backup create mode 100644 MikroGig/20260703/20260703142257-Config.rsc create mode 100644 MikroGig/history/20260703/20260703142257-Diff-Config.rsc diff --git a/MikroGig/20260703/20260703142257-Binary.backup b/MikroGig/20260703/20260703142257-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..a5b4629d46567b515a139b71997a27c0cc4abafc GIT binary patch literal 193280 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\"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 Identity [/system/identity/get name];\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe true;\r\ + \n:global RunOnce (a);\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs false;\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 UrlSuffix \$Identity;\r\ + \n :local UrlDir \"certs/\";\r\ + \n :local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\"); \ + \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\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 /tool/fetch (\$CertUrl . \$CertFileName) dst-path=\$CertFileName\ + \_as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n /certificate/set name=\"Root-YE\" [ find where common-name=\"Roo\ + t YE\" ];\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\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 :local Script \"mod/AM-Certs-By-Ident\";\r\ + \n \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/fetch \ + check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".\ + rsc\") output=user as-value ]->\"data\");\r\ + \n /system/script run \$Script;\r\ + \n :global tmpAddCerts;\r\ + \n :while ([ \$tmpAddCerts ] = true) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n :delay 1s;\r\ + \n :put \"Removing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\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 Identity [/system/identity/get name];\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 (a);\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/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\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/728/bebacfc7\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 11:00:05 30.06.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\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 MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\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 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 GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\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 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 ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\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 updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$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 :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\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 :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$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\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\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\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:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\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:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$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={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$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={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\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\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\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 :log 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 :log 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 :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log 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 :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\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 ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$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=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$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 :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' 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 :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 :log 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 FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\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 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 [ :le\ + n \$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 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 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\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 :if (\$ExitOK = \"false\") do={\r\ + \n :log 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 ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\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 :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\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={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :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 :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\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 :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\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\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 :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log 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 :log 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 :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log 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 :log 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 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 VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log 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 :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 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\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\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\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 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 :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\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 :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', 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\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\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\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\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 :log 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\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\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\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\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\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:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\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\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\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\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 \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\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 FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\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 (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\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={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\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 \"Every Day Set Global Environment Variables\";\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: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:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add comment="Download custom Certificates By Routers Identity " \ + dont-require-permissions=no name=mod/AM-Certs-By-Ident owner=\ + mod/AM-Certs-By-Ident policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-Certs-By-Ident\r\ + \n# Script comment: Download custom Certificates By Routers Identity \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#\r\ + \n# CloudFlare\r\ + \n#/tool/fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalR\ + ootCA.crt.pem;\r\ + \n#/certificate/import file-name=DigiCertGlobalRootCA.crt.pem passphrase=\ + \"\";\r\ + \n#/tool/ fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobal\ + G2TLSRSASHA2562020CA1-1.crt.pem;\r\ + \n#/certificate/import file-name=DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt\ + .pem passphrase=\"\";\r\ + \n# Quad9\r\ + \n#/tool/fetch mode=https url=\"https://cacerts.digicert.com/DigiCertGloba\ + lG3TLSECCSHA3842020CA1-1.crt.pem\"\r\ + \n#/certificate/import file-name=DigiCertGlobalG3TLSECCSHA3842020CA1-1.crt\ + .pem passphrase=\"\";\r\ + \n:global tmpAddCerts true; \r\ + \n\r\ + \n:global GlobalScriptsUrl;\r\ + \n:local UrlSuffix [/system/identity/get name];\r\ + \n:local UrlDir \"certs/\";\r\ + \n:local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\");\r\ + \n\r\ + \n:log error \$CertUrl;\r\ + \n\r\ + \n:local CertName \"DigiCert-Global-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-CA\" [ find where common-na\ + me=\"DigiCert Global Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-CA\" [ find where commo\ + n-name=\"DigiCert Assured ID Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G2\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G3\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G2 TLS RSA SHA256 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G3 TLS ECC SHA384 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G2\" [ find where common-na\ + me=\"DigiCert Global Root G2\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G3\" [ find where common-na\ + me=\"DigiCert Global Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-ECC-P384-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-ECC-P384-Root-G5\" [ find where com\ + mon-name=\"DigiCert TLS ECC P384 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-RSA4096-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-RSA4096-Root-G5\" [ find where comm\ + on-name=\"DigiCert TLS RSA4096 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Trusted-Root-G4.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Trusted-Root-G4\" [ find where common-n\ + ame=\"DigiCert Trusted Root G4\" ];\r\ + \n\r\ + \n:set CertName \"GTS-Root-R4.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"GTS-Root-R4\" [ find where common-name=\"GTS Roo\ + t R4\" ];\r\ + \n\r\ + \n:set CertName \"Go-Daddy-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Go-Daddy-Root-Certificate-Authority-G2\" [ find \ + where common-name=\"Go Daddy Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"ISRG-Root-X1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"ISRG-Root-X1\" [ find where common-name=\"ISRG R\ + oot X1\" ];\r\ + \n\r\ + \n:set CertName \"Root-YE.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Root-YE\" [ find where common-name=\"Root YE\" ]\ + ;\r\ + \n\r\ + \n:set CertName \"Starfield-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Starfield-Root-Certificate-Authority-G2\" [ find\ + \_where common-name=\"Starfield Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"USERTrust-RSA-Certification-Authority.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"USERTrust-RSA-Certification-Authority\" [ find w\ + here common-name=\"USERTrust RSA Certification Authority\" ];\r\ + \n\r\ + \n:global tmpAddCerts (a);\r\ + \n\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"GTS-Root-RX.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#internet\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"ISRG-Root-X2.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n\r\ + \n\r\ + \n#/ip/dns/set allow-remote-requests=yes doh-max-concurrent-queries=100 do\ + h-max-server-connections=20 use-doh-server=https://security.cloudflare-dns\ + .com/dns-query verify-doh-cert=yes;\r\ + \n#/ip/dns/static remove [find where address=1.1.1.1];\r\ + \n#/ip/dns/static add address=1.1.1.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 1\";\r\ + \n#/ip/dns/ static remove [find where address=1.0.0.1];\r\ + \n#/ip/dns/static add address=1.0.0.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 2\"\r\ + \n#/ip dns static add address=2606:4700:4700::1111 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip dns static add address=2606:4700:4700::1001 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip/dns set servers=\"1.0.0.1, 8.8.4.4\";\r\ + \n#/ip/dns set servers=\"\";" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n:global GlobalScriptsUrl;\r\ + \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" +add dont-require-permissions=no name=awg2-webui owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + :put \"Download image, and save him to usb1/tmp\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/docker/awg2-webui-arm.tar\" dst-\ + path=usb1/tmp/awg2-webui.tar\ + \n\ + \n:put \"1. Create veth interface\"\ + \n/interface veth add name=veth-awg address=10.9.9.2/24 gateway=10.9.9.1\ + \n\ + \n:put \"2. Create bridge and add veth\"\ + \n/interface bridge add name=br-awg\ + \n/interface bridge port add bridge=br-awg interface=veth-awg\ + \n\ + \n:put \"3. Assign IP to bridge\"\ + \n/ip address add address=10.9.9.1/24 interface=br-awg\ + \n\ + \n:put \"4. NAT: masquerade container traffic\"\ + \n/ip firewall nat add chain=srcnat src-address=10.9.9.0/24 action=masquer\ + ade\ + \n\ + \n:put \"5. Port forward: UDP 443 \? container (AmneziaWG QUIC mimicry)\"\ + \n/ip firewall nat add chain=dstnat protocol=udp dst-port=443 \\\ + \n action=dst-nat to-addresses=10.9.9.2 to-ports=55055 in-interface=eth\ + er1\ + \n\ + \n:put \"6. Port forward: HTTPS 9443 \? container Web UI\"\ + \n/ip firewall nat add chain=dstnat protocol=tcp dst-port=9443 \\\ + \n action=dst-nat to-addresses=10.9.9.2 to-ports=443 in-interface=ether\ + 1\ + \n\ + \n:put \"Create environment list..\"\ + \n/container envs add list=awgui-env key=WEB_USER value=vados\ + \n/container envs add list=awgui-env key=WEB_PASS value=zoomzoomrulezz\ + \n/container envs add list=awgui-env key=SECRET_KEY value=RanDomSecret32Sy\ + mboLs2325272931q\ + \n/container envs add list=awgui-env key=AWG_ENDPOINT value=10.30.30.10:44\ + 3\ + \n\ + \n:put \"Load and start container...\"\ + \n/container add file=usb1/tmp/awg2-webui.tar interface=veth-awg hostname=\ + awg2-webui \\\ + \nroot-dir=usb1/awg2-webui envlist=awgui-env start-on-boot=yes logging=yes\ + \_shm-size=4M\ + \n\ + \n:put \"Start...\"\ + \n/container start 0\ + \n\ + \n:put \"Verify...\"\ + \n/container print\ + \n\ + \n:put \"Should show: status=running\"\ + \n\ + \n/log print where topics~\"container\"\ + \n\ + \n:put \"Should show: AWG started, nginx running\"\ + \n" +add comment=awg-VDSina dont-require-permissions=no name=awg-VDSina-uninstall \ + owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n\ + \n :put \"Uninstallimg AmneziaWG...\"\ + \n\ + \n :log info \"Uninstallimg AmneziaWG...\"\ + \n\ + \n :local prevDNS \"\"\ + \n\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\ + \n\ + \n :local storageDisk \"disk1\"\ + \n\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\ + \n\ + \n :local prevTmpdir \"\"\ + \n\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ + \n\ + \n }\ + \n\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\ + \n\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\ + \n\ + \n /container/stop [find where interface=veth-awg-VDSina]\ + \n\ + \n :delay 7s\ + \n\ + \n /container/remove [find where interface=veth-awg-VDSina]\ + \n\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\ + \n\ + \n :if (\$prevDNS != \"\") do={\ + \n\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ + \n\ + \n :put (\"DNS restored to: \$prevDNS\")\ + \n\ + \n }\ + \n\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n\ + \n /container/config set tmpdir=\$prevTmpdir\ + \n\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ + \n\ + \n }\ + \n\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\ + \n\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \n\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\ + \n\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\ + \n\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\ + \n\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\ + \n\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\ + \n\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \n\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\ + \n\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\ + \n\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\ + \n\ + \n }\ + \n\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\ + \n\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ + \n\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\ + \n\ + \n" +add comment=Generator dont-require-permissions=no name=AWG-VDSina owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# ============================================================\r\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\r\ + \n# 2026-06-30 22:08:12\r\ + \n# ============================================================\r\ + \n\r\ + \n# 0. Check prerequisites\r\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\r\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\r\ + \n :error \"Usage: /system/device-mode/update container=yes\"\r\ + \n}\r\ + \n\r\ + \n# Auto-detect storage\r\ + \n:global awgDisk \"disk1\"\r\ + \n{\r\ + \n :local usbFree 0\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \r\ + \n } else={\r\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\r\ + \n :put \"USB found but not mounted. Format as ext4\?\"\r\ + \n :put \"Press 'y' to confirm:\"\r\ + \n :local key [/terminal/inkey timeout=30]\r\ + \n :if (\$key = 121 || \$key = 89) do={\r\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\r\ + \n :delay 3s\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n } else={ :put \"Format failed, using disk1\" }\r\ + \n } else={ :put \"Using disk1\" }\r\ + \n } else={ :put \"No USB, using disk1\" }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 1. Uninstall script\r\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local storageDisk \"disk1\"\r\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n }\r\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ + \n /container/stop [find where interface=veth-awg-VDSina]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg-VDSina]\r\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n }\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\r\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\r\ + \n }\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ + \n}\r\ + \n\r\ + \n# 2. Network infrastructure\r\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\r\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\r\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\r\ + \n\r\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \r\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ + yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\r\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ + QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\r\ + \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\r\ + \n\r\ + \n# 4. Container environment variables\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\r\ + \n\r\ + \n# 5. DNS\r\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ + \n# NOTE: replaces existing DNS configuration\r\ + \n/ip/dns/set servers=109.107.177.79\r\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\r\ + \n\r\ + \n# 6. Download, create and start container\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \r\ + \n:if (\$awgDisk != \"disk1\") do={\r\ + \n :local tmpPath (\$awgDisk . \"/pull\")\r\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\r\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\r\ + \n}\r\ + \n{\r\ + \n :local arch [/system/resource/get architecture-name]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local suffix \"\"\r\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ + \n :local file \"\"\r\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\r\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\r\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\r\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \r\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\r\ + \n :local filePath \$file\r\ + \n :if (\$awgDisk != \"disk1\") do={\r\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\r\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\r\ + \n }\r\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\r\ + \n :local freeStorage 0\r\ + \n :if (\$awgDisk = \"disk1\") do={\r\ + \n :set freeStorage [/system/resource/get free-hdd-space]\r\ + \n } else={\r\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\r\ + \n }\r\ + \n :if (\$freeStorage < 262144) do={\r\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\r\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\r\ + \n :error \"Insufficient disk space\"\r\ + \n }\r\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \r\ + \n } else={\r\ + \n :put (\"File already exists: \" . \$filePath)\r\ + \n }\r\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\r\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\r\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\r\ + \n /file/remove \$filePath\r\ + \n :local freeMem [/system/resource/get free-memory]\r\ + \n :if (\$freeMem < 16777216) do={\r\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\r\ + \n }\r\ + \n /container/start [find where interface=veth-awg-VDSina]\r\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\r\ + \n :put \"Waiting for container to start...\"\r\ + \n :delay 5s\r\ + \n /interface/wireguard/enable wg-awg-VDSina\r\ + \n :put \"WireGuard interface enabled\"\r\ + \n :put \"Installation complete!\"\r\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\r\ + \n /ping 109.107.177.79 count=10 interval=1\r\ + \n :put \"\"\r\ + \n :put \"======= NEXT STEPS =======\"\r\ + \n :put \"\"\r\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ + \n :put \"\"\r\ + \n :put \" Route a single host:\"\r\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Route a subnet:\"\r\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Remove a route:\"\r\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\r\ + \n :put \"\"\r\ + \n :put \" Show all tunnel routes:\"\r\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Uninstall:\"\r\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\r\ + \n :put \"=========================\"\r\ + \n}\r\ + \n\r\ + \n# 7. Verification\r\ + \n# /container/print\r\ + \n# /interface/wireguard/print\r\ + \n# /interface/wireguard/peers/print\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" +/container config +set layer-dir=/usb1/docker memory-high=200.0MiB memory-max=2048.0KiB \ + registry-url=https://registry-1.docker.io tmpdir=/usb1/pull username=\ + amsternl +/disk settings +set auto-media-interface=lo +/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 +/ip neighbor discovery-settings +set discover-interface-list=Internet +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface detect-internet +set detect-interface-list=static internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +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 +add interface=ether1 list=Internet +add interface=Bridge-LAN list=LAN +/interface wireguard peers +add allowed-address=0.0.0.0/0 endpoint-address=172.19.75.210 endpoint-port=\ + 51820 interface=wg-awg-VDSina name=peer4 persistent-keepalive=10s \ + public-key="o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-18FD746E5814 discovery-interfaces=Bridge-LAN enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether1 network=10.30.30.0 +add address=172.19.75.209/30 interface=veth-awg-VDSina network=172.19.75.208 +add address=10.9.0.2 interface=wg-awg-VDSina network=10.9.0.2 +/ip dns +set allow-remote-requests=yes servers=109.107.177.79 +/ip firewall nat +add action=masquerade chain=srcnat src-address=10.9.9.0/24 +# in/out-interface matcher not possible when interface (ether1) is slave - use master instead (Bridge-LAN) +add action=dst-nat chain=dstnat dst-port=443 in-interface=ether1 protocol=udp \ + to-addresses=10.9.9.2 to-ports=55055 +# in/out-interface matcher not possible when interface (ether1) is slave - use master instead (Bridge-LAN) +add action=dst-nat chain=dstnat dst-port=9443 in-interface=ether1 protocol=\ + tcp to-addresses=10.9.9.2 to-ports=443 +add action=masquerade chain=srcnat src-address=172.19.75.208/30 +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set irc disabled=no +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip hotspot walled-garden +add server=*1 +add server=*1 +/ip ipsec settings +set accounting=no +/ip ipsec policy +set 0 disabled=yes dst-address=0.0.0.0/0 src-address=0.0.0.0/0 +/ip ipsec profile +set [ find default=yes ] dpd-interval=2m dpd-maximum-failures=5 +/ip proxy +set cache-administrator="" max-cache-size=none port=80,443 src-address=\ + 0.0.0.0 +/ip route +add check-gateway=ping disabled=no distance=2 dst-address=0.0.0.0/0 gateway=\ + ether1 routing-table=main scope=30 target-scope=10 +add comment=awg-VDSina-dns distance=1 dst-address=109.107.177.79/32 gateway=\ + wg-awg-VDSina +/ip service +set ftp disabled=yes +set telnet disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api address=10.30.30.0/24 disabled=yes +set api-ssl address=10.30.30.0/24 disabled=yes +set www-ssl port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set graphs-plain=no rest-plain=no webfig-plain=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=Bridge-LAN type=internal +add forced-ip=109.107.177.79 interface=*A type=external +add interface=lo type=internal +add interface=wlan2 type=internal +add interface=wlan1 type=internal +/ipv6 nd +set [ find default=yes ] advertise-dns=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system clock manual +set time-zone=+03:00 +/system identity +set name=MikroGig +/system logging +add action=email disabled=yes regex="* added|changed|removed *" topics=\ + system,info +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes use-local-clock=yes +/system ntp client servers +add address=10.30.30.81 +add address=10.30.30.10 +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +add address=time.google.com disabled=yes +/system scheduler +add comment="Every Day Set Global Environment Variables" 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 +add comment=Generator name=awg-VDSina on-event="# ============================\ + ================================\r\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\r\ + \n# 2026-07-01 00:03:43\r\ + \n# ============================================================\r\ + \n\r\ + \n# 0. Check prerequisites\r\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\r\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\r\ + \n :error \"Usage: /system/device-mode/update container=yes\"\r\ + \n}\r\ + \n\r\ + \n# Auto-detect storage\r\ + \n:global awgDisk \"disk1\"\r\ + \n{\r\ + \n :local usbFree 0\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \r\ + \n } else={\r\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\r\ + \n :put \"USB found but not mounted. Format as ext4\?\"\r\ + \n :put \"Press 'y' to confirm:\"\r\ + \n :local key [/terminal/inkey timeout=30]\r\ + \n :if (\$key = 121 || \$key = 89) do={\r\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\r\ + \n :delay 3s\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n } else={ :put \"Format failed, using disk1\" }\r\ + \n } else={ :put \"Using disk1\" }\r\ + \n } else={ :put \"No USB, using disk1\" }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 1. Uninstall script\r\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local storageDisk \"disk1\"\r\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n }\r\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ + \n /container/stop [find where interface=veth-awg-VDSina]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg-VDSina]\r\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n }\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\r\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\r\ + \n }\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ + \n}\r\ + \n\r\ + \n# 2. Network infrastructure\r\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\r\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\r\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\r\ + \n\r\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \r\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"QCMsDU98Gm+nhn\ + kYRcAN/dyczDYHOLsX3PfBRFjWBF4=\" listen-port=14710 disabled=yes\r\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"b39T9K2/LR8vNtY\ + AZw+sLRze6yGlS3EaZhAa7wiFB20=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\r\ + \n/ip/address/add address=10.9.0.2/32 interface=wg-awg-VDSina\r\ + \n\r\ + \n# 4. Container environment variables\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\r\ + \n\r\ + \n# 5. DNS\r\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ + \n# NOTE: replaces existing DNS configuration\r\ + \n/ip/dns/set servers=109.107.177.79\r\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\r\ + \n\r\ + \n# 6. Download, create and start container\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \r\ + \n:if (\$awgDisk != \"disk1\") do={\r\ + \n :local tmpPath (\$awgDisk . \"/pull\")\r\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\r\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\r\ + \n}\r\ + \n{\r\ + \n :local arch [/system/resource/get architecture-name]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local suffix \"\"\r\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ + \n :local file \"\"\r\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\r\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\r\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\r\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \r\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\r\ + \n :local filePath \$file\r\ + \n :if (\$awgDisk != \"disk1\") do={\r\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\r\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\r\ + \n }\r\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\r\ + \n :local freeStorage 0\r\ + \n :if (\$awgDisk = \"disk1\") do={\r\ + \n :set freeStorage [/system/resource/get free-hdd-space]\r\ + \n } else={\r\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\r\ + \n }\r\ + \n :if (\$freeStorage < 262144) do={\r\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\r\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\r\ + \n :error \"Insufficient disk space\"\r\ + \n }\r\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \r\ + \n } else={\r\ + \n :put (\"File already exists: \" . \$filePath)\r\ + \n }\r\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\r\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\r\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\r\ + \n /file/remove \$filePath\r\ + \n :local freeMem [/system/resource/get free-memory]\r\ + \n :if (\$freeMem < 16777216) do={\r\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\r\ + \n }\r\ + \n /container/start [find where interface=veth-awg-VDSina]\r\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\r\ + \n :put \"Waiting for container to start...\"\r\ + \n :delay 5s\r\ + \n /interface/wireguard/enable wg-awg-VDSina\r\ + \n :put \"WireGuard interface enabled\"\r\ + \n :put \"Installation complete!\"\r\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\r\ + \n /ping 109.107.177.79 count=10 interval=1\r\ + \n :put \"\"\r\ + \n :put \"======= NEXT STEPS =======\"\r\ + \n :put \"\"\r\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ + \n :put \"\"\r\ + \n :put \" Route a single host:\"\r\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Route a subnet:\"\r\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Remove a route:\"\r\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\r\ + \n :put \"\"\r\ + \n :put \" Show all tunnel routes:\"\r\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Uninstall:\"\r\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\r\ + \n :put \"=========================\"\r\ + \n}\r\ + \n\r\ + \n# 7. Verification\r\ + \n# /container/print\r\ + \n# /interface/wireguard/print\r\ + \n# /interface/wireguard/peers/print\r\ + \n" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-07-01 start-time=02:03:59 +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com diff --git a/MikroGig/history/20260703/20260703142257-Diff-Config.rsc b/MikroGig/history/20260703/20260703142257-Diff-Config.rsc new file mode 100644 index 0000000..45dc990 --- /dev/null +++ b/MikroGig/history/20260703/20260703142257-Diff-Config.rsc @@ -0,0 +1,268 @@ +2717,2983d2716 +< \n" +< add comment=Generator dont-require-permissions=no name=AWG-VDSina owner=vados \ +< policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +< source="# ============================================================\r\ +< \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\r\ +< \n# 2026-06-30 22:08:12\r\ +< \n# ============================================================\r\ +< \n\r\ +< \n# 0. Check prerequisites\r\ +< \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ +< = 0) do={\r\ +< \n :put \"Container package is not installed or disabled. Install it and \ +< reboot.\"\r\ +< \n :error \"Usage: /system/device-mode/update container=yes\"\r\ +< \n}\r\ +< \n\r\ +< \n# Auto-detect storage\r\ +< \n:global awgDisk \"disk1\"\r\ +< \n{\r\ +< \n :local usbFree 0\r\ +< \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ +< } on-error={}\r\ +< \n :if (\$usbFree > 0) do={\r\ +< \n :set awgDisk \"usb1\"\r\ +< \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ +< \r\ +< \n } else={\r\ +< \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\r\ +< \n :put \"USB found but not mounted. Format as ext4\?\"\r\ +< \n :put \"Press 'y' to confirm:\"\r\ +< \n :local key [/terminal/inkey timeout=30]\r\ +< \n :if (\$key = 121 || \$key = 89) do={\r\ +< \n /disk/format-drive usb1 file-system=ext4 label=usb1\r\ +< \n :delay 3s\r\ +< \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ +< free] } on-error={}\r\ +< \n :if (\$usbFree > 0) do={\r\ +< \n :set awgDisk \"usb1\"\r\ +< \n } else={ :put \"Format failed, using disk1\" }\r\ +< \n } else={ :put \"Using disk1\" }\r\ +< \n } else={ :put \"No USB, using disk1\" }\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n# 1. Uninstall script\r\ +< \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ +< \r\ +< \n :put \"Uninstallimg AmneziaWG...\"\r\ +< \n :log info \"Uninstallimg AmneziaWG...\"\r\ +< \n :local prevDNS \"\"\r\ +< \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ +< env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ +< \n :local storageDisk \"disk1\"\r\ +< \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ +< ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ +< \n :local prevTmpdir \"\"\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ +< Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ +< \n }\r\ +< \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ +< \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ +< \n /container/stop [find where interface=veth-awg-VDSina]\r\ +< \n :delay 7s\r\ +< \n /container/remove [find where interface=veth-awg-VDSina]\r\ +< \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ +< \n :if (\$prevDNS != \"\") do={\r\ +< \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ +< \n :put (\"DNS restored to: \$prevDNS\")\r\ +< \n }\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n /container/config set tmpdir=\$prevTmpdir\r\ +< \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ +< \n }\r\ +< \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ +< \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ +< \r\ +< \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ +< \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ +< \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ +< a\"]\r\ +< \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ +< \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ +< \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ +< \r\ +< \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ +< \_} on-error={}\r\ +< \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ +< out.rsc\")] } on-error={}\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ +< n-error={}\r\ +< \n }\r\ +< \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ +< \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ +< \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ +< \n}\r\ +< \n\r\ +< \n# 2. Network infrastructure\r\ +< \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ +< y=172.19.75.209\r\ +< \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\r\ +< \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ +< 5.208/30\r\ +< \n\r\ +< \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ +< \r\ +< \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ +< yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\r\ +< \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ +< Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ +< QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ +< rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\r\ +< \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\r\ +< \n\r\ +< \n# 4. Container environment variables\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ +< \r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ +< 77.79:55055\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ +< 438637\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ +< 809250\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ +< 09079495\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ +< 12329741\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ +< l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ +< face/wireguard/get [find name=wg-awg-VDSina] public-key]\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ +< \"\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ +< \r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\r\ +< \n\r\ +< \n# 5. DNS\r\ +< \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ +< n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ +< \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ +< g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ +< \n# NOTE: replaces existing DNS configuration\r\ +< \n/ip/dns/set servers=109.107.177.79\r\ +< \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ +< ce=1 comment=awg-VDSina-dns\r\ +< \n\r\ +< \n# 6. Download, create and start container\r\ +< \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ +< \r\ +< \n:if (\$awgDisk != \"disk1\") do={\r\ +< \n :local tmpPath (\$awgDisk . \"/pull\")\r\ +< \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ +< ntainer/config/get tmpdir]\r\ +< \n /container/config set tmpdir=\$tmpPath memory-high=200M\r\ +< \n}\r\ +< \n{\r\ +< \n :local arch [/system/resource/get architecture-name]\r\ +< \n :local ver [/system/resource/get version]\r\ +< \n :local dotPos [:find \$ver \".\"]\r\ +< \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ +< \n :local endPos [:find \$rest \".\"]\r\ +< \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ +< \"] }\r\ +< \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ +< \n :local suffix \"\"\r\ +< \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ +< \n :local file \"\"\r\ +< \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ +< x . \".tar.gz\") }\r\ +< \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ +< \".tar.gz\") }\r\ +< \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ +< . \".tar.gz\") }\r\ +< \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ +< \r\ +< \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ +< atest/download/\$file\"\r\ +< \n :local filePath \$file\r\ +< \n :if (\$awgDisk != \"disk1\") do={\r\ +< \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\r\ +< \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\r\ +< \n }\r\ +< \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\r\ +< \n :local freeStorage 0\r\ +< \n :if (\$awgDisk = \"disk1\") do={\r\ +< \n :set freeStorage [/system/resource/get free-hdd-space]\r\ +< \n } else={\r\ +< \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ +< k] free] } on-error={}\r\ +< \n }\r\ +< \n :if (\$freeStorage < 262144) do={\r\ +< \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ +< B free). Need at least 256KB.\")\r\ +< \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ +< cient-disk-space\"\r\ +< \n :error \"Insufficient disk space\"\r\ +< \n }\r\ +< \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ +< \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ +< \r\ +< \n } else={\r\ +< \n :put (\"File already exists: \" . \$filePath)\r\ +< \n }\r\ +< \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\r\ +< \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ +< DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ +< yes comment=awg-VDSina\r\ +< \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ +< =veth-awg-VDSina] shm-size=4M\"] }\r\ +< \n /file/remove \$filePath\r\ +< \n :local freeMem [/system/resource/get free-memory]\r\ +< \n :if (\$freeMem < 16777216) do={\r\ +< \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ +< . 16MB+ recommended.\")\r\ +< \n }\r\ +< \n /container/start [find where interface=veth-awg-VDSina]\r\ +< \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ +< }\r\ +< \n :put \"Waiting for container to start...\"\r\ +< \n :delay 5s\r\ +< \n /interface/wireguard/enable wg-awg-VDSina\r\ +< \n :put \"WireGuard interface enabled\"\r\ +< \n :put \"Installation complete!\"\r\ +< \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ +< \"\r\ +< \n /ping 109.107.177.79 count=10 interval=1\r\ +< \n :put \"\"\r\ +< \n :put \"======= NEXT STEPS =======\"\r\ +< \n :put \"\"\r\ +< \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ +< \n :put \"\"\r\ +< \n :put \" Route a single host:\"\r\ +< \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ +< comment=awg-VDSina-tunnel\"\r\ +< \n :put \"\"\r\ +< \n :put \" Route a subnet:\"\r\ +< \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ +< \_comment=awg-VDSina-tunnel\"\r\ +< \n :put \"\"\r\ +< \n :put \" Remove a route:\"\r\ +< \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ +< address=8.8.8.8/32]\"\r\ +< \n :put \"\"\r\ +< \n :put \" Show all tunnel routes:\"\r\ +< \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\r\ +< \n :put \"\"\r\ +< \n :put \" Uninstall:\"\r\ +< \n :put \" /system/script/run awg-VDSina-uninstall\"\r\ +< \n :put \"=========================\"\r\ +< \n}\r\ +< \n\r\ +< \n# 7. Verification\r\ +< \n# /container/print\r\ +< \n# /interface/wireguard/print\r\ +< \n# /interface/wireguard/peers/print\r\ -- 2.52.0