From dd3b0518b2881a7ef2edd8256639b498019d3e26 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 18 Sep 2026 10:20:07 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at Sep 18 10:20:07. --- .../20260918/20260918102001-Binary.backup | Bin 0 -> 243756 bytes .../20260918/20260918102001-Config.rsc | 4336 +++++++++++++++++ .../20260918/20260918102001-Diff-Config.rsc | 12 + 3 files changed, 4348 insertions(+) create mode 100644 MikroMaster/20260918/20260918102001-Binary.backup create mode 100644 MikroMaster/20260918/20260918102001-Config.rsc create mode 100644 MikroMaster/history/20260918/20260918102001-Diff-Config.rsc diff --git a/MikroMaster/20260918/20260918102001-Binary.backup b/MikroMaster/20260918/20260918102001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..ad888d12c371dfabd286950f05528fcb5a28c37f GIT binary patch literal 243756 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⋘{4)zZ0G}gz}pl}b~m#VthtVjBIsbh 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 z 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 IoeU#*hpS`KfdBvi literal 0 HcmV?d00001 diff --git a/MikroMaster/20260918/20260918102001-Config.rsc b/MikroMaster/20260918/20260918102001-Config.rsc new file mode 100644 index 0000000..ff63b5a --- /dev/null +++ b/MikroMaster/20260918/20260918102001-Config.rsc @@ -0,0 +1,4336 @@ +# 2026-09-18 10:20:03 by RouterOS 7.23.3 +# software id = 2961-C4ZZ +# +# model = RBD52G-5HacD2HnD +# serial number = HCX084RAVFA +/interface bridge +add name=Bridge-Lan +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(17dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] disabled=no mode=ap-bridge ssid=vados \ + wireless-protocol=802.11 +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(20dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] disabled=no mode=ap-bridge ssid=vados5g \ + wireless-protocol=802.11 +/interface ethernet +set [ find default-name=ether1 ] mac-address=48:8F:5A:8E:1A:BC name=\ + "ether1 - Unet" +/interface veth +add address=172.19.14.102/30 container-mac-address=30:C8:D7:A4:6C:D6 dhcp=no \ + gateway=172.19.14.101 gateway6="" mac-address=30:C8:D7:A4:6C:D5 name=\ + veth-awg3vds +/interface wireguard +add listen-port=41430 mtu=1320 name=wg-awg3vds +add disabled=yes listen-port=32252 mtu=1420 name=wg1 +/interface list +add comment=defconf name=WAN +add comment=defconf name=LAN +add exclude=LAN include=WAN name=Internet +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroTik +/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 +/ip dns forwarders +add disabled=yes dns-servers=1.1.1.1,1.0.0.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 pool +add name=dhcp ranges=10.30.30.150-10.30.30.200 +/ip dhcp-server +add address-pool=dhcp bootp-support=dynamic dhcp-option-set=domain-search-set \ + interface=Bridge-Lan name=masterDHCP server-address=10.30.30.81 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/routing table +add disabled=no fib name=To-VPN +/system script +add dont-require-permissions=no name=fetchCustom owner=admin policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n\ + \n\ + \n#\ + \n\ + \n#root.mnuc.backuper\ + \n\ + \n\ + \n\ + \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\";\ + \n\ + \n\ + \n#:local Script AM-GlobalConfig;\ + \n\ + \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\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n\ + \n:global MkDir;\ + \n\ + \n\ + \n:local FetchFile Manager@id_rsa.pub\ + \n:local localDir \"/\";\ + \n\ + \n\ + \n\ + \n\$MkDir \$localDir;\ + \n\ + \n\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig-2026-09-1211:58:18.rsc 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 dont-require-permissions=no name=AM-Fetch-Generator owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \n:local srcFile \"AM-Awg-Generator.rsc\";\ + \n:local dstFile \$srcFile;\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"/\$srcFile\") dst-pat\ + h=\"/\$dstFile\";\ + \n\ + \nexit 0\ + \n#\ + \n\ + \n#root.mnuc.backuper\ + \n\ + \n\ + \n\ + \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\";\ + \n\ + \n\ + \n#:local Script AM-GlobalConfig;\ + \n\ + \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\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n\ + \n:global MkDir;\ + \n\ + \n\ + \n:local FetchFile Manager@id_rsa.pub\ + \n:local localDir \"/\";\ + \n\ + \n\ + \n\ + \n\$MkDir \$localDir;\ + \n\ + \n\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\ + \n" +add comment=awg2vds dont-require-permissions=no name=awg2vds-uninstall owner=\ + vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n :put \"Uninstallimg AmneziaWG...\"\ + \n :log info \"Uninstallimg AmneziaWG...\"\ + \n :local prevDNS \"\"\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg2vds-env\ + \" key=\"AWG_PREV_DNS\"] value] } on-error={}\ + \n :local prevTmpdir \"\"\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg2vds-\ + env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ + \n /ip/route/remove [find where comment=awg2vds-tunnel]\ + \n /ip/route/remove [find where comment=awg2vds-dns]\ + \n /container/stop [find where interface=veth-awg2vds]\ + \n :delay 7s\ + \n /container/remove [find where interface=veth-awg2vds]\ + \n /container/envs/remove [find where list=\"awg2vds-env\"]\ + \n :if (\$prevDNS != \"\") do={\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ + \n :put (\"DNS restored to: \$prevDNS\")\ + \n }\ + \n /container/config set tmpdir=\$prevTmpdir\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg2vds\"]\ + \n /ip/firewall/nat/remove [find where src-address=\"172.20.200.68/30\"]\ + \n /ip/address/remove [find where address=\"172.20.200.69/30\"]\ + \n /interface/veth/remove [find where name=\"veth-awg2vds\"]\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg2vds\"\ + ]\ + \n /ip/address/remove [find where interface=\"wg-awg2vds\"]\ + \n /interface/wireguard/remove [find where name=\"wg-awg2vds\"]\ + \n :do { /file/remove [find where name~\"awg2vds.+tar\"] } on-error={}\ + \n :do { /file/remove [find where name=\"usb1/awg2vds\"] } on-error={}\ + \n :do { /file/remove [find where name=\"usb1/ru_ranges_timeout.rsc\"] } \ + on-error={}\ + \n :do { /file/remove [find where name~\"usb1/pull\"] } on-error={}\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ + \n /system/script/remove [find where name=awg2vds-uninstall]\ + \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/17176/0d89ed8d\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 02:20:04 14.09.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="awg3vds installer" dont-require-permissions=no name=\ + AM-awg3vdsInstall owner=AM-awg3vdsInstall policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-awg3vdsInstall\r\ + \n# Script comment: awg3vds installer\r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n# ============================================================\r\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v3)\r\ + \n# 2026-09-12 08:41:48\r\ + \n# ============================================================\r\ + \n# 0. Check prerequisites\r\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\r\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\r\ + \n :error \"Usage: /system/device-mode/update container=yes\"\r\ + \n}\r\ + \n\r\ + \n# Check storage device\r\ + \n{\r\ + \n :local targetDisk \"usb1\"\r\ + \n :local diskFree 0\r\ + \n :do { :set diskFree [/disk/get [find where mount-point=\$targetDisk] f\ + ree] } on-error={}\r\ + \n :if (\$diskFree = 0) do={\r\ + \n :local baseDisk \$targetDisk\r\ + \n :local dashPos [:find \$targetDisk \"-part\"]\r\ + \n :if ([:typeof \$dashPos] != \"nil\") do={ :set baseDisk [:pick \$tar\ + getDisk 0 \$dashPos] }\r\ + \n :if ([:len [/disk/find where slot=\$baseDisk]] > 0) do={\r\ + \n :put (\"Device \$baseDisk found but \$targetDisk is not available.\ + \")\r\ + \n :put \"Format \$baseDisk as ext4\? ALL DATA WILL BE ERASED!\"\r\ + \n :put \"Press 'y' to confirm, any other key to cancel:\"\r\ + \n :local key [/terminal/inkey timeout=30]\r\ + \n :if (\$key = 121 || \$key = 89) do={\r\ + \n :put \"Formatting \$baseDisk as ext4...\"\r\ + \n /disk/format-drive \$baseDisk file-system=ext4 label=\$baseDisk\ + \r\ + \n :delay 3s\r\ + \n :do { :set diskFree [/disk/get [find where mount-point=\$targetD\ + isk] free] } on-error={}\r\ + \n :if (\$diskFree = 0) do={\r\ + \n :put (\"ERROR: \$targetDisk not found after formatting.\")\r\ + \n :put \"Check mount point: /disk/print\"\r\ + \n :error (\"Mount point \$targetDisk not found after formatting\ + \")\r\ + \n }\r\ + \n :put (\"Formatted OK. Free: \" . (\$diskFree / 1048576) . \" MB\ + \")\r\ + \n } else={\r\ + \n :error \"Formatting cancelled\"\r\ + \n }\r\ + \n } else={\r\ + \n :put (\"ERROR: Storage device \$targetDisk not found.\")\r\ + \n :put \"Check available disks: /disk/print\"\r\ + \n :error (\"Storage not found: \" . \$targetDisk)\r\ + \n }\r\ + \n } else={\r\ + \n :put (\"Storage OK: \$targetDisk (\" . (\$diskFree / 1048576) . \" M\ + B free)\")\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 1. Uninstall and update scripts\r\ + \n/system/script/add name=awg3vds-uninstall comment=awg3vds source={\r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg3vds-env\ + \" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg3vds-\ + env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n /ip/route/remove [find where comment=awg3vds-tunnel]\r\ + \n /ip/route/remove [find where comment=awg3vds-dns]\r\ + \n :do { /system/scheduler/remove [find where comment~\"awg3vds\"] } on-e\ + rror={}\r\ + \n :do { /system/script/remove [find where comment~\"awg3vds\" and name!=\ + \"awg3vds-uninstall\"] } on-error={}\r\ + \n /container/stop [find where interface=veth-awg3vds]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg3vds]\r\ + \n /container/envs/remove [find where list=\"awg3vds-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg3vds\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.14.100/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.14.101/30\"]\r\ + \n :do { /ipv6/firewall/nat/remove [find where comment=awg3vds-v6-nat] } \ + on-error={}\r\ + \n :do { /ipv6/firewall/nat/remove [find where comment=awg3vds-dstnat6] }\ + \_on-error={}\r\ + \n :do { /ipv6/firewall/filter/remove [find where comment=awg3vds-v6-out]\ + \_} on-error={}\r\ + \n :do { /ipv6/firewall/filter/remove [find where comment=awg3vds-awg-in6\ + ] } on-error={}\r\ + \n :do { /ipv6/nd/remove [find where interface=veth-awg3vds] } on-error={\ + }\r\ + \n :do { /ipv6/nd/prefix/remove [find where interface=veth-awg3vds] } on-\ + error={}\r\ + \n :do { /ipv6/address/remove [find where comment=awg3vds-v6] } on-error=\ + {}\r\ + \n /interface/veth/remove [find where name=\"veth-awg3vds\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg3vds\"\ + ]\r\ + \n /ip/address/remove [find where interface=\"wg-awg3vds\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg3vds\"]\r\ + \n :do { /file/remove [find where name~\"awg3vds.+tar\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/awg3vds\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/ru_ranges_timeout.rsc\"] } \ + on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/ru_ranges.rsc\"] } on-error\ + ={}\r\ + \n :do { /file/remove [find where name~\"usb1/pull\"] } 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=awg3vds-uninstall]\r\ + \n}\r\ + \n/system/script/add name=awg3vds-update comment=awg3vds source={\r\ + \n :local cids [/container/find where interface=veth-awg3vds and !stopped\ + ]\r\ + \n :if ([:len \$cids] = 0) do={ :set cids [/container/find where interfac\ + e=veth-awg3vds and start-on-boot=yes] }\r\ + \n :if ([:len \$cids] = 0) do={ :set cids [/container/find where interfac\ + e=veth-awg3vds] }\r\ + \n :if ([:len \$cids] = 0) do={\r\ + \n :put \"Container awg3vds not found\"\r\ + \n :log warning \"awg3vds-update: container not found\"\r\ + \n } else={\r\ + \n :local cid [:pick \$cids ([:len \$cids] - 1)]\r\ + \n :local img [/container/get \$cid remote-image]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \"\ + \_\"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local wantRunning true\r\ + \n :do { :if ([/container/get \$cid start-on-boot] != true) do={ :set w\ + antRunning false } } on-error={}\r\ + \n :local healthy true\r\ + \n :if ([:len [/container/get \$cid image-id]] = 0) do={ :set healthy f\ + alse }\r\ + \n :if (\$wantRunning) do={\r\ + \n :do { :if ([/container/get \$cid stopped] = true) do={ :set health\ + y false } } on-error={}\r\ + \n }\r\ + \n :if (!\$healthy && \$wantRunning && [:len [/container/get \$cid imag\ + e-id]] > 0) do={\r\ + \n :put \"Container is down - trying to start it\"\r\ + \n :do { /container/start \$cid } on-error={}\r\ + \n :delay 8s\r\ + \n :set healthy true\r\ + \n :do { :if ([/container/get \$cid stopped] = true) do={ :set health\ + y false } } on-error={}\r\ + \n :if (\$healthy) do={\r\ + \n :put \"Container is back up\"\r\ + \n :log info \"awg3vds: container restarted by the update script\"\ + \r\ + \n }\r\ + \n }\r\ + \n :if (\$img = \"\" && \$minor >= 22 && !\$healthy) do={\r\ + \n :local imgTag \"latest\"\r\ + \n :local rbModel \"\"\r\ + \n :do { :set rbModel [[:parse \":return [/system/routerboard/get mod\ + el]\"]] } on-error={}\r\ + \n :local bName [/system/resource/get board-name]\r\ + \n :if (\$rbModel~\"E50UG\" || \$rbModel~\"E60iUGS\" || \$bName~\"E50\ + UG\" || \$bName~\"E60iUGS\" || \$bName~\"^hEX\") do={\r\ + \n :set imgTag \"latest-armv5\"\r\ + \n }\r\ + \n :set img (\"ghcr.io/timbrs/awg-proxy:\" . \$imgTag)\r\ + \n :put (\"Container is down and was installed from a file - pointing\ + \_it at \" . \$img)\r\ + \n :log warning \"awg3vds-update: broken file install, switching to t\ + he registry\"\r\ + \n :do { /container/set \$cid remote-image=\$img } on-error={}\r\ + \n }\r\ + \n :if (\$img = \"\") do={\r\ + \n :put \"Installed from a local image file - /container/repull only \ + updates registry installs.\"\r\ + \n :put \"Reinstall with the configurator on RouterOS 7.22+ to switch\ + \_to one-command updates.\"\r\ + \n } else={\r\ + \n :if (\$minor < 22) do={\r\ + \n :put (\"/container/repull needs RouterOS 7.22+, this router runs\ + \_\" . \$ver)\r\ + \n :if (!\$healthy) do={ :log error (\"awg3vds-update: container is\ + \_down, and \" . \$ver . \" has no /container/repull\") }\r\ + \n } else={\r\ + \n :local rootDir [/container/get \$cid root-dir]\r\ + \n :if ([:pick \$rootDir 0 1] = \"/\") do={ :set rootDir [:pick \$r\ + ootDir 1 [:len \$rootDir]] }\r\ + \n :local rootDirOrig \$rootDir\r\ + \n :local slashPos [:find \$rootDir \"/\"]\r\ + \n :local disk \$rootDir\r\ + \n :if ([:typeof \$slashPos] != \"nil\") do={ :set disk [:pick \$ro\ + otDir 0 \$slashPos] }\r\ + \n :local verPath \"awg-update-check.json\"\r\ + \n :if (\$disk != \"disk1\") do={\r\ + \n :do { /file/make-directory (\$disk . \"/pull\") } on-error={}\ + \r\ + \n /container/config set tmpdir=(\$disk . \"/pull\")\r\ + \n :set verPath (\$disk . \"/pull/awg-update-check.json\")\r\ + \n }\r\ + \n :local newVer \"\"\r\ + \n :do {\r\ + \n /tool/fetch url=\"https://api.github.com/repos/timbrs/amneziaw\ + g-mikrotik-c/releases/latest\" dst-path=\$verPath http-max-redirect-count=\ + 10\r\ + \n :local relJson [/file/get [find where name=\$verPath] contents\ + ]\r\ + \n :local tagPos [:find \$relJson \"\\\"tag_name\\\":\\\"\"]\r\ + \n :if ([:typeof \$tagPos] != \"nil\") do={\r\ + \n :local tagRest [:pick \$relJson (\$tagPos + 12) [:len \$relJ\ + son]]\r\ + \n :set newVer [:pick \$tagRest 0 [:find \$tagRest \"\\\"\"]]\r\ + \n }\r\ + \n :do { /file/remove [find where name=\$verPath] } on-error={}\r\ + \n } on-error={ :put \"Could not read the published version\" }\r\ + \n :local curVer \"\"\r\ + \n :do { :set curVer [/container/envs/get [find where list=\"awg3vd\ + s-env\" key=\"AWG_IMAGE_VER\"] value] } on-error={}\r\ + \n :local doPull true\r\ + \n :if (\$healthy) do={\r\ + \n :if (\$newVer = \"\") do={\r\ + \n :set doPull false\r\ + \n :put \"Published version unknown - leaving the healthy conta\ + iner alone\"\r\ + \n }\r\ + \n :if (\$newVer != \"\" && \$newVer = \$curVer) do={\r\ + \n :set doPull false\r\ + \n :put (\"Already on \" . \$curVer . \" - nothing to pull, tun\ + nel untouched\")\r\ + \n }\r\ + \n }\r\ + \n :if (\$doPull) do={\r\ + \n :if (!\$healthy) do={\r\ + \n :put \"Container is not healthy - pulling the image again\"\ + \r\ + \n :log warning \"awg3vds-update: container unhealthy, forcing \ + a pull\"\r\ + \n }\r\ + \n :put (\"Updating \" . \$img . \" ...\")\r\ + \n :log info \"awg3vds: repull started\"\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.backu\ + p\")] } on-error={}\r\ + \n :do { [:parse \"/container/set \$cid ignore-remote-image-chang\ + e=yes\"] } on-error={}\r\ + \n /container/repull \$cid\r\ + \n :local waited 0\r\ + \n :while ([:len [/container/get \$cid image-id]] = 0 && \$waited\ + \_< 180) do={\r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n :if ([:len [/container/get \$cid image-id]] = 0) do={\r\ + \n :put \"Pull failed - retrying once in 15s\"\r\ + \n :delay 15s\r\ + \n /container/repull \$cid\r\ + \n :set waited 0\r\ + \n :while ([:len [/container/get \$cid image-id]] = 0 && \$wait\ + ed < 180) do={\r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n }\r\ + \n :local backUp false\r\ + \n :if ([:len [/container/get \$cid image-id]] > 0) do={\r\ + \n :set backUp true\r\ + \n :if (\$wantRunning) do={\r\ + \n :delay 3s\r\ + \n :do { /container/start \$cid } on-error={}\r\ + \n :delay 8s\r\ + \n :set backUp false\r\ + \n :do { :if ([/container/get \$cid stopped] != true) do={ :s\ + et backUp true } } on-error={}\r\ + \n }\r\ + \n }\r\ + \n :if (!\$backUp) do={\r\ + \n :put \"Container did not come back up - rebuilding it from t\ + he registry\"\r\ + \n :log warning \"awg3vds-update: container did not come back, \ + rebuilding\"\r\ + \n :do { /container/stop \$cid } on-error={}\r\ + \n :delay 5s\r\ + \n :do { /container/remove \$cid } on-error={}\r\ + \n :delay 3s\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.bac\ + kup\")] } on-error={}\r\ + \n :do { /container/add remote-image=\$img interface=veth-awg3v\ + ds envlist=awg3vds-env hostname=awg3vds root-dir=\$rootDirOrig logging=no \ + start-on-boot=yes comment=awg3vds } on-error={}\r\ + \n :set waited 0\r\ + \n :local newCids [/container/find where interface=veth-awg3vds\ + \_and start-on-boot=yes]\r\ + \n :if ([:len \$newCids] = 0) do={ :set newCids [/container/fin\ + d where interface=veth-awg3vds] }\r\ + \n :while ([:len \$newCids] > 0 && [:len [/container/get [:pick\ + \_\$newCids ([:len \$newCids] - 1)] image-id]] = 0 && \$waited < 180) do={\ + \r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n :if ([:len \$newCids] > 0 && [:len [/container/get [:pick \$\ + newCids ([:len \$newCids] - 1)] image-id]] > 0) do={\r\ + \n :do { /container/set [:pick \$newCids ([:len \$newCids] - \ + 1)] shm-size=4M } on-error={}\r\ + \n :do { [:parse \"/container/set [find where interface=veth-\ + awg3vds] ignore-remote-image-change=yes\"] } on-error={}\r\ + \n :do { [:parse \"/container/set [find where interface=veth-\ + awg3vds] restart-policy=on-failure restart-interval=30s restart-max-count=\ + 10\"] } on-error={}\r\ + \n :do { /container/start [:pick \$newCids ([:len \$newCids] \ + - 1)] } on-error={}\r\ + \n :delay 8s\r\ + \n :do { :if ([/container/get [:pick \$newCids ([:len \$newCi\ + ds] - 1)] stopped] != true) do={ :set backUp true } } on-error={}\r\ + \n }\r\ + \n :if (\$backUp) do={\r\ + \n :put \"Container rebuilt\"\r\ + \n :log info \"awg3vds: container rebuilt after update\"\r\ + \n } else={\r\ + \n :put \"Rebuild failed - the tunnel is down. Netwatch keeps\ + \_the router online meanwhile.\"\r\ + \n :put \"This script runs again on the next schedule and wil\ + l retry.\"\r\ + \n :log error \"awg3vds-update: rebuild failed, tunnel is dow\ + n\"\r\ + \n }\r\ + \n }\r\ + \n :if (\$backUp && \$newVer != \"\") do={\r\ + \n :do { /container/envs/remove [find where list=\"awg3vds-env\ + \" key=\"AWG_IMAGE_VER\"] } on-error={}\r\ + \n :do { /container/envs/add list=awg3vds-env key=AWG_IMAGE_VER\ + \_value=\$newVer } on-error={}\r\ + \n }\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.backu\ + p\")] } on-error={}\r\ + \n :if (\$backUp) do={\r\ + \n :put (\"Update done: \" . \$img)\r\ + \n :log info \"awg3vds: update done\"\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n# Daily update check. Skipped if scheduler is not allowed by device-mode\ + \r\ + \n{\r\ + \n :local schedOk true\r\ + \n :do { :set schedOk [/system/device-mode/get scheduler] } on-error={}\r\ + \n :if (\$schedOk) do={\r\ + \n /system/scheduler/add name=awg3vds-update on-event=\"/system/script/\ + run awg3vds-update\" start-time=04:30:00 interval=1d comment=awg3vds\r\ + \n } else={\r\ + \n :put \"WARNING: scheduler not allowed by device-mode, no daily updat\ + e check.\"\r\ + \n :put \"Update by hand: /system/script/run awg3vds-update\"\r\ + \n :put \"To allow it: /system/device-mode/update scheduler=yes\"\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 2. Network infrastructure\r\ + \n/interface/veth/add name=veth-awg3vds address=172.19.14.102/30 gateway=1\ + 72.19.14.101\r\ + \n/ip/address/add address=172.19.14.101/30 interface=veth-awg3vds\r\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.1\ + 4.100/30\r\ + \n\r\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \r\ + \n/interface/wireguard/add name=wg-awg3vds private-key=\"AEU+diR7SCIEOtwOW\ + SWR3pEpkw6v0Qro2LRF0SnPpnw=\" listen-port=41430 mtu=1320 disabled=yes\r\ + \n/interface/wireguard/peers/add interface=wg-awg3vds public-key=\"MMWjD/T\ + PNpupCvhXLCAw0xHXV4N6jgtQkg9Pl6pcQhU=\" preshared-key=\"r9B13bB7gUTqde6zgB\ + DfffFIUN6puP2gOWdK5zVS3nw=\" endpoint-address=172.19.14.102 endpoint-port=\ + 51820 allowed-address=10.31.31.0/24,0.0.0.0/0 persistent-keepalive=14\r\ + \n/ip/address/add address=10.31.31.2/24 interface=wg-awg3vds\r\ + \n\r\ + \n# 4. Container environment variables\r\ + \n/container/envs/add list=awg3vds-env key=AWG_LISTEN value=\":51820\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_REMOTE value=\"89.110.101.1\ + 7:31031\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_JC value=\"5\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_JMIN value=\"510\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_JMAX value=\"952\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_S1 value=\"138\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_S2 value=\"105\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_H1 value=\"457615290-457646\ + 150\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_H2 value=\"1307355386-13073\ + 63580\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_H3 value=\"2441734303-24417\ + 81787\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_H4 value=\"3719180788-37191\ + 95844\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_SERVER_PUB value=\"MMWjD/TP\ + NpupCvhXLCAw0xHXV4N6jgtQkg9Pl6pcQhU=\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_CLIENT_PUB value=[/interfac\ + e/wireguard/get [find name=wg-awg3vds] public-key]\r\ + \n/container/envs/add list=awg3vds-env key=AWG_S3 value=\"51\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_S4 value=\"22\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_I1 value=\"\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_I2 value=\"\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_I3 value=\"\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_I4 value=\"\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_I5 value=\"\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_HEADER_PROTECTION_KEY value\ + =\"FkGxbrW6ds3YPWNl48OWFEccrLC4tF94z9MnoKUZUsM=\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_CONTENT_PADDING value=\"54-\ + 119\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_REKEY_AFTER value=\"102-130\ + \"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_REKEY_TIMEOUT value=\"6-8\"\ + \r\ + \n/container/envs/add list=awg3vds-env key=AWG_REJECT_AFTER value=\"174-19\ + 5\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_KEEPALIVE_TIMEOUT value=\"1\ + 4-21\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_MAX_HANDSHAKE_ATTEMPTS valu\ + e=\"12-14\"\r\ + \n/container/envs/add list=awg3vds-env key=AWG_NO_DF value=\"1\"\r\ + \n# Perf: give each forwarding thread its own core (4+ core routers)\r\ + \n{ :if ([/system/resource/get cpu-count] >= 4) do={ /container/envs/add l\ + ist=awg3vds-env key=AWG_CPU_C2S value=\"1\"; /container/envs/add list=awg3\ + vds-env key=AWG_CPU_S2C value=\"2\" } }\r\ + \n# NOTE on MTU: the value above assumes this tunnel is the last hop.\r\ + \n# If the server forwards your traffic into another tunnel, subtract\r\ + \n# that tunnel's overhead too, or every packet leaves in two fragments.\ + \r\ + \n\r\ + \n# 5. DNS\r\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g3vds-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ + \n# NOTE: replaces existing DNS configuration\r\ + \n/ip/dns/set servers=89.110.101.17,8.8.4.4\r\ + \n# DNS 89.110.101.17 \D0\B8\D0\B4\D1\91\D1\82 \D0\BE\D0\B1\D1\89\D0\B8\D0\ + \BC \D0\BC\D0\B0\D1\80\D1\88\D1\80\D1\83\D1\82\D0\BE\D0\BC (\D0\B2 \D0\B0\ + \D0\BA\D1\82\D0\B8\D0\B2\D0\BD\D1\8B\D0\B9 \D1\82\D1\83\D0\BD\D0\BD\D0\B5\ + \D0\BB\D1\8C / default),\r\ + \n# \D0\B1\D0\B5\D0\B7 \D0\BF\D1\80\D0\B8\D0\B2\D1\8F\D0\B7\D0\BA\D0\B8 \ + \D0\BA wg-awg3vds: \D0\B8\D0\BD\D0\B0\D1\87\D0\B5 \D0\BF\D0\B0\D0\B4\D0\B5\ + \D0\BD\D0\B8\D0\B5 \D1\82\D1\83\D0\BD\D0\BD\D0\B5\D0\BB\D1\8F \D1\83\D0\BD\ + \D0\BE\D1\81\D0\B8\D1\82 \D1\81 \D1\81\D0\BE\D0\B1\D0\BE\D0\B9 \D1\80\D0\ + \B5\D0\B7\D0\BE\D0\BB\D0\B2.\r\ + \n# DNS 8.8.4.4 \D0\B8\D0\B4\D1\91\D1\82 \D0\BE\D0\B1\D1\89\D0\B8\D0\BC \ + \D0\BC\D0\B0\D1\80\D1\88\D1\80\D1\83\D1\82\D0\BE\D0\BC (\D0\B2 \D0\B0\D0\ + \BA\D1\82\D0\B8\D0\B2\D0\BD\D1\8B\D0\B9 \D1\82\D1\83\D0\BD\D0\BD\D0\B5\D0\ + \BB\D1\8C / default),\r\ + \n# \D0\B1\D0\B5\D0\B7 \D0\BF\D1\80\D0\B8\D0\B2\D1\8F\D0\B7\D0\BA\D0\B8 \ + \D0\BA wg-awg3vds: \D0\B8\D0\BD\D0\B0\D1\87\D0\B5 \D0\BF\D0\B0\D0\B4\D0\B5\ + \D0\BD\D0\B8\D0\B5 \D1\82\D1\83\D0\BD\D0\BD\D0\B5\D0\BB\D1\8F \D1\83\D0\BD\ + \D0\BE\D1\81\D0\B8\D1\82 \D1\81 \D1\81\D0\BE\D0\B1\D0\BE\D0\B9 \D1\80\D0\ + \B5\D0\B7\D0\BE\D0\BB\D0\B2.\r\ + \n\r\ + \n# 6. Download, create and start container\r\ + \n:local prevTmpdir [/container/config/get tmpdir]\r\ + \n/container/envs/add list=awg3vds-env key=AWG_PREV_TMPDIR value=\$prevTmp\ + dir\r\ + \n/container/config set tmpdir=usb1/pull memory-high=200M\r\ + \n{\r\ + \n :local arch [/system/resource/get architecture-name]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local suffix \"\"\r\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ + \n :local file \"\"\r\ + \n :local imgTag \"latest\"\r\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\r\ + \n :if (\$arch = \"arm\") do={\r\ + \n :set file (\"awg-proxy-arm\" . \$suffix . \".tar.gz\")\r\ + \n :local rbModel \"\"\r\ + \n :do { :set rbModel [[:parse \":return [/system/routerboard/get model\ + ]\"]] } on-error={}\r\ + \n :local bName [/system/resource/get board-name]\r\ + \n :if (\$rbModel~\"E50UG\" || \$rbModel~\"E60iUGS\" || \$bName~\"E50UG\ + \" || \$bName~\"E60iUGS\" || \$bName~\"^hEX\") do={\r\ + \n :set file (\"awg-proxy-armv5\" . \$suffix . \".tar.gz\")\r\ + \n :set imgTag \"latest-armv5\"\r\ + \n }\r\ + \n }\r\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\r\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \r\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\r\ + \n :local filePath (\"usb1/pull/\" . \$file)\r\ + \n :local altPath (\"usb1/\" . \$file)\r\ + \n :local rootDir \"usb1/awg3vds\"\r\ + \n :do { /file/make-directory usb1/pull } on-error={}\r\ + \n :if ([:len [/file/find where name=\$filePath]] = 0 && [:len [/file/fin\ + d where name=\$altPath]] > 0) do={\r\ + \n :set filePath \$altPath\r\ + \n }\r\ + \n :local added false\r\ + \n :local fetched false\r\ + \n :if ([:len [/file/find where name=\$filePath]] > 0) do={\r\ + \n :put (\"Using image already on the router: \" . \$filePath)\r\ + \n /container/add file=\$filePath interface=veth-awg3vds envlist=awg3vd\ + s-env hostname=awg3vds root-dir=\$rootDir logging=no start-on-boot=yes com\ + ment=awg3vds\r\ + \n :set added true\r\ + \n }\r\ + \n :if (!\$added && \$minor >= 22) do={\r\ + \n :local img (\"ghcr.io/timbrs/awg-proxy:\" . \$imgTag)\r\ + \n :put (\"Pulling \" . \$img)\r\ + \n /container/add remote-image=\$img interface=veth-awg3vds envlist=awg\ + 3vds-env hostname=awg3vds root-dir=\$rootDir logging=no start-on-boot=yes \ + comment=awg3vds\r\ + \n :local cids [/container/find where interface=veth-awg3vds]\r\ + \n :local waited 0\r\ + \n :while ([:len \$cids] > 0 && [:len [/container/get [:pick \$cids 0] \ + image-id]] = 0 && \$waited < 120) do={\r\ + \n :delay 2s\r\ + \n :set waited (\$waited + 2)\r\ + \n }\r\ + \n :if ([:len \$cids] > 0 && [:len [/container/get [:pick \$cids 0] ima\ + ge-id]] > 0) do={\r\ + \n :set added true\r\ + \n :put (\"Pulled from registry in \" . \$waited . \"s\")\r\ + \n :do {\r\ + \n :local verPath (\$filePath . \".rel\")\r\ + \n /tool/fetch url=\"https://api.github.com/repos/timbrs/amneziawg-\ + mikrotik-c/releases/latest\" dst-path=\$verPath http-max-redirect-count=10\ + \r\ + \n :local relJson [/file/get [find where name=\$verPath] contents]\ + \r\ + \n :local tagPos [:find \$relJson \"\\\"tag_name\\\":\\\"\"]\r\ + \n :local tagRest [:pick \$relJson (\$tagPos + 12) [:len \$relJson]\ + ]\r\ + \n /container/envs/add list=awg3vds-env key=AWG_IMAGE_VER value=[:p\ + ick \$tagRest 0 [:find \$tagRest \"\\\"\"]]\r\ + \n /file/remove [find where name=\$verPath]\r\ + \n } on-error={}\r\ + \n } else={\r\ + \n :put \"Registry unavailable, falling back to the release archive\"\ + \r\ + \n :do { /container/remove \$cids } on-error={}\r\ + \n :delay 2s\r\ + \n }\r\ + \n }\r\ + \n :if (!\$added) do={\r\ + \n :local freeStorage 0\r\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\r\ + \n :if (\$freeStorage < 262144) do={\r\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\r\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\r\ + \n :error \"Insufficient disk space\"\r\ + \n }\r\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \r\ + \n /container/add file=\$filePath interface=veth-awg3vds envlist=awg3vd\ + s-env hostname=awg3vds root-dir=\$rootDir logging=no start-on-boot=yes com\ + ment=awg3vds\r\ + \n :set fetched true\r\ + \n }\r\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg3vds] shm-size=4M\"] }\r\ + \n :do { [:parse \"/container/set [find where interface=veth-awg3vds] ign\ + ore-remote-image-change=yes\"] } on-error={}\r\ + \n :do { [:parse \"/container/set [find where interface=veth-awg3vds] res\ + tart-policy=on-failure restart-interval=30s restart-max-count=10\"] } on-e\ + rror={}\r\ + \n :if (\$fetched) do={ /file/remove \$filePath }\r\ + \n :local freeMem [/system/resource/get free-memory]\r\ + \n :if (\$freeMem < 16777216) do={\r\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\r\ + \n }\r\ + \n /container/start [find where interface=veth-awg3vds]\r\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\r\ + \n :put \"Waiting for container to start...\"\r\ + \n :delay 5s\r\ + \n /interface/wireguard/enable wg-awg3vds\r\ + \n :put \"WireGuard interface enabled\"\r\ + \n :put \"Installation complete!\"\r\ + \n :put \"Ping test: 89.110.101.17 via AmneziaWG tunnel. repeat 10 times\ + \"\r\ + \n /ping 89.110.101.17 count=10 interval=1\r\ + \n :put \"\"\r\ + \n :put \"======= NEXT STEPS =======\"\r\ + \n :put \"\"\r\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ + \n :put \"\"\r\ + \n :put \" Route a single host:\"\r\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg3vds com\ + ment=awg3vds-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Route a subnet:\"\r\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg3vds co\ + mment=awg3vds-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Remove a route:\"\r\ + \n :put \" /ip/route/remove [find where comment=awg3vds-tunnel dst-add\ + ress=8.8.8.8/32]\"\r\ + \n :put \"\"\r\ + \n :put \" Show all tunnel routes:\"\r\ + \n :put \" /ip/route/print where comment=awg3vds-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Update the container:\"\r\ + \n :put \" /system/script/run awg3vds-update\"\r\ + \n :put \"\"\r\ + \n :put \" Uninstall:\"\r\ + \n :put \" /system/script/run awg3vds-uninstall\"\r\ + \n :put \"=========================\"\r\ + \n}\r\ + \n\r\ + \n# 7. Verification\r\ + \n# /container/print\r\ + \n# /interface/wireguard/print\r\ + \n# /interface/wireguard/peers/print\r\ + \n" +add comment=awg3vds dont-require-permissions=no name=awg3vds-uninstall owner=\ + vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg3vds-env\ + \" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg3vds-\ + env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n /ip/route/remove [find where comment=awg3vds-tunnel]\r\ + \n /ip/route/remove [find where comment=awg3vds-dns]\r\ + \n :do { /system/scheduler/remove [find where comment~\"awg3vds\"] } on-e\ + rror={}\r\ + \n :do { /system/script/remove [find where comment~\"awg3vds\" and name!=\ + \"awg3vds-uninstall\"] } on-error={}\r\ + \n /container/stop [find where interface=veth-awg3vds]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg3vds]\r\ + \n /container/envs/remove [find where list=\"awg3vds-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg3vds\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.14.100/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.14.101/30\"]\r\ + \n :do { /ipv6/firewall/nat/remove [find where comment=awg3vds-v6-nat] } \ + on-error={}\r\ + \n :do { /ipv6/firewall/nat/remove [find where comment=awg3vds-dstnat6] }\ + \_on-error={}\r\ + \n :do { /ipv6/firewall/filter/remove [find where comment=awg3vds-v6-out]\ + \_} on-error={}\r\ + \n :do { /ipv6/firewall/filter/remove [find where comment=awg3vds-awg-in6\ + ] } on-error={}\r\ + \n :do { /ipv6/nd/remove [find where interface=veth-awg3vds] } on-error={\ + }\r\ + \n :do { /ipv6/nd/prefix/remove [find where interface=veth-awg3vds] } on-\ + error={}\r\ + \n :do { /ipv6/address/remove [find where comment=awg3vds-v6] } on-error=\ + {}\r\ + \n /interface/veth/remove [find where name=\"veth-awg3vds\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg3vds\"\ + ]\r\ + \n /ip/address/remove [find where interface=\"wg-awg3vds\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg3vds\"]\r\ + \n :do { /file/remove [find where name~\"awg3vds.+tar\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/awg3vds\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/ru_ranges_timeout.rsc\"] } \ + on-error={}\r\ + \n :do { /file/remove [find where name=\"usb1/ru_ranges.rsc\"] } on-error\ + ={}\r\ + \n :do { /file/remove [find where name~\"usb1/pull\"] } 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=awg3vds-uninstall]\r\ + \n" +add comment=awg3vds dont-require-permissions=no name=awg3vds-update owner=\ + vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n :local cids [/container/find where interface=veth-awg3vds and !stopped\ + ]\r\ + \n :if ([:len \$cids] = 0) do={ :set cids [/container/find where interfac\ + e=veth-awg3vds and start-on-boot=yes] }\r\ + \n :if ([:len \$cids] = 0) do={ :set cids [/container/find where interfac\ + e=veth-awg3vds] }\r\ + \n :if ([:len \$cids] = 0) do={\r\ + \n :put \"Container awg3vds not found\"\r\ + \n :log warning \"awg3vds-update: container not found\"\r\ + \n } else={\r\ + \n :local cid [:pick \$cids ([:len \$cids] - 1)]\r\ + \n :local img [/container/get \$cid remote-image]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \"\ + \_\"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local wantRunning true\r\ + \n :do { :if ([/container/get \$cid start-on-boot] != true) do={ :set w\ + antRunning false } } on-error={}\r\ + \n :local healthy true\r\ + \n :if ([:len [/container/get \$cid image-id]] = 0) do={ :set healthy f\ + alse }\r\ + \n :if (\$wantRunning) do={\r\ + \n :do { :if ([/container/get \$cid stopped] = true) do={ :set health\ + y false } } on-error={}\r\ + \n }\r\ + \n :if (!\$healthy && \$wantRunning && [:len [/container/get \$cid imag\ + e-id]] > 0) do={\r\ + \n :put \"Container is down - trying to start it\"\r\ + \n :do { /container/start \$cid } on-error={}\r\ + \n :delay 8s\r\ + \n :set healthy true\r\ + \n :do { :if ([/container/get \$cid stopped] = true) do={ :set health\ + y false } } on-error={}\r\ + \n :if (\$healthy) do={\r\ + \n :put \"Container is back up\"\r\ + \n :log info \"awg3vds: container restarted by the update script\"\ + \r\ + \n }\r\ + \n }\r\ + \n :if (\$img = \"\" && \$minor >= 22 && !\$healthy) do={\r\ + \n :local imgTag \"latest\"\r\ + \n :local rbModel \"\"\r\ + \n :do { :set rbModel [[:parse \":return [/system/routerboard/get mod\ + el]\"]] } on-error={}\r\ + \n :local bName [/system/resource/get board-name]\r\ + \n :if (\$rbModel~\"E50UG\" || \$rbModel~\"E60iUGS\" || \$bName~\"E50\ + UG\" || \$bName~\"E60iUGS\" || \$bName~\"^hEX\") do={\r\ + \n :set imgTag \"latest-armv5\"\r\ + \n }\r\ + \n :set img (\"ghcr.io/timbrs/awg-proxy:\" . \$imgTag)\r\ + \n :put (\"Container is down and was installed from a file - pointing\ + \_it at \" . \$img)\r\ + \n :log warning \"awg3vds-update: broken file install, switching to t\ + he registry\"\r\ + \n :do { /container/set \$cid remote-image=\$img } on-error={}\r\ + \n }\r\ + \n :if (\$img = \"\") do={\r\ + \n :put \"Installed from a local image file - /container/repull only \ + updates registry installs.\"\r\ + \n :put \"Reinstall with the configurator on RouterOS 7.22+ to switch\ + \_to one-command updates.\"\r\ + \n } else={\r\ + \n :if (\$minor < 22) do={\r\ + \n :put (\"/container/repull needs RouterOS 7.22+, this router runs\ + \_\" . \$ver)\r\ + \n :if (!\$healthy) do={ :log error (\"awg3vds-update: container is\ + \_down, and \" . \$ver . \" has no /container/repull\") }\r\ + \n } else={\r\ + \n :local rootDir [/container/get \$cid root-dir]\r\ + \n :if ([:pick \$rootDir 0 1] = \"/\") do={ :set rootDir [:pick \$r\ + ootDir 1 [:len \$rootDir]] }\r\ + \n :local rootDirOrig \$rootDir\r\ + \n :local slashPos [:find \$rootDir \"/\"]\r\ + \n :local disk \$rootDir\r\ + \n :if ([:typeof \$slashPos] != \"nil\") do={ :set disk [:pick \$ro\ + otDir 0 \$slashPos] }\r\ + \n :local verPath \"awg-update-check.json\"\r\ + \n :if (\$disk != \"disk1\") do={\r\ + \n :do { /file/make-directory (\$disk . \"/pull\") } on-error={}\ + \r\ + \n /container/config set tmpdir=(\$disk . \"/pull\")\r\ + \n :set verPath (\$disk . \"/pull/awg-update-check.json\")\r\ + \n }\r\ + \n :local newVer \"\"\r\ + \n :do {\r\ + \n /tool/fetch url=\"https://api.github.com/repos/timbrs/amneziaw\ + g-mikrotik-c/releases/latest\" dst-path=\$verPath http-max-redirect-count=\ + 10\r\ + \n :local relJson [/file/get [find where name=\$verPath] contents\ + ]\r\ + \n :local tagPos [:find \$relJson \"\\\"tag_name\\\":\\\"\"]\r\ + \n :if ([:typeof \$tagPos] != \"nil\") do={\r\ + \n :local tagRest [:pick \$relJson (\$tagPos + 12) [:len \$relJ\ + son]]\r\ + \n :set newVer [:pick \$tagRest 0 [:find \$tagRest \"\\\"\"]]\r\ + \n }\r\ + \n :do { /file/remove [find where name=\$verPath] } on-error={}\r\ + \n } on-error={ :put \"Could not read the published version\" }\r\ + \n :local curVer \"\"\r\ + \n :do { :set curVer [/container/envs/get [find where list=\"awg3vd\ + s-env\" key=\"AWG_IMAGE_VER\"] value] } on-error={}\r\ + \n :local doPull true\r\ + \n :if (\$healthy) do={\r\ + \n :if (\$newVer = \"\") do={\r\ + \n :set doPull false\r\ + \n :put \"Published version unknown - leaving the healthy conta\ + iner alone\"\r\ + \n }\r\ + \n :if (\$newVer != \"\" && \$newVer = \$curVer) do={\r\ + \n :set doPull false\r\ + \n :put (\"Already on \" . \$curVer . \" - nothing to pull, tun\ + nel untouched\")\r\ + \n }\r\ + \n }\r\ + \n :if (\$doPull) do={\r\ + \n :if (!\$healthy) do={\r\ + \n :put \"Container is not healthy - pulling the image again\"\ + \r\ + \n :log warning \"awg3vds-update: container unhealthy, forcing \ + a pull\"\r\ + \n }\r\ + \n :put (\"Updating \" . \$img . \" ...\")\r\ + \n :log info \"awg3vds: repull started\"\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.backu\ + p\")] } on-error={}\r\ + \n :do { [:parse \"/container/set \$cid ignore-remote-image-chang\ + e=yes\"] } on-error={}\r\ + \n /container/repull \$cid\r\ + \n :local waited 0\r\ + \n :while ([:len [/container/get \$cid image-id]] = 0 && \$waited\ + \_< 180) do={\r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n :if ([:len [/container/get \$cid image-id]] = 0) do={\r\ + \n :put \"Pull failed - retrying once in 15s\"\r\ + \n :delay 15s\r\ + \n /container/repull \$cid\r\ + \n :set waited 0\r\ + \n :while ([:len [/container/get \$cid image-id]] = 0 && \$wait\ + ed < 180) do={\r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n }\r\ + \n :local backUp false\r\ + \n :if ([:len [/container/get \$cid image-id]] > 0) do={\r\ + \n :set backUp true\r\ + \n :if (\$wantRunning) do={\r\ + \n :delay 3s\r\ + \n :do { /container/start \$cid } on-error={}\r\ + \n :delay 8s\r\ + \n :set backUp false\r\ + \n :do { :if ([/container/get \$cid stopped] != true) do={ :s\ + et backUp true } } on-error={}\r\ + \n }\r\ + \n }\r\ + \n :if (!\$backUp) do={\r\ + \n :put \"Container did not come back up - rebuilding it from t\ + he registry\"\r\ + \n :log warning \"awg3vds-update: container did not come back, \ + rebuilding\"\r\ + \n :do { /container/stop \$cid } on-error={}\r\ + \n :delay 5s\r\ + \n :do { /container/remove \$cid } on-error={}\r\ + \n :delay 3s\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.bac\ + kup\")] } on-error={}\r\ + \n :do { /container/add remote-image=\$img interface=veth-awg3v\ + ds envlist=awg3vds-env hostname=awg3vds root-dir=\$rootDirOrig logging=no \ + start-on-boot=yes comment=awg3vds } on-error={}\r\ + \n :set waited 0\r\ + \n :local newCids [/container/find where interface=veth-awg3vds\ + \_and start-on-boot=yes]\r\ + \n :if ([:len \$newCids] = 0) do={ :set newCids [/container/fin\ + d where interface=veth-awg3vds] }\r\ + \n :while ([:len \$newCids] > 0 && [:len [/container/get [:pick\ + \_\$newCids ([:len \$newCids] - 1)] image-id]] = 0 && \$waited < 180) do={\ + \r\ + \n :delay 3s\r\ + \n :set waited (\$waited + 3)\r\ + \n }\r\ + \n :if ([:len \$newCids] > 0 && [:len [/container/get [:pick \$\ + newCids ([:len \$newCids] - 1)] image-id]] > 0) do={\r\ + \n :do { /container/set [:pick \$newCids ([:len \$newCids] - \ + 1)] shm-size=4M } on-error={}\r\ + \n :do { [:parse \"/container/set [find where interface=veth-\ + awg3vds] ignore-remote-image-change=yes\"] } on-error={}\r\ + \n :do { [:parse \"/container/set [find where interface=veth-\ + awg3vds] restart-policy=on-failure restart-interval=30s restart-max-count=\ + 10\"] } on-error={}\r\ + \n :do { /container/start [:pick \$newCids ([:len \$newCids] \ + - 1)] } on-error={}\r\ + \n :delay 8s\r\ + \n :do { :if ([/container/get [:pick \$newCids ([:len \$newCi\ + ds] - 1)] stopped] != true) do={ :set backUp true } } on-error={}\r\ + \n }\r\ + \n :if (\$backUp) do={\r\ + \n :put \"Container rebuilt\"\r\ + \n :log info \"awg3vds: container rebuilt after update\"\r\ + \n } else={\r\ + \n :put \"Rebuild failed - the tunnel is down. Netwatch keeps\ + \_the router online meanwhile.\"\r\ + \n :put \"This script runs again on the next schedule and wil\ + l retry.\"\r\ + \n :log error \"awg3vds-update: rebuild failed, tunnel is dow\ + n\"\r\ + \n }\r\ + \n }\r\ + \n :if (\$backUp && \$newVer != \"\") do={\r\ + \n :do { /container/envs/remove [find where list=\"awg3vds-env\ + \" key=\"AWG_IMAGE_VER\"] } on-error={}\r\ + \n :do { /container/envs/add list=awg3vds-env key=AWG_IMAGE_VER\ + \_value=\$newVer } on-error={}\r\ + \n }\r\ + \n :do { /file/remove [find where name~(\$disk . \"/awg3vds.backu\ + p\")] } on-error={}\r\ + \n :if (\$backUp) do={\r\ + \n :put (\"Update done: \" . \$img)\r\ + \n :log info \"awg3vds: update done\"\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +add name=manager policy="local,ssh,ftp,read,write,policy,api,rest-api,!telnet,\ + !reboot,!test,!winbox,!password,!web,!sniff,!sensitive,!romon" +/certificate settings +set builtin-trust-store=\ + capsman,fetch,email,netwatch,container,dns,www,api,reverse-proxy,logging +/container +add comment=awg3vds envlists=awg3vds-env file=usb1/pull/awg-proxy-arm.tar.gz \ + hostname=awg3vds ignore-remote-image-change=yes interface=veth-awg3vds \ + layer-dir="" name=awg-proxy-arm restart-interval=30s restart-max-count=10 \ + restart-policy=on-failure root-dir=/usb1/awg3vds shm-size=4096.0KiB \ + start-on-boot=yes +/container config +set memory-high=200.0MiB tmpdir=/usb1/pull +/container envs +add key=AWG_CLIENT_PUB list=awg3vds-env value=\ + "LnLYVichmfWj/lDZqn2tk7pj2XII/1tnyZaOjf40Tl8=" +add key=AWG_CONTENT_PADDING list=awg3vds-env value=54-119 +add key=AWG_CPU_C2S list=awg3vds-env value=1 +add key=AWG_CPU_S2C list=awg3vds-env value=2 +add key=AWG_H1 list=awg3vds-env value=457615290-457646150 +add key=AWG_H2 list=awg3vds-env value=1307355386-1307363580 +add key=AWG_H3 list=awg3vds-env value=2441734303-2441781787 +add key=AWG_H4 list=awg3vds-env value=3719180788-3719195844 +add key=AWG_HEADER_PROTECTION_KEY list=awg3vds-env value=\ + "FkGxbrW6ds3YPWNl48OWFEccrLC4tF94z9MnoKUZUsM=" +add key=AWG_I1 list=awg3vds-env value=\ + "" +add key=AWG_I2 list=awg3vds-env value=\ + "" +add key=AWG_I3 list=awg3vds-env value="" +add key=AWG_I4 list=awg3vds-env value="" +add key=AWG_I5 list=awg3vds-env value=\ + "" +add key=AWG_JC list=awg3vds-env value=5 +add key=AWG_JMAX list=awg3vds-env value=952 +add key=AWG_JMIN list=awg3vds-env value=510 +add key=AWG_KEEPALIVE_TIMEOUT list=awg3vds-env value=14-21 +add key=AWG_LISTEN list=awg3vds-env value=:51820 +add key=AWG_MAX_HANDSHAKE_ATTEMPTS list=awg3vds-env value=12-14 +add key=AWG_NO_DF list=awg3vds-env value=1 +add key=AWG_PREV_DNS list=awg3vds-env value=10.30.30.33,8.8.4.4 +add key=AWG_PREV_TMPDIR list=awg3vds-env value=/usb1/pull +add key=AWG_REJECT_AFTER list=awg3vds-env value=174-195 +add key=AWG_REKEY_AFTER list=awg3vds-env value=102-130 +add key=AWG_REKEY_TIMEOUT list=awg3vds-env value=6-8 +add key=AWG_REMOTE list=awg3vds-env value=89.110.101.17:31031 +add key=AWG_S1 list=awg3vds-env value=138 +add key=AWG_S2 list=awg3vds-env value=105 +add key=AWG_S3 list=awg3vds-env value=51 +add key=AWG_S4 list=awg3vds-env value=22 +add key=AWG_SERVER_PUB list=awg3vds-env value=\ + "MMWjD/TPNpupCvhXLCAw0xHXV4N6jgtQkg9Pl6pcQhU=" +/disk settings +set auto-media-interface=Bridge-Lan +/ip smb +set domain=WORKGROUP enabled=no interfaces=lo +/interface bridge port +add bridge=Bridge-Lan interface=ether2 +add bridge=Bridge-Lan interface=ether3 +add bridge=Bridge-Lan interface=ether4 +add bridge=Bridge-Lan interface=ether5 +add bridge=Bridge-Lan interface=wlan1 +add bridge=Bridge-Lan interface=wlan2 +/interface bridge settings +set allow-fast-path=no use-ip-firewall=yes +/ip neighbor discovery-settings +set discover-interface-list=LAN +/ip settings +set accept-redirects=yes allow-fast-path=no +/ipv6 settings +set accept-router-advertisements-on=none allow-fast-path=no disable-ipv6=yes \ + disable-link-local-address=yes +/interface detect-internet +set detect-interface-list=WAN internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +add interface="ether1 - Unet" list=WAN +add interface=Bridge-Lan list=LAN +add interface=wg-awg3vds list=WAN +/interface wireguard peers +add allowed-address=10.31.31.0/24,0.0.0.0/0 endpoint-address=172.19.14.102 \ + endpoint-port=51820 interface=wg-awg3vds name=peer1 persistent-keepalive=\ + 14s public-key="MMWjD/TPNpupCvhXLCAw0xHXV4N6jgtQkg9Pl6pcQhU=" +/interface wireless cap +# +set bridge=Bridge-Lan caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-2C900E832E04 certificate=\ + CAP-18FD746E5814 discovery-interfaces=Bridge-Lan enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.81/24 interface=Bridge-Lan network=10.30.30.0 +add address=172.19.14.101/30 interface=veth-awg3vds network=172.19.14.100 +add address=10.31.31.2/24 interface=wg-awg3vds network=10.31.31.0 +/ip cloud +set ddns-enabled=yes +/ip dhcp-client +add add-default-route=special-classless default-route-distance=2 \ + default-route-tables=main:2 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.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.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 +/ip dhcp-server network +add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ + domain-search-list dhcp-option-set=domain-search-set dns-server=\ + 10.30.30.81 domain=WORKGROUP gateway=10.30.30.81 netmask=24 ntp-server=\ + 10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +/ip dns +set allow-remote-requests=yes servers=10.30.30.33,8.8.4.4 +/ip dns static +add address=10.30.30.81 comment=defconf name=router.lan type=A +add address=10.30.30.81 comment=defconf name=master type=A +add address=10.30.30.33 comment=amster name=amster.vados.ru type=A +add address=8.8.8.8 name=dns.google type=A +add address=8.8.4.4 name=dns.google 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=149.112.112.112 comment="Cuad9-dns IPv4 2" disabled=yes name=\ + dns.quad9.net type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +/ip firewall address-list +add address=10.0.0.0/8 list=RFC1918 +add address=172.16.0.0/12 list=RFC1918 +add address=192.168.0.0/16 list=RFC1918 +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.4 disabled=yes list=to_vpn +add address=10.30.30.98 comment=vados-len list=Local2Vpn +add address=89.110.101.17 list=VDS +add address=109.107.177.79 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=2ip.ru list=Test +add address=89.110.101.17 comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" list=TRUSTED +add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +add address=love.ru comment=love.ru list=NoVdsina +add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +add address=pochta.ru comment=pochta.ru list=NoVdsina +add address=vdsina.com comment=vdsina.com list=NoVdsina +add address=vdsina.ru comment=vdsina.ru list=NoVdsina +add address=youla.ru comment=youla.ru list=NoVdsina +add address=kupiprodai.ru comment=kupiprodai.ru list=NoVdsina +add address=myip.ru list=Test +add address=geoip.co comment=geoip.co list=NoVdsina +add address=x.com list=Twitter +add address=facebook.com list=facebook +add address=fbcd.net list=facebook +add address=comp-lenta.ru comment=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=82.202.162.184 comment=comp-lenta.ru list=NoWG +add address=smtp.mail.me.com.akadns.net. comment=smtp.mail.me.com list=NoWG +add address=17.57.155.37 comment=smtp.mail.me.com.akadns.net list=NoWG +add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ + purchase.mp.microsoft.com list=windowsupdateslist +add address=e110219.a.akamaiedge.net. comment=\ + purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.141 list=windowsupdateslist +add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=storesdk.xbetservices.akadns.net. comment=\ + storesdk.dsx.mp.microsoft.com list=windowsupdateslist +add address=e16646.g.akamaiedge.net. comment=\ + storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ + software-download.microsoft.com list=windowsupdateslist +add address=download.prss.microsoft.com.akamaized.net. comment=\ + software-download.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +add address=87.250.250.50 comment=YandexDisk list=NoVdsina +add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ + purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ + purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ + cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=a1996.dscd.akamai.net. comment=\ + wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.sls.update.microsoft.com list=windowsupdateslist +add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ + star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ + paymentinstruments.mp.microsoft.com list=windowsupdateslist +add address=10.30.30.33 comment=NUC disabled=yes list=NoWG +add address=10.30.30.10 comment=MikroNUC disabled=yes list=NoWG +add address=89.110.101.17 comment=!!!VDSINA!!!! disabled=yes list=NoWG +add address=wg.vados.ru comment=VDSina-vpn list=Trusted-VPN +add address=80.85.244.9 list=TRUSTED +add address=disc801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + disc801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=vdsina.vados.ru 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=Trusted-VPN +add address=vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=ns.vados.ru comment=VDSina-vpn list=Trusted-VPN +add address=vdsina.com comment=VDSina-vpn list=Trusted-VPN +add address=cp.vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=ns1.vdsina.ru comment=VDSina-vpn list=Trusted-VPN +add address=ghcr.io comment=GitHub list=Trusted-VPN +add address=github.com comment=GitHub list=Trusted-VPN +add address=149.154.164.13 comment=telegra.ph list=FuckRKN +add address=194.85.61.76 comment=grani.ru list=FuckRKN +add address=109.70.26.37 comment=grani.ru list=FuckRKN +add address=104.16.4.81 comment=xhamster.com list=FuckRKN +add address=104.16.3.81 comment=xhamster.com list=FuckRKN +add address=188.114.96.1 comment=lostfilm.tv list=FuckRKN +add address=188.114.97.1 comment=lostfilm.tv list=FuckRKN +add address=172.67.182.196 comment=rutracker.org list=FuckRKN +add address=104.21.32.39 comment=rutracker.org list=FuckRKN +add address=104.247.81.99 comment=lurkmore.to list=FuckRKN +add address=8.47.69.6 comment=dou.ua list=FuckRKN +add address=8.6.112.6 comment=dou.ua list=FuckRKN +add address=66.254.114.79 comment=youporn.com list=FuckRKN +add address=185.110.92.40 comment=pornolab.net list=FuckRKN +add address=185.110.92.41 comment=pornolab.net list=FuckRKN +add address=104.21.71.238 comment=crimerussia.com list=FuckRKN +add address=172.67.172.95 comment=crimerussia.com list=FuckRKN +add address=149.154.167.99 comment=telegram.org list=FuckRKN +add address=149.154.166.110 comment=api.telegram.org list=FuckRKN +add address=myip.ru comment="!!! Check IP (MYIP.RU) !!!" disabled=yes list=\ + NoVdsina +add address=ipinfo.io comment="!!! Check IP (IPINFO.IO) !!!" list=NoVdsina +add address=cian.ru comment=cian.ru list=NoVdsina +add address=hh.ru comment=hh.ru list=NoVdsina +add address=trudvsem.ru comment=trudvsem.ru list=NoVdsina +add address=esia.gosuslugi.ru comment=esia.gosuslugi.ru list=NoVdsina +add address=spb.hh.ru comment=spb.hh.ru list=NoVdsina +/ip firewall filter +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=12h chain=input comment="block honeypot DNS UDP" \ + connection-state=new dst-port=53 in-interface="ether1 - Unet" protocol=\ + udp src-address-list=!VDS +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot DNS TCP" \ + connection-state=new dst-port=53 in-interface="ether1 - Unet" protocol=\ + tcp src-address-list=!VDS +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=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 ssh rdp winbox" connection-state=new dst-port=22,8291 \ + in-interface-list=WAN protocol=tcp src-address-list=!TRUSTED +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid +add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp +add action=accept chain=input comment=\ + "defconf: accept to local loopback (for CAPsMAN)" disabled=yes \ + dst-address=127.0.0.1 in-interface=lo src-address=127.0.0.1 +add action=drop chain=input comment="defconf: drop all not coming from LAN" \ + in-interface-list=!LAN +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 +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + in-interface-list=WAN +/ip firewall mangle +add action=accept chain=prerouting dst-address-list=RFC1918 \ + in-interface-list=!WAN +add action=mark-connection chain=prerouting comment="NO VPN" \ + dst-address-list=NoVdsina in-interface-list=!WAN new-connection-mark=\ + To-ISP src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=All2vpn connection-mark=\ + !To-ISP dst-address=!89.110.101.17 dst-address-list=!NoVdsina \ + new-routing-mark=To-VPN src-address=10.30.30.0/24 src-address-list=!NoWG +add action=change-mss chain=forward comment="MSS on WG" connection-mark=\ + !To-ISP in-interface-list=!WAN new-mss=1380 protocol=tcp tcp-flags=syn \ + tcp-mss=1381-65535 +add action=mark-routing chain=prerouting connection-mark=to-vpn-conn \ + disabled=yes new-routing-mark=To-VPN routing-mark=To-VPN src-address=\ + 10.30.30.0/24 +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" in-interface=\ + veth-awg3vds log-prefix=Mark-VPN-FT new-connection-mark=VPN_No_FastTrack +add action=accept chain=prerouting comment="SSH To ME" disabled=yes \ + dst-address=10.30.30.81 dst-port=2222 in-interface-list=!WAN protocol=tcp \ + src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment="VPN Network" disabled=yes \ + dst-address=10.8.0.0/24 log-prefix=VPN-Net new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 +/ip firewall nat +add action=masquerade chain=srcnat comment="Default NAT" ipsec-policy=\ + out,none out-interface="ether1 - Unet" src-address=10.30.30.0/24 +add action=masquerade chain=srcnat comment="NAT for VPN" routing-mark=To-VPN +add action=dst-nat chain=dstnat comment="dst-nat for acme" 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="dst-nat for amster HTTPS" dst-port=\ + 443 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=443 +add action=dst-nat chain=dstnat comment="dst-nat for amster ssh" disabled=yes \ + dst-port=22 protocol=tcp src-address-list=VDS to-addresses=10.30.30.33 \ + to-ports=22 +add action=dst-nat chain=dstnat comment="dst-nat for amster DNS (TCP)" \ + dst-port=53 in-interface="ether1 - Unet" protocol=tcp src-address-list=\ + VDS to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat comment="dst-nat for amster DNS (UDP)" \ + dst-port=53 in-interface="ether1 - Unet" protocol=udp src-address-list=\ + VDS to-addresses=10.30.30.33 to-ports=53 +add action=masquerade chain=srcnat disabled=yes src-address=172.20.200.68/30 +add action=masquerade chain=srcnat src-address=172.19.14.100/30 +/ip firewall raw +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-static chain=prerouting content=spb.hh.ru +add action=drop chain=prerouting src-address-list="Honeypot Hacker" +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set irc disabled=no +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip hotspot user profile +set [ find default=yes ] address-pool=dhcp +/ip route +add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=wg-awg3vds@main \ + routing-table=To-VPN scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set www disabled=yes port=188 +set reverse-proxy disabled=yes +set ssh port=2222 +set www-ssl port=4433 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface="ether1 - Unet" type=external +add interface=Bridge-Lan type=internal +/ipv6 firewall filter +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked disabled=yes +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid disabled=yes +add action=accept chain=input comment="defconf: accept ICMPv6" disabled=yes \ + protocol=icmpv6 +add action=accept chain=input comment="defconf: accept UDP traceroute" \ + disabled=yes dst-port=33434-33534 protocol=udp +add action=accept chain=input comment=\ + "defconf: accept DHCPv6-Client prefix delegation." disabled=yes dst-port=\ + 546 protocol=udp src-address=fe80::/10 +add action=accept chain=input comment="defconf: accept IKE" disabled=yes \ + dst-port=500,4500 protocol=udp +add action=accept chain=input comment="defconf: accept ipsec AH" disabled=yes \ + protocol=ipsec-ah +add action=accept chain=input comment="defconf: accept ipsec ESP" disabled=\ + yes protocol=ipsec-esp +add action=accept chain=input comment=\ + "defconf: accept all that matches ipsec policy" disabled=yes \ + ipsec-policy=in,ipsec +add action=drop chain=input comment=\ + "defconf: drop everything else not coming from LAN" disabled=yes \ + in-interface-list=!LAN +add action=fasttrack-connection chain=forward comment="defconf: fasttrack6" \ + connection-state=established,related +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 +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system identity +set name=MikroMaster +/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=time.google.com +/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=awg3vds interval=1d name=awg3vds-update on-event=\ + "/system/script/run awg3vds-update" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-09-12 start-time=04:30:00 +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool netwatch +add comment="doh-fallback, doh-url=https://security.cloudflare-dns.com/dns-que\ + ry, doh-cert=DigiCert Global Root CA, notify, name=CloudFlare-doh IPv4 1" \ + disabled=yes host=1.1.1.1 type=simple +add comment="doh, doh-url=https://security.cloudflare-dns.com/dns-query, doh-c\ + ert=DigiCert Global Root CA, notify, name=CloudFlare-doh IPv4 2" \ + disabled=yes host=1.0.0.1 type=simple +add comment="doh-fallback, dns-fallback, doh-url=https://dns.google/dns-query,\ + \_doh-cert=DigiCert Global Root G2, notify, name=Google-doh IPv4 1" \ + disabled=yes host=8.8.8.8 type=simple +add comment="doh-fallback, dns-fallback, doh-url=https://dns.google/dns-query,\ + \_doh-cert=DigiCert Global Root G2, notify, name=Google-doh IPv4 2" \ + disabled=yes host=8.8.4.4 type=simple +add comment="doh-fallback, dns-fallback, doh-url=https://dns.quad9.net/dns-que\ + ry, doh-cert=DigiCert Global Root G3, notify, name=Cuad9-doh IPv4 1" \ + disabled=yes host=9.9.9.9 type=simple +add comment="doh-fallback, dns-fallback, doh-url=https://dns.quad9.net/dns-que\ + ry, doh-cert=DigiCert Global Root G3, notify, name=Cuad9-doh IPv4 2" \ + disabled=yes host=149.112.112.112 type=simple +add comment="dns, notify, name=ns1.unet.ws" disabled=yes host=91.192.189.2 \ + type=simple +/user aaa +set accounting=no diff --git a/MikroMaster/history/20260918/20260918102001-Diff-Config.rsc b/MikroMaster/history/20260918/20260918102001-Diff-Config.rsc new file mode 100644 index 0000000..d1d4219 --- /dev/null +++ b/MikroMaster/history/20260918/20260918102001-Diff-Config.rsc @@ -0,0 +1,12 @@ +11,12c11,12 +< set [ find default-name=wlan1 ] disabled=no mode=ap-bridge ssid=vados \ +< wireless-protocol=802.11 +--- +> set [ find default-name=wlan2 ] disabled=no mode=ap-bridge name=wlan1 ssid=\ +> vados wireless-protocol=802.11 +15,16c15,16 +< set [ find default-name=wlan2 ] disabled=no mode=ap-bridge ssid=vados5g \ +< wireless-protocol=802.11 +--- +> set [ find default-name=wlan1 ] disabled=no mode=ap-bridge name=wlan2 ssid=\ +> vados5g wireless-protocol=802.11 -- 2.52.0