From dfcd2a196c7d0e5f73156f10b78d0c532039b200 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 15 May 2026 09:40:37 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at May 15 09:40:37. --- .../20260515/20260515094001-Binary.backup | Bin 0 -> 247509 bytes .../20260515/20260515094001-Config.rsc | 3549 +++++++++++++++++ .../20260515/20260515094001-Diff-Config.rsc | 2308 +++++++++++ 3 files changed, 5857 insertions(+) create mode 100644 MikroMaster/20260515/20260515094001-Binary.backup create mode 100644 MikroMaster/20260515/20260515094001-Config.rsc create mode 100644 MikroMaster/history/20260515/20260515094001-Diff-Config.rsc diff --git a/MikroMaster/20260515/20260515094001-Binary.backup b/MikroMaster/20260515/20260515094001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..3efe2bba95982c1ee2f1a6100be4f21c00aef814 GIT binary patch literal 247509 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

?g-KcB$T7&S!^R2F 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¥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\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n\r\ + \n#\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n\r\ + \n#\r\ + \n\ + \n#root.mnuc.backuper\ + \n\ + \n\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\r\ + \n\ + \n#:local Script AM-GlobalConfig;\ + \n\r\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n\r\ + \n\r\ + \n#\ + \n:global MkDir;\ + \n\r\ + \n\ + \n#:local FetchFile Binary.backup\ + \n:local localDir \"\";\ + \n\ + \n\r\ + \n#\$MkDir \$localDir;\r\ + \n\ + \n#\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\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/636/1e86a8d7\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 09:15:03 15.05.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 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 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\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#/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=\"\";" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,www,api,reverse-proxy,logging" crl-store=system +/interface bridge port +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ip firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN +/ip settings +set max-neighbor-entries=8192 secure-redirects=no +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no max-neighbor-entries=8192 +/interface detect-internet +set detect-interface-list=WAN internet-interface-list=WAN lan-interface-list=\ + LAN wan-interface-list=WAN +/interface l2tp-server server +set authentication=mschap2 use-ipsec=yes +/interface list member +add interface=Bridge-LAN list=LAN +add interface="ether1 - Unet" list=WAN +/interface wireguard peers +add allowed-address=0.0.0.0/0,::/0 client-allowed-address=::/0 \ + endpoint-address=89.110.101.17 endpoint-port=29185 interface=WG name=\ + MikroVados persistent-keepalive=10s public-key=\ + "64Y25EUZQQt8EIeAJYD8qWt+te8qvGEepnswdBgmzlY=" +/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=Bridge-LAN enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.81/24 interface=Bridge-LAN network=10.30.30.0 +add address=10.8.0.2/24 interface=WG network=10.8.0.0 +/ip dhcp-client +add interface="ether1 - Unet" name=client1 +/ip dhcp-server config +set accounting=no +/ip dhcp-server lease +add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ + 48:8F:5A:8E:EE:A8 server=masterDHCP +add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ + F0:DE:F1:91:0D:1E server=masterDHCP +add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ + 00:80:77:EC:43:86 server=masterDHCP +add address=10.30.30.70 dhcp-option=domain-search-list,HostName \ + dhcp-option-set=HP1505n mac-address=00:1E:0B:1A:88:8D server=masterDHCP +add address=10.30.30.50 client-id=1:4:7c:16:36:f5:37 mac-address=\ + 04:7C:16:36:F5:37 server=masterDHCP +add address=10.30.30.71 client-id=1:10:2d:41:2c:20:c2 mac-address=\ + 10:2D:41:2C:20:C2 server=masterDHCP +add address=10.30.30.61 client-id=1:10:8:c1:81:59:5f mac-address=\ + 10:08:C1:81:59:5F server=masterDHCP +add address=10.30.30.72 client-id=1:10:38:1f:d2:5f:13 mac-address=\ + 10:38:1F:D2:5F:13 server=masterDHCP +add address=10.30.30.99 client-id=1:10:b1:df:e9:d0:d5 mac-address=\ + 10:B1:DF:E9:D0:D5 server=masterDHCP +add address=10.30.30.111 client-id=1:fe:2:52:be:3f:16 mac-address=\ + FE:02:52:BE:3F:16 server=masterDHCP +add address=10.30.30.92 client-id=1:d4:6d:6d:fd:e5:49 mac-address=\ + D4:6D:6D:FD:E5:49 server=masterDHCP +add address=10.30.30.93 client-id=1:7e:8b:1e:cb:b8:cb mac-address=\ + CC:42:10:12:46:94 server=masterDHCP +add address=10.30.30.94 client-id=1:50:cc:f8:85:96:a mac-address=\ + 50:CC:F8:85:96:0A server=masterDHCP +add address=10.30.30.82 client-id=1:e4:18:6b:58:34:ab mac-address=\ + E4:18:6B:58:34:AB server=masterDHCP +add address=10.30.30.75 client-id=1:0:27:15:41:97:a9 mac-address=\ + 00:27:15:41:97:A9 server=masterDHCP +add address=10.30.30.77 dhcp-option=HostName dhcp-option-set=StartLife1 \ + mac-address=C4:82:E1:03:49:10 server=masterDHCP +add address=10.30.30.73 client-id=1:10:38:1f:82:81:f2 mac-address=\ + 10:38:1F:82:81:F2 server=masterDHCP +add address=10.30.30.95 client-id=1:88:ae:dd:60:39:54 dhcp-option=HostName \ + dhcp-option-set=VADOS-NUC mac-address=88:AE:DD:60:39:54 server=masterDHCP +add address=10.30.30.98 client-id=1:c8:5b:76:d8:cc:bf dhcp-option=HostName \ + dhcp-option-set=VADOS-LEN mac-address=C8:5B:76:D8:CC:BF server=masterDHCP +add address=10.30.30.96 client-id=iPhone mac-address=4A:91:ED:0E:1F:39 \ + server=masterDHCP +add address=10.30.30.74 client-id=MiTV dhcp-option=HostName dhcp-option-set=\ + MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP +add address=10.30.30.30 dhcp-option=HostName dhcp-option-set=miller \ + mac-address=F0:75:5D:1E:5F:71 server=masterDHCP +add address=10.30.30.100 client-id=iVados dhcp-option=HostName \ + dhcp-option-set="=\"Client ID\"" mac-address=DE:4D:72:F3:1A:9F server=\ + masterDHCP +/ip dhcp-server network +add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ + domain-search-list dhcp-option-set=domain-search-set dns-server=\ + 10.30.30.81 domain=WORKGROUP gateway=10.30.30.81 netmask=24 ntp-server=\ + 10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +/ip dns +set allow-remote-requests=yes cache-max-ttl=1d doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=8.8.8.8,8.8.4.4 verify-doh-cert=yes +/ip dns static +add address=10.30.30.33 name=ros.vados.ru type=A +add address=10.30.30.95 name=vados-nuc type=A +add address=10.30.30.33 name=amster-nuc type=A +add address=10.30.30.33 comment=AMSTER name=amster.vados.ru type=A +add address=10.30.30.33 name=amster type=A +add address=10.30.30.33 name=amster-reg type=A +add address=10.30.30.33 name=mng.vados.ru type=A +add address=10.30.30.33 name=mgr.vados.ru type=A +add address=10.30.30.33 name=prt.vados.ru type=A +add address=10.30.30.33 name=reg.vados.ru type=A +add address=10.30.30.33 match-subdomain=yes name=mikrots.vados.ru type=A +add address=10.30.30.33 name=oxidized.vados.ru type=A +add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +add address=8.8.8.8 comment="Google-dns IPv4 1" name=dns.google type=A +add address=10.30.30.30 comment=MILLER name=miller.vados.ru type=A +add address=10.30.30.30 name=MILLER-LEN type=A +add address=10.30.30.30 name=miller type=A +add address=1.0.0.1 comment="CloudFlare-doh IPv4 2" name=\ + security.cloudflare-dns.com type=A +add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" name=\ + security.cloudflare-dns.com type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=149.112.112.112 comment="Cuad9-dns IPv4 2" name=dns.quad9.net \ + type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +add address=10.30.30.81 comment=LocalNet name=MikroVados type=A +add address=10.30.30.10 name=MikroNUC type=A +add address=10.30.30.86 name=MikroYellow type=A +add address=10.30.30.85 name=MikroMic type=A +add address=10.30.30.95 name=VADOS-NUC type=A +add address=10.30.30.98 name=VADOS-LEN type=A +add address=10.30.30.20 name=garage type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +/ip firewall address-list +add address=91.215.120.206 list=TRUSTED +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=10.30.30.100-255 list=KIDS +add address=8.8.4.0/24 list=YouTube +add address=8.8.8.0/24 list=YouTube +add address=8.34.208.0/20 list=YouTube +add address=8.35.192.0/20 list=YouTube +add address=23.236.48.0/20 list=YouTube +add address=23.251.128.0/19 list=YouTube +add address=34.0.0.0/15 list=YouTube +add address=34.2.0.0/16 list=YouTube +add address=34.3.0.0/23 list=YouTube +add address=34.3.3.0/24 list=YouTube +add address=34.3.4.0/24 list=YouTube +add address=34.3.8.0/21 list=YouTube +add address=34.3.16.0/20 list=YouTube +add address=34.3.32.0/19 list=YouTube +add address=34.3.64.0/18 list=YouTube +add address=34.4.0.0/14 list=YouTube +add address=34.8.0.0/13 list=YouTube +add address=34.16.0.0/12 list=YouTube +add address=34.32.0.0/11 list=YouTube +add address=34.64.0.0/10 list=YouTube +add address=34.128.0.0/10 list=YouTube +add address=35.184.0.0/13 list=YouTube +add address=35.192.0.0/14 list=YouTube +add address=35.196.0.0/15 list=YouTube +add address=35.198.0.0/16 list=YouTube +add address=35.199.0.0/17 list=YouTube +add address=35.199.128.0/18 list=YouTube +add address=35.200.0.0/13 list=YouTube +add address=35.208.0.0/12 list=YouTube +add address=35.224.0.0/12 list=YouTube +add address=35.240.0.0/13 list=YouTube +add address=57.140.192.0/18 list=YouTube +add address=64.15.112.0/20 list=YouTube +add address=64.233.160.0/19 list=YouTube +add address=66.22.228.0/23 list=YouTube +add address=66.102.0.0/20 list=YouTube +add address=66.249.64.0/19 list=YouTube +add address=70.32.128.0/19 list=YouTube +add address=72.14.192.0/18 list=YouTube +add address=74.125.0.0/16 list=YouTube +add address=104.154.0.0/15 list=YouTube +add address=104.196.0.0/14 list=YouTube +add address=104.237.160.0/19 list=YouTube +add address=107.167.160.0/19 list=YouTube +add address=107.178.192.0/18 list=YouTube +add address=108.59.80.0/20 list=YouTube +add address=108.170.192.0/18 list=YouTube +add address=108.177.0.0/17 list=YouTube +add address=130.211.0.0/16 list=YouTube +add address=136.22.160.0/20 list=YouTube +add address=136.22.176.0/21 list=YouTube +add address=136.22.184.0/23 list=YouTube +add address=136.22.186.0/24 list=YouTube +add address=142.250.0.0/15 list=YouTube +add address=146.148.0.0/17 list=YouTube +add address=152.65.208.0/22 list=YouTube +add address=152.65.214.0/23 list=YouTube +add address=152.65.218.0/23 list=YouTube +add address=152.65.222.0/23 list=YouTube +add address=152.65.224.0/19 list=YouTube +add address=162.120.128.0/17 list=YouTube +add address=162.216.148.0/22 list=YouTube +add address=162.222.176.0/21 list=YouTube +add address=172.110.32.0/21 list=YouTube +add address=172.217.0.0/16 list=YouTube +add address=172.253.0.0/16 list=YouTube +add address=173.194.0.0/16 list=YouTube +add address=173.255.112.0/20 list=YouTube +add address=192.158.28.0/22 list=YouTube +add address=192.178.0.0/15 list=YouTube +add address=193.186.4.0/24 list=YouTube +add address=199.36.154.0/23 list=YouTube +add address=199.36.156.0/24 list=YouTube +add address=199.192.112.0/22 list=YouTube +add address=199.223.232.0/21 list=YouTube +add address=207.223.160.0/20 list=YouTube +add address=208.65.152.0/22 list=YouTube +add address=208.68.108.0/22 list=YouTube +add address=208.81.188.0/22 list=YouTube +add address=208.117.224.0/19 list=YouTube +add address=209.85.128.0/17 list=YouTube +add address=216.58.192.0/19 list=YouTube +add address=216.73.80.0/20 list=YouTube +add address=216.239.32.0/19 list=YouTube +add address=2ip.ru list=Test +add address=157.240.247.174 list=Instagram +add address=46.53.178.107 list=Instagram +add address=179.60.195.174 list=Instagram +add address=157.240.205.174 list=Instagram +add address=31.13.24.0/21 list=Instagram +add address=31.13.64.0/18 list=Instagram +add address=45.64.40.0/22 list=Instagram +add address=66.220.144.0/20 list=Instagram +add address=69.63.176.0/20 list=Instagram +add address=69.171.224.0/19 list=Instagram +add address=74.119.76.0/22 list=Instagram +add address=103.4.96.0/22 list=Instagram +add address=129.134.0.0/16 list=Instagram +add address=157.240.0.0/16 list=Instagram +add address=173.252.64.0/18 list=Instagram +add address=179.60.192.0/22 list=Instagram +add address=185.60.216.0/22 list=Instagram +add address=204.15.20.0/22 list=Instagram +add address=157.240.200.63 list=Instagram +add address=185.60.219.63 list=Instagram +add address=129.134.31.12 list=Instagram +add address=66.81.203.132 list=Instagram +add address=185.89.218.12 list=Instagram +add address=31.13.66.63 list=Instagram +add address=84.15.65.162 list=Instagram +add address=68.66.224.28 list=Instagram +add address=157.240.253.63 list=Instagram +add address=83.174.11.224 list=Instagram +add address=157.240.9.52 list=Instagram +add address=157.240.252.174 list=Instagram +add address=157.240.195.63 list=Instagram +add address=31.13.71.52 list=Instagram +add address=57.144.110.192 list=Instagram +add address=157.240.252.17 list=Instagram +add address=84.15.66.97 list=Instagram +add address=217.168.6.33 list=Instagram +add address=31.13.83.52 list=Instagram +add address=157.240.241.63 list=Instagram +add address=129.134.30.12 list=Instagram +add address=185.89.219.12 list=Instagram +add address=157.240.252.10 list=Instagram +add address=157.240.201.63 list=Instagram +add address=66.81.203.197 list=Instagram +add address=179.60.195.52 list=Instagram +add address=66.81.203.7 list=Instagram +add address=216.40.34.41 list=Instagram +add address=157.240.202.63 list=Instagram +add address=157.240.229.63 list=Instagram +add address=157.240.252.63 list=Instagram +add address=31.13.72.53 list=Instagram +add address=124.108.16.224 list=Instagram +add address=157.240.205.63 list=Instagram +add address=92.46.37.96 list=Instagram +add address=157.240.247.63 list=Instagram +add address=157.240.234.63 list=Instagram +add address=157.240.235.63 list=Instagram +add address=87.245.208.97 list=Instagram +add address=216.58.192.0/19 list=Instagram +add address=209.85.128.0/17 list=Instagram +add address=198.105.240.0/20 list=Instagram +add address=173.194.0.0/16 list=Instagram +add address=172.217.0.0/16 list=Instagram +add address=142.250.0.0/15 list=Instagram +add address=108.177.0.0/17 list=Instagram +add address=87.245.197.140 list=Instagram +add address=74.125.0.0/16 list=Instagram +add address=64.233.160.0/19 list=Instagram +add address=157.240.0.1 list=Instagram +add address=157.240.238.63 list=Instagram +add address=157.240.238.174 list=Instagram +add address=157.240.0.63 list=Instagram +add address=157.240.224.63 list=Instagram +add address=157.240.224.174 list=Instagram +add address=157.240.251.36 list=Instagram +add address=157.240.253.12 list=Instagram +add address=157.240.253.35 list=Instagram +add address=157.240.238.13 list=Instagram +add address=157.240.238.56 list=Instagram +add address=157.240.238.175 list=Instagram +add address=57.144.112.141 list=Instagram +add address=157.240.251.60 list=Instagram +add address=157.240.251.128 list=Instagram +add address=157.240.238.5 list=Instagram +add address=157.240.253.13 list=Instagram +add address=157.240.253.5 list=Instagram +add address=157.240.238.2 list=Instagram +add address=157.240.238.37 list=Instagram +add address=157.240.251.5 list=Instagram +add address=157.240.251.34 list=Instagram +add address=57.144.112.1 list=Instagram +add address=157.240.238.54 list=Instagram +add address=129.134.26.123 list=Instagram +add address=157.240.252.3 list=Instagram +add address=31.13.84.4 list=Instagram +add address=157.240.224.12 list=Instagram +add address=157.240.238.4 list=Instagram +add address=157.240.0.13 list=Instagram +add address=3.33.139.32 list=Instagram +add address=157.240.0.35 list=Instagram +add address=157.240.238.14 list=Instagram +add address=157.240.238.60 list=Instagram +add address=57.144.112.145 list=Instagram +add address=157.240.251.35 list=Instagram +add address=89.110.101.17 comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" list=TRUSTED +add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +add address=love.ru comment=love.ru list=NoVdsina +add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +add address=pochta.ru comment=pochta.ru list=NoVdsina +add address=vdsina.com list=NoVdsina +add address=vdsina.ru list=NoVdsina +add address=youla.ru list=NoVdsina +add address=kupiprodai.ru list=NoVdsina +add address=myip.ru list=Test +add address=geoip.co list=NoVdsina +add address=facebook.com list=facebook +add address=fbcd.net list=facebook +add address=comp-lenta.ru list=NoVdsina +add address=128.85.102.70 comment=update.microsoft.com list=\ + windowsupdateslist +add address=wu-b-net.trafficmanager.net. comment=\ + ctldl.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=ctldl.windowsupdate.com.delivery.microsoft.com. comment=\ + ctldl.windowsupdate.com list=windowsupdateslist +add address=redir.update.msft.com.trafficmanager.net. comment=\ + update.microsoft.com list=windowsupdateslist +add address=geo.prod.do.dsp.trafficmanager.net. comment=\ + geo.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=13.74.139.29 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12437.d.akamaiedge.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=displaycatalog-rp.md.mp.microsoft.com.akadns.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=rp-consumer-prod-displaycatalog-geomap.trafficmanager.net. \ + comment=displaycatalog-rp.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=sls.update.microsoft.com. comment=slscr.update.microsoft.com \ + list=windowsupdateslist +add address=glb.sls.prod.dcat.dsp.trafficmanager.net. comment=\ + sls.update.microsoft.com list=windowsupdateslist +add address=fe3.delivery.mp.microsoft.com. comment=\ + fe3cr.delivery.mp.microsoft.com list=windowsupdateslist +add address=glb.cws.prod.dcat.dsp.trafficmanager.net. comment=\ + fe3.delivery.mp.microsoft.com list=windowsupdateslist +add address=fe2cr.update.msft.com.trafficmanager.net. comment=\ + fe2cr.update.microsoft.com list=windowsupdateslist +add address=download.windowsupdate.com.delivery.microsoft.com. comment=\ + download.windowsupdate.com list=windowsupdateslist +add address=wu-f-net.trafficmanager.net. comment=\ + download.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=tsfe.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=edge.ds-c7110-microsoft.global.dns.qwilted-cds.cqloud.com. \ + comment=9.au.download.windowsupdate.com list=windowsupdateslist +add address=52.158.227.125 comment=array812.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dspw65.akamai.net. comment=\ + download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.151.58.88 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net. \ + comment=licensing.mp.microsoft.com list=windowsupdateslist +add address=licensing-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-nlu-net.trafficmanager.net. comment=\ + star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.b.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-tlu-net.trafficmanager.net. comment=\ + star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=storeedgefd.xbetservices.akadns.net. comment=\ + storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net. \ + comment=storeedgefd.dsx.mp.microsoft.com.edgekey.net list=\ + windowsupdateslist +add address=e16646.dscg.akamaiedge.net. comment=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net list=\ + windowsupdateslist +add address=40.69.76.189 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=bg.microsoft.map.fastly.net. comment=\ + 3.au.download.windowsupdate.com list=windowsupdateslist +add list=windowsupdateslist +add address=40.69.75.33 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=cdp-f-ssl-tlu-net.trafficmanager.net. comment=\ + star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a2033.dscd.akamai.net. comment=\ + star.sb.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.138.242 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-nlu-net.trafficmanager.net. comment=\ + dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=1D.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-b-tlu-net.trafficmanager.net. comment=\ + 1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a122.dscg3.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=windowsupdateslist +add address=geover.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e10370.d.akamaiedge.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=52.232.182.21 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.95 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=a1683.dscd.akamai.net. comment=\ + dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net. \ + comment=collections.mp.microsoft.com list=windowsupdateslist +add address=a1847.dscd.akamai.net. comment=\ + wildcard.f.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.142.6 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=au.download.windowsupdate.com.edgesuite.net. comment=\ + 2.au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dscg3.akamai.net. comment=\ + au.download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.156.123.84 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.78.254 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=4.au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + 4.au.download.windowsupdate.com list=windowsupdateslist +add address=cl-glcb907925.gcdn.co. comment=\ + 4.au.download.windowsupdate.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.111 comment=array510.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.69.70.43 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com. \ + comment=tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=ts-frontend.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=40.69.75.248 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.74.84 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=sds.trafficmanager.net. comment=software-download.microsoft.com \ + list=windowsupdateslist +add address=40.69.74.80 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.175.242.182 comment=array804.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=dlc-shim.trafficmanager.net. comment=download.microsoft.com list=\ + windowsupdateslist +add address=e12671.dscd.akamaiedge.net. comment=\ + download.microsoft.com.edgekey.net list=windowsupdateslist +add address=20.187.55.34 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.231 comment=array513.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.222.13 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12358.d.akamaiedge.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-tlu-net.trafficmanager.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a1856.dspw65.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=52.167.164.252 comment=array506.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=13.74.137.54 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv501.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv501.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=collections-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=52.167.160.173 comment=array509.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.77.148 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.200.126 comment=array507.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.167.59 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.172 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=smtp.mail.me.com comment=smtp.mail.me.com list=iCloud-Mail +add address=smtp.mail.me.com.akadns.net comment=smtp.mail.me.com.akadns.net \ + list=iCloud-Mail +add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ + purchase.mp.microsoft.com list=windowsupdateslist +add address=e110219.a.akamaiedge.net. comment=\ + purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.141 list=windowsupdateslist +add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=storesdk.xbetservices.akadns.net. comment=\ + storesdk.dsx.mp.microsoft.com list=windowsupdateslist +add address=e16646.g.akamaiedge.net. comment=\ + storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ + software-download.microsoft.com list=windowsupdateslist +add address=download.prss.microsoft.com.akamaized.net. comment=\ + software-download.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +add address=87.250.250.50 comment=YandexDisk list=NoVdsina +add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ + purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ + purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ + cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=a1996.dscd.akamai.net. comment=\ + wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.sls.update.microsoft.com list=windowsupdateslist +add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ + star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ + paymentinstruments.mp.microsoft.com list=windowsupdateslist +add address=10.30.30.33 comment=NUC disabled=yes list=NoWG +add address=10.30.30.10 comment=MikroNUC disabled=yes list=NoWG +add address=89.110.101.17 comment=!!!VDSINA!!!! disabled=yes list=NoWG +add address=wg.vados.ru comment=VDSina-vpn list=Trusted-VPN +add address=80.85.244.9 list=TRUSTED +add address=disc801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + disc801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=89.110.101.17 comment="!!!VDSina Server!!!" disabled=yes list=\ + NoVdsina +add address=dns.quad9.net comment=Quad9-dns disabled=yes list=Trusted-DNS +add address=dns.google comment=Google-dns list=Trusted-DNS +add address=security.cloudflare-dns.com comment=CloudFlare-dns list=\ + Trusted-DNS +add address=time.google.com comment=Google-time list=Trusted-NTP +add address=0.ru.pool.ntp.org comment=ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=1.ru.pool.ntp.org disabled=yes list=Trusted-NTP +add address=2.ru.pool.ntp.org comment=2.ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=3.ru.pool.ntp.org comment=3.ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=cp.vdsina.com comment=VDSina-vpn list=Trusted-VPN +add address=vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=ns.vados.ru comment=VDSina-vpn list=Trusted-VPN +add address=vdsina.com comment=VDSina-vpn list=Trusted-VPN +add address=cp.vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=ns1.vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=149.154.164.13 comment=telegra.ph list=FuckRKN +add address=109.70.26.37 comment=grani.ru list=FuckRKN +add address=194.85.61.76 comment=grani.ru list=FuckRKN +add address=104.16.4.81 comment=xhamster.com list=FuckRKN +add address=104.16.3.81 comment=xhamster.com list=FuckRKN +add address=188.114.97.1 comment=lostfilm.tv list=FuckRKN +add address=188.114.96.1 comment=lostfilm.tv list=FuckRKN +add address=172.67.182.196 comment=rutracker.org list=FuckRKN +add address=104.21.32.39 comment=rutracker.org list=FuckRKN +add address=104.247.81.99 comment=lurkmore.to list=FuckRKN +add address=104.20.28.254 comment=dou.ua list=FuckRKN +add address=172.66.164.200 comment=dou.ua list=FuckRKN +add address=66.254.114.79 comment=youporn.com list=FuckRKN +add address=185.110.92.41 comment=pornolab.net list=FuckRKN +add address=185.110.92.40 comment=pornolab.net list=FuckRKN +add address=172.67.172.95 comment=crimerussia.com list=FuckRKN +add address=104.21.71.238 comment=crimerussia.com list=FuckRKN +add address=149.154.167.99 comment=telegram.org list=FuckRKN +add address=149.154.166.110 comment=api.telegram.org list=FuckRKN +add address=10.30.30.0/24 comment="Local Network" list=Local-Net +add address=10.8.0.0/24 comment="WireGuard Network" list=Local-Net +/ip firewall filter +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=12h chain=input comment="block honeypot DNS" \ + connection-state=new dst-port=53 in-interface-list=WAN protocol=udp \ + src-address=!10.30.30.0/24 src-address-list=!Trusted-DNS +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input connection-state=new dst-port=53 \ + in-interface-list=WAN protocol=tcp src-address=!10.30.30.0/24 \ + src-address-list=!Trusted-DNS +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment=\ + "block honeypot ssh rdp winbox" connection-state=new dst-port=\ + 22,8291,2222 in-interface-list=WAN protocol=tcp src-address-list=!TRUSTED +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot asterisk" \ + connection-state=new dst-port=5060 in-interface-list=WAN protocol=udp \ + src-address-list=!TRUSTED +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=5d chain=input comment="block honeypot NTP" \ + connection-state=new dst-port=123 in-interface-list=WAN protocol=udp \ + src-address=!10.30.30.0/24 src-address-list=!Trusted-NTP +add action=fasttrack-connection chain=forward comment=\ + "FastTrack for non-VPN connections" connection-mark=!VPN_No_FastTrack \ + connection-state=established,related,new disabled=yes +add action=accept chain=output comment="Accept Rule for Trusted-NTP Servers" \ + dst-address-list=Trusted-NTP dst-port=123 out-interface-list=WAN \ + protocol=udp +add action=accept chain=input comment=\ + "accept NTP clients on local area network" disabled=yes dst-port=123 \ + in-interface-list=LAN protocol=udp src-address=10.30.30.0/24 +add action=accept chain=output comment="accept WireGuard" disabled=yes \ + dst-address-list=VPN-Server dst-port=13231 out-interface="ether1 - Unet" \ + protocol=udp +add action=accept chain=output disabled=yes dst-address-list=VPN-Server \ + dst-port=29185 out-interface="ether1 - Unet" protocol=udp +add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \ + connection-state=established,related,new disabled=yes routing-mark=\ + !To-VPN +add action=accept chain=input disabled=yes dst-port=443 in-interface=\ + "ether1 - Unet" protocol=tcp +add action=accept chain=output disabled=yes protocol=tcp src-port=443 +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid +add action=accept chain=input comment="defconf: accept ICMP" disabled=yes \ + protocol=icmp +add action=accept chain=input comment=\ + "defconf: accept to local loopback (for CAPsMAN)" disabled=yes \ + dst-address=127.0.0.1 +add action=accept chain=output disabled=yes src-address=127.0.0.1 +add action=accept chain=forward comment="defconf: accept in ipsec policy" \ + ipsec-policy=in,ipsec +add action=accept chain=forward comment="defconf: accept out ipsec policy" \ + ipsec-policy=out,ipsec +add action=accept chain=forward comment=\ + "defconf: accept established,related, untracked" connection-state=\ + established,related,untracked +add action=drop chain=forward comment="defconf: drop invalid" \ + connection-state=invalid +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + connection-state=new in-interface="ether1 - Unet" +add action=accept chain=input connection-state=established disabled=yes +add action=accept chain=input connection-state=related disabled=yes +add action=drop chain=input disabled=yes in-interface-list=!LAN +add action=drop chain=forward comment=\ + "Filter Rule to block FB address LIST : )" disabled=yes dst-address-list=\ + facebook +add action=drop chain=forward comment=\ + "Filter Rule to block YOUTUBE address LIST : )" disabled=yes \ + dst-address-list=YouTube +/ip firewall mangle +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" in-interface=WG \ + new-connection-mark=VPN_No_FastTrack +add action=mark-routing chain=prerouting comment=\ + "Mark Routing main for NoVdsina" dst-address-list=NoVdsina \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment="Test sites" disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=Test new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=FuckRKN dst-address-list=\ + FuckRKN new-routing-mark=To-VPN src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=Instagram dst-address-list=\ + Instagram new-routing-mark=To-VPN src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=Twitter dst-address-list=\ + Twitter new-routing-mark=To-VPN src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=YouTube dst-address-list=\ + YouTube new-routing-mark=To-VPN src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=facebook dst-address-list=\ + facebook new-routing-mark=To-VPN src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment="VDSIna for All sites" \ + dst-address=!10.30.30.0/24 dst-address-list=!Trusted-VPN log-prefix=\ + VPN-all new-routing-mark=To-VPN src-address=10.30.30.0/24 +add action=change-mss chain=forward comment="MSS on WG" new-mss=1380 \ + out-interface=WG protocol=tcp routing-mark=To-VPN tcp-flags=syn tcp-mss=\ + 1381-65535 +add action=mark-routing chain=prerouting comment="VPN Network" dst-address=\ + 10.8.0.0/24 log-prefix=VPN-Net new-routing-mark=To-VPN passthrough=no \ + src-address=10.30.30.0/24 +/ip firewall nat +add action=redirect chain=dstnat comment=\ + "FORCE DNS TO LOCAL MIKROTIK DNS SERVER" dst-port=53 protocol=tcp \ + src-address=10.30.30.0/24 to-ports=53 +add action=redirect chain=dstnat dst-port=53 protocol=udp src-address=\ + 10.30.30.0/24 to-ports=53 +add action=masquerade chain=srcnat comment="masquerade Default" ipsec-policy=\ + out,none out-interface="ether1 - Unet" routing-mark=!To-VPN +add action=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ + log-prefix=WG-nat out-interface=WG +add action=dst-nat chain=dstnat comment=amster.vados.ruhttps dst-port=443 \ + in-interface="ether1 - Unet" log-prefix=2Amster protocol=tcp \ + routing-mark=!To-VPN to-addresses=10.30.30.33 to-ports=443 +add action=dst-nat chain=dstnat comment=npm dst-port=81 in-interface=\ + "ether1 - Unet" protocol=tcp routing-mark=!To-VPN to-addresses=\ + 10.30.30.33 to-ports=81 +add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ + dst-port=80 in-interface="ether1 - Unet" protocol=tcp routing-mark=\ + !To-VPN to-addresses=10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat disabled=yes dst-port=22 in-interface=\ + "ether1 - Unet" protocol=tcp routing-mark=!To-VPN to-addresses=\ + 10.30.30.33 to-ports=22 +add action=dst-nat chain=dstnat comment="Yandex.DNS Family" disabled=yes \ + dst-port=53 in-interface=Bridge-LAN protocol=udp src-address-list=KIDS \ + time=6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +add action=dst-nat chain=dstnat disabled=yes dst-port=53 in-interface=\ + Bridge-LAN protocol=tcp src-address-list=KIDS time=\ + 6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +/ip firewall raw +add action=drop chain=prerouting comment="Drop Honeypot Hackers" \ + in-interface="ether1 - Unet" src-address-list="Honeypot Hacker" +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + extras.getpagespeed.com content=extras.getpagespeed.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=linux.duke.edu \ + content=linux.duke.edu disabled=yes +add action=accept chain=prerouting comment="Trusted DNS" disabled=yes \ + in-interface-list=WAN src-address-list=Trusted-DNS +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment="vk.com raw" \ + content=vk.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment="ok.ru raw" \ + content=ok.ru +add action=add-dst-to-address-list address-list=Instagram \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "Instagram raw" content=instagram.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting comment="Twitter raw" content=twimg.com \ + dst-address-list=!Local-Net src-address-list=!Local-Net +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting comment="Twitter raw" content=x.com \ + dst-address-list=!Local-Net src-address-list=!Local-Net +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting comment="Twitter raw" content=twitter.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtube.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googleapis.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ggpht.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtu.be +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ytimg.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googlevideo.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=gstatic.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googleusercontent.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=nhacmp3youtube.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ + content=rutube.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=me.com \ + content=me.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=icloud.com \ + content=icloud.com +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting comment=facebook \ + content=fbcd.net +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting content=facebook.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=comp-lenta.ru \ + content=comp-lenta.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + smtp.mail.me.com content=smtp.mail.me.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=gov.ru \ + content=gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + r78.fssp.gov.ru content=r78.fssp.gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=api.db-ip.com \ + content=api.db-ip.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + api.telegram.org content=api.telegram.org +/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 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 disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=WG routing-table=\ + To-VPN scope=30 target-scope=10 +add disabled=no distance=2 dst-address=0.0.0.0/0 gateway=146.120.64.209 \ + routing-table=main scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet 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 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 interface="ether1 - Unet" type=external +add disabled=yes forced-ip=89.110.101.17 interface=WG type=external +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system clock manual +set time-zone=+03:00 +/system identity +set name=MikroMaster +/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=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 +/system watchdog +set watchdog-timer=no +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool mac-server +set allowed-interface-list=LAN +/tool mac-server mac-winbox +set allowed-interface-list=LAN +/tool netwatch +add comment="doh, doh-url=https://security.cloudflare-dns.com/dns-query, notif\ + y, name=CloudFlare-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 \ + http-codes="" test-script="" type=simple up-script="" +add check-certificate=no comment="doh-fallback, doh-url=https://security.cloud\ + flare-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Cl\ + oudFlare-doh IPv4" disabled=yes down-script="" host=1.0.0.1 http-codes="" \ + port=443 test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=Google-DNS IPv4" disabled=yes \ + down-script="" host=8.8.8.8 http-codes="" test-script="" type=simple \ + up-script="" +add comment="doh-fallback, doh-url=https://dns.google/dns-query, doh-cert=GTS \ + Root R1, notify, name=Google-DOH IPv4" disabled=yes down-script="" host=\ + 8.8.4.4 http-codes="" test-script="" type=simple up-script="" +add comment="dns, notify, name=Cuad9-DOH IPv4" disabled=yes down-script="" \ + host=9.9.9.9 http-codes="" test-script="" type=simple up-script="" +add comment="doh-fallback, doh-url=https://dns.quad9.net/dns-query, name=Cuad9\ + -DOH IPv4" disabled=yes down-script="" host=149.112.112.112 http-codes="" \ + test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ + down-script="" host=91.192.189.2 http-codes="" test-script="" type=simple \ + up-script="" +/user aaa +set accounting=no diff --git a/MikroMaster/history/20260515/20260515094001-Diff-Config.rsc b/MikroMaster/history/20260515/20260515094001-Diff-Config.rsc new file mode 100644 index 0000000..11dc53e --- /dev/null +++ b/MikroMaster/history/20260515/20260515094001-Diff-Config.rsc @@ -0,0 +1,2308 @@ +136,2426d135 +< 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/636/1e86a8d7\";\r\ +< \n:global CommitTAG \"unknown\";\r\ +< \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ +< r: root, in 09:15:03 15.05.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 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 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\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#/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=\"\";" +3386,3387c1095 +< none-dynamic chain=prerouting comment="Twitter raw" content=x.com \ +< dst-address-list=!Local-Net src-address-list=!Local-Net +--- +> none-dynamic chain=prerouting comment="Twitter raw" content=x.com +3507,3516d1214 +< /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 -- 2.52.0