From 68f4be6037e1c31fa3ef2e7d95fa7c0fd09bdb2d Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 3 Jul 2026 02:00:04 +0300 Subject: [PATCH] Backup for MikroNUC created successfully at Jul 03 02:00:04. --- .../20260703/20260703014003-Config.rsc | 3695 +++++++++++ MikroMaster/tmp/Diff-Config.rsc | 8 +- .../20260703/20260703020001-Binary.backup | Bin 0 -> 378865 bytes MikroNUC/20260703/20260703020001-Config.rsc | 5379 +++++++++++++++++ .../20260703/20260703020001-Diff-Config.rsc | 29 + 5 files changed, 9107 insertions(+), 4 deletions(-) create mode 100644 MikroMaster/20260703/20260703014003-Config.rsc create mode 100644 MikroNUC/20260703/20260703020001-Binary.backup create mode 100644 MikroNUC/20260703/20260703020001-Config.rsc create mode 100644 MikroNUC/history/20260703/20260703020001-Diff-Config.rsc diff --git a/MikroMaster/20260703/20260703014003-Config.rsc b/MikroMaster/20260703/20260703014003-Config.rsc new file mode 100644 index 0000000..1a05edb --- /dev/null +++ b/MikroMaster/20260703/20260703014003-Config.rsc @@ -0,0 +1,3695 @@ +# 2026-07-03 01:40:09 by RouterOS 7.23.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BF auto-mac=no dhcpv6-agent-circuit-id=\ + "\$(INTERFACE):\$(VID)" dhcpv6-agent-remote-id="\$(BRIDGEMAC)" name=\ + Bridge-LAN port-cost-mode=short +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" loop-protect=off name=\ + "ether1 - Unet" rx-flow-control=auto tx-flow-control=auto +set [ find default-name=ether2 ] comment=LAN-2 +set [ find default-name=ether3 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-3 +set [ find default-name=ether4 ] comment=LAN-4 +set [ find default-name=ether5 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-5 \ + loop-protect=on poe-out=off rx-flow-control=auto tx-flow-control=auto +/interface wireless +# managed by CAPsMAN +# channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados wireless-protocol=802.11 +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados5g wireless-protocol=802.11 +/interface wireguard +add comment=WG listen-port=13231 mtu=1320 name=WG +/interface list +add include=static name=LAN +add name=Internet +add include=Internet name=WAN +/interface wireless security-profiles +set [ find default=yes ] authentication-types=wpa-psk,wpa2-psk mode=\ + dynamic-keys supplicant-identity=MikroTik +/iot wiliot servers +set *1 address=mqtt.us-east-2.prod.wiliot.cloud name="Wiliot US East" +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +add name=iVados options=HostName +/ip dns forwarders +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=blsp.at verify-doh-cert=no +add comment=Kra disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon2.to \ + verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ipv6 dhcp-client option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=DUID value=0x00030001488f5a8e1abc +add code=61 name=clientid +/ipv6 dhcp-server option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=CLIENT_DUID +add code=61 name=CLIENT_MAC +/ppp profile +set *FFFFFFFE use-upnp=no +/routing bgp template +set default disabled=no output.network=bgp-networks +/routing table +add disabled=no fib name=To-VPN +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n\r\ + \n#:local Script AM-setup\ + \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\ + \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/727/203f86a6\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 13:30:05 29.06.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add comment=\ + "Lookup IP addresses for RKN list and add them to firewall address-list" \ + dont-require-permissions=no name=AM-RKN-dnsLookup owner=AM-RKN-dnsLookup \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: AM-RKN-dnsLookup\r\ + \n# Script comment: Lookup IP addresses for RKN list and add them to firew\ + all address-list\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# Script description: This script is intended to be run periodically, e.\ + g. once a day, to update the IP addresses in the firewall address-list bas\ + ed on the RKN list.\r\ + \n# It resolves the domain names in the RKN list and a\ + dds the corresponding IP addresses to the specified firewall address-list.\ + \r\ + \n# The script also handles CNAME records by following\ + \_them until it finds A records.\r\ + \n# Usage:\r\ + \n# /system/script { run AM-RKN-dnsLookup; }\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n:global dnsLookupReady false;\r\ + \n:if ([:typeof \$dnsLookupReady] != \"boolean\") do={ :set dnsLookupReady\ + \_true; }\r\ + \nwhile (!\$dnsLookupReady) do={ :nothing; }\r\ + \n:set dnsLookupReady false;\r\ + \n\r\ + \n:local arrRKN {\r\ + \n \"telegra.ph\"\r\ + \n \"grani.ru\"\r\ + \n \"xhamster.com\"\r\ + \n \"lostfilm.tv\"\r\ + \n \"rutracker.org\"\r\ + \n \"lurkmore.to\"\r\ + \n \"dou.ua\"\r\ + \n \"youporn.com\"\r\ + \n \"pornolab.net\"\r\ + \n \"crimerussia.com\"\r\ + \n \"telegram.org\"\r\ + \n \"api.telegram.org\"\r\ + \n \"facebook.com\"\r\ + \n \"instagram.com\"\r\ + \n \"x.com\"\r\ + \n \"twitter.com\"\r\ + \n \"youtube.com\"\r\ + \n \"googleapis.com\"\r\ + \n \"youtu.be\"\r\ + \n \"googlevideo.com\"\r\ + \n \"gstatic.com\"\r\ + \n \"googleusercontent.com\"\r\ + \n \"nhacmp3youtube.com\"\r\ + \n \"telegram.me\"\r\ + \n \"t.me\";}\r\ + \n\r\ + \n:local ListRKN \"RKN-dnsLookup\";\r\ + \n:local ListComment (\"ListRKN managed by \" . \$ScriptName);\r\ + \n:foreach aListItem in=[/ip/firewall/address-list find list=\$ListRKN] do\ + ={\r\ + \n /ip firewall address-list remove \$aListItem;\r\ + \n}\r\ + \n:foreach aItem in=\$arrRKN do={\r\ + \n# :do {\r\ + \n :retry delay=500ms max=5 on-error={:log error \"dns resolve fail\ + ure [ \$aItem - resolve ip ]\"} command={:resolve \$aItem}\r\ + \n# } on-error={\r\ + \n# :log error \"dns resolve failure [ \$arItem - resolve ip ]\";\r\ + \n# }\r\ + \n :foreach dnsRecord in=[/ip dns cache all find where (name=\$aItem)] \ + do={\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"A\") do={\r\ + \n :local newAddress [/ip dns cache all get \$dnsRecord data];\ + \r\ + \n :do {\r\ + \n /ip firewall address-list add list=\$ListRKN address=\$newA\ + ddress comment=\$aItem;\r\ + \n :log warning \"Successfully adding ip to list A record: \ + \$dnsRecord, address: \$newAddress domain: \$aItem\";\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list A record: \$dn\ + sRecord, address: \$newAddress domain: \$aItem\";\r\ + \n }\r\ + \n }\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"CNAME\") do={\r\ + \n :local cname;\r\ + \n :local nextCname;\r\ + \n :local cnameAddress;\r\ + \n :set cname [/ip dns cache all find where (name=\$aItem && ty\ + pe=\"CNAME\")];\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip dns \ + cache all get \$cname data] && type=\"CNAME\")];\r\ + \n :while (\$nextCname != \"\") do={\r\ + \n :set cname \$nextCname;\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip \ + dns cache all get \$cname data] && type=\"CNAME\")];\r\ + \n }\r\ + \n :foreach aRecord in=[/ip dns cache all find where (name=[/ip\ + \_dns cache all get \$cname data] && type=\"A\")] do={\r\ + \n :do {\r\ + \n :set cnameAddress [/ip dns cache all get \$aRecord d\ + ata];\r\ + \n /ip firewall address-list add list=\$ListRKN address\ + =\$cnameAddress comment=\$aItem;\r\ + \n :log warning \"Succesfully adding ip to list CNAME r\ + ecord: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \ + \$aItem.\";\r\ + \n# /ip firewall raw add action=add-dst-to-address-list\ + \_address-list=\$ListRKN address-list-timeout=none-dynamic chain=preroutin\ + g comment=\$aItem content=\$aItem;\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list CNAME reco\ + rd: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \$aI\ + tem.\";\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n :log error (\$ScriptName . \"System Scheduler for script: \" . \$Scri\ + ptName . \" is NOT SET! Fix It Now!\");\r\ + \n /system/scheduler/add name=\$ScriptName on-event=\"/system/script { \ + run \$ScriptName; }\" comment=\"Update RKN DNS Looup\" interval=00:30:00 p\ + olicy=\"ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon\"\ + \_start-time=startup;\r\ + \n }\r\ + \n:set dnsLookupReady true;\r\ + \ndelay 2s; \r\ + \n:global dnsLookupReady (a);\r\ + \n" +add dont-require-permissions=no name="renameLists " owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local oldName \"Test\";\ + \n:local newName \"Test-IP\";\ + \n/ip firewall address-list\ + \n:foreach i in=[find list=\$oldName] do={\ + \nset \$i list=\$newName;\ + \n}\ + \n" +add dont-require-permissions=no name=IPv6-Settings owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + #############Script Settings##################\ + \n\ + \n:local \"IF-TUN\" \"6to4-tun\"\ + \n:local \"IF-LOC\" \"Bridge-LAN\"\ + \n:local \"POOL-6TO4\" \"poolV6-local\"\ + \n:local \"force-update\" false\ + \n############ use then static ip #######################\ + \n:local \"lease-address\" [/ip address get [find interface=\$\"IF-LOC\"] \ + address]\ + \n#:local \"interface\" \"ext\"\ + \n:local bound 0\ + \n\ + \n###############################################\ + \n\ + \n:local 6to4prefix do={\ + \n :global dec2hex\ + \n :local ipv4 \$1\ + \n :local ipv6 \"2002:\"\ + \n :for i from=0 to=2 step=1 do={ \ + \n :if ( \$i = 2) do={\ + \n :set ipv6 (\$ipv6.\":\")\ + \n }\ + \n :local fp [:find \$ipv4 \".\"]\ + \n :if ( \$fp > 0 ) do={\ + \n :set ipv6 (\$ipv6.[\$dec2hex [:pick \$ipv4 0 \$fp]])\ + \n :set ipv4 [:pick \$ipv4 (\$fp + 1 ) [:len \$ipv4]]\ + \n }\ + \n }\ + \n :return (\$ipv6.[\$dec2hex \$ipv4])\ + \n}\ + \n:local \"str_replace\" do={\ + \n :local \"str-pos\" [:find \$1 \$2]\ + \n :local \"str-len\" [:len \$2]\ + \n :local str \"\"\ + \n :local rest \$1\ + \n :while (\$\"str-pos\" >= 0) do={\ + \n :local t [:pick \$rest 0 \$\"str-pos\"]\ + \n :if ( \$4 > 0 ) do={\ + \n :for i from=1 to=(\$4 - [:len \$t]) step=1 do={\ + \n :set str (\$str.\$5)\ + \n }\ + \n }\ + \n :set str (\$str.\$t.\$3)\ + \n :set rest [:pick \$rest (\$\"str-pos\"+\$\"str-len\") [:len \$re\ + st]]\ + \n :set \"str-pos\" [:find \$rest \$2]\ + \n }\ + \n :return (\$str.\$rest)\ + \n}\ + \n\ + \n:if (\$bound=1) do={\ + \n :local t [:find \$\"lease-address\" \"/\"]\ + \n\ + \n :if ( \$t >= 0 ) do={\ + \n :set \"lease-address\" [:pick \$\"lease-address\" 0 \$t]\ + \n }\ + \n\ + \n :if ( [/interface 6to4 print count-only where name=\$\"IF-TUN\"] = 0\ + ) do={\ + \n /interface 6to4 add !keepalive local-address=\$\"lease-address\"\ + \_mtu=1280 name=\$\"IF-TUN\" remote-address=10.30.30.0\ + \n :set \"force-update\" true\ + \n }\ + \n\ + \n :local \"IPv4-TUN\" [/interface 6to4 get [find name=\$\"IF-TUN\"] lo\ + cal-address];\ + \n\ + \n :if ( \$\"lease-address\" != \$\"IPv4-TUN\" || \$\"force-update\" = \ + true) do={\ + \n /interface 6to4 set [find name=\$\"IF-TUN\"] local-address=\$\"l\ + ease-address\"\ + \n /ipv6 address remove [find interface=\$\"IF-TUN\"]\ + \n /ipv6 address remove [find interface=\$\"IF-LOC\"]\ + \n /ipv6 route remove [find gateway ~ \$\"IF-TUN\" and dst-address=\ + \"::/0\"]\ + \n :local \"pool-prefix\" [\$6to4prefix \$\"lease-address\"]\ + \n :if ( [/ipv6 pool print count-only where name=\$\"POOL-6TO4\"] =\ + \_0) do={ \ + \n /ipv6 pool add name=\$\"POOL-6TO4\" prefix=(\$\"pool-prefix\ + \".\":1::/64\") prefix-length=64\ + \n } else={\ + \n /ipv6 pool set [/ipv6 pool find where name=\$\"POOL-6TO4\"] \ + prefix=(\$\"pool-prefix\".\":1::/64\")\ + \n }\ + \n /ipv6 address add address=(\$\"pool-prefix\".\"::\".[\$MAC2EUI64\ + \_[/interface get [find name=\$\"interface\"] mac-address]].\"/3\") interf\ + ace=\$\"IF-TUN\" advertise=no\ + \n /ipv6 address add eui-64=yes from-pool=\$\"POOL-6TO4\" interface\ + =\$\"IF-LOC\" advertise=yes\ + \n /ipv6 route add dst-address=::/0 gateway=(\"::10.30.30.81%\".\$\ + \"IF-TUN\")\ + \n :local t [/ipv6 address get [find interface=\$\"IF-LOC\"] addres\ + s]\ + \n :set t [:pick \$t 0 [:find \$t \"/\"]]\ + \n :if ( [/ipv6 dhcp-server option print count-only where name=DNS]\ + \_= 0) do={\ + \n /ipv6 dhcp-server option add code=23 name=DNS value=(\"0x\".\ + [\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n } else={\ + \n /ipv6 dhcp-server option set [/ipv6 dhcp-server option find \ + where name=DNS] value=(\"0x\".[\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n }\ + \n :if ( [/ipv6 dhcp-server print count-only where interface=\$\"IF\ + -LOC\"] = 0) do={\ + \n /ipv6 dhcp-server add address-pool=\$\"POOL-6TO4\" dhcp-opti\ + on=DNS interface=\$\"IF-LOC\" lease-time=1d name=\$\"IF-LOC\"\ + \n }\ + \n :if ( [ipv6 nd print count-only where interface=\$\"IF-LOC\"] = \ + 0) do={\ + \n /ipv6 nd add advertise-dns=no interface=\$\"IF-LOC\" other-c\ + onfiguration=yes\ + \n }\ + \n }\ + \n}" +add dont-require-permissions=no name=IPv6-GlobalFunc owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global MAC2EUI64 do={\ + \n :local EUI64 \"\"\ + \n :local MAC \$1\ + \n :local HEX2DEC \"0123456789ABCDEF\"\ + \n :for i from=0 to=5 step=1 do={\ + \n :if ( \$i = 0 ) do={\ + \n :set EUI64 [:pick \$MAC 0]\ + \n :set EUI64 (\$EUI64.[:tostr [:pick \$\"HEX2DEC\" ([:find \$\ + \"HEX2DEC\" [:pick \$MAC 1]] ^ 2)]])\ + \n }\ + \n :if ( \$i = 1 || \$i = 3) do={\ + \n :set EUI64 (\$EUI64.\":\")\ + \n }\ + \n :if ( \$i = 2 ) do={\ + \n :set EUI64 (\$EUI64.\"FF:FE\")\ + \n }\ + \n :if ( [:find \$MAC \":\"] = 2 ) do={\ + \n :set MAC [:pick \$MAC 3 [:len \$MAC]]\ + \n :set EUI64 (\$EUI64.[:pick \$MAC 0 2])\ + \n }\ + \n }\ + \n :return (\$EUI64)\ + \n}\ + \n\ + \n:global dec2hex do={\ + \n :local hex \"\"\ + \n :local dec [:tonum \$1]\ + \n :for i from=0 to=4 step=4 do={\ + \n :set hex ([:pick \"0123456789ABCDEF\" ((\$dec>>\$i)&0xf) (((\$de\ + c>>\$i)&0xf)+1)].\$hex)\ + \n }\ + \n :return ([:tostr \$hex])\ + \n}" +/user group +add name=backup policy="ssh,read,write,policy,test,web,sniff,sensitive,api,res\ + t-api,!local,!telnet,!ftp,!reboot,!winbox,!password,!romon" +/ip smb +set enabled=no interfaces=lo +/interface bridge port +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether4 trusted=yes +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/interface bridge settings +set use-ip-firewall=yes +/ip firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN lldp-med=no lldp-poe-power=no +/ip settings +set accept-redirects=yes ipv4-multipath-hash-policy=l4 max-neighbor-entries=\ + 8192 +/ipv6 settings +set disable-ipv6=yes disable-link-local-address=yes forward=no \ + max-neighbor-entries=8192 multipath-hash-policy=l4 +/interface detect-internet +set detect-interface-list=static internet-interface-list=Internet \ + lan-interface-list=LAN request-interval=1m wan-interface-list=WAN +/interface l2tp-server server +set authentication=mschap2 use-ipsec=yes +/interface list member +add interface=ether4 list=WAN +add interface="ether1 - Unet" list=Internet +add interface=WG list=WAN +add interface=Bridge-LAN list=LAN +/interface wireguard peers +add allowed-address=0.0.0.0/0 client-allowed-address=::/0 endpoint-address=\ + 109.107.177.79 endpoint-port=29185 interface=WG name=VDSina \ + persistent-keepalive=10s public-key=\ + "zuRsO+dL/j6awaBWZ/NgnHR+bCNUjRWbaHFpdzkNnw4=" +/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=\ + wlan2,wlan1 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 cloud +set update-time=no +/ip dhcp-client +add add-default-route=special-classless default-route-distance=2 \ + default-route-tables=main:1 dhcp-options=clientid,clientid_duid \ + interface="ether1 - Unet" name=client1 use-peer-dns=no use-peer-ntp=no +/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=iVados mac-address=DE:4D:72:F3:1A:9F server=masterDHCP +add address=10.30.30.10 allow-dual-stack-queue=yes client-id=\ + ff:0:0:0:df:0:3:0:1:f0:75:5d:1e:5f:85 dhcp-option=HostName \ + dhcp-option-set=MikroNUC mac-address=F0:75:5D:1E:5F:85 server=masterDHCP \ + use-src-mac=yes +/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.33,109.107.177.79 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=10.30.30.33,8.8.8.8 \ + verify-doh-cert=yes +/ip dns static +add address=109.107.177.79 comment="VDSina Server DNS" name=ns1.vados.ru \ + type=A +add address=109.107.177.79 name=vds.vados.ru type=A +add comment="Local DNS server for vados.ru" disabled=yes ns=10.30.30.81 \ + regexp=*.vados.ru type=NS +add comment="*.vados.ru Regexp" disabled=yes forward-to=10.30.30.81 regexp=\ + "\".*\\\\.vados\\\\.ru\"" type=FWD +add comment="*.30.30.10.in-addr.arpa Regexp" disabled=yes forward-to=\ + 10.30.30.81 regexp="\".*\\\\.30\\\\.30\\\\.10\\\\.in-addr\\\\.arpa" type=\ + FWD +add address=10.30.30.81 comment=NS.vados.ru.local disabled=yes name=\ + ns.vados.ru.local type=A +add comment="DNS ns.vados.ru.local" disabled=yes match-subdomain=yes name=\ + vados.ru ns=ns.vados.ru.local type=NS +add address=10.30.30.33 comment=reg.vados.ru name=reg.vados.ru type=A +add address=8.8.8.8 comment="Google-dns IPv4 1" match-subdomain=yes name=\ + dns.google type=A +add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +add address=10.30.30.33 comment=AMSTER name=amster.vados.ru type=A +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 name=amster type=A +add address=10.30.30.33 name=amster-reg type=A +add address=10.30.30.33 disabled=yes 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 disabled=yes match-subdomain=yes name=\ + mikrots.vados.ru 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" disabled=yes name=\ + security.cloudflare-dns.com type=A +add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" disabled=yes 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" disabled=yes name=\ + dns.quad9.net type=A +add address=195.133.25.16 comment="DNS Comss" disabled=yes name=dns.comss.one \ + 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 disabled=yes name=MikroYellow type=A +add address=10.30.30.85 disabled=yes 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=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +add address=10.30.30.20 disabled=yes name=garage 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=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-IP +add address=wg.vados.ru comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" disabled=yes 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-IP +add address=geoip.co list=NoVdsina +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=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=amster 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=VDSina +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!!!" 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=VDSina +add address=vdsina.ru comment=VDSina-vpn list=VDSina +add address=ns.vados.ru comment=VDSina-vpn list=VDSina +add address=vdsina.com comment=VDSina-vpn list=VDSina +add address=cp.vdsina.ru comment=VDSina-vpn list=VDSina +add address=ns1.vdsina.ru comment=VDSina-vpn list=VDSina +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 +add address=146.120.64.208/29 comment="External Net" list=Unet +add address=esia.gosuslugi.ru comment=esia.gosuslugi.ru list=NoVdsina +add address=lk.gosuslugi.ru comment=lk.gosuslugi.ru list=NoVdsina +add address=trudvsem.ru comment=trudvsem.ru list=NoVdsina +add address=10.30.30.30 comment=miller disabled=yes list=NoWG +add address=10.30.30.33 comment="Direct connet to DNS servers" list=\ + Direct-DNS +add address=109.107.177.79 list=VPN-Server +add address=10.30.30.10 list=AWG-Proxy +/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="ether1 - Unet" protocol=\ + udp 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="ether1 - Unet" protocol=tcp 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 \ + in-interface="ether1 - Unet" 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="ether1 - Unet" protocol=\ + udp +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot NTP" \ + connection-state=new dst-port=123 in-interface="ether1 - Unet" protocol=\ + udp +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=input disabled=yes dst-port=29185 in-interface=\ + "ether1 - Unet" protocol=tcp +add action=accept chain=input disabled=yes dst-port=29185 in-interface=\ + "ether1 - Unet" protocol=udp +add action=accept chain=input comment="tcp Accept input DNS queries from LAN" \ + dst-port=53 protocol=tcp src-address=10.30.30.0/24 +add action=accept chain=input comment="udp Accept input DNS queries" \ + dst-port=53 protocol=udp src-address=10.30.30.0/24 +add action=accept chain=output comment="accept WireGuard" disabled=yes \ + dst-address-list=VPN-Server out-interface="ether1 - Unet" protocol=udp \ + src-port=13231 +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=output disabled=yes protocol=tcp src-port=443 +add action=accept chain=output disabled=yes src-address=127.0.0.1 +add action=accept chain=forward comment="defconf: accept in ipsec policy" \ + disabled=yes ipsec-policy=in,ipsec +add action=accept chain=forward comment="defconf: accept out ipsec policy" \ + disabled=yes 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 in-interface="ether1 - Unet" src-address=\ + !10.30.30.0/24 +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + connection-state=new in-interface="ether1 - Unet" src-address-list=\ + !VDSina +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 +add action=accept chain=input in-interface="ether1 - Unet" protocol=icmp \ + src-address-list=VDSina +add action=accept chain=input connection-state=established disabled=yes +add action=accept chain=input connection-state=related disabled=yes +/ip firewall mangle +add action=mark-routing chain=prerouting comment="Mark Routing main for NoWG" \ + new-routing-mark=main src-address-list=NoWG +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=\ + "Mark Routing main for VDSina" dst-address-list=VPN-Server \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=\ + "Mark Routing main for MikroNuc" disabled=yes dst-address-list=AWG-Proxy \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=\ + "!!!ERROR Mark Routing main for Unet!!!" disabled=yes dst-address-list=\ + Unet new-routing-mark=main passthrough=no +add action=mark-routing chain=prerouting comment="Test-IP sites" disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=Test-IP new-routing-mark=\ + To-VPN src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=FuckRKN disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=RKN-dnsLookup \ + new-routing-mark=To-VPN passthrough=no src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment="AWG for All sites" \ + disabled=yes dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina \ + new-routing-mark=*401 routing-mark=!main 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=!NoVdsina new-routing-mark=\ + To-VPN routing-mark=!main src-address=10.30.30.0/24 src-address-list=\ + !NoWG +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" new-connection-mark=\ + VPN_No_FastTrack routing-mark=To-VPN +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 new-routing-mark=To-VPN src-address=10.30.30.0/24 +/ip firewall nat +add action=redirect chain=dstnat comment="udp Redirect DNS in NAT" disabled=\ + yes dst-port=53 protocol=udp src-address=10.30.30.0/24 src-address-list=\ + !NoWG to-addresses=10.30.30.33 to-ports=53 +add action=redirect chain=dstnat comment="tcp Redirect DNS in NAT" disabled=\ + yes dst-port=53 protocol=tcp src-address=10.30.30.0/24 src-address-list=\ + !NoWG to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat comment=\ + "53/tcp dst-nat to amster.loc. From VDSina Server" dst-port=53 \ + in-interface="ether1 - Unet" protocol=tcp src-address-list=VPN-Server \ + to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat comment=\ + "53/udp dst-nat to amster.loc. From VDSina Server" dst-port=53 protocol=\ + udp src-address-list=VPN-Server to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat disabled=yes dst-port=44333 in-interface=\ + "ether1 - Unet" protocol=udp src-address=!10.30.30.0/24 to-addresses=\ + 10.30.30.33 to-ports=44333 +add action=masquerade chain=srcnat comment="Default NAT" out-interface=\ + "ether1 - Unet" routing-mark=!To-VPN src-address=10.30.30.0/24 +add action=dst-nat chain=dstnat comment=amster.vados.ruhttps dst-port=443 \ + fragment=no in-interface="ether1 - Unet" protocol=tcp routing-mark=main \ + to-addresses=10.30.30.33 to-ports=443 +add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ + dst-port=80 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat comment="amster.vados.ru 3x-ui" disabled=yes \ + dst-port=2904 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=2904 +add action=dst-nat chain=dstnat comment=reg.vados.ru disabled=yes dst-port=\ + 5000 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=5000 +add action=dst-nat chain=dstnat comment="Docker swarm" disabled=yes dst-port=\ + 2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=2377 +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=SSH dst-port=22 in-interface=\ + "ether1 - Unet" protocol=tcp src-address-list=TRUSTED to-addresses=\ + 10.30.30.33 to-ports=22 +add action=dst-nat chain=dstnat comment="portainer agent" disabled=yes \ + dst-port=2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=2377 +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=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ + out-interface=WG routing-mark=To-VPN src-address-list=!NoWG +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=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=\ + 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=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtube.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googleapis.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ggpht.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtu.be \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ytimg.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googlevideo.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=gstatic.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googleusercontent.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + nhacmp3youtube.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ + content=rutube.ru disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment="me.com raw" \ + content=me.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "icloud.com raw" content=icloud.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "smtp.mail.me.com raw" content=smtp.mail.me.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "smtp.mail.me.com.akadns.net raw" content=smtp.mail.me.com.akadns.net \ + disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "api.db-ip.com raw" content=api.db-ip.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + esia.gosuslugi.ru content=esia.gosuslugi.ru disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=gosuslugi.ru \ + content=gosuslugi.ru disabled=yes +/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 check-gateway=none disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\ + WG routing-table=To-VPN 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 +set api-ssl address=10.30.30.0/24 disabled=yes +set www-ssl certificate=Root-YE port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ + webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=Bridge-LAN type=internal +add forced-ip=146.120.64.211 interface="ether1 - Unet" type=external +add forced-ip=109.107.177.79 interface=*E type=external +add interface=lo type=internal +add interface=wlan2 type=internal +add interface=wlan1 type=internal +/ipv6 dhcp-client +add add-default-route=yes disabled=yes interface=*F rapid-commit=no request=\ + info use-interface-duid=yes validate-server-duid=no +/ipv6 dhcp-server option sets +add name=domain-search-set options=domain-search-list +add name="=\"Client ID\"" options=HostName +/ipv6 firewall address-list +add address=::/128 comment="defconf: unspecified address" list=bad_ipv6 +add address=::1/128 comment="defconf: lo" list=bad_ipv6 +add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6 +add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6 +add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6 +add address=100::/64 comment="defconf: discard only " list=bad_ipv6 +add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6 +add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6 +add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6 +/ipv6 firewall filter +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 ICMPv6" protocol=\ + icmpv6 +add action=accept chain=input comment="defconf: accept UDP traceroute" \ + dst-port=33434-33534 protocol=udp +add action=accept chain=input comment=\ + "defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\ + udp src-address=fe80::/10 +add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \ + protocol=udp +add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\ + ipsec-ah +add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\ + ipsec-esp +add action=accept chain=input comment=\ + "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +add action=drop chain=input comment=\ + "defconf: drop everything else not coming from LAN" in-interface-list=\ + !LAN +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 packets with bad src ipv6" src-address-list=bad_ipv6 +add action=drop chain=forward comment=\ + "defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6 +add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \ + hop-limit=equal:1 protocol=icmpv6 +add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\ + icmpv6 +add action=accept chain=forward comment="defconf: accept HIP" protocol=139 +add action=accept chain=forward comment="defconf: accept IKE" dst-port=\ + 500,4500 protocol=udp +add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\ + ipsec-ah +add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\ + ipsec-esp +add action=accept chain=forward comment=\ + "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +add action=drop chain=forward comment=\ + "defconf: drop everything else not coming from LAN" in-interface-list=\ + !LAN +/ipv6 nd +set [ find default=yes ] advertise-dns=yes disabled=yes interface=Bridge-LAN \ + managed-address-configuration=yes other-configuration=yes pref64=::/64 +/ipv6 nd prefix +add autonomous=no disabled=yes interface=Bridge-LAN on-link=no prefix=none +/ipv6 nd prefix default +set dhcp6-pd-preferred=yes +/ipv6 nd proxy +add disabled=yes interface=lo +/ipv6 nd settings +set router-advertisement-route-distance=100 +/routing settings +set single-process=no +/system clock +set 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 package update +set check-certificate=yes-without-crl ip-version=ipv4 +/system scheduler +add comment="Every Day Set Global Environment Variables" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Update RKN DNS Looup" disabled=yes interval=20m name=\ + AM-RKN-dnsLookup on-event="/system/script { run AM-RKN-dnsLookup; }" \ + 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 certificate=DigiCert-Global-Root-CA check-certificate=no comment="doh, doh\ + -url=https://security.cloudflare-dns.com/dns-query, notify, name=CloudFlar\ + e-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 http-codes="" \ + interval=10s name="CloudFlare-doh IPv4 1" port=443 test-script="" type=\ + https-get 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="" \ + name="CloudFlare-doh IPv4" port=443 test-script="" type=https-get \ + up-script="" +add comment="dns, notify, name=Google-DNS IPv4" disabled=yes dns-server=\ + 8.8.8.8 down-script="" host=dns.google http-codes="" name=\ + "Google-DNS IPv4" test-script="" type=dns up-script="" +add certificate=GTS-Root-R4 check-certificate=yes comment="doh-fallback, doh-u\ + rl=https://dns.google/dns-query, doh-cert=GTS Root R1, notify, name=Google\ + -DOH IPv4" disabled=yes dns-server=8.8.4.4 down-script="" host=dns.google \ + http-codes="" name="Google-DOH IPv4" port=443 record-type=NS src-address=\ + "" test-script="" type=dns up-script="" +add comment="dns-fallback, notify, name=Cuad9-DOH IPv4" disabled=yes \ + dns-server=9.9.9.9 down-script="" host=dns9.quad9.net http-codes="" \ + interval=10s name="Cuad9-DOH IPv4" src-address=146.120.64.211 \ + test-script="" timeout=800ms type=dns up-script="" +add certificate=DigiCert-Assured-ID-Root-CA comment="doh-fallback, doh-url=htt\ + ps://dns.quad9.net/dns-query, name=Cuad9-DOH IPv4" disabled=yes \ + down-script="" host=149.112.112.112 http-codes="" interval=10s name=\ + "Cuad9-DOH IPv4" port=443 test-script="" type=https-get up-script="" +add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ + down-script="" host=91.192.189.2 http-codes="" interval=10s name=\ + ns1.unet.ws test-script="" type=simple up-script="" +add check-certificate=yes comment=\ + "doh, doh-url=https://vds.vados.ru/vds-query, name=vds.vados.ru" \ + disabled=yes down-script="" host=109.107.177.79 http-codes="" name=\ + vds.vados.ru port=443 test-script="" type=https-get up-script="" +/user aaa +set accounting=no diff --git a/MikroMaster/tmp/Diff-Config.rsc b/MikroMaster/tmp/Diff-Config.rsc index 9b46c11..9cf6e4e 100644 --- a/MikroMaster/tmp/Diff-Config.rsc +++ b/MikroMaster/tmp/Diff-Config.rsc @@ -1,6 +1,6 @@ 91,92c91,92 -< #error exporting "/ppp/profile" (timeout) -< #error exporting "/queue/interface" (timeout) +< /ppp profile +< set *FFFFFFFE use-upnp=no --- -> /ppp profile -> set *FFFFFFFE use-upnp=no +> #error exporting "/ppp/profile" (timeout) +> #error exporting "/queue/interface" (timeout) diff --git a/MikroNUC/20260703/20260703020001-Binary.backup b/MikroNUC/20260703/20260703020001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..c840ce04f3731fb62fae27889c05b0a07d47ac8a GIT binary patch literal 378865 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 z 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
  • a~^k7WzmW0?MuYxPg{8v| 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

    YP#1JZ$_@^t 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 literal 0 HcmV?d00001 diff --git a/MikroNUC/20260703/20260703020001-Config.rsc b/MikroNUC/20260703/20260703020001-Config.rsc new file mode 100644 index 0000000..3d2c7ed --- /dev/null +++ b/MikroNUC/20260703/20260703020001-Config.rsc @@ -0,0 +1,5379 @@ +# 2026-07-03 02:00:02 by RouterOS 7.23.1 +# system id = NmJcEM+8XAP +# +/caps-man channel +add band=2ghz-g/n extension-channel=disabled frequency=2422 name=2G-3 \ + reselect-interval=20m save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXX frequency=5660 name=5G-5660 \ + save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXXXXXX frequency=5160,5200,5280 \ + name=5G-5160-5280 reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5180 name=5G-36 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5200 name=5G-40 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5220 name=5G-44 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5240 name=5G-48 \ + reselect-interval=30m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2442 name=2G-7 \ + reselect-interval=20m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2462 name=2G-11 \ + reselect-interval=20m save-selected=yes +/interface bridge +add name=BridgeLAN +/interface ethernet +set [ find default-name=ether1 ] disable-running-check=no +/interface veth +add address=172.18.0.2/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ + gateway=172.18.0.1 gateway6="" name=vetch-wg2awg +/caps-man security +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=xs-Sec +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=WPA2 +/disk +add slot=ram tmpfs-max-size=100000000 type=tmpfs +/interface list +add include=dynamic,static name=LAN +add exclude=LAN name=WAN +add exclude=LAN include=WAN name=Internet +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroMIC +/iot wiliot servers +set *1 address=mqtt.us-east-2.prod.wiliot.cloud name="Wiliot US East" +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=P1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +/ip pool +add name=dhcp ranges=10.30.30.150-10.30.30.200 +/routing table +add disabled=no fib name=to-awg +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=test owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n#:local ScriptName [ :jobname ];\r\ + \n:local expSrc;\r\ + \n:local FileName;\r\ + \n:local FilePath;\r\ + \n:local DirPath \"tmpfs/\";\r\ + \n:global WaitForFile;\r\ + \n:global IfThenElse;\r\ + \n\r\ + \n:foreach Script in=([ /system/script find where name~\"Amster-GlobalConf\ + *\" ]) do={\r\ + \n:local ScriptVal [ /system/script/get \$Script ];\r\ + \n\r\ + \n:local expName [ (\$ScriptVal->\"name\") ];\r\ + \n#[/system/script get \$expScript name];\r\ + \n:delay 2s;\r\ + \n\r\ + \n:set expSrc [/system/script print where name=\$expName];\r\ + \n/system/script print where name=\$expName;\r\ + \n#[:put [/system/script get \$expScript source]];\r\ + \n:put [\$expSrc];\r\ + \n:delay 2s;\r\ + \n:set FileName \$expName;\r\ + \n:set FilePath (\$DirPath . \$FileName);\r\ + \n\r\ + \n#:log warning \"\\n----------------------\\n\\\$expSrc = \$expSrc\\n____\ + ______________________________\";\r\ + \n:log info \"\\n\\\$FileName = '\$FileName'\";\r\ + \n:log info \"\\n\\\$FilePath = \$FilePath\";\r\ + \n#:log warning {/system/script/get source=[/system/script/get \$expScript\ + \_source];};\r\ + \n\r\ + \n#\$[/system script get [/system script find name=\"\$FileName\"] source]\ + \r\ + \n\r\ + \n#:local gettingScript \"\$FileName\";\r\ + \n#:execute script=\"[[:parse \\\"[:parse { :put (\"\$[/system script get \ + [/system script find name=\$FileName] source]\"); } \\\"]]\"; \\\r\ + \n\r\ + \n#:execute script={:put \"[:parse \\\"[:parse [/system/script get [/syste\ + m/script find name=\$gettingScript] source];\\\"]]\";} \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n:do {\r\ + \n:local fName (\$FilePath . \".rsc\");\r\ + \n#:delay 3s;\r\ + \n#/file add name=\$fName;\r\ + \n:put [:tostr [\$expSrc]];\r\ + \n/file set \$fName contents=[:put [\$expSrc]];\r\ + \n:delay 3s;\r\ + \n\$WaitForFile \$fName;\r\ + \n(\$FilePath . \".rsc\");\r\ + \n#:delay 2s;\r\ + \n\r\ + \n} on-error={\r\ + \n:log error \"\\nERROR \\\$FilePath = \$FilePath\";\r\ + \n}\r\ + \n#\$WaitForFile (\$FilePath . \".rsc\");\r\ + \n#:execute script={ :put [/system/script get [:put \$FileName] source]; }\ + ;\r\ + \n#/system/script export \$Sscript file=\$FilePath;\r\ + \n#/system/script/export [:put [/system/script/get \$expScript source]] fi\ + le=\$FilePath;\r\ + \n#:execute script={ :put [/system/script/get \$expScript source]; } \\\r\ + \n\r\ + \n#:log warning \"\\n\\\$expScript = \$expScript\";\r\ + \n# \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n#script={:put [/system/script/get \$FileName source];} file=(\$FilePath\ + \_. \".rsc\\00\");\r\ + \n#/system script export \$src file=(\$FilePath . \$FileName);\r\ + \n}\r\ + \n\r\ + \n:log warning \"\\nComplete!\";\r\ + \n\r\ + \n # :execute script={ :put [ /system/script/get Amster-GlobalConfig sou\ + rce ]; } \\\r\ + \n # file=(\$FilePath . \".conf\\00\");\r\ + \n # \$WaitForFile (\$FilePath . \".conf\");\r\ + \n # :onerror Err {\r\ + \n # /tool/fetch upload=yes url=(\$BackupUploadUrl . \"/\" . \$FileName\ + \_. \".conf\") \\\r\ + \n # user=\$BackupUploadUser password=\$BackupUploadPass src-path=(\ + \$FilePath . \".conf\");\r\ + \n # :set ConfigFile [ /file/get (\$FilePath . \".conf\") ];\r\ + \n # :set (\$ConfigFile->\"name\") (\$FileName . \".conf\");\r\ + \n " +add dont-require-permissions=no name=test1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n#:local runningVer [:find [/system/resource/get version] \"(\"];\r\ + \n\r\ + \n:local runningChannel;\r\ + \n:local runningVersion;\r\ + \n:local ParseCustom;\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\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:global runningChannel [\$ParseCustom [/system/resource/get version] \"(\ + \" \")\" 1];\r\ + \n:log warning [\$runningChannel];\r\ + \n:set runningVersion [\$ParseCustom [/system/resource/get version] \" \" \ + \")\" 2];\r\ + \n:log warning [\$runningVersion];\r\ + \n\r\ + \n\r\ + \n\r\ + \n# :if ([:len \$open] = 0) do={\r\ + \n# :log error \"\$SMP Could not extract installed OS channel from vers\ + ion string: `\$runningOsAndChannel`.\";\r\ + \n# :error \"\$SMP error, check logs\";\r\ + \n# }\r\ + \n# :local rest [:pick \$runningOsAndChannel (\$open+1) [:len \$runningOs\ + AndChannel]];\r\ + \n# :local close [:find \$rest \")\"];\r\ + \n# :local channel [:pick \$rest 0 \$close];\r\ + \n# :return \$channel;\r\ + \n#}" +add dont-require-permissions=no name=01-Amster-Init-Script owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# Amster Initial Script\r\ + \n#\r\ + \n#:global GlobalEnvRemove true; /system/script {run Amster-GlobalEnvRemov\ + e; };\r\ + \n#:delay 1s;\r\ + \n:#global ReloadGlobal true; \r\ + \n\r\ + \n:global AmScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global defOwner \"vados\";\r\ + \n:global AmFirstRun;\r\ + \n\r\ + \n:set AmFirstRun do={\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n #:global ParseKeyValueStore;\r\ + \n #:local AmUpdCRLF true;\r\ + \n #:local IfThenElse;\r\ + \n #:set IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1\ + \_] = true) do={:return \$2}; :return \$3}\r\ + \n #/certificate/settings/set builtin-trust-store=fetch;\r\ + \n #/tool/fetch \"\$scriptsUrl/certs/Root-YE.pem\" dst-path=\"root-ye.p\ + em\";\r\ + \n #/certificate/import file-name=\"root-ye.pem\" passphrase=\"\";\r\ + \n # For basic verification we rename the certificate and print it by f\ + ingerprint. Make sure exactly this one certificate (\"Root-YE\") is shown.\ + \r\ + \n #/certificate/set name=\"Root-YE\" [ find where common-name=\"Root Y\ + E\" ];\r\ + \n #/certificate/print proplist=name,fingerprint where fingerprint=\"e1\ + 4ffcad5b0025731006caa43a121a22d8e9700f4fb9cf852f02a708aa5d5666\";\r\ + \n #:log info \"\\nAmScriptsUrl = \$AmScriptsUrl\";\r\ + \n :local Scripts {\r\ + \n \"Amster-GlobalConfig\"\r\ + \n \"Amster-GlobalFunc\";\r\ + \n# \"Amster-SFTP-backup\"\r\ + \n# \"Amster-BkpEmail-and-upd\";\r\ + \n };\r\ + \n# /system/script/set owner=(\$ScriptVal->\"name\") \\\r\ + \n# source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRLF \$S\ + ourceNew ] \$Script;\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n /system/script { run Amster-GlobalConfig; run Amster-GlobalFunc; }\r\ + \n}\r\ + \n:global AmUpdRun;\r\ + \n:set AmUpdRun do={\r\ + \n #:local UpdScript [ :tostr \$1 ];\r\ + \n #:global ParseKeyValueStore;\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n :local Scripts {\r\ + \n# \"Amster-GlobalConfig\"\r\ + \n# \"Amster-GlobalFunc\"\r\ + \n# \"Amster-GlobalRemove\"\r\ + \n \"Amster-backup-SFTP\"\r\ + \n \"Amster-SFTP-backup\"\r\ + \n \"Amster-BkpEmail-and-upd\"\r\ + \n \"Amster-TG-Bot\"\r\ + \n \"Amster-TG-Notification\";\r\ + \n };\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"updating \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n# /system/script/add name=\$Script owner=\$AmOwner source=([ /tool/fe\ + tch check-certificate=yes-without-crl (\"\$AmScriptsUrl\" . \$Script . \".\ + rsc\") output=user as-value ]->\"data\"); };\r\ + \n}\r\ + \n\r\ + \n\$AmFirstRun;\r\ + \n#\$AmUpdRun;\r\ + \n\r\ + \n#\$setUpdExist;\r\ + \n#:global setUpdExist;\r\ + \n#:global ParseKeyValueStore;\r\ + \n#:set setUpdExist do={\r\ + \n#:do {\r\ + \n#:global ParseKeyValueStore;\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\\r\?\\n#comment=*\" ] do={\r\ + \n# :local ScriptVal [ /system/script/get \$Script ];\r\ + \n# :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"#comment\"\ + ) ];\r\ + \n# :local scriptName (\$ScriptVal->\"name\");\r\ + \n#:log warning (\"\\n\\\$scriptName = \". \$scriptName);\r\ + \n#: log warning (\"\\n\\\$ScriptInfo = \". \$ScriptInfo);\r\ + \n# }\r\ + \n#} on-error={}\r\ + \n#}\r\ + \n#\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run\ + -count;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;\r\ + \n#;(evl / (evl /docommand=;(evl / (evl /foreachcounter=\$Script;do=;(evl \ + / (evl /localname=\$ScriptVal;value=(evl (evl /system/script/getnumber=\$S\ + cript))) (evl /localname=\$ScriptInfo;value=(evl (<%% \$ParseKeyValueStore\ + \_(> \$ParseKeyValueStore);(-> \$ScriptVal comment)))) (evl /localname=\$s\ + criptName) (evl /setname=\$scriptName;value=(-> #\$ScriptVal name)) (evl /\ + log/errormessage=(. \r\ + \n# \$ ScriptInfo = \$ScriptInfo)));in=(evl (evl /system/script/findwhere\ + =\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run-c\ + ount;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;(~ \$so\ + urce (. ^#!rsc by Vados \r\ + \n# \? \r\ + \n#));5))));on-error=;(evl /)))\r\ + \n" +add dont-require-permissions=no name="Download cAP's Packages" owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# +------------------------------+\r\ + \n# | |\r\ + \n# | Mikrotik RouterOS Scripts |\r\ + \n# | _Download cAP's Packages_ |\r\ + \n# | |\r\ + \n# +------------------------------+\r\ + \n# https://github.com/sebastian13/mikrotik-routeros-scripts\r\ + \n#\r\ + \n\r\ + \n# Set a directory path providing the required space\r\ + \n# Add a microSD card https://wiki.mikrotik.com/wiki/Manual:System/Disks\ + \r\ + \n# or setup a RAM-Disk via '/disk/add type=tmpfs tmpfs-max-size=20M slot=\ + ram'\r\ + \n:local dir \"/tmpfs/capsman-packages\";\r\ + \n\r\ + \n\r\ + \n# Set Package Path if required, set policy to none if using 'upgrade-cap\ + s' script\r\ + \n/interface/wifi/capsman/set package-path=\$dir upgrade-policy=none;\r\ + \n/caps-man/manager/set package-path=\$dir upgrade-policy=none;\r\ + \n#require-same-version;\r\ + \n\r\ + \n:local installed [/system package get value-name=version [find where nam\ + e=\"routeros\"]]\r\ + \n\r\ + \n# Delete old downloads\r\ + \n# /file/remove [ find type=package name~\"capsman*\" ]\r\ + \n\r\ + \n# Starting from RouterOS version 7.13, drivers for older wireless and 60\ + GHz interfaces are\r\ + \n# part of the separate \"wireless\" package. The existing \"wifiwave2\" \ + package has been divided\r\ + \n# into distinct packages: \"wifi-qcom\" and \"wifi-qcom-ac\".\r\ + \n# RouterOS >=7.12 is required to upgrade to 7.13.\r\ + \n# https://forum.mikrotik.com/viewtopic.php\?t=202423\r\ + \n\r\ + \n:foreach architecture in={ \"arm\";\r\ + \n# \"arm64\";\r\ + \n \"x86_64\";\r\ + \n \"mipsbe\"} do={\r\ + \n :foreach package in={ \"routeros\";\r\ + \n# \"wifi-qcom-ac\";\r\ + \n# \"wifi-qcom\";\r\ + \n \"container\";\r\ + \n \"wireless\"} do={ :do {\r\ + \n :put \"\"\r\ + \n :put \"Download \$package \$installed for \$architecture\"\r\ + \n /tool fetch mode=https \\\r\ + \n url=\"https://download.mikrotik.com/routeros/\$installed/\$packa\ + ge-\$installed-\$architecture.npk\" \\\r\ + \n dst-path=\"\$dir/\$package-\$installed-\$architecture.npk\"\r\ + \n } on-error={ :put \"Error downloading the file. On a 404, note t\ + hat the package may not exist for the specified architecture!\" }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Script for setup routeros script system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros script system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe true;\r\ + \n:global RunOnce (a);\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs false;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n\r\ + \n :local UrlSuffix \$Identity;\r\ + \n :local UrlDir \"certs/\";\r\ + \n :local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\"); \ + \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ + \_\\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n /tool/fetch (\$CertUrl . \$CertFileName) dst-path=\$CertFileName\ + \_as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n /certificate/set name=\"Root-YE\" [ find where common-name=\"Roo\ + t YE\" ];\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :local Script \"mod/AM-Certs-By-Ident\";\r\ + \n \r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetch \ + check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".\ + rsc\") output=user as-value ]->\"data\");\r\ + \n /system/script run \$Script;\r\ + \n :global tmpAddCerts;\r\ + \n :while ([ \$tmpAddCerts ] = true) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n :delay 1s;\r\ + \n :put \"Removing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/729/f42d43ae\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 00:05:03 01.07.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \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#\ + \n#root.mnuc.backuper\ + \n\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\ + \n#:local Script AM-GlobalConfig;\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n:global MkDir;\ + \n\ + \n:local FetchFile Manager@id_rsa.pub\ + \n:local localDir \"/\";\ + \n\ + \n\$MkDir \$localDir;\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\ + \n" +add dont-require-permissions=yes name=MkTmpfs owner=vados policy=\ + ftp,read,write,policy,test,sniff,sensitive source=\ + ":global MkDir;\r\ + \n\r\ + \n\$MkDir /usb1/tmpfs;" +add dont-require-permissions=no name=CreateContainer owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local contIF \"veth1\";\r\ + \n:local contIP \"10.10.10.10/24\";\r\ + \n:local contGW \"10.10.10.1\";\r\ + \n#/interface/veth/add name=\$contIF address=\$contIP gateway=\$contGW;\r\ + \n:local contBridgeIF \"Bridge-DOC\";\r\ + \n:local contBridgeIP \"10.10.10.1/24\";\r\ + \n/interface/bridge/add name=\$contBridgeIF;\r\ + \n/ip/address/add address=\$contBridgeIP interface=\$contBridgeIF;\r\ + \n/interface/bridge/port/add bridge=\$contBridgeIF interface=\$contIF;\r\ + \n/container/config/set ram-high=768M registry-url=https://registry-1.dock\ + er.io tmpdir=sata1/tmp\r\ + \n" +add dont-require-permissions=no name=carkeeperbot owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/mounts/add list=carkeeper_configs/.profile src=sata1/carkeeper/c\ + onfigs/.profile dst=/root/.ashrc;\r\ + \n/container/mounts/add list=carkeeper_configs/php.ini src=sata1/carkeeper\ + /configs/php.ini dst=/etc/php82/php.ini;\r\ + \n#/container/mounts/add list=carkeeper_configs src=sata1/carkeeper/config\ + s dst=/configs;\r\ + \n/container/mounts/add list=carkeeper_app src=sata1/carkeeper/app dst=/ap\ + p;\r\ + \n/container/mounts/add list=carkeeper_scripts src=sata1/carkeeper/scripts\ + \_dst=/scripts;\r\ + \n/container/mounts/add list=carkeeper_configs/sshd_config src=sata1/carke\ + eper/configs/sshd_config dst=/etc/ssh/sshd_config;\r\ + \n\r\ + \n/container/mounts/add list=carkeeper_tmp src=sata1/carkeeper/tmp dst=/va\ + r/tmp;\r\ + \n/container/mounts/add list=carkeeper_sync src=sata1/carkeeper/sync dst=/\ + var/sync;\r\ + \n" +add comment="Enable or disable ip addresses based on bridge port state" \ + dont-require-permissions=no name=mod/AM-IPbridge owner=mod/AM-IPbridge \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: mod/AM-IPbridge\r\ + \n# Script comment: Enable or disable ip addresses based on bridge port st\ + ate\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# Add this Script scheduler\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n:log warning (\"SystemScheduler for script: \" . \$ScriptName . \" is NO\ + T SET! Fix It Now!\");\r\ + \n:local OnEvent \"/system/script/run \$ScriptName;\";\r\ + \n:local Comment \"Every Day Check For Fake Bridges\";\r\ + \n/system/scheduler/add name=\$ScriptName comment=\$Comment start-time=sta\ + rtup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:foreach Bridge in=[ /interface/bridge/find ] do={\r\ + \n :local BrName [ /interface/bridge/get \$Bridge name ];\r\ + \n :if ([ :len [ /interface/bridge/port/find where bridge=\$BrName ] ] > \ + 0) do={\r\ + \n :if ([ :len [ /interface/bridge/port/find where bridge=\$BrName and \ + inactive=no ] ] = 0) do={\r\ + \n /ip/address/disable [ find where !dynamic interface=\$BrName ];\r\ + \n } else={\r\ + \n /ip/address/enable [ find where !dynamic interface=\$BrName ];\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Use Telegram to chat with your Router and send commands" \ + dont-require-permissions=no name=mod/AM-TG-Bot owner=mod/AM-TG-Bot \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: mod/AM-TG-Bot\r\ + \n# Script comment: Use Telegram to chat with your Router and send command\ + s\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n :global Identity;\r\ + \n :global TelegramChatActive;\r\ + \n :global TelegramChatGroups;\r\ + \n :global TelegramChatId;\r\ + \n :global TelegramChatIdsTrusted;\r\ + \n :global TelegramChatOffset;\r\ + \n :global TelegramChatRunTime;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global TelegramRandomDelay;\r\ + \n :global TelegramTokenId;\r\ + \n\r\ + \n :global CertificateAvailable;\r\ + \n :global EitherOr;\r\ + \n :global EscapeForRegEx;\r\ + \n :global FileExists;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global LogPrintVerbose;\r\ + \n :global MAX;\r\ + \n :global MIN;\r\ + \n :global MkDir;\r\ + \n :global RandomDelay;\r\ + \n :global RmDir;\r\ + \n :global ScriptLock;\r\ + \n :global SendTelegram2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global WaitForFile;\r\ + \n :global WaitFullyConnected;\r\ + \n\r\ + \n :if ([ \$ScriptLock \$ScriptName ] = false) do={\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n \$WaitFullyConnected;\r\ + \n\r\ + \n :if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) \ + do={\r\ + \n /system/scheduler/add start-time=startup interval=30s name=\$ScriptN\ + ame on-event=\"/system/script/run \$ScriptName;\" comment=\"Telegram Chat \ + Bot\";\r\ + \n }\r\ + \n :if ([ :typeof \$TelegramChatOffset ] != \"array\") do={\r\ + \n :set TelegramChatOffset { 0; 0; 0 };\r\ + \n }\r\ + \n :if ([ :typeof \$TelegramRandomDelay ] != \"num\") do={\r\ + \n :set TelegramRandomDelay 0;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$ScriptName (\"Downloading required certificate \ + failed.\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n \$RandomDelay \$TelegramRandomDelay;\r\ + \n\r\ + \n :local Data false;\r\ + \n :for I from=1 to=4 do={\r\ + \n :if (\$Data = false) do={\r\ + \n :onerror Err {\r\ + \n :set Data ([ /tool/fetch check-certificate=yes-without-crl outpu\ + t=user \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TelegramTokenId . \"/get\ + Updates\?offset=\" . \\\r\ + \n \$TelegramChatOffset->0 . \"&allowed_updates=%5B%22message%22%\ + 5D\") as-value ]->\"data\");\r\ + \n :set TelegramRandomDelay [ \$MAX 0 (\$TelegramRandomDelay - 1) ]\ + ;\r\ + \n } do={\r\ + \n :if (\$I < 4) do={\r\ + \n \$LogPrint debug \$ScriptName (\"Fetch failed, \" . \$I . \". \ + try: \" . \$Err);\r\ + \n :set TelegramRandomDelay [ \$MIN 15 (\$TelegramRandomDelay + 5\ + ) ];\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Data = false) do={\r\ + \n \$LogPrint warning \$ScriptName (\"Failed getting updates.\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local JSON [ :deserialize from=json value=\$Data ];\r\ + \n :local UpdateID 0;\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :foreach Update in=(\$JSON->\"result\") do={\r\ + \n :set UpdateID (\$Update->\"update_id\");\r\ + \n \$LogPrintVerbose debug \$ScriptName (\"Update \" . \$UpdateID . \":\ + \_\" . [ :serialize to=json \$Update ]);\r\ + \n\r\ + \n :local Message (\$Update->\"message\");\r\ + \n :local IsAnyReply ([ :typeof (\$Message->\"reply_to_message\") ] = \ + \"array\");\r\ + \n :local IsMyReply (\$TelegramMessageIDs->[ :tostr (\$Message->\"reply\ + _to_message\"->\"message_id\") ]);\r\ + \n :if ((\$IsMyReply = 1 || \$TelegramChatOffset->0 > 0 || \$Uptime > 5\ + m) && \$UpdateID >= \$TelegramChatOffset->2) do={\r\ + \n :local Trusted false;\r\ + \n :local Chat (\$Message->\"chat\");\r\ + \n :local From (\$Message->\"from\");\r\ + \n :local Command (\$Message->\"text\");\r\ + \n :local ThreadId [ \$IfThenElse (\$Message->\"is_topic_message\") (\ + \$Message->\"message_thread_id\") \"\" ];\r\ + \n\r\ + \n :foreach IdsTrusted in=(\$TelegramChatId, \$TelegramChatIdsTrusted\ + ) do={\r\ + \n :if (\$From->\"id\" = \$IdsTrusted || \\\r\ + \n \$From->\"username\" = \$IdsTrusted || \\\r\ + \n \$Chat->\"id\" = \$IdsTrusted) do={\r\ + \n :set Trusted true;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Trusted = true) do={\r\ + \n :local Done false;\r\ + \n :if (\$Command = \"\?\") do={\r\ + \n \$LogPrint info \$ScriptName (\"Sending notice for update \" .\ + \_\$UpdateID . \".\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\"\ + ); silent=true; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \\\ + \r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \"\ + Telegram Chat\"); \\\r\ + \n message=([ \$IfThenElse ([ :len (\$From->\"first_name\") ] >\ + \_0) (\"Hello \" . (\$From->\"first_name\") . \"!\\n\\n\") ] . \\\r\ + \n \"Online\" . [ \$IfThenElse \$TelegramChatActive \" (and a\ + ctive!)\" ] . \", awaiting your commands!\") });\r\ + \n :set Done true;\r\ + \n }\r\ + \n :if (\$Done = false && [ :pick \$Command 0 1 ] = \"!\") do={\r\ + \n :if (\$Command ~ (\"^! *(\" . [ \$EscapeForRegEx \$Identity ] \ + . \"|@\" . \$TelegramChatGroups . \")\\\$\")) do={\r\ + \n :set TelegramChatActive true;\r\ + \n } else={\r\ + \n :set TelegramChatActive false;\r\ + \n }\r\ + \n \$LogPrint info \$ScriptName (\"Now \" . [ \$IfThenElse \$Tele\ + gramChatActive \"active\" \"passive\" ] . \\\r\ + \n \" from update \" . \$UpdateID . \"!\");\r\ + \n :set Done true;\r\ + \n }\r\ + \n :if (\$Done = false && (\$IsMyReply = 1 || (\$IsAnyReply = false\ + \_&& \\\r\ + \n \$TelegramChatActive = true)) && [ :len \$Command ] > 0) do\ + ={\r\ + \n :if ([ \$ValidateSyntax \$Command ] = true) do={\r\ + \n :local State \"\";\r\ + \n :local File (\"tmpfs/telegram-chat/\" . [ \$GetRandom20CharA\ + lNum 6 ]);\r\ + \n :if ([ \$MkDir \"tmpfs/telegram-chat\" ] = false) do={\r\ + \n \$LogPrint error \$ScriptName (\"Failed creating directory\ + !\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n \$LogPrint info \$ScriptName (\"Running command from update \ + \" . \$UpdateID . \": \" . \$Command);\r\ + \n :execute script=(\":do {\\n\" . \$Command . \"\\n} on-error=\ + { /file/add name=\\\"\" . \$File . \".failed\\\" };\" . \\\r\ + \n \"/file/add name=\\\"\" . \$File . \".done\\\"\") file=(\$\ + File . \"\\00\");\r\ + \n :if ([ \$WaitForFile (\$File . \".done\") [ \$EitherOr \$Tel\ + egramChatRunTime 20s ] ] = false) do={\r\ + \n :set State ([ \$SymbolForNotification \"warning-sign\" ] .\ + \_\"The command did not finish, still running in background.\\n\\n\");\r\ + \n }\r\ + \n :if ([ \$FileExists (\$File . \".failed\") ] = true) do={\r\ + \n :set State ([ \$SymbolForNotification \"cross-mark\" ] . \ + \"The command failed with an error!\\n\\n\");\r\ + \n }\r\ + \n :local Content ([ /file/read chunk-size=32768 file=\$File as\ + -value ]->\"data\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\ + \"); silent=true; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \ + \\\r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \ + \"Telegram Chat\"); \\\r\ + \n message=([ \$SymbolForNotification \"gear\" ] . \"Command:\ + \\n\" . \$Command . \"\\n\\n\" . \\\r\ + \n \$State . [ \$IfThenElse ([ :len \$Content ] > 0) \\\r\ + \n ([ \$SymbolForNotification \"memo\" ] . \"Output:\\n\" .\ + \_\$Content) \\\r\ + \n ([ \$SymbolForNotification \"memo\" ] . \"No output.\") \ + ]) });\r\ + \n \$RmDir \"tmpfs/telegram-chat\";\r\ + \n } else={\r\ + \n \$LogPrint info \$ScriptName (\"The command from update \" .\ + \_\$UpdateID . \" failed syntax validation!\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\ + \"); silent=false; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \ + \\\r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \ + \"Telegram Chat\"); \\\r\ + \n message=([ \$SymbolForNotification \"gear\" ] . \"Command:\ + \\n\" . \$Command . \"\\n\\n\" . \\\r\ + \n [ \$SymbolForNotification \"cross-mark\" ] . \"The comma\ + nd failed syntax validation!\") });\r\ + \n }\r\ + \n }\r\ + \n } else={\r\ + \n :local MessageText (\"Received a message from untrusted contact \ + \" . \\\r\ + \n [ \$IfThenElse ([ :len (\$From->\"username\") ] = 0) \"without\ + \_username\" (\"'\" . \$From->\"username\" . \"'\") ] . \\\r\ + \n \" (ID \" . \$From->\"id\" . \") in update \" . \$UpdateID . \ + \"!\");\r\ + \n :if (\$Command ~ (\"^! *\" . [ \$EscapeForRegEx \$Identity ] . \ + \"\\\$\")) do={\r\ + \n \$LogPrint warning \$ScriptName \$MessageText;\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\"\ + ); silent=false; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \\\ + \r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \"\ + Telegram Chat\"); \\\r\ + \n message=(\"You are not trusted.\") });\r\ + \n } else={\r\ + \n \$LogPrint info \$ScriptName \$MessageText;\r\ + \n }\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint debug \$ScriptName (\"Already handled update \" . \$Upd\ + ateID . \".\");\r\ + \n }\r\ + \n }\r\ + \n :set TelegramChatOffset ([ :pick \$TelegramChatOffset 1 3 ], \\\r\ + \n [ \$IfThenElse (\$UpdateID >= \$TelegramChatOffset->2) (\$UpdateID +\ + \_1) (\$TelegramChatOffset->2) ]);\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +add comment="Script send Notifications in Telegram" dont-require-permissions=\ + no name=mod/AM-TG-Notifications owner=mod/AM-TG-Notifications policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: mod/AM-TG-Notifications\r\ + \n# Script comment: Script send Notifications in Telegram\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:global FlushTelegramQueue;\r\ + \n:global GetTelegramChatId;\r\ + \n:global NotificationFunctions;\r\ + \n:global PurgeTelegramQueue;\r\ + \n:global SendTelegram;\r\ + \n:global SendTelegram2;\r\ + \n# flush telegram queue\r\ + \n:set FlushTelegramQueue do={ :onerror Err {\r\ + \n :global TelegramQueue;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global CertificateAvailable;\r\ + \n :global IsFullyConnected;\r\ + \n :global LogPrint;\r\ + \n :if ([ \$IsFullyConnected ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"System is not fully connected, not flushing.\ + \");\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n :local AllDone true;\r\ + \n :local QueueLen [ :len \$TelegramQueue ];\r\ + \n :if ([ :len [ /system/scheduler/find where name=\"_FlushTelegramQueue\ + \" ] ] > 0 && \$QueueLen = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Flushing Telegram messages from scheduler,\ + \_but queue is empty.\");\r\ + \n }\r\ + \n :foreach Id,Message in=\$TelegramQueue do={\r\ + \n :if ([ :typeof \$Message ] = \"array\" ) do={\r\ + \n :onerror Err {\r\ + \n :local Data ([ /tool/fetch check-certificate=yes-without-crl out\ + put=user http-method=post \\\r\ + \n (\"https://api.telegram.org/bot\" . (\$Message->\"tokenid\") .\ + \_\"/sendMessage\") \\\r\ + \n http-data=(\$Message->\"http-data\") as-value ]->\"data\");\r\ + \n :set (\$TelegramQueue->\$Id);\r\ + \n :set (\$TelegramMessageIDs->[ :tostr ([ :deserialize from=json v\ + alue=\$Data ]->\"result\"->\"message_id\") ]) 1;\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Sending queued Telegram message failed: \ + \" . \$Err);\r\ + \n :set AllDone false;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :if (\$AllDone = true && \$QueueLen = [ :len \$TelegramQueue ]) do={\r\ + \n /system/scheduler/remove [ find where name=\"_FlushTelegramQueue\" ]\ + ;\r\ + \n :set TelegramQueue;\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# get the chat id\r\ + \n:set GetTelegramChatId do={ :onerror Err {\r\ + \n :global TelegramTokenId;\r\ + \n :global CertificateAvailable;\r\ + \n :global LogPrint;\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n :local Data;\r\ + \n :onerror Err {\r\ + \n :set Data ([ /tool/fetch check-certificate=yes-without-crl output=us\ + er \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TelegramTokenId . \"/getUpd\ + ates\?offset=0\" . \\\r\ + \n \"&allowed_updates=%5B%22message%22%5D\") as-value ]->\"data\");\ + \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Fetching data failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :local JSON [ :deserialize from=json value=\$Data ];\r\ + \n :local Count [ :len (\$JSON->\"result\") ];\r\ + \n :if (\$Count = 0) do={\r\ + \n \$LogPrint info \$0 (\"No message received.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local Message (\$JSON->\"result\"->(\$Count - 1)->\"message\");\r\ + \n \$LogPrint info \$0 (\"The chat id is: \" . (\$Message->\"chat\"->\"id\ + \"));\r\ + \n :if ((\$Message->\"is_topic_message\") = true) do={\r\ + \n \$LogPrint info \$0 (\"The thread id is: \" . (\$Message->\"message_\ + thread_id\"));\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# send notification via telegram - expects one array argument\r\ + \n:set (\$NotificationFunctions->\"telegram\") do={\r\ + \n :local Notification \$1;\r\ + \n :global Identity;\r\ + \n :global IdentityExtra;\r\ + \n :global TelegramChatId;\r\ + \n :global TelegramChatIdOverride;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global TelegramQueue;\r\ + \n :global TelegramThreadId;\r\ + \n :global TelegramThreadIdOverride;\r\ + \n :global TelegramTokenId;\r\ + \n :global TelegramTokenIdOverride;\r\ + \n :global CertificateAvailable;\r\ + \n :global CharacterReplace;\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ProtocolStrip;\r\ + \n :global SymbolForNotification;\r\ + \n :global UrlEncode;\r\ + \n :local EscapeMD do={\r\ + \n :local Text [ :tostr \$1 ];\r\ + \n :local Mode [ :tostr \$2 ];\r\ + \n :local Excl [ :tostr \$3 ];\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :local Chars {\r\ + \n \"body\"={ \"\\\\\"; \"`\" };\r\ + \n \"plain\"={ \"_\"; \"*\"; \"[\"; \"]\"; \"(\"; \")\"; \"~\"; \"`\"\ + ; \">\";\r\ + \n \"#\"; \"+\"; \"-\"; \"=\"; \"|\"; \"{\"; \"}\"; \".\"; \ + \"!\" };\r\ + \n }\r\ + \n :foreach Char in=(\$Chars->\$Mode) do={\r\ + \n :if ([ :typeof [ :find \$Excl \$Char ] ] = \"nil\") do={\r\ + \n :set Text [ \$CharacterReplace \$Text \$Char (\"\\\\\" . \$Char)\ + \_];\r\ + \n }\r\ + \n }\r\ + \n :if (\$Mode = \"body\") do={:return (\"```\\n\" . \$Text . \"\\n```\ + \")}\r\ + \n :return \$Text;\r\ + \n }\r\ + \n :local ChatId [ \$EitherOr (\$Notification->\"chatid\") \\\r\ + \n [ \$EitherOr (\$TelegramChatIdOverride->(\$Notification->\"origin\")\ + ) \$TelegramChatId ] ];\r\ + \n :local ThreadId [ \$EitherOr (\$Notification->\"threadid\") \\\r\ + \n [ \$EitherOr (\$TelegramThreadIdOverride->(\$Notification->\"origin\ + \")) \\\r\ + \n [ \$IfThenElse ([ :len (\$TelegramChatIdOverride->(\$Notification->\ + \"origin\")) ] = 0) \$TelegramThreadId ] ] ];\r\ + \n :local TokenId [ \$EitherOr (\$TelegramTokenIdOverride->(\$Notificatio\ + n->\"origin\")) \$TelegramTokenId ];\r\ + \n :if ([ :len \$TokenId ] = 0 || [ :len \$ChatId ] = 0) do={:return fals\ + e}\r\ + \n :if ([ :typeof \$TelegramMessageIDs ] = \"nothing\") do={:set Telegram\ + MessageIDs ({})}\r\ + \n :local Truncated false;\r\ + \n :local Text (\"*__\" . [ \$EscapeMD (\"[\" . \$IdentityExtra . \$Ident\ + ity . \"] \" . \\\r\ + \n (\$Notification->\"subject\")) \"plain\" ] . \"__*\\n\\n\");\r\ + \n :local LenSubject [ :len \$Text ];\r\ + \n :local LenMessage [ :len (\$Notification->\"message\") ];\r\ + \n :local LenLink ([ :len (\$Notification->\"link\") ] * 2);\r\ + \n :local LenSum (\$LenSubject + \$LenMessage + \$LenLink);\r\ + \n :if (\$LenSum > 3968) do={\r\ + \n :set Text (\$Text . [ \$EscapeMD ([ :pick (\$Notification->\"message\ + \") 0 (3840 - \$LenSubject - \$LenLink) ] . \"...\") \"body\" ]);\r\ + \n :set Truncated true;\r\ + \n } else={:set Text (\$Text . [ \$EscapeMD (\$Notification->\"message\")\ + \_\"body\" ])}\r\ + \n :if (\$LenLink > 0) do={\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"link\" ] .\ + \_\\\r\ + \n \"[\" . [ \$EscapeMD [ \$ProtocolStrip (\$Notification->\"link\") \ + ] \"plain\" ] . \"]\" . \\\r\ + \n \"(\" . [ \$EscapeMD (\$Notification->\"link\") \"plain\" ] . \")\ + \");\r\ + \n }\r\ + \n :if (\$Truncated = true) do={\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"scissors\"\ + \_] . \\\r\ + \n [ \$EscapeMD (\"The message was too long and has been truncated, c\ + ut off _\" . \\\r\ + \n ((\$LenSum - [ :len \$Text ]) * 100 / \$LenSum) . \"%_!\") \"plain\ + \" \"_\" ]);\r\ + \n }\r\ + \n :local HTTPData (\"chat_id=\" . \$ChatId . \"&disable_notification=\" \ + . (\$Notification->\"silent\") . \\\r\ + \n \"&reply_to_message_id=\" . (\$Notification->\"replyto\") . \"&mes\ + sage_thread_id=\" . \$ThreadId . \\\r\ + \n \"&disable_web_page_preview=true&parse_mode=MarkdownV2\");\r\ + \n :onerror Err {\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority \ + - G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Data ([ /tool/fetch check-certificate=yes-without-crl output=\ + user http-method=post \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TokenId . \"/sendMessage\") \ + \\\r\ + \n http-data=(\$HTTPData . \"&text=\" . [ \$UrlEncode \$Text ]) as-va\ + lue ]->\"data\");\r\ + \n :set (\$TelegramMessageIDs->[ :tostr ([ :deserialize from=json value\ + =\$Data ]->\"result\"->\"message_id\") ]) 1;\r\ + \n } do={\r\ + \n \$LogPrint info \$0 (\"Failed sending Telegram notification: \" . \$\ + Err . \" - Queuing...\");\r\ + \n :if ([ :typeof \$TelegramQueue ] = \"nothing\") do={:set TelegramQue\ + ue ({})}\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"alarm-cloc\ + k\" ] . \\\r\ + \n [ \$EscapeMD (\"This message was queued since _\" . [ /system/cloc\ + k/get date ] . \\\r\ + \n \" \" . [ /system/clock/get time ] . \"_ and may be obsolete.\") \ + \"plain\" \"_\" ]);\r\ + \n :set (\$TelegramQueue->[ :len \$TelegramQueue ]) { tokenid=\$TokenId\ + ;\r\ + \n http-data=(\$HTTPData . \"&text=\" . [ \$UrlEncode \$Text ]) };\r\ + \n :if ([ :len [ /system/scheduler/find where name=\"_FlushTelegramQueu\ + e\" ] ] = 0) do={\r\ + \n /system/scheduler/add name=\"_FlushTelegramQueue\" interval=1m sta\ + rt-time=startup \\\r\ + \n on-event=(\":global FlushTelegramQueue; \\\$FlushTelegramQueue;\ + \");\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n# purge the Telegram queue\r\ + \n:set PurgeTelegramQueue do={\r\ + \n :global TelegramQueue;\r\ + \n /system/scheduler/remove [ find where name=\"_FlushTelegramQueue\" ];\ + \r\ + \n :set TelegramQueue;\r\ + \n}\r\ + \n# send notification via telegram - expects at least two string arguments\ + \r\ + \n:set SendTelegram do={ :onerror Err {\r\ + \n :global SendTelegram2;\r\ + \n \$SendTelegram2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3; sil\ + ent=\$4 });\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# send notification via telegram - expects one array argument\r\ + \n:set SendTelegram2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n (\$NotificationFunctions->\"telegram\") (\"\\\$NotificationFunctions->\ + \\\"telegram\\\"\") \$Notification;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=testIfThenElseAndEitherOr owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source=":local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n:local ExitError;\r\ + \n#:local IfThenElse;\r\ + \n#:local EitherOr;\r\ + \n\r\ + \n:local one 11;\r\ + \n:local two 8;\r\ + \n#:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n:local Test; # [ :totime \"22s\" ];\r\ + \n\r\ + \n:local IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] \ + = true) do={:return \$2}; :return \$3;}\r\ + \n:local EitherOr do={\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:if ((\$1 != 0) = true) do={:retur\ + n \$1} else={:return \$2};}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:if ((\$1 > 0s) = true) do={:retu\ + rn \$1} else={:return \$2};}\r\ + \n :if ([ :len [ :tostr \$1 ] ] > 0) do={:return \$1} else={:return \$2};\ + \r\ + \n}\r\ + \n\r\ + \n:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n\r\ + \n:set Test [ \$EitherOr \$Test \"\" ];\r\ + \n:log warning (\"\\\$ Test = \" . \$Test);\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 :local 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\r\ + \n#:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n\r\ + \n:set ExitOK true;\r\ + \n\$ExitError \$ExitOK \$ScriptName \"Err test custom\";" +add comment="Update and Backup send notification to EMail" \ + dont-require-permissions=no name=AM-Backup-UpdateEmail owner=\ + AM-Backup-UpdateEmail policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-Backup-UpdateEmail\r\ + \n# Script comment: Update and Backup send notification to EMail\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version>=6.43.7\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# Updated: 15/04/2025\r\ + \n# Website: https://github.com/beeyev\r\ + \n# Notification e-mail (Make sure you have configured Email settings in T\ + ools -> Email)\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n:local IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] \ + = true) do={:return \$2}; :return \$3;}\r\ + \n:local EitherOr do={\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:if ((\$1 != 0) = true) do={:retur\ + n \$1} else={:return \$2};}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:if ((\$1 > 0s) = true) do={:retu\ + rn \$1} else={:return \$2};}\r\ + \n :if ([ :len [ :tostr \$1 ] ] > 0) do={:return \$1} else={:return \$2};\ + \r\ + \n}\r\ + \n:local ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :if (\$ExitOK = \"false\") do={:log error (\$Name [ \$IfThenElse ([ :p\ + ick \$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:global LogPrint;\r\ + \n:global EditSchedulers;\r\ + \n:global DevInfoIncludeIP;\r\ + \n\r\ + \n:local SchedInterval \"7d\";\r\ + \n:local SchedStartTime \"03:41:27\";\r\ + \n:local SchedComment \"Every 7 Day Check For Update and Backup send notif\ + ication to EMail.\";\r\ + \n\r\ + \n# Function to add or edit schedulers for scripts, to ensure they are set\ + \_up correctly\r\ + \n# How to use:\r\ + \n# Call this function with the following parameters:\r\ + \n# 1. \$1 - Scheduler name (usually same as script name) [*]\r\ + \n# 2. \$2 - Interval (e.g. \"1d\" (default is \"1d\")) [**]\r\ + \n# 3. \$3 - Start Time (e.g. \"00:00:00\", default is current time) [**]\ + \r\ + \n# 4. \$4 - Comment (optional, default: \"Scheduler for script: \")\ + \_[**]\r\ + \n# 5. \$5 - On Event command (e.g. \"/system/script { run ; }\" (de\ + fault is \"/system/script { run \$SchedName; }\")) [**]\r\ + \n# 6. \$6 - Policy (e.g. \"ftp,reboot,read,write,policy,test,password,sni\ + ff,sensitive,romon\" (default is the same)) [**]\r\ + \n# 7. \$7 - Start Date (e.g. \"jan/01/1970\", default is current date) [*\ + *]\r\ + \n# Notes:\r\ + \n# * - Scheduler name is required, and is used to identify the scheduler\ + \_to create or edit. It is usually the same as the script name (\$ScriptNa\ + me).\r\ + \n# ** - If optional parameters are not provided, default values will be u\ + sed.\r\ + \n# This allows for quick setup with minimal parameters, while still \ + providing flexibility for customization.\r\ + \n# Example usage:\r\ + \n# :if ([ \$EditSchedulers \"my-script\" ] = false) do={:set ExitOK false\ + ; :error true;}\r\ + \n# :if ([ \$EditSchedulers \"my-script\" \"1d\" \"03:41:27\" \"My custom \ + scheduler comment\" false false \"jan/01/1970\" ] = false) do={:set ExitOK\ + \_false; :error true;}\r\ + \n\r\ + \n:set EditSchedulers do={\r\ + \n :local SchedName [ :tostr \$1 ];\r\ + \n :if ([ :len \$SchedName ] = 0) do={ :return false; }\r\ + \n :local Interval [ :tostr \$2 ];\r\ + \n :if ([ :len \$Interval ] = 0) do={ :set Interval \"1d\"; }\r\ + \n :local StartTime [ :tostr \$3 ];\r\ + \n :if ([ :len \$StartTime ] = 0) do={ :set StartTime [/system/clock/get \ + time]; }\r\ + \n :local Comment [ :tostr \$4 ];\r\ + \n :if ([ :len \$Comment ] = 0) do={ :set Comment \"Scheduler for script:\ + \_\$SchedName\"; }\r\ + \n :local OnEvent [ :tostr \$5 ];\r\ + \n :if ([ :len \$OnEvent ] = 0) do={ :set OnEvent \"/system/script { run \ + \$SchedName; }\"; }\r\ + \n :local Policy [ :tostr \$6 ];\r\ + \n :if ([ :len \$Policy ] = 0) do={ :set Policy \"ftp,reboot,read,write,p\ + olicy,test,password,sniff,sensitive,romon\"; }\r\ + \n :local StartDate [ :tostr \$7 ];\r\ + \n :if ([ :len \$StartDate ] = 0) do={ :set StartDate [/system/clock/get \ + date]; }\r\ + \n\r\ + \n :onerror Err {\r\ + \n # Check if scheduler exists, if not - create it\r\ + \n :if ([ :len [ /system/scheduler/find where name=\$SchedName ] ] = 0)\ + \_do={\r\ + \n :log warning (\$SchedName . \"System Scheduler for script: \" . \$\ + SchedName . \" is NOT SET! Fix It Now!\");\r\ + \n /system/scheduler/add comment=\$Comment interval=\$Interval name=\ + \$SchedName on-event=\$OnEvent policy=\$Policy start-date=\$StartDate star\ + t-time=\$StartTime;\r\ + \n }\r\ + \n # Check if scheduler parameters are correct, if not - fix them\r\ + \n :if ([ /system/scheduler/get \$SchedName comment ] != \$Comment) do=\ + {\r\ + \n /system/scheduler/set \$SchedName comment=\$Comment;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName interval ] != \$Interval) d\ + o={\r\ + \n /system/scheduler/set \$SchedName interval=\$Interval;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName on-event ] != \$OnEvent) do\ + ={\r\ + \n /system/scheduler/set \$SchedName on-event=\$OnEvent;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName policy ] != \$Policy) do={\ + \r\ + \n /system/scheduler/set \$SchedName policy=\$Policy;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName start-date ] != \$StartDate\ + ) do={\r\ + \n /system/scheduler/set \$SchedName start-date=\$StartDate;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName start-time ] != \$StartTime\ + ) do={\r\ + \n /system/scheduler/set \$SchedName start-time=\$StartTime;\r\ + \n }\r\ + \n } do={:log error (\$SchedName . \"Failed to add/modify scheduler for '\ + \" . \$SchedName . \"' failed: \" . \$Err); :return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:if ([ \$EditSchedulers \$ScriptName \$SchedInterval \$SchedStartTime \$\ + SchedComment ] = false) do={\r\ + \n :log error (\$ScriptName . \"Failed to add/modify scheduler for \" . \ + \$ScriptName . \"!\");\r\ + \n :set ExitOK true;\r\ + \n :error true;\r\ + \n}\r\ + \n\r\ + \n# Local Function CheckOSUpdateMode\r\ + \n:local CheckOSUpdateMode;\r\ + \n:set CheckOSUpdateMode do={\r\ + \n :local NewMode [ :tostr \$1 ];\r\ + \n :if ([ :len \$NewMode ] = 0) do={\r\ + \n :log error (\$0 . \"/nFunction /\$CheckOSUpdateMode received empty v\ + alue!\");\r\ + \n :return false;\r\ + \n :error true;\r\ + \n }\r\ + \n\r\ + \n :global BackupAndUpdateMode;\r\ + \n :global OldMode [ :tostr \$BackupAndUpdateMode ];\r\ + \n :if (\$NewMode != \$BackupAndUpdateMode && \$NewMode = \"updateOnce\")\ + \_do={\r\ + \n :set BackupAndUpdateMode [ :tostr \$NewMode ];\r\ + \n :log info (\$0 . \"/nOk. /\$BackupAndUpdateMode set to: '\" . \$NewM\ + ode . \"'.\\nYou're a good boy! ))\\nI'm launching the update in 5 seconds\ + .\");\r\ + \n :delay 5;\r\ + \n /system/script { run \$ScriptName; };\r\ + \n } else={\r\ + \n :log warning (\$0 . \"/nFunction /\$CheckOSUpdateMode received value: \ + '\" . \$NewMode . \"', but is may be only \\\"updateOnce\\\"!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n :error false;\r\ + \n}\r\ + \n\r\ + \n# :if ([ :len [ /system/scheduler/find where name=\"running-from-backup\ + -partition\" ] ] > 0) do={\r\ + \n# \$LogPrint warning \$ScriptName (\"Running from backup partition, r\ + efusing to act.\");\r\ + \n# :set ExitOK true;\r\ + \n# :error false;\r\ + \n# }\r\ + \n\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n:global forceBackup;\r\ + \n:global BackupPassword;\r\ + \n:global BackupSens;\r\ + \n:global updateChannel;\r\ + \n\r\ + \n:global DevInfoIncludeIP;\r\ + \n\r\ + \n# Installs patch updates only (BackupAndUpdateMode = \"osupdate\").\r\ + \n# Works for `stable` and `long-term` channels.\r\ + \n# Updates only if MAJOR.MINOR match (e.g. 6.43.2 > 6.43.6 allowed, 6.44.\ + 1 skipped).\r\ + \n# Sends info if a newer (non-patch) version is found.\r\ + \n:local installOnlyPatchUpdates false;\r\ + \n:local scriptVersion \"26.04.30\";\r\ + \n:local copyrightUrl \"https://www.github.com/vados-dev/\";\r\ + \n#Script messages prefix\r\ + \n:local SMP \"BkpAndUpdate:\";\r\ + \n\r\ + \n:local exitErrorMessage \"\$SMP script stopped due to an error. Please c\ + heck logs for more details.\";\r\ + \n:log info \"\\n\\n\$SMP Script \\\"Mikrotik RouterOS automatic backup & \ + update\\\" v.\$scriptVersion started.\";\r\ + \n:log info \"\$SMP Script Mode: `\$BackupAndUpdateMode`, Update channel: \ + `\$updateChannel`, Force backup: `\$forceBackup`, Install only patch updat\ + es: `\$installOnlyPatchUpdates`\";\r\ + \n\r\ + \n## vv FUNCTIONS vv ##\r\ + \n:global WaitCheckUpdates; \$WaitCheckUpdates;\r\ + \n:global MiniDateTimeStamp;\r\ + \n:local MDTSFix [\$MiniDateTimeStamp];\r\ + \n:global Identity;\r\ + \n:global IdentityShort;\r\ + \n:global devBoardName;\r\ + \n:global runningVersion;\r\ + \n:global runningChannel;\r\ + \n:global devModel;\r\ + \n:global devRbSerialNumber;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n\r\ + \n# Checks if two RouterOS version strings differ only by the patch versio\ + n\r\ + \n# :put [\$FuncIsPatchUpdateOnly \"6.2.1\" \"6.2.4\"] # Output: true\r\ + \n# :put [\$FuncIsPatchUpdateOnly \"6.2.1\" \"6.3.1\"] # Output: false\r\ + \n:local FuncIsPatchUpdateOnly do={\r\ + \n :local ver1 \$1;\r\ + \n :local ver2 \$2;\r\ + \n # Extract the major and minor components from a version\r\ + \n :local extractMajorMinor do={\r\ + \n :local ver \$1;\r\ + \n :local dot1 [:find \$ver \".\"];\r\ + \n :if (\$dot1 = -1) do={:return \$ver}\r\ + \n :local major [:pick \$ver 0 \$dot1];\r\ + \n :local rest [:pick \$ver (\$dot1 + 1) [:len \$ver]];\r\ + \n :local dot2 [:find \$rest \".\"];\r\ + \n :local minor \$rest;\r\ + \n :if (\$dot2 >= 0) do={:set minor [:pick \$rest 0 \$dot2]}\r\ + \n :return (\$major . \".\" . \$minor);\r\ + \n }\r\ + \n\r\ + \n# Compare the major and minor components of both version strings\r\ + \n:if ([\$extractMajorMinor \$ver1] = [\$extractMajorMinor \$ver2]) do={:r\ + eturn true}\r\ + \n :return false;\r\ + \n}\r\ + \n# Creates backups and returns array of names\r\ + \n# Possible arguments:\r\ + \n# \$1 - file name, without extension\r\ + \n# \$2 - password (optional)\r\ + \n# \$3 - sensitive data in config (optional, default: false)\r\ + \n# Example:\r\ + \n#:put [\$FuncCreateBackups \$backupName]\r\ + \n:local FuncCreateBackups do={\r\ + \n :local backupName [ :tostr \$1 ];\r\ + \n :local BackPass \$2;\r\ + \n :local BackSens \$3;\r\ + \n\r\ + \n #Script messages prefix\r\ + \n :local SMP \"BkpAndUpdate:\";\r\ + \n :local exitErrorMessage \"\$SMP script stopped due to an error. Please\ + \_check logs for more details.\";\r\ + \n :log info (\"\$SMP global function `FuncCreateBackups` started, input:\ + \_`\$backupName`\");\r\ + \n\r\ + \n # validate required parameter: backupName\r\ + \n :if ([:typeof \$backupName] != \"str\" or [:len \$backupName] = 0) do=\ + {\r\ + \n :log error \"\$SMP parameter 'backupName' is required and must be a \ + non-empty string\";\r\ + \n# :log warning \"\$SMP parameter '\\\$backupName' is required and mus\ + t be a non-empty string.\\nI set '\\\$backupName' to 'default-backup'\";\r\ + \n# :set \$backupName \"default-backup\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n\r\ + \n :local backupFileSys \"\$backupName.backup\";\r\ + \n :local backupFileConfig \"\$backupName.rsc\";\r\ + \n :local backupNames {\$backupFileSys;\$backupFileConfig};\r\ + \n\r\ + \n ## Perform system backup\r\ + \n :if ([:len \$BackPass] = 0) do={\r\ + \n :log info (\"\$SMP starting backup without password, backup name: `\ + \$backupName`\");\r\ + \n /system backup save dont-encrypt=yes name=\$backupName;\r\ + \n } else={\r\ + \n :log info (\"\$SMP starting backup with password, backup name: `\$ba\ + ckupName`\");\r\ + \n /system backup save password=\$BackPass name=\$backupName;\r\ + \n }\r\ + \n :log info (\"\$SMP system backup created: `\$backupFileSys`\");\r\ + \n ## Export config file\r\ + \n :if (\$BackSens = true) do={\r\ + \n :log info (\"\$SMP starting export config with sensitive data, backu\ + p name: `\$backupName`\");\r\ + \n # Since RouterOS v7 it needs to be explicitly set that we want to ex\ + port sensitive data\r\ + \n :if ([:pick [/system resource get version] 0 1] < 7) do={\r\ + \n :execute \"/export compact terse file=\$backupName\";\r\ + \n } else={\r\ + \n :execute \"/export compact show-sensitive terse file=\$backupName\ + \";\r\ + \n }\r\ + \n } else={\r\ + \n :log info (\"\$SMP starting export config without sensitive data, ba\ + ckup name: `\$backupName`\");\r\ + \n /export compact hide-sensitive terse file=\$backupName;\r\ + \n }\r\ + \n :log info (\"\$SMP Config export complete: `\$backupFileConfig`\");\r\ + \n :log info (\"\$SMP Waiting a little to ensure backup files are written\ + \");\r\ + \n :delay 20;\r\ + \n :if ([:len [/file find name=\$backupFileSys]] > 0) do={\r\ + \n :log info (\"\$SMP system backup file successfully saved to the file\ + \_system: `\$backupFileSys`\");\r\ + \n } else={\r\ + \n :log error (\"\$SMP system backup was not created, file does not exi\ + st: `\$backupFileSys`\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :if ([:len [/file find name=\$backupFileConfig]] > 0) do={\r\ + \n :log info (\"\$SMP config backup file successfully saved to the file\ + \_system: `\$backupFileConfig`\");\r\ + \n } else={\r\ + \n :log error (\"\$SMP config backup was not created, file does not exi\ + st: `\$backupFileConfig`\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :log info (\"\$SMP global function `FuncCreateBackups` finished. Creat\ + ed backups, system: `\$backupFileSys`, config: `\$backupFileConfig`\")\r\ + \n :return \$backupNames;\r\ + \n}\r\ + \n# Sends an email\r\ + \n# Parameters:\r\ + \n# \$1 - to (email address)\r\ + \n# \$2 - subject\r\ + \n# \$3 - body\r\ + \n# \$4 - file attachments (optional; pass \"\" if not needed)\r\ + \n#\r\ + \n# Example:\r\ + \n# \$FuncSendEmailSafe \"admin@domain.com\" \"Backup Done\" \"Backup comp\ + lete.\" \"backup1.backup\"\r\ + \n:local FuncSendEmailSafe do={\r\ + \n :global EmailGeneralTo;\r\ + \n :local emailSubject \$2;\r\ + \n :local emailBody \$3;\r\ + \n :local emailAttachments \$4;\r\ + \n :local SMP \"Bkp&Upd:\";\r\ + \n :local exitErrorMessage \"\$SMP script stopped due to an error. Please\ + \_check logs for more details.\";\r\ + \n :log info \"\$SMP Attempting to send email to `\$EmailGeneralTo`\";\r\ + \n # SAFETY: wait for any previously queued email to finish\r\ + \n :local waitTimeoutPre 60;\r\ + \n :local waitCounterPre 0;\r\ + \n :while (([/tool e-mail get last-status] = \"resolving-dns\" or [/tool \ + e-mail get last-status] = \"in-progress\")) do={\r\ + \n :if (\$waitCounterPre >= \$waitTimeoutPre) do={\r\ + \n :log error \"\$SMP Email send aborted: previous send did not compl\ + ete after \$waitTimeoutPre seconds\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :log info \"\$SMP Waiting for previous email to finish (status: \$[/\ + tool e-mail get last-status])...\";\r\ + \n :delay 1; \r\ + \n :set waitCounterPre (\$waitCounterPre + 1);\r\ + \n }\r\ + \n # Send the email\r\ + \n :do {\r\ + \n /tool e-mail send to=\$EmailGeneralTo subject=\$emailSubject body=\$\ + emailBody file=\$emailAttachments;\r\ + \n } on-error={\r\ + \n :log error \"\$SMP Email send command failed to execute. Check logs \ + and verify email settings.\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n # Wait for send status to change from \"in-progress\" / \"resolving-dn\ + s\"\r\ + \n :local waitTimeout 60;\r\ + \n :local waitCounter 0;\r\ + \n :local emailStatus \"\";\r\ + \n :log info \"\$SMP Waiting for email to be sent, timeout in `\$waitTime\ + out` seconds...\";\r\ + \n :while (\$waitCounter < \$waitTimeout) do={\r\ + \n :set emailStatus [/tool e-mail get last-status];\r\ + \n :if (\$emailStatus != \"in-progress\" and \$emailStatus != \"resolvi\ + ng-dns\") do={\r\ + \n :log info \"\$SMP Email send status received: \$emailStatus\";\r\ + \n # exit loop\r\ + \n :set waitCounter \$waitTimeout;\r\ + \n } else={:delay 1; :set waitCounter (\$waitCounter + 1)}\r\ + \n }\r\ + \n # Final decision based on last status\r\ + \n :if (\$emailStatus = \"succeeded\") do={\r\ + \n :log info \"\$SMP Email successfully sent to `\$EmailGeneralTo`\";\ + \r\ + \n } else={\r\ + \n :log error \"\$SMP Email failed to send. Status: `\$emailStatus`. Ch\ + eck logs for more details and verify email settings.\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n}\r\ + \n# Global variable to track current update step\r\ + \n# They need to be initialized here first to be available in the script\r\ + \n:global buGlobalVarTargetOsVersion;\r\ + \n:global buGlobalVarScriptStep;\r\ + \n:local scriptStep \$buGlobalVarScriptStep;\r\ + \n:do {\r\ + \n /system/script/environment remove buGlobalVarScriptStep;\r\ + \n} on-error={}\r\ + \n:if ([:len \$scriptStep] = 0) do={\r\ + \n :set scriptStep 1;\r\ + \n}\r\ + \n## ^^ FUNCTIONS ^^ ##\r\ + \n#\r\ + \n# Initial validation\r\ + \n## Check email settings\r\ + \n:if ([:len \$EmailGeneralTo] < 3) do={\r\ + \n :log error (\"\$SMP Parameter `\\\$EmailGeneralTo` is not set, or cont\ + ains invalid value. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Values will be defined later in the script\r\ + \n:local emailServer \"\";\r\ + \n:local emailFromAddress [/tool e-mail get from];\r\ + \n:log info \"\$SMP Validating email settings...\";\r\ + \n:do {\r\ + \n :set emailServer [/tool e-mail get server];\r\ + \n} on-error={\r\ + \n # This is a workaround for the RouterOS v7.12 and older versions\r\ + \n :set emailServer [/tool e-mail get address];\r\ + \n}\r\ + \n:if (\$emailServer = \"0.0.0.0\") do={\r\ + \n :log error (\"\$SMP Email server address is not correct: `\$emailServe\ + r`, check `Tools -> Email`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n:if ([:len \$emailFromAddress] < 3) do={\r\ + \n :log error (\"\$SMP Email configuration FROM address is not correct: `\ + \$emailFromAddress`, check `Tools -> Email`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Script mode validation\r\ + \n:if (\$BackupAndUpdateMode != \"backup\" and \$BackupAndUpdateMode != \"\ + osupdate\" and \$BackupAndUpdateMode != \"updateOnce\" and \$BackupAndUpda\ + teMode != \"osnotify\") do={\r\ + \n :log error (\"\$SMP Script parameter `\\\$BackupAndUpdateMode` is not \ + set, or contains invalid value: `\$BackupAndUpdateMode`. Script stopped.\"\ + );\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Update channel validation\r\ + \n:if (\$updateChannel != \"stable\" and \$updateChannel != \"long-term\" \ + and \$updateChannel != \"testing\" and \$updateChannel != \"development\")\ + \_do={\r\ + \n :log error (\"\$SMP Script parameter `\\\$updateChannel` is not set, o\ + r contains invalid value: `\$updateChannel`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Verify if script is set to install patch updates and if the update cha\ + nnel is valid\r\ + \n:if ((\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \"\ + updateOnce\") and \$installOnlyPatchUpdates = true) do={\r\ + \n :if (\$updateChannel != \"stable\" and \$updateChannel != \"long-term\ + \") do={\r\ + \n :log error (\"\$SMP Patch-only updates enabled, but update channel `\ + \$updateChannel` is invalid. Only `stable` and `long-term` are supported. \ + Script stopped\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n \r\ + \n :if (\$runningChannel != \"stable\" and \$runningChannel != \"long-ter\ + m\") do={\r\ + \n :log error (\"\$SMP Script is set to install only patch updates, but\ + \_the installed RouterOS version is not from `stable` or `long-term` chann\ + el: `\$runningChannel`. Script stopped\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n}\r\ + \n#\r\ + \n\r\ + \n:local rawTime [/system clock get time];\r\ + \n:local rawDate [/system clock get date];\r\ + \n\r\ + \n:local deviceOsVerAndChannelRunning [/system/resource/get version];\r\ + \n\r\ + \n:local backupNameTemplate (\"backup_v\" . \$runningVersion . \"_\" .\ + \_\$runningChannel . \"_\" . \$MDTSFix);\r\ + \n:local backupNameBeforeUpdate (\$backupNameTemplate . \"_before_update\"\ + );\r\ + \n:local backupNameAfterUpdate (\$backupNameTemplate . \"_after_update\")\ + ;\r\ + \n\r\ + \n## Email body template\r\ + \n:local mailSubjectPrefix \"\$SMP Device - `\$IdentityShort`\";\r\ + \n:local mailBodyCopyright \"Mikrotik RouterOS automatic backup & update \ + (ver. \$scriptVersion) \\n\$copyrightUrl\";\r\ + \n:local changelogUrl \"Check RouterOS changelog: https://mikrotik.com\ + /download/changelogs/\";\r\ + \n:local mailBodyDeviceInfo \"\";\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"Device information:\")\ + ;\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\n-------------------\ + --\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nName: \$Identity\")\ + ;\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nModel: \$devModel\"\ + );\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nBoard: \$devBoardNa\ + me\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nSerial number: \$de\ + vRbSerialNumber\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nRouterOS version: v\ + \$deviceOsVerAndChannelRunning\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nBuild time: \$[/sys\ + tem/resource/get build-time]\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nRouterboard FW Avai\ + lable: \$ROsVerAvail\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nDevice date-time: \ + \$rawDate \$rawTime (\$[/system/clock/get time-zone-name ])\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nUptime: \$[/system/\ + resource/get uptime]\");\r\ + \n## IP address detection\r\ + \n:if ([ \$DevInfoIncludeIP ] = true) do={\r\ + \n :global GetPubIp;\r\ + \n :local PublicIpAddress [ \$GetPubIp ];\r\ + \n :set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nPublic IP address\ + : \" . \$PublicIpAddress . \".\");\r\ + \n :log info \"\$SMP Public IP address detected: \$PublicIpAddress\";\r\ + \n} \r\ + \n\r\ + \n:local mailAttachments [:toarray \"\"];\r\ + \n:if (\$scriptStep = 1 or \$scriptStep = 3) do={\r\ + \n :if (\$scriptStep = 3) do={\r\ + \n :log info (\"\$SMP Waiting for one minute before continuing to the f\ + inal step.\");\r\ + \n :delay 1m;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n## STEP 1: Create backups, check for new RouterOS, and send email\r\ + \n## Steps 2\C3\A23 run only if auto-update is enabled and a new version i\ + s available\r\ + \n:if (\$scriptStep = 1) do={\r\ + \n :global BackupPassword;\r\ + \n :global BackupSens;\r\ + \n :local isNewOsUpdateAvailable false;\r\ + \n :local isLatestOsAlreadyInstalled true;\r\ + \n :local isOsNeedsToBeUpdated false;\r\ + \n :local isUpdateCheckSucceeded false;\r\ + \n :local isEmailNeedsToBeSent false;\r\ + \n :local mailSubjectPartAction \"\";\r\ + \n :local mailPtBodyAction \"\";\r\ + \n :local mailPtSubjectBackup \"\";\r\ + \n :local mailPtBodyBackup \"\";\r\ + \n # Checking for new version\r\ + \n :if (\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \ + \"osnotify\" or \$BackupAndUpdateMode = \"updateOnce\") do={\r\ + \n :log info (\"\$SMP Setting update channel to `\$updateChannel`\");\r\ + \n /system/package/update/set channel=\$updateChannel;\r\ + \n :log info (\"\$SMP Checking for new RouterOS version. Current instal\ + led version is: `\$runningVersion`\");\r\ + \n \$LogPrint debug \$ScriptName (\"Checking for updates...\");\r\ + \n \r\ + \n# /system/package/update/check-for-updates without-paging as-value;\ + \r\ + \n# /system/package/update check-for-updates;\r\ + \n :delay 5s;\r\ + \n :set PkgUpdStatus [ /system/package/update/get status ];\r\ + \n :if (\$PkgUpdStatus = \"New version is available\") do={\r\ + \n :set ROsVerAvail [/system/package/update/get latest-version];\r\ + \n }\r\ + \n\r\ + \n :if (\$PkgUpdStatus = \"New version is available\") do={\r\ + \n :log info (\"\$SMP New RouterOS version is available: `\$ROsVerAva\ + il`\");\r\ + \n :set isNewOsUpdateAvailable true;\r\ + \n :set isLatestOsAlreadyInstalled false;\r\ + \n :set isUpdateCheckSucceeded true;\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :set mailSubjectPartAction \"New RouterOS available\";\r\ + \n :set mailPtBodyAction \"New RouterOS version is available, curren\ + t version: v\$runningVersion, new version: v\$ROsVerAvail. \\n\$changelogU\ + rl\";\r\ + \n } else={\r\ + \n :if (\$PkgUpdStatus = \"System is already up to date\") do={\r\ + \n :log info (\"\$SMP No new RouterOS version is available, the lat\ + est version is already installed: `v\$runningVersion`\");\r\ + \n :set isUpdateCheckSucceeded true;\r\ + \n :set mailSubjectPartAction \"No os update available\";\r\ + \n :set mailPtBodyAction \"No new RouterOS version is available, t\ + he latest version is already installed: `v\$runningVersion`\";\r\ + \n } else={\r\ + \n :log error (\"\$SMP Failed to check for new RouterOS version. Pa\ + ckage check status: `\$PkgUpdStatus`\");\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :set mailSubjectPartAction \"Error unable to check new os versio\ + n\";\r\ + \n :set mailPtBodyAction \"An error occurred while checking for a \ + new RouterOS version.\\nStatus returned: `\$PkgUpdStatus`\\n\\nPlease revi\ + ew the logs on the device for more details and verify internet connectivit\ + y.\";\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n # Checking if the script needs to install new os version\r\ + \n :if ((\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \ + \"updateOnce\") and \$isNewOsUpdateAvailable = true) do={\r\ + \n :if (\$installOnlyPatchUpdates = true) do={\r\ + \n :if ([\$FuncIsPatchUpdateOnly \$runningVersion \$ROsVerAvail] = tr\ + ue) do={\r\ + \n :log info \"\$SMP New RouterOS version is available, and it is a\ + \_patch update. Current version: v\$runningVersion, new version: v\$ROsVer\ + Avail\";\r\ + \n :set isOsNeedsToBeUpdated true;\r\ + \n } else={\r\ + \n :log info \"\$SMP The script will not install this update, becau\ + se it is not a patch update. Current version: v\$runningVersion, new versi\ + on: v\$ROsVerAvail\";\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nThis update wil\ + l not be installed, because the script is set to install only patch update\ + s.\");\r\ + \n }\r\ + \n } else={\r\ + \n :set isOsNeedsToBeUpdated true;\r\ + \n }\r\ + \n }\r\ + \n # Checking If the script needs to create a backup\r\ + \n :if (\$forceBackup = true or \$BackupAndUpdateMode = \"backup\" or \$i\ + sOsNeedsToBeUpdated = true) do={\r\ + \n :log info (\"\$SMP Starting backup process.\");\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :local backupName \$backupNameTemplate;\r\ + \n # This means it's the first step where we create a backup before the\ + \_update process\r\ + \n :if (\$isOsNeedsToBeUpdated = true) do={\r\ + \n :set backupName \$backupNameBeforeUpdate;\r\ + \n #Email body if the purpose of the script is to update the device\r\ + \n :set mailSubjectPartAction \"Update preparation\";\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nThe update proces\ + s for device '\$Identity' is scheduled to upgrade RouterOS from version v.\ + \$runningVersion to version v.\$ROsVerAvail (Update channel: \$updateChann\ + el)\");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nPlease note: The \ + update will proceed only after a successful backup.\");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nA final report wi\ + th detailed information will be sent once the update process is completed.\ + \");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nIf you do not rec\ + eive a second email within the next 10 minutes, there may be an issue. Ple\ + ase check your device logs for further information.\");\r\ + \n }\r\ + \n :do {\r\ + \n :set mailAttachments [\$FuncCreateBackups \$backupName \$BackupPas\ + sword \$BackupSens];\r\ + \n :set mailPtSubjectBackup \"Backup created\";\r\ + \n :set mailPtBodyBackup \"System backups have been successfully crea\ + ted and attached to this email.\";\r\ + \n } on-error={\r\ + \n :set isOsNeedsToBeUpdated false;\r\ + \n :set mailPtSubjectBackup \"Backup failed\";\r\ + \n :set mailPtBodyBackup \"The script failed to create backups. Pleas\ + e check device logs for more details.\";\r\ + \n :log warning \"\$SMP Backup creation failed. Update process will b\ + e canceled if automatic update is enabled\";\r\ + \n }\r\ + \n }\r\ + \n :if (\$isEmailNeedsToBeSent = true) do={\r\ + \n :log info \"\$SMP Preparing to send email...\";\r\ + \n :local mailStep1Subject \$mailSubjectPrefix;\r\ + \n :local mailStep1Body \"\";\r\ + \n # subject\r\ + \n :if (\$mailSubjectPartAction != \"\") do={:set mailStep1Subject (\$\ + mailStep1Subject . \" - \" . \$mailSubjectPartAction)}\r\ + \n :if (\$mailPtSubjectBackup != \"\") do={:set mailStep1Subject (\$ma\ + ilStep1Subject . \" - \" . \$mailPtSubjectBackup)}\r\ + \n # body\r\ + \n :if (\$mailPtBodyAction != \"\") do={:set mailStep1Body (\$mailStep1\ + Body . \$mailPtBodyAction . \"\\n\\n\")}\r\ + \n :if (\$mailPtBodyBackup != \"\") do={:set mailStep1Body (\$mailStep1\ + Body . \$mailPtBodyBackup . \"\\n\\n\")}\r\ + \n :set mailStep1Body (\$mailStep1Body . \$mailBodyDeviceInfo . \"\\n__\ + ________\\n\" . \$mailBodyCopyright);\r\ + \n :set mailStep1Body (\$mailStep1Body . \"\\n[*** TEST START ***]\\n\\\ + \$DeviceInfo: \" . [ \$DeviceInfo ] . \"\\n[*** TEST END ***]\\n\");\r\ + \n # Send email with backups\r\ + \n :do {\$FuncSendEmailSafe \$EmailGeneralTo \$mailStep1Subject \$mailS\ + tep1Body \$mailAttachments} on-error={\r\ + \n :set isOsNeedsToBeUpdated false;\r\ + \n :log error \"\$SMP The script will not proceed with the update pro\ + cess, because the email was not sent.\";\r\ + \n }\r\ + \n }\r\ + \n :if ([:len \$mailAttachments] > 0) do={\r\ + \n :log info \"\$SMP Cleaning up backup files from the file system...\"\ + ;\r\ + \n /file remove \$mailAttachments;\r\ + \n :delay 2s;\r\ + \n }\r\ + \n :if (\$isOsNeedsToBeUpdated = true) do={\r\ + \n :global OldMode;\r\ + \n :log info \"\$SMP everything is ready to install new RouterOS, going\ + \_to start the update process and reboot the device.\";\r\ + \n :do {\r\ + \n :local nextStep 2;\r\ + \n :if (\$isCloudHostedRouter = true) do={\r\ + \n :log info \"\$SMP The device is a cloud hosted router, the secon\ + d step updating the Routerboard firmware will be skipped.\";\r\ + \n :set nextStep 3;\r\ + \n }\r\ + \n :local scheduledCommand (\":delay 5s; /system/scheduler remove BKP\ + UPD-NEXT-BOOT-TASK; \\\r\ + \n :global buGlobalVarScriptStep \$nextStep; :global buGlobalVarTarg\ + etOsVersion \\\"\$ROsVerAvail\\\"; \\\r\ + \n :delay 10s; /system/script { run \$ScriptName; }\");\r\ + \n /system/scheduler add name=BKPUPD-NEXT-BOOT-TASK on-event=\$schedu\ + ledCommand start-time=startup interval=0;\r\ + \n /system/package/update install;\r\ + \n } on-error={\r\ + \n # Failed to install new os version, remove the task and variables\ + \r\ + \n :do {\r\ + \n /system/scheduler remove BKPUPD-NEXT-BOOT-TASK;\r\ + \n :set BackupAndUpdateMode \$OldMode;\r\ + \n :delay 2;\r\ + \n :do {\r\ + \n :global buGlobalVarTargetOsVersion (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \"ERROR Remove\ + \_global variable \\\$buGlobalVarTargetOsVersion failed!\");\r\ + \n }\r\ + \n# :if ([ :len \$OldMode ] > 0) do={\r\ + \n# :do {\r\ + \n# :global OldMode (a);\r\ + \n# } on-error={\r\ + \n# :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Re\ + move global variable \\\$OldMode failed!\");\r\ + \n# }\r\ + \n# }\r\ + \n } on-error={\r\ + \n :log error \"\$SMP Failed to install new RouterOS version. Pleas\ + e check device logs for more details. \\\r\ + \n \\nAnd Failed to remove task and variables! Check it!\";\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Remove \ + task and global variables!\");\r\ + \n }\r\ + \n :log error \"\$SMP Failed to install new RouterOS version. Please \ + check device logs for more details.\";\r\ + \n :local mailUpdateErrorSubject (\$mailSubjectPrefix . \" - Update f\ + ailed\");\r\ + \n :local mailUpdateErrorBody \"The script was unable to install new \ + RouterOS version. Please check device logs for more details.\";\r\ + \n # Send email with error\r\ + \n \$FuncSendEmailSafe \$EmailGeneralTo \$mailUpdateErrorSubject \$ma\ + ilUpdateErrorBody \"\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n## STEP 2: (Post-reboot) Upgrade RouterBOARD firmware\r\ + \n## Runs only if auto-update is enabled and a new RouterOS version was fo\ + und\r\ + \n:if (\$scriptStep = 2) do={\r\ + \n :log info \"\$SMP The script is in the second step, updating Routerboa\ + rd firmware.\";\r\ + \n :log info \"\$SMP Upgrading routerboard firmware from v.\$deviceRbCurr\ + entFw to v.\$deviceRbUpgradeFw\";\r\ + \n /system routerboard upgrade;\r\ + \n :delay 2;\r\ + \n :log info \"\$SMP routerboard upgrade process was completed, going to \ + reboot in a moment!\";\r\ + \n ## Set task to send final report on the next boot\r\ + \n /system scheduler add name=BKPUPD-NEXT-BOOT-TASK on-event=\":delay 2; \ + :global buGlobalVarScriptStep 3; \\\r\ + \n :global buGlobalVarTargetOsVersion \\\"\$buGlobalVarTargetOsVersion\\\ + \"; :delay 10s; /system/script { run \$ScriptName; }; \\ \r\ + \n :delay 5s; /system/scheduler remove BKPUPD-NEXT-BOOT-TASK;\" start-ti\ + me=startup interval=0;\r\ + \n :delay 2;\r\ + \n /system reboot;\r\ + \n}\r\ + \n\r\ + \n## STEP 3: Final report (after second reboot, with delay).\r\ + \n## Runs only if auto-update is enabled and a new RouterOS version was fo\ + und.\r\ + \n:if (\$scriptStep = 3) do={\r\ + \n :log info (\"\$SMP The script is in the third step, sending final repo\ + rt.\");\r\ + \n :local targetOsVersion \$buGlobalVarTargetOsVersion;\r\ + \n :do {\r\ + \n# /system/script/environment remove [find name=\"buGlobalVarTargetOsV\ + ersion\"];\r\ + \n :global buGlobalVarTargetOsVersion (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Remove glob\ + al variable \\\$buGlobalVarTargetOsVersion failed!\");\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$OldMode ] != 0) do={\r\ + \n :do {\r\ + \n# /system/script/environment remove [find name=\"OldMode\"];\r\ + \n :global OldMode (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR! Remove\ + \_global variable \\\$OldMode failed!\");\r\ + \n }\r\ + \n }\r\ + \n :if ([:len \$targetOsVersion] = 0) do={\r\ + \n :log warning \"\$SMP Something is wrong, the script was unable to ge\ + t the target updated OS version from the global variable.\";\r\ + \n }\r\ + \n :local mailStep3Subject \$mailSubjectPrefix;\r\ + \n :local mailStep3Body \"\";\r\ + \n :if (\$targetOsVersion = \$runningVersion) do={\r\ + \n :log info \"\$SMP Successfully verified new RouterOS version: target\ + : `\$targetOsVersion`, current: `\$runningVersion`\";\r\ + \n :set mailStep3Subject (\$mailStep3Subject . \" - Update completed - \ + Backup created\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"RouterOS and routerboard upg\ + rade process was completed\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"\\nNew RouterOS version: v.\ + \$targetOsVersion, routerboard firmware: v.\$deviceRbCurrentFw\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"\\n\$changelogUrl\\nBackups \ + of the upgraded system are in the attachment of this email.\\n\\n\$mailBod\ + yDeviceInfo\\n\\n\$mailBodyCopyright\");\r\ + \n :set mailAttachments [\$FuncCreateBackups \$backupNameAfterUpdate \$\ + BackupPassword \$BackupSens];\r\ + \n } else={\r\ + \n :log error \"\$SMP Failed to verify new RouterOS version: target: `\ + \$targetOsVersion`, current: `\$runningVersion`\";\r\ + \n :set mailStep3Subject (\$mailStep3Subject . \" - Update failed\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"The script was unable to ver\ + ify that the new RouterOS version was installed, target version: `\$target\ + OsVersion`, current version: `\$runningVersion`\\nCheck device logs for mo\ + re details.\\n\\n\$mailBodyDeviceInfo\\n\\n\$mailBodyCopyright\");\r\ + \n }\r\ + \n \$FuncSendEmailSafe \$EmailGeneralTo \$mailStep3Subject \$mailStep3Bod\ + y \$mailAttachments;\r\ + \n :if ([:len \$mailAttachments] > 0) do={\r\ + \n :log info \"\$SMP Cleaning up backup files from the file system...\"\ + ;\r\ + \n /file remove \$mailAttachments;\r\ + \n :delay 2;\r\ + \n }\r\ + \n :log info (\"\$SMP Final report email sent successfully, and the scrip\ + t has finished.\");\r\ + \n}\r\ + \n:log info (\"\$SMP the script has finished, script step: `\$scriptStep` \ + \\n\\n\");\r\ + \n\r\ + \n} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n" +add dont-require-permissions=no name=testGetPubIP owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global DevInfoIncludeIP;\r\ + \n:global CharacterReplace;\r\ + \n:global EscapeForRegEx;\r\ + \n:global UrlEncode;\r\ + \n\r\ + \n:if ([ \$DevInfoIncludeIP ] = true) do={\r\ + \n :global GetPubIp;\r\ + \n :local Char (\"\\n\\r\");\r\ + \n :local PublicIpAddress [\$GetPubIp];\r\ + \n# :if ([ :pick \$PublicIpAddress ([ :len \$PublicIpAddress ] - 2) ] = \ + \"\\n\") do={:error true}; :set error falseon-error={:set PublicIpAddress \ + (\$PublicIpAddress . Char)};\r\ + \n#:if ([ :pick \$PublicIpAddress ([ :len \$PublicIpAddress ] - 1) ] = \"/\ + n\") do={\r\ + \n#:log warning \"N is = //n\"; \r\ + \n# :set PublicIpAddress [ \$CharacterReplace \$PublicIpAddress \$Char \"\ + \" ];\r\ + \n#}\r\ + \n# :set PublicIpAddress [ \$UrlEncode \$PublicIpAddress ];\r\ + \n#:local IpLen ([ :len \$PublicIpAddress ] -1);\r\ + \n#:set PublicIpAddress [:pick \$PublicIpAddress 0 \$IpLen];\r\ + \n :log warning \"Public IP address detected: \$PublicIpAddress , len = \ + \$IpLen\";\r\ + \n}\r\ + \n" +add comment="download, import and update firewall address-lists" \ + dont-require-permissions=no name=AM-FwAddrLists owner=AM-FwAddrLists \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: AM-FwAddrLists\r\ + \n# Script comment: download, import and update firewall address-lists\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# https://ros.vados.ru/doc/fw-addr-lists.md\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ListsDirName (\"fw-addr-lists.d/\" . [ /system identity get nam\ + e ] . \"/\");\r\ + \n :local ListsUrl (\$GlobalScriptsUrl . \$ListsDirName);\r\ + \n :local ListsIndex \"index.lst\";\r\ + \n :local AddrListsTimeOut 1d;\r\ + \n :local CheckCerts false;\r\ + \n\r\ + \n :global CertificateAvailable;\r\ + \n :global EitherOr;\r\ + \n :global FetchHugeFiles;\r\ + \n :global HumanReadableNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global NetMask4;\r\ + \n :global NetMask6;\r\ + \n :global ScriptLock;\r\ + \n \r\ + \n :local FindDelim do={\r\ + \n :local ValidChars \"0123456789.:/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi\ + jklmnopqrstuvwxyz-\";\r\ + \n :for I from=0 to=[ :len \$1 ] do={\r\ + \n :if ([ :typeof [ :find \$ValidChars [ :pick (\$1 . \" \") \$I ] ] \ + ] != \"num\") do={\r\ + \n :return \$I;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local GetBranch do={\r\ + \n :global EitherOr;\r\ + \n :return [ :pick [ :convert transform=md5 to=hex [ :pick \$1 0 [ \$Ei\ + therOr [ :find \$1 \"/\" ] [ :len \$1 ] ] ] ] 0 2 ];\r\ + \n }\r\ + \n \r\ + \n :if ([ \$ScriptLock \$ScriptName ] = false) do={\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local ListComment (\"managed by \" . \$ScriptName);\r\ + \n :local Url (\$ListsUrl . \$ListsIndex);\r\ + \n :local tmpIndex false;\r\ + \n\r\ + \n :for I from=1 to=5 do={\r\ + \n :if (\$tmpIndex = false) do={\r\ + \n :set tmpIndex [ :tolf [ \$FetchHugeFiles \$ScriptName \$Url \$Chec\ + kCerts ] ];\r\ + \n :if (\$tmpIndex = false && \$I < 5) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading address-list \ + index, \" . \$I . \". try from: \" . \$Url);\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :if (\$tmpIndex = false) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading address-list inde\ + x from: \" . \$Url);\r\ + \n :set tmpIndex \"\";\r\ + \n }\r\ + \n\r\ + \n :foreach List in=[ :deserialize \$tmpIndex delimiter=\"\\n\" from=dsv \ + options=dsv.plain ] do={\r\ + \n# :set List (\$List->0);\r\ + \n :local ListName;\r\ + \n :local Delim [ \$FindDelim \$List ];\r\ + \n :if (\$Delim = 0) do={ :set List \"\"; };\r\ + \n :log warning (\$ScriptName . \" Parsing address-list index entry: \"\ + \_. \$List);\r\ + \n :if ([ :len \$List ] = 0) do={\r\ + \n :log error (\$ScriptName . \" Failed parsing address-list index en\ + try: \" . \$List);\r\ + \n } else={\r\ + \n :set ListName [ :pick \$List 0 \$Delim ];\r\ + \n }\r\ + \n :log warning (\$ScriptName . \" Parsing address-list index entry: \"\ + \_. \$ListName . \" - Ok.\");\r\ + \n :local ListUrl (\$ListsUrl . \$ListName);\r\ + \n :local CntAdd 0;\r\ + \n :local CntRenew 0;\r\ + \n :local CntRemove 0;\r\ + \n :local IPv4Addresses ({});\r\ + \n :local IPv6Addresses ({});\r\ + \n :local Failure false;\r\ + \n :local Data false;\r\ + \n :local TimeOut \$AddrListTimeOut;\r\ + \n\r\ + \n :for I from=1 to=5 do={\r\ + \n :if (\$Data = false) do={\r\ + \n :set Data [ :tolf [ \$FetchHugeFiles \$ScriptName \$ListUrl \$Ch\ + eckCerts ] ];\r\ + \n :if (\$Data = false && \$I < 5) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading for list '\ + \" . \$ListName . \"', \" . \$I . \". try from: \" . \$ListUrl);\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Data = false) do={\r\ + \n :set Data \"\";\r\ + \n :set Failure true;\r\ + \n :log warning (\$ScriptName . \" Failed downloading for list '\" . \ + \$ListName . \"' from: \" . \$ListUrl);\r\ + \n } else={\r\ + \n :log warning (\$ScriptName . \" Downloaded \" . [ \$HumanReadableN\ + um [ :len \$Data ] 1024 ] . \"B for list '\" . \$ListName . \"' from: \" .\ + \_\$ListUrl);\r\ + \n }\r\ + \n\r\ + \n :foreach Line in=[ :deserialize \$Data delimiter=\"\\n\" from=dsv op\ + tions=dsv.plain ] do={\r\ + \n :set Line (\$Line->0);\r\ + \n :local Address;\r\ + \n :if ([ :pick \$Line 0 1 ] = \"{\" && [ :pick \$Line ([ :len \$Line\ + \_] - 1) ] = \"}\") do={\r\ + \n :do {\r\ + \n :set Address [ :tostr ([ :deserialize from=json \$Line ]->\"ci\ + dr\") ];\r\ + \n } on-error={ }\r\ + \n } else={\r\ + \n :set Address ([ :pick \$Line 0 [ \$FindDelim \$Line ] ] . (\$L\ + ist->\"cidr\"));\r\ + \n }\r\ + \n :do {\r\ + \n :local Branch;\r\ + \n :if (\$Address ~ \"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\\ + .[0-9]{1,3}(/[0-9]{1,2})\?\\\$\") do={\r\ + \n :local Net \$Address;\r\ + \n :local CIDR 32;\r\ + \n :local Slash [ :find \$Address \"/\" ];\r\ + \n :if ([ :typeof \$Slash ] = \"num\") do={\r\ + \n :set Net [ :toip [ :pick \$Address 0 \$Slash ] ]\r\ + \n :set CIDR [ :pick \$Address (\$Slash + 1) [ :len \$Address ]\ + \_];\r\ + \n :set Address [ :tostr (([ :toip \$Net ] & [ \$NetMask4 \$CID\ + R ]) . [ \$IfThenElse (\$CIDR < 32) (\"/\" . \$CIDR) ]) ];\r\ + \n }\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n :if (\$Address ~ \"^[0-9a-zA-Z]*:[0-9a-zA-Z:\\\\.]+(/[0-9]{1,3})\ + \?\\\$\") do={\r\ + \n :local Net \$Address;\r\ + \n :local CIDR 128;\r\ + \n :local Slash [ :find \$Address \"/\" ];\r\ + \n :if ([ :typeof \$Slash ] = \"num\") do={\r\ + \n :set Net [ :toip6 [ :pick \$Address 0 \$Slash ] ]\r\ + \n :set CIDR [ :pick \$Address (\$Slash + 1) [ :len \$Address ]\ + \_];\r\ + \n }\r\ + \n :set Address (([ :toip6 \$Net ] & [ \$NetMask6 \$CIDR ]) . \"/\ + \" . \$CIDR);\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n :if (\$Address ~ \"^[\\\\.a-zA-Z0-9-]+\\\\.[a-zA-Z]{2,}\\\$\") d\ + o={\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n \r\ + \n\r\ + \n :foreach Entry in=[ /ip/firewall/address-list/find where \\\r\ + \n list=\$ListName comment=\$ListComment ] do={\r\ + \n :local Address [ /ip/firewall/address-list/get \$Entry address ];\ + \r\ + \n :local Branch [ \$GetBranch \$Address ];\r\ + \n :local TimeOut (\$IPv4Addresses->\$Branch->\$Address);\r\ + \n :if ([ :typeof \$TimeOut ] = \"time\") do={\r\ + \n :log warning (\$ScriptName . \" Renewing IPv4 address \" . \$Add\ + ress . \\\r\ + \n \" in list '\" . \$ListName . \"' with \" . \$TimeOut . \".\ + \");\r\ + \n /ip/firewall/address-list/set \$Entry timeout=\$TimeOut;\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address);\r\ + \n :set CntRenew (\$CntRenew + 1);\r\ + \n } else={\r\ + \n :if (\$Failure = false) do={\r\ + \n :log warning (\$ScriptName . \" Removing IPv4 address \" . \$A\ + ddress . \\\r\ + \n \" from list '\" . \$ListName . \".\");\r\ + \n /ip/firewall/address-list/remove \$Entry;\r\ + \n :set CntRemove (\$CntRemove + 1);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach Entry in=[ /ipv6/firewall/address-list/find where \\\r\ + \n list=\$ListName comment=\$ListComment ] do={\r\ + \n :local Address [ /ipv6/firewall/address-list/get \$Entry address ]\ + ;\r\ + \n :local Branch [ \$GetBranch \$Address ];\r\ + \n :local TimeOut (\$IPv6Addresses->\$Branch->\$Address);\r\ + \n :if ([ :typeof \$TimeOut ] = \"time\") do={\r\ + \n :log warning (\$ScriptName . \" Renewing IPv6 address \" . \$Add\ + ress . \\\r\ + \n \" in list '\" . \$ListName . \"' with \" . \$TimeOut . \".\ + \");\r\ + \n /ipv6/firewall/address-list/set \$Entry timeout=\$TimeOut;\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address);\r\ + \n :set CntRenew (\$CntRenew + 1);\r\ + \n } else={\r\ + \n :if (\$Failure = false) do={\r\ + \n :log warning (\$ScriptName . \" Removing IPv6 address \" . \$A\ + ddress . \\\r\ + \n \" from list '\" . \$ListName . \".\");\r\ + \n /ipv6/firewall/address-list/remove \$Entry;\r\ + \n :set CntRemove (\$CntRemove + 1);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach BranchName,Branch in=\$IPv4Addresses do={\r\ + \n :log warning (\$ScriptName . \" Handling branch: \" . \$BranchName\ + );\r\ + \n :foreach Address,Timeout in=\$Branch do={\r\ + \n :log warning (\$ScriptName . \" Adding IPv4 address \" . \$Addre\ + ss . \\\r\ + \n \" to list '\" . \$ListName . \"' with \" . \$Timeout . \".\ + \");\r\ + \n :onerror Err {\r\ + \n /ip/firewall/address-list/add list=\$ListName comment=\$ListCo\ + mment \\\r\ + \n address=\$Address timeout=\$Timeout;\r\ + \n :set CntAdd (\$CntAdd + 1);\r\ + \n } do={\r\ + \n :log warning (\$ScriptName . \" Failed to add IPv4 address \" \ + . \$Address . \\\r\ + \n \" to list '\" . \$ListName . \"': \" . \$Err);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach BranchName,Branch in=\$IPv6Addresses do={\r\ + \n :log warning (\$ScriptName . \" Handling branch: \" . \$BranchName\ + );\r\ + \n :foreach Address,Timeout in=\$Branch do={\r\ + \n :log warning (\$ScriptName . \" Adding IPv6 address \" . \$Addre\ + ss . \\\r\ + \n \" to list '\" . \$ListName . \"' with \" . \$Timeout . \".\ + \");\r\ + \n :onerror Err {\r\ + \n /ipv6/firewall/address-list/add list=\$ListName comment=\$List\ + Comment \\\r\ + \n address=\$Address timeout=\$Timeout;\r\ + \n :set CntAdd (\$CntAdd + 1);\r\ + \n } do={\r\ + \n :log warning (\$ScriptName . \" Failed to add IPv6 address \" \ + . \$Address . \\\r\ + \n \" to list '\" . \$ListName . \"': \" . \$Err);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :log info (\$ScriptName . \" list: \" . \$ListName . \\\r\ + \n \" (\" . [ \$HumanReadableNum (\$CntAdd + \$CntRenew) 1000 ] . \ + \")\" . \\\r\ + \n \" -- added: \" . [ \$HumanReadableNum \$CntAdd 1000 ] . \\\r\ + \n \" - renewed: \" . [ \$HumanReadableNum \$CntRenew 1000 ] . \\\r\ + \n \" - removed: \" . [ \$HumanReadableNum \$CntRemove 1000 ]);\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=awg-env owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/envs/add list=awg-proxy-env key=AWG_LISTEN value=\":55055\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_REMOTE value=\"109.107.17\ + 7.79:55055\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JC value=\"9\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JMIN value=\"105\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JMAX value=\"920\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S1 value=\"90\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S2 value=\"136\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S3 value=\"45\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S4 value=\"27\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H1 value=\"472437748-4724\ + 38637\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H2 value=\"707808381-7078\ + 09250\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H3 value=\"1609078552-160\ + 9079495\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H4 value=\"1012329484-101\ + 2329741\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I1 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I2 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I3 value=\"\ + \"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I4 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I5 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_SERVER_PUB value=\"o5IgCl\ + 1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_CLIENT_PUB value=[/interf\ + ace/wireguard/get [find name=wg-awg-proxy] public-key]" +add dont-require-permissions=no name=awg-container-add owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/add file=sata1/tmp/awg-proxy-amd64.tar.gz interface=veth-awg-pro\ + xy envlist=awg-proxy-env \\\ + \n hostname=awg-proxy root-dir=sata1/awg-proxy logging=yes shm-size=4M \ + start-on-boot=yes\ + \n/container/start [find where tag~\"awg-proxy\"]" +add dont-require-permissions=yes name=awg2-webui owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + put \"Download image, and save him to usb1/tmp\"\ + \n/tool/fetch url=\"https://ros.vados.ru/docker/awg2-webui-chr.tar\" dst-p\ + ath=sata1/tmp/awg2-webui.tar\ + \n\ + \n:put \"1. Create veth interface\"\ + \n/interface veth add name=veth-awg address=10.9.9.2/24 gateway=10.9.9.1\ + \n\ + \n:put \"2. Create bridge and add veth\"\ + \n/interface bridge add name=br-awg\ + \n/interface bridge port add bridge=br-awg interface=veth-awg\ + \n\ + \n:put \"3. Assign IP to bridge\"\ + \n/ip address add address=10.9.9.1/24 interface=br-awg\ + \n\ + \n:put \"4. NAT: masquerade container traffic\"\ + \n/ip firewall nat add chain=srcnat src-address=10.9.9.0/24 action=masquer\ + ade\ + \n\ + \n:put \"5. Port forward: UDP 443 \? container (AmneziaWG QUIC mimicry)\"\ + \n/ip firewall nat add chain=dstnat protocol=udp dst-port=443 action=dst-n\ + at to-addresses=10.9.9.2 to-ports=55055 in-interface=ether1\ + \n\ + \n:put \"6. Port forward: HTTPS 9443 \? container Web UI\"\ + \n/ip firewall nat add chain=dstnat protocol=tcp dst-port=9443 action=dst-\ + nat to-addresses=10.9.9.2 to-ports=443 in-interface=ether1\ + \n\ + \n:put \"Create environment list..\"\ + \n/container envs add list=awgui-env key=WEB_USER value=vados\ + \n/container envs add list=awgui-env key=WEB_PASS value=zoomzoomrulezz\ + \n/container envs add list=awgui-env key=SECRET_KEY value=RanDomSecret32Sy\ + mboLs2325272931q\ + \n/container envs add list=awgui-env key=AWG_ENDPOINT value=10.30.30.10:44\ + 3\ + \n\ + \n:put \"Load and start container...\"\ + \n/container add file=sata1/tmp/awg2-webui.tar interface=veth-awg hostname\ + =awg2-webui \\\ + \nroot-dir=sata1/awg2-webui layer-dir=sata1/docker/awg2-webu/ envlist=awgu\ + i-env start-on-boot=yes logging=yes shm-size=4M\ + \n\ + \n:put \"Start...\"\ + \n/container start 0\ + \n\ + \n:put \"Verify...\"\ + \n/container print\ + \n\ + \n:put \"Should show: status=running\"\ + \n\ + \n/log print where topics~\"container\"\ + \n\ + \n:put \"Should show: AWG started, nginx running\"\ + \n" +add dont-require-permissions=no name=awg-proxy-go-Client owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n:put \"[::::::::::::::: START :::::::::::::::]\"\ + \n:put \"\"\ + \n:put \"Add ram disk tmpfs\"\ + \n#/disk add type=tmpfs tmpfs-max-size=100M slot=ram\ + \n\ + \n:put \"veth and network:\"\ + \n /interface/bridge add name=docker port-cost-mode=short\ + \n /ip/address/add address=192.168.100.1/24 interface=docker\ + \n\ + \n /interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ + =awg-proxy-go-client\ + \n /interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ + \n\ + \n:put \"add config-client.json\"\ + \n/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ + \n/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json d\ + st=/app/config.json list=awgcfg-client\ + \n\ + \n#:put \"Download image, and save him to sata1/tmp/awgproxy-0.0.1-0034-am\ + d64.tar.gz\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/amneziawg/img/awgproxy-0.0.1-003\ + 4-amd64.tar.gz\" dst-#path=\"tmp/awgproxy-0.0.1-0034-amd64.tar.gz\"\ + \n\ + \n:put \"Add container\"\ + \n/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interface\ + =awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-proxy\ + -client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pro\ + xy-go-client\" mountlists=awgcfg-client\ + \n\ + \n:put \"Start container\"\ + \n#/container/start awg-proxy-go-client\ + \n\ + \n:put \"Add user:\"\ + \n /user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ + peskar55\ + \n\ + \n:put \"Add forwarding port web-ui\"\ + \n /ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ + face=ether1 protocol=tcp to-addresses=192.168.100.3 to-port=8088\ + \n\ + \n:put \"Add native WireGuard-server wg-awg, add address.\"\ + \n /interface/wireguard/add name=wg-awg-client\ + \n /ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ + \n\ + \n:put \"\"\ + \n:put \"[::::::::::::::: END :::::::::::::::]\"\ + \n" +add comment=awg2wg dont-require-permissions=no name=awg2wg-uninstall owner=\ + Manager policy=ftp,read,write,policy source="\r\ + \n :put \"Uninstalling AmneziaWG...\"\r\ + \n :log info \"Uninstalling AmneziaWG...\"\r\ + \n /ip/route/remove [find where comment=awg2wg-tunnel]\r\ + \n :do { /tool/netwatch/remove [find where comment=Monitor-AWG2WG] } on-e\ + rror={}\r\ + \n :do { /ip/route/remove [find where comment=Monitor-AWG2WG] } on-error=\ + {}\r\ + \n /container/stop [find where interface=veth-awg2wg]\r\ + \n :delay 7s\r\ + \n /interface/list/member/remove [find where interface=wg-awg2wg]\r\ + \n /container/remove [find where interface=veth-awg2wg]\r\ + \n /container/envs/remove [find where list=\"awg2wg-env\"]\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg2wg\"]\r\ + \n /ip/address/remove [find where address=\"172.20.0.1/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg2wg\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg2wg\"]\ + \r\ + \n /ip/address/remove [find where interface=\"wg-awg2wg\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg2wg\"]\r\ + \n :do { /file/remove [find where name~\"awg2wg.+tar\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"disk1/awg2wg\"] } on-error={}\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg2wg-uninstall]\r\ + \n" +add dont-require-permissions=no name=amneziawg-mikrotik-c owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ + \n:global imagesPath \"amneziawg/img/\";\ + \n:local Image \"awg-proxy-amd64-7.20-Docker.tar.gz\";\ + \n\ + \n:global DstDir \"sata1/dst/\";\ + \n\ + \n:local Url=(\$GlobalScriptsUrl . \$ImagesPath . \$Image);\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n" +add comment=Generator dont-require-permissions=no name=awg-VDSina owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# ============================================================\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\ + \n# 2026-06-30 22:08:12\ + \n# ============================================================\ + \n\ + \n# 0. Check prerequisites\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\ + \n :error \"Usage: /system/device-mode/update container=yes\"\ + \n}\ + \n\ + \n# Auto-detect storage\ + \n:global awgDisk \"disk1\"\ + \n{\ + \n :local usbFree 0\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \n } else={\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\ + \n :put \"USB found but not mounted. Format as ext4\?\"\ + \n :put \"Press 'y' to confirm:\"\ + \n :local key [/terminal/inkey timeout=30]\ + \n :if (\$key = 121 || \$key = 89) do={\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\ + \n :delay 3s\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n } else={ :put \"Format failed, using disk1\" }\ + \n } else={ :put \"Using disk1\" }\ + \n } else={ :put \"No USB, using disk1\" }\ + \n }\ + \n}\ + \n\ + \n# 1. Uninstall script\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \n :put \"Uninstallimg AmneziaWG...\"\ + \n :log info \"Uninstallimg AmneziaWG...\"\ + \n :local prevDNS \"\"\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\ + \n :local storageDisk \"disk1\"\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\ + \n :local prevTmpdir \"\"\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ + \n }\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\ + \n /container/stop [find where interface=veth-awg-VDSina]\ + \n :delay 7s\ + \n /container/remove [find where interface=veth-awg-VDSina]\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\ + \n :if (\$prevDNS != \"\") do={\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ + \n :put (\"DNS restored to: \$prevDNS\")\ + \n }\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n /container/config set tmpdir=\$prevTmpdir\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ + \n }\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\ + \n }\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\ + \n}\ + \n\ + \n# 2. Network infrastructure\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\ + \n\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ + yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ + QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\ + \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\ + \n\ + \n# 4. Container environment variables\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\ + \n\ + \n# 5. DNS\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\ + \n# NOTE: replaces existing DNS configuration\ + \n/ip/dns/set servers=109.107.177.79\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\ + \n\ + \n# 6. Download, create and start container\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \n:if (\$awgDisk != \"disk1\") do={\ + \n :local tmpPath (\$awgDisk . \"/pull\")\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\ + \n}\ + \n{\ + \n :local arch [/system/resource/get architecture-name]\ + \n :local ver [/system/resource/get version]\ + \n :local dotPos [:find \$ver \".\"]\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\ + \n :local endPos [:find \$rest \".\"]\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\ + \n :local suffix \"\"\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\ + \n :local file \"\"\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\ + \n :local filePath \$file\ + \n :if (\$awgDisk != \"disk1\") do={\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\ + \n }\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\ + \n :local freeStorage 0\ + \n :if (\$awgDisk = \"disk1\") do={\ + \n :set freeStorage [/system/resource/get free-hdd-space]\ + \n } else={\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\ + \n }\ + \n :if (\$freeStorage < 262144) do={\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\ + \n :error \"Insufficient disk space\"\ + \n }\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \n } else={\ + \n :put (\"File already exists: \" . \$filePath)\ + \n }\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\ + \n /file/remove \$filePath\ + \n :local freeMem [/system/resource/get free-memory]\ + \n :if (\$freeMem < 16777216) do={\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\ + \n }\ + \n /container/start [find where interface=veth-awg-VDSina]\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\ + \n :put \"Waiting for container to start...\"\ + \n :delay 5s\ + \n /interface/wireguard/enable wg-awg-VDSina\ + \n :put \"WireGuard interface enabled\"\ + \n :put \"Installation complete!\"\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\ + \n /ping 109.107.177.79 count=10 interval=1\ + \n :put \"\"\ + \n :put \"======= NEXT STEPS =======\"\ + \n :put \"\"\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\ + \n :put \"\"\ + \n :put \" Route a single host:\"\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Route a subnet:\"\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Remove a route:\"\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\ + \n :put \"\"\ + \n :put \" Show all tunnel routes:\"\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Uninstall:\"\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\ + \n :put \"=========================\"\ + \n}\ + \n\ + \n# 7. Verification\ + \n# /container/print\ + \n# /interface/wireguard/print\ + \n# /interface/wireguard/peers/print\ + \n" +add comment="wg2awg GH repo in client mode" dont-require-permissions=no name=\ + "wg2awg client" owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n\ + \n:local WorkDisk \"sata1\";\ + \n:local Name wg2awg;\ + \n:local Bridge (\"Bridge-\" . \$Name);\ + \n:local Vetch (\"vetch-\" . \$Name);\ + \n:local Env (\$Name . \"-env\");\ + \n:local ConfDir (\"/etc/\" . \$Name . \"/\");\ + \n:local ConfFile (\$Name . \".conf\");\ + \n:local Mounts (\$WorkDisk . \"/mounts/\" . \$Name . \"/\");\ + \n#:put \"\"\ + \n#put \"Add ram disk tmpfs\"\ + \n#/disk add type=tmpfs tmpfs-max-size=100M slot=ram\ + \n\ + \n\ + \n:log warning \"[::::::::::::::: START :::::::::::::::]\"\ + \n:log warning \"Add veth and nat...\";\ + \n:do {\ + \n/interface/veth/add name=\$Vetch address=172.18.0.2/30 gateway=172.18.0.\ + 1;\ + \n/ip/address/add address=172.18.0.1/30 interface=\$Vetch;\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.18.0\ + .0/30;\ + \n} on-error={}\ + \n\ + \n#:do {\ + \n#/file add type=directory name=\$Mounts\ + \n#} on-error={}\ + \n\ + \n:log warning (\"Remove config file \" . \$Mounts . \$ConfFile . \"...\")\ + ;\ + \n/file remove [find name=(\$Mounts . \$ConfFile)];\ + \n\ + \n:do {\ + \n:log warning (\"Add config file \" . \$Mounts . \$ConfFile . \"...\");\ + \n/file add type=file name=(\$Mounts . \$ConfFile) contents=\"[Interface]\ + \nPrivateKey = 4CHyNhbOs923/EyNDguMXJXdghL2I3UyzXPwrANVgHs=\ + \nAddress = 10.9.0.3/32\ + \nMTU = 1280\ + \nDNS = 109.107.177.79\ + \nPreUp = ip route add 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nPostDown = ip route del 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nJc = 9\ + \nJmin = 105\ + \nJmax = 920\ + \nS1 = 90\ + \nS2 = 136\ + \nS3 = 45\ + \nS4 = 27\ + \nH1 = 472437748-472438637\ + \nH2 = 707808381-707809250\ + \nH3 = 1609078552-1609079495\ + \nH4 = 1012329484-1012329741\ + \nI1 = <\ + r 4>\ + \nI2 = \ + \nI3 = \ + \nI4 = \ + \nI5 = \ + \n\ + \n[Peer]\ + \nPublicKey = o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\ + \nAllowedIPs = 0.0.0.0/0\ + \nEndpoint = 109.107.177.79:55055\ + \nPersistentKeepalive = 10\ + \nPresharedKey = RNvF7T1cg5tyXcYQnD9N5BEp6e20vVJQTv0GMjyvHU0=\";\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Remove mounts list \$Env...\");\ + \n/container/mounts/remove [find list=\$Env];\ + \n:log warning (\"Add mounts list \$Env...\");\ + \n/container/mounts/add src=(\$Mounts . \$ConfFile) dst=(\$ConfDir . \$Con\ + fFile) list=\$Env;\ + \n:log warning (\"Add mounts Environment key AWG_CONFIG.\");\ + \n/container/envs/add list=\$Env key=AWG_CONFIG value=(\$ConfDir . \$ConfF\ + ile);\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Remove \" . \$Mounts . \"tmp/\");\ + \n/file remove [find name=(\$Mounts . \"tmp\")];\ + \n:log warning (\"Add \" . \$Mounts . \"tmp/\");\ + \n/file add type=directory name=(\$Mounts . \"tmp\");\ + \n} on-error={}\ + \n\ + \n\ + \n#/interface/bridge add name=\$Bridge port-cost-mode=short;\ + \n#/ip/address/add address=192.168.100.1/24 interface=\$Bridge;\ + \n\ + \n#/interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ + =awg-proxy-go-client\ + \n#/interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ + \n\ + \n#:put \"add config-client.json\"\ + \n#/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ + \n#/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json \ + dst=/app/config.json list=awgcfg-client\ + \n\ + \n#:put \"Download image, and save him to sata1/tmp/awgproxy-0.0.1-0034-am\ + d64.tar.gz\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/amneziawg/img/awgproxy-0.0.1-003\ + 4-amd64.tar.gz\" dst-#path=\"tmp/awgproxy-0.0.1-0034-amd64.tar.gz\"\ + \n\ + \n#:put \"Add container\"\ + \n#/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interfac\ + e=awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-prox\ + y-client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pr\ + oxy-go-client\" mountlists=awgcfg-client\ + \n\ + \n#:put \"Start container\"\ + \n#/container/start awg-proxy-go-client\ + \n\ + \n#:put \"Add user:\"\ + \n#/user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ + peskar55\ + \n\ + \n#:put \"Add forwarding port web-ui\"\ + \n#/ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ + face=ether1 protocol=tcp to-addresses=192.168.100.3 to-port=8088\ + \n\ + \n#:put \"Add native WireGuard-server wg-awg, add address.\"\ + \n#/interface/wireguard/add name=wg-awg-client\ + \n#/ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ + \n\ + \n:put \"\"\ + \n:put \"[::::::::::::::: END :::::::::::::::]\"\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +add name=manager policy="local,ssh,ftp,read,write,policy,api,rest-api,!telnet,\ + !reboot,!test,!winbox,!password,!web,!sniff,!sensitive,!romon" +/app +set cinny firewall-redirects=8094:80:tcp:web +set goaway container-command-lines=goaway:none:docker.io/pommee/goaway:latest +set home-assistant container-command-lines=\ + home-assistant:none:lscr.io/linuxserver/homeassistant +set n8n firewall-redirects=5678:5678:tcp:web +set nextcloud container-command-lines="db:none:docker.io/postgres:17,redis:non\ + e:docker.io/valkey/valkey:/bin/sh -c 'valkey-server --port 6379 --appendon\ + ly yes --requirepass \$VALKEY_PASSWORD',server:none:docker.io/nextcloud:ap\ + ache" +set pihole environment="pihole:FTLCONF_dns_listeningMode=all,pihole:FTLCONF_we\ + bserver_api_password=password" +set redlib firewall-redirects=8087:8080:tcp:web +set solr container-command-lines=solr:none:docker.io/solr:latest +set uptime-kuma container-command-lines=\ + uptime-kuma:none:docker.io/louislam/uptime-kuma:1 +/app settings +set auto-update=yes disk=*7 lan-bridge=*3 registry-mirrors="https://reg.vados.\ + ru:5000/:https://reg.vados.ru/,https://registry-1.docker.io" +/caps-man aaa +set called-format=ssid +/caps-man access-list +add action=reject allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-120..-80 ssid-regexp="" +add action=accept allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-79..120 ssid-regexp="" +/caps-man configuration +add channel.band=2ghz-b/g/n country=no_country_set datapath=xs-DataPath mode=\ + ap name=xs-2G rx-chains=0,1,2,3 security=xs-Sec ssid=vados tx-chains=\ + 0,1,2,3 +add channel.band=5ghz-a/n/ac country=no_country_set datapath=xs-DataPath \ + installation=any mode=ap name=xs-5G rx-chains=0,1,2,3 security=xs-Sec \ + ssid=vados5g tx-chains=0,1,2,3 +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX .frequency=2422,2442,2462 .reselect-interval=20m country=belarus \ + datapath=DataPath datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes hw-protection-mode=rts-cts installation=any name=2G \ + rx-chains=0,1,2,3 security=WPA2 ssid=vados tx-chains=0,1,2,3 +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX .frequency=5180,5200,5220,5240,5260 .reselect-interval=20m \ + .skip-dfs-channels=yes country=belarus datapath=DataPath \ + datapath.client-to-client-forwarding=yes .local-forwarding=yes \ + hw-protection-mode=rts-cts installation=any name=5G security=WPA2 ssid=\ + vados5g +/caps-man datapath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + xs-DataPath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + DataPath +/caps-man manager +set ca-certificate=CAPsMAN-CA-51B25E507D07 certificate=CAPsMAN-51B25E507D07 \ + enabled=yes require-peer-certificate=yes +/caps-man manager interface +set [ find default=yes ] forbid=yes +add disabled=no interface=BridgeLAN +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=g,gn,b \ + master-configuration=2G name-format=prefix-identity name-prefix=2G +add action=create-dynamic-enabled hw-supported-modes=an,ac,a \ + master-configuration=5G name-format=prefix-identity name-prefix=5G +add action=create-dynamic-enabled disabled=yes hw-supported-modes=ac,an,a \ + master-configuration=2G name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled disabled=yes hw-supported-modes=an \ + master-configuration=5G name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set crl-store=system +/container config +set layer-dir=/sata1/docker/layers memory-high=200.0MiB memory-max=4096.0MiB \ + registry-url=https://registry-1.docker.io tmpdir=/sata1/tmp username=\ + amsternl +/container envs +add key=AWG_CONFIG list=wg2awg-env value=/etc/wg2awg/wg2awg.conf +/container mounts +add dst=/etc/wg2awg/wg2awg.conf list=wg2awg-env src=\ + /sata1/mounts/wg2awg/wg2awg.conf +/ip smb +set enabled=no +/interface bridge port +add bridge=BridgeLAN interface=ether1 +add bridge=BridgeLAN interface=2G-MikroGig-1 +add bridge=BridgeLAN interface=2G-MikroMaster-1 +add bridge=BridgeLAN interface=5G-MikroGig-1 +add bridge=BridgeLAN interface=5G-MikroMaster-1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes +/interface detect-internet +set detect-interface-list=all internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +add interface=ether1 list=WAN +/interface wifi cap +set discovery-interfaces=*DF +/interface wifi capsman +set package-path=/tmpfs/capsman-packages upgrade-policy=none +/ip address +add address=10.30.30.10/24 interface=BridgeLAN network=10.30.30.0 +add address=172.18.0.1/30 interface=vetch-wg2awg network=172.18.0.0 +/ip dhcp-client +add disabled=yes interface=ether1 name=client1 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set disabled=yes interface=*3 lease-script=\ + lease-script lease-time=10m name=nucDHCP server-address=10.30.30.10 +/ip dns +set allow-remote-requests=yes doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=10.30.30.33,109.107.177.79 \ + verify-doh-cert=yes +/ip firewall nat +add action=masquerade chain=srcnat src-address=172.18.0.0/30 +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip route +add check-gateway=none disabled=no distance=2 dst-address=0.0.0.0/0 gateway=\ + BridgeLAN routing-table=main scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set reverse-proxy disabled=yes +set ssh port=2222 +set www-ssl port=4443 +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ + webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=*3 type=external +add interface=*B5 type=internal +/ipv6 firewall address-list +add address=2400:cb00::/32 list=CLOUDFLARE-IP-Address +add address=2606:4700::/32 list=CLOUDFLARE-IP-Address +add address=2803:f800::/32 list=CLOUDFLARE-IP-Address +add address=2405:b500::/32 list=CLOUDFLARE-IP-Address +add address=2405:8100::/32 list=CLOUDFLARE-IP-Address +add address=2a06:98c0::/29 list=CLOUDFLARE-IP-Address +add address=2c0f:f248::/32 list=CLOUDFLARE-IP-Address +/special-login +add port=serial0 +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system gps +set set-system-time=yes +/system identity +set name=MikroNUC +/system note +set show-at-login=no +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes +/system ntp client servers +add address=10.30.30.81 +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 +/system scheduler +add comment="Every Day Set Global Environment Variables" disabled=yes 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" disabled=yes interval=1d \ + name=AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Fake Bridges" disabled=yes interval=1d name=\ + mod/AM-IPbridge on-event="/system/script/run mod/AM-IPbridge;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Telegram Chat Bot" disabled=yes interval=30s name=mod/AM-TG-Bot \ + on-event="/system/script/run mod/AM-TG-Bot;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment=\ + "Every 7 Day Check For Update and Backup send notification to EMail." \ + disabled=yes interval=1w name=AM-Backup-UpdateEmail on-event=\ + "/system/script { run AM-Backup-UpdateEmail; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-06-25 start-time=03:41:27 +/tool e-mail +set certificate-verification=no from=MikroNUC port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260703/20260703020001-Diff-Config.rsc b/MikroNUC/history/20260703/20260703020001-Diff-Config.rsc new file mode 100644 index 0000000..c540cf7 --- /dev/null +++ b/MikroNUC/history/20260703/20260703020001-Diff-Config.rsc @@ -0,0 +1,29 @@ +5082,5085d5081 +< \n:log warning (\"Remove config file \" . \$Mounts . \$ConfFile . \"...\")\ +< ;\ +< \n/file remove [find name=(\$Mounts . \$ConfFile)];\ +< \n\ +5087c5083 +< \n:log warning (\"Add config file \" . \$Mounts . \$ConfFile . \"...\");\ +--- +> \n:log warning \"Add config file...\";\ +5122,5124c5118 +< \n:log warning (\"Remove mounts list \$Env...\");\ +< \n/container/mounts/remove [find list=\$Env];\ +< \n:log warning (\"Add mounts list \$Env...\");\ +--- +> \n:log warning (\"Add mounts...\");\ +5126,5127c5120,5121 +< fFile) list=\$Env;\ +< \n:log warning (\"Add mounts Environment key AWG_CONFIG.\");\ +--- +> fFile) list=\$Env\ +> \n:log warning (\"Add mounts Environment key.\");\ +5130,5136d5123 +< \n} on-error={}\ +< \n\ +< \n:do {\ +< \n:log warning (\"Remove \" . \$Mounts . \"tmp/\");\ +< \n/file remove [find name=(\$Mounts . \"tmp\")];\ +< \n:log warning (\"Add \" . \$Mounts . \"tmp/\");\ +< \n/file add type=directory name=(\$Mounts . \"tmp\");\ -- 2.52.0