From ce3d7b8dbd2e9d25d6ad6552dca7c2d035d936e0 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Sun, 19 Apr 2026 17:20:15 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 19 17:20:15. --- .../20260419/20260419172005-Binary.backup | Bin 0 -> 116182 bytes .../20260419/20260419172005-Config.rsc | 2375 +++++++++++++++++ .../20260419/20260419172005-Diff-Config.rsc | 8 + 3 files changed, 2383 insertions(+) create mode 100644 MikroYellow/20260419/20260419172005-Binary.backup create mode 100644 MikroYellow/20260419/20260419172005-Config.rsc create mode 100644 MikroYellow/history/20260419/20260419172005-Diff-Config.rsc diff --git a/MikroYellow/20260419/20260419172005-Binary.backup b/MikroYellow/20260419/20260419172005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..7c4d3ac86560176ec0f4bdd4963d13fbcf1941ac GIT binary patch literal 116182 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¬AOnJ9YMS-BZp1$&ivf@#2$2J-rxS66 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

*#P>7ix?10b91 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\"data\");\ + \n#/usb1/mikro_bak_rsa.pub" +add comment="Script for setup routeros scrypt system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros scrypt system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global RunOnce;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix \"\";\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass {\r\ + \n \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass {\r\ + \n \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/247/016960a4\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 03:45:02 16.04.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n#:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global ExitError;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if (\$CurrentChannel != \$updateChannel) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel (\$Update->\"channel\");\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n\r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([:len \$arrDeviceInfo] = 0) do={\r\ + \n :global arrDeviceInfo ({});\r\ + \n :local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};}\ + );\r\ + \n }\r\ + \n # else={:local arrDeviceInfo ({})}\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [[ :parse \"/\ + system/package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"\ + Error\")};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannel\"; \$Cu\ + rrentChannel;};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentVersion\"; (\$U\ + pdate->\"installed-version\");};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannelVersion\ + \"; [/system/resource/get version];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateChannel\"; [\$up\ + dateChannel];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateVersion\"; (\$Up\ + date->\"latest-version\");};\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n\r\ + \n :global arrDeviceInfo [:toarray {\"section\"={\"key\"=\"\"; \"value\"\ + =\"\";} }];\r\ + \n #:do {:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system/package\ + /update/get\" ]]} on-error={}\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devRbCurrentFw;\r\ + \n :global devRbUpgradeFw;\r\ + \n\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global ROsVerCurrent;\r\ + \n :global ROsChannelCurrent;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :global ParseCustom;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global devBuildTime;\r\ + \n :global GetPubIp;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :set devBuildTime (\$Resource->\"build-time\");\r\ + \n :set runningChannelVersion (\$Resource->\"version\");\r\ + \n :set runningChannel [\$ParseCustom \$runningChannelVersion \"(\" \")\ + \" 1];\r\ + \n :set runningVersion [\$ParseCustom \$runningChannelVersion \" \"];\r\ + \n\r\ + \n :do {\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :local RouterBoard;\r\ + \n :do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on\ + -error={}\r\ + \n :set devModel (\$RouterBoard->\"model\");\r\ + \n :set devRbRevision (\$RouterBoard->\"revision\");\r\ + \n :set devRbSerialNumber (\$RouterBoard->\"serial-number\");\r\ + \n #:set devRbCurrentFw (\$RouterBoard->\"current-firmware\");\r\ + \n #:set devRbUpgradeFw (\$RouterBoard->\"upgrade-firmware\");\r\ + \n :if (\$devCurArch = \"mipsbe\" || \$devCurArch = \"arm\") do={\r\ + \n :global devRunning [ /system/device-mode/get mode ];\r\ + \n } else={\r\ + \n :global devRunning [/system/device-mode/get running];}\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n\r\ + \n :set devRbRevision false;\r\ + \n :set devRbSerialNumber false;\r\ + \n# :set devRbCurrentFw false;\r\ + \n# :set devRbUpgradeFw false;\r\ + \n #:set devCurrentFw \$runningVersion;#:set devUpgradeFw \$ROsVerAvail\ + ;\r\ + \n :set devRunning [/system/device-mode/get running];\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Error in Function getDevice!\");\r\ + \n :return false;\r\ + \n }\r\ + \n:return true;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global WaitArrDeviceInfo;\r\ + \n # \$WaitDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devCurArch;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global PiblicIpAddress;\r\ + \n\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :local Return;\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n\r\ + \n :set Return ([ \$FormatLine \"Hostname:\" \$Identity ] . \"\\n\" . \\\ + \r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location:\" (\$Snmp->\"location\") ] . \"\\n\") \ + ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact:\" (\$Snmp->\"contact\") ] . \"\\n\") ] \ + . \\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board:\" . \$devBoardName ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Arch:\" . \$devCurArch ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Model:\" \$devModel ] . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbRevision ] > 0) \\\r\ + \n (\" \" . \$devRbRevision) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbSerialNumber ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial:\" . \$devRbSerialNumber ] . \"\\n\"\ + ) ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"nleve\ + l\")) ] . \"\\n\") ] . \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \"Running Channel\" \$runningChannel ] . \"\\n\" . \\\ + \r\ + \n [ \$FormatLine \" Installed:\" (\$Update->\"installed-version\") \ + ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :typeof (\$Update->\"latest-version\") ] != \"noth\ + ing\" && \\\r\ + \n \$Update->\"installed-version\" != \$Update->\"latest-version\")\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Update->\"latest-version\") ]\ + \_. \"\\n\") ] . \\\r\ + \n [ \$IfThenElse (\$RouterBoard->\"routerboard\" = true && \\\r\ + \n \$RouterBoard->\"current-firmware\" != \$RouterBoard->\"upgrade-\ + firmware\") \\\r\ + \n ([ \$FormatLine \" Firmware\" (\$RouterBoard->\"current-firmwar\ + e\") ] . \"\\n\") ] . \\ \r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fail\ + ed to detect public IP using default service: \" . \$Url . \".\")}\r\ + \n #:error \"Failed to detect public IP using default service: \$Url\ + .\"};\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :if (\$PubIpAddr = false) do={\r\ + \n :set PubIpAddr \"not-detected\";\r\ + \n } else={\r\ + \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ + \n }\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n \$LogPrint warning \$0 (\"This system has low free flash space but \ + \" . \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint info \$0 (\"There are \" . \$CertCount . \" Certificates \ + with CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :global LogPrint;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint error \$Name ([ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\ + \$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {:set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :global LogPrint;\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\r\ + \n \r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\r\ + \n \r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Setup Global Environment for scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BC auto-mac=no mlag-peer-port=ether1 name=\ + Bridge-LAN port-cost-mode=short +/interface wireless +# managed by CAPsMAN +# channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface list member +add interface=ether1 list=WAN +add interface=ether2 list=LAN +add interface=ether3 list=LAN +add interface=ether4 list=LAN +add interface=ether5 list=LAN +add interface=wlan2 list=LAN +add interface=wlan1 list=LAN +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +/ip dns +set servers=10.30.30.81 +/ip route +add disabled=no dst-address=0.0.0.0/0 gateway=10.30.30.81 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set www disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system identity +set name=MikroYellow +/system scheduler +add comment="Setup Global Environment for scripts" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup diff --git a/MikroYellow/history/20260419/20260419172005-Diff-Config.rsc b/MikroYellow/history/20260419/20260419172005-Diff-Config.rsc new file mode 100644 index 0000000..05621f6 --- /dev/null +++ b/MikroYellow/history/20260419/20260419172005-Diff-Config.rsc @@ -0,0 +1,8 @@ +2286c2286 +< # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +2307c2307 +< # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding -- 2.52.0