From 8292a40895cc49329d8822206e4ce313919228fc Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 3 Jul 2026 01:40:03 +0300 Subject: [PATCH] Backup for MikroNUC created successfully at Jul 03 01:40:03. --- .../20260703/20260703012002-Config.rsc | 3695 ++++++++++++ MikroMaster/tmp/Diff-Config.rsc | 6 + .../20260703/20260703014001-Binary.backup | Bin 0 -> 378399 bytes MikroNUC/20260703/20260703014001-Config.rsc | 5366 +++++++++++++++++ .../20260703/20260703014001-Diff-Config.rsc | 178 + 5 files changed, 9245 insertions(+) create mode 100644 MikroMaster/20260703/20260703012002-Config.rsc create mode 100644 MikroMaster/tmp/Diff-Config.rsc create mode 100644 MikroNUC/20260703/20260703014001-Binary.backup create mode 100644 MikroNUC/20260703/20260703014001-Config.rsc create mode 100644 MikroNUC/history/20260703/20260703014001-Diff-Config.rsc diff --git a/MikroMaster/20260703/20260703012002-Config.rsc b/MikroMaster/20260703/20260703012002-Config.rsc new file mode 100644 index 0000000..d93c3d5 --- /dev/null +++ b/MikroMaster/20260703/20260703012002-Config.rsc @@ -0,0 +1,3695 @@ +# 2026-07-03 01:20:08 by RouterOS 7.23.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BF auto-mac=no dhcpv6-agent-circuit-id=\ + "\$(INTERFACE):\$(VID)" dhcpv6-agent-remote-id="\$(BRIDGEMAC)" name=\ + Bridge-LAN port-cost-mode=short +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" loop-protect=off name=\ + "ether1 - Unet" rx-flow-control=auto tx-flow-control=auto +set [ find default-name=ether2 ] comment=LAN-2 +set [ find default-name=ether3 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-3 +set [ find default-name=ether4 ] comment=LAN-4 +set [ find default-name=ether5 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-5 \ + loop-protect=on poe-out=off rx-flow-control=auto tx-flow-control=auto +/interface wireless +# managed by CAPsMAN +# channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados wireless-protocol=802.11 +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados5g wireless-protocol=802.11 +/interface wireguard +add comment=WG listen-port=13231 mtu=1320 name=WG +/interface list +add include=static name=LAN +add name=Internet +add include=Internet name=WAN +/interface wireless security-profiles +set [ find default=yes ] authentication-types=wpa-psk,wpa2-psk mode=\ + dynamic-keys supplicant-identity=MikroTik +/iot wiliot servers +set *1 address=mqtt.us-east-2.prod.wiliot.cloud name="Wiliot US East" +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +add name=iVados options=HostName +/ip dns forwarders +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=blsp.at verify-doh-cert=no +add comment=Kra disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon2.to \ + verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ipv6 dhcp-client option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=DUID value=0x00030001488f5a8e1abc +add code=61 name=clientid +/ipv6 dhcp-server option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=CLIENT_DUID +add code=61 name=CLIENT_MAC +#error exporting "/ppp/profile" (timeout) +#error exporting "/queue/interface" (timeout) +/routing bgp template +set default disabled=no output.network=bgp-networks +/routing table +add disabled=no fib name=To-VPN +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n\r\ + \n#:local Script AM-setup\ + \n;\r\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n\r\ + \n#\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n\r\ + \n#\r\ + \n\ + \n#root.mnuc.backuper\ + \n\ + \n\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\r\ + \n\ + \n#:local Script AM-GlobalConfig;\ + \n\r\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n\r\ + \n\r\ + \n#\ + \n:global MkDir;\ + \n\r\ + \n\ + \n#:local FetchFile Binary.backup\ + \n:local localDir \"\";\ + \n\ + \n\r\ + \n#\$MkDir \$localDir;\r\ + \n\ + \n#\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/727/203f86a6\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 13:30:05 29.06.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add comment=\ + "Lookup IP addresses for RKN list and add them to firewall address-list" \ + dont-require-permissions=no name=AM-RKN-dnsLookup owner=AM-RKN-dnsLookup \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: AM-RKN-dnsLookup\r\ + \n# Script comment: Lookup IP addresses for RKN list and add them to firew\ + all address-list\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# Script description: This script is intended to be run periodically, e.\ + g. once a day, to update the IP addresses in the firewall address-list bas\ + ed on the RKN list.\r\ + \n# It resolves the domain names in the RKN list and a\ + dds the corresponding IP addresses to the specified firewall address-list.\ + \r\ + \n# The script also handles CNAME records by following\ + \_them until it finds A records.\r\ + \n# Usage:\r\ + \n# /system/script { run AM-RKN-dnsLookup; }\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n:global dnsLookupReady false;\r\ + \n:if ([:typeof \$dnsLookupReady] != \"boolean\") do={ :set dnsLookupReady\ + \_true; }\r\ + \nwhile (!\$dnsLookupReady) do={ :nothing; }\r\ + \n:set dnsLookupReady false;\r\ + \n\r\ + \n:local arrRKN {\r\ + \n \"telegra.ph\"\r\ + \n \"grani.ru\"\r\ + \n \"xhamster.com\"\r\ + \n \"lostfilm.tv\"\r\ + \n \"rutracker.org\"\r\ + \n \"lurkmore.to\"\r\ + \n \"dou.ua\"\r\ + \n \"youporn.com\"\r\ + \n \"pornolab.net\"\r\ + \n \"crimerussia.com\"\r\ + \n \"telegram.org\"\r\ + \n \"api.telegram.org\"\r\ + \n \"facebook.com\"\r\ + \n \"instagram.com\"\r\ + \n \"x.com\"\r\ + \n \"twitter.com\"\r\ + \n \"youtube.com\"\r\ + \n \"googleapis.com\"\r\ + \n \"youtu.be\"\r\ + \n \"googlevideo.com\"\r\ + \n \"gstatic.com\"\r\ + \n \"googleusercontent.com\"\r\ + \n \"nhacmp3youtube.com\"\r\ + \n \"telegram.me\"\r\ + \n \"t.me\";}\r\ + \n\r\ + \n:local ListRKN \"RKN-dnsLookup\";\r\ + \n:local ListComment (\"ListRKN managed by \" . \$ScriptName);\r\ + \n:foreach aListItem in=[/ip/firewall/address-list find list=\$ListRKN] do\ + ={\r\ + \n /ip firewall address-list remove \$aListItem;\r\ + \n}\r\ + \n:foreach aItem in=\$arrRKN do={\r\ + \n# :do {\r\ + \n :retry delay=500ms max=5 on-error={:log error \"dns resolve fail\ + ure [ \$aItem - resolve ip ]\"} command={:resolve \$aItem}\r\ + \n# } on-error={\r\ + \n# :log error \"dns resolve failure [ \$arItem - resolve ip ]\";\r\ + \n# }\r\ + \n :foreach dnsRecord in=[/ip dns cache all find where (name=\$aItem)] \ + do={\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"A\") do={\r\ + \n :local newAddress [/ip dns cache all get \$dnsRecord data];\ + \r\ + \n :do {\r\ + \n /ip firewall address-list add list=\$ListRKN address=\$newA\ + ddress comment=\$aItem;\r\ + \n :log warning \"Successfully adding ip to list A record: \ + \$dnsRecord, address: \$newAddress domain: \$aItem\";\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list A record: \$dn\ + sRecord, address: \$newAddress domain: \$aItem\";\r\ + \n }\r\ + \n }\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"CNAME\") do={\r\ + \n :local cname;\r\ + \n :local nextCname;\r\ + \n :local cnameAddress;\r\ + \n :set cname [/ip dns cache all find where (name=\$aItem && ty\ + pe=\"CNAME\")];\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip dns \ + cache all get \$cname data] && type=\"CNAME\")];\r\ + \n :while (\$nextCname != \"\") do={\r\ + \n :set cname \$nextCname;\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip \ + dns cache all get \$cname data] && type=\"CNAME\")];\r\ + \n }\r\ + \n :foreach aRecord in=[/ip dns cache all find where (name=[/ip\ + \_dns cache all get \$cname data] && type=\"A\")] do={\r\ + \n :do {\r\ + \n :set cnameAddress [/ip dns cache all get \$aRecord d\ + ata];\r\ + \n /ip firewall address-list add list=\$ListRKN address\ + =\$cnameAddress comment=\$aItem;\r\ + \n :log warning \"Succesfully adding ip to list CNAME r\ + ecord: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \ + \$aItem.\";\r\ + \n# /ip firewall raw add action=add-dst-to-address-list\ + \_address-list=\$ListRKN address-list-timeout=none-dynamic chain=preroutin\ + g comment=\$aItem content=\$aItem;\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list CNAME reco\ + rd: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \$aI\ + tem.\";\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n :log error (\$ScriptName . \"System Scheduler for script: \" . \$Scri\ + ptName . \" is NOT SET! Fix It Now!\");\r\ + \n /system/scheduler/add name=\$ScriptName on-event=\"/system/script { \ + run \$ScriptName; }\" comment=\"Update RKN DNS Looup\" interval=00:30:00 p\ + olicy=\"ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon\"\ + \_start-time=startup;\r\ + \n }\r\ + \n:set dnsLookupReady true;\r\ + \ndelay 2s; \r\ + \n:global dnsLookupReady (a);\r\ + \n" +add dont-require-permissions=no name="renameLists " owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local oldName \"Test\";\ + \n:local newName \"Test-IP\";\ + \n/ip firewall address-list\ + \n:foreach i in=[find list=\$oldName] do={\ + \nset \$i list=\$newName;\ + \n}\ + \n" +add dont-require-permissions=no name=IPv6-Settings owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + #############Script Settings##################\ + \n\ + \n:local \"IF-TUN\" \"6to4-tun\"\ + \n:local \"IF-LOC\" \"Bridge-LAN\"\ + \n:local \"POOL-6TO4\" \"poolV6-local\"\ + \n:local \"force-update\" false\ + \n############ use then static ip #######################\ + \n:local \"lease-address\" [/ip address get [find interface=\$\"IF-LOC\"] \ + address]\ + \n#:local \"interface\" \"ext\"\ + \n:local bound 0\ + \n\ + \n###############################################\ + \n\ + \n:local 6to4prefix do={\ + \n :global dec2hex\ + \n :local ipv4 \$1\ + \n :local ipv6 \"2002:\"\ + \n :for i from=0 to=2 step=1 do={ \ + \n :if ( \$i = 2) do={\ + \n :set ipv6 (\$ipv6.\":\")\ + \n }\ + \n :local fp [:find \$ipv4 \".\"]\ + \n :if ( \$fp > 0 ) do={\ + \n :set ipv6 (\$ipv6.[\$dec2hex [:pick \$ipv4 0 \$fp]])\ + \n :set ipv4 [:pick \$ipv4 (\$fp + 1 ) [:len \$ipv4]]\ + \n }\ + \n }\ + \n :return (\$ipv6.[\$dec2hex \$ipv4])\ + \n}\ + \n:local \"str_replace\" do={\ + \n :local \"str-pos\" [:find \$1 \$2]\ + \n :local \"str-len\" [:len \$2]\ + \n :local str \"\"\ + \n :local rest \$1\ + \n :while (\$\"str-pos\" >= 0) do={\ + \n :local t [:pick \$rest 0 \$\"str-pos\"]\ + \n :if ( \$4 > 0 ) do={\ + \n :for i from=1 to=(\$4 - [:len \$t]) step=1 do={\ + \n :set str (\$str.\$5)\ + \n }\ + \n }\ + \n :set str (\$str.\$t.\$3)\ + \n :set rest [:pick \$rest (\$\"str-pos\"+\$\"str-len\") [:len \$re\ + st]]\ + \n :set \"str-pos\" [:find \$rest \$2]\ + \n }\ + \n :return (\$str.\$rest)\ + \n}\ + \n\ + \n:if (\$bound=1) do={\ + \n :local t [:find \$\"lease-address\" \"/\"]\ + \n\ + \n :if ( \$t >= 0 ) do={\ + \n :set \"lease-address\" [:pick \$\"lease-address\" 0 \$t]\ + \n }\ + \n\ + \n :if ( [/interface 6to4 print count-only where name=\$\"IF-TUN\"] = 0\ + ) do={\ + \n /interface 6to4 add !keepalive local-address=\$\"lease-address\"\ + \_mtu=1280 name=\$\"IF-TUN\" remote-address=10.30.30.0\ + \n :set \"force-update\" true\ + \n }\ + \n\ + \n :local \"IPv4-TUN\" [/interface 6to4 get [find name=\$\"IF-TUN\"] lo\ + cal-address];\ + \n\ + \n :if ( \$\"lease-address\" != \$\"IPv4-TUN\" || \$\"force-update\" = \ + true) do={\ + \n /interface 6to4 set [find name=\$\"IF-TUN\"] local-address=\$\"l\ + ease-address\"\ + \n /ipv6 address remove [find interface=\$\"IF-TUN\"]\ + \n /ipv6 address remove [find interface=\$\"IF-LOC\"]\ + \n /ipv6 route remove [find gateway ~ \$\"IF-TUN\" and dst-address=\ + \"::/0\"]\ + \n :local \"pool-prefix\" [\$6to4prefix \$\"lease-address\"]\ + \n :if ( [/ipv6 pool print count-only where name=\$\"POOL-6TO4\"] =\ + \_0) do={ \ + \n /ipv6 pool add name=\$\"POOL-6TO4\" prefix=(\$\"pool-prefix\ + \".\":1::/64\") prefix-length=64\ + \n } else={\ + \n /ipv6 pool set [/ipv6 pool find where name=\$\"POOL-6TO4\"] \ + prefix=(\$\"pool-prefix\".\":1::/64\")\ + \n }\ + \n /ipv6 address add address=(\$\"pool-prefix\".\"::\".[\$MAC2EUI64\ + \_[/interface get [find name=\$\"interface\"] mac-address]].\"/3\") interf\ + ace=\$\"IF-TUN\" advertise=no\ + \n /ipv6 address add eui-64=yes from-pool=\$\"POOL-6TO4\" interface\ + =\$\"IF-LOC\" advertise=yes\ + \n /ipv6 route add dst-address=::/0 gateway=(\"::10.30.30.81%\".\$\ + \"IF-TUN\")\ + \n :local t [/ipv6 address get [find interface=\$\"IF-LOC\"] addres\ + s]\ + \n :set t [:pick \$t 0 [:find \$t \"/\"]]\ + \n :if ( [/ipv6 dhcp-server option print count-only where name=DNS]\ + \_= 0) do={\ + \n /ipv6 dhcp-server option add code=23 name=DNS value=(\"0x\".\ + [\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n } else={\ + \n /ipv6 dhcp-server option set [/ipv6 dhcp-server option find \ + where name=DNS] value=(\"0x\".[\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n }\ + \n :if ( [/ipv6 dhcp-server print count-only where interface=\$\"IF\ + -LOC\"] = 0) do={\ + \n /ipv6 dhcp-server add address-pool=\$\"POOL-6TO4\" dhcp-opti\ + on=DNS interface=\$\"IF-LOC\" lease-time=1d name=\$\"IF-LOC\"\ + \n }\ + \n :if ( [ipv6 nd print count-only where interface=\$\"IF-LOC\"] = \ + 0) do={\ + \n /ipv6 nd add advertise-dns=no interface=\$\"IF-LOC\" other-c\ + onfiguration=yes\ + \n }\ + \n }\ + \n}" +add dont-require-permissions=no name=IPv6-GlobalFunc owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global MAC2EUI64 do={\ + \n :local EUI64 \"\"\ + \n :local MAC \$1\ + \n :local HEX2DEC \"0123456789ABCDEF\"\ + \n :for i from=0 to=5 step=1 do={\ + \n :if ( \$i = 0 ) do={\ + \n :set EUI64 [:pick \$MAC 0]\ + \n :set EUI64 (\$EUI64.[:tostr [:pick \$\"HEX2DEC\" ([:find \$\ + \"HEX2DEC\" [:pick \$MAC 1]] ^ 2)]])\ + \n }\ + \n :if ( \$i = 1 || \$i = 3) do={\ + \n :set EUI64 (\$EUI64.\":\")\ + \n }\ + \n :if ( \$i = 2 ) do={\ + \n :set EUI64 (\$EUI64.\"FF:FE\")\ + \n }\ + \n :if ( [:find \$MAC \":\"] = 2 ) do={\ + \n :set MAC [:pick \$MAC 3 [:len \$MAC]]\ + \n :set EUI64 (\$EUI64.[:pick \$MAC 0 2])\ + \n }\ + \n }\ + \n :return (\$EUI64)\ + \n}\ + \n\ + \n:global dec2hex do={\ + \n :local hex \"\"\ + \n :local dec [:tonum \$1]\ + \n :for i from=0 to=4 step=4 do={\ + \n :set hex ([:pick \"0123456789ABCDEF\" ((\$dec>>\$i)&0xf) (((\$de\ + c>>\$i)&0xf)+1)].\$hex)\ + \n }\ + \n :return ([:tostr \$hex])\ + \n}" +/user group +add name=backup policy="ssh,read,write,policy,test,web,sniff,sensitive,api,res\ + t-api,!local,!telnet,!ftp,!reboot,!winbox,!password,!romon" +/ip smb +set enabled=no interfaces=lo +/interface bridge port +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether4 trusted=yes +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/interface bridge settings +set use-ip-firewall=yes +/ip firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN lldp-med=no lldp-poe-power=no +/ip settings +set accept-redirects=yes ipv4-multipath-hash-policy=l4 max-neighbor-entries=\ + 8192 +/ipv6 settings +set disable-ipv6=yes disable-link-local-address=yes forward=no \ + max-neighbor-entries=8192 multipath-hash-policy=l4 +/interface detect-internet +set detect-interface-list=static internet-interface-list=Internet \ + lan-interface-list=LAN request-interval=1m wan-interface-list=WAN +/interface l2tp-server server +set authentication=mschap2 use-ipsec=yes +/interface list member +add interface=ether4 list=WAN +add interface="ether1 - Unet" list=Internet +add interface=WG list=WAN +add interface=Bridge-LAN list=LAN +/interface wireguard peers +add allowed-address=0.0.0.0/0 client-allowed-address=::/0 endpoint-address=\ + 109.107.177.79 endpoint-port=29185 interface=WG name=VDSina \ + persistent-keepalive=10s public-key=\ + "zuRsO+dL/j6awaBWZ/NgnHR+bCNUjRWbaHFpdzkNnw4=" +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=Bridge-LAN enabled=yes interfaces=\ + wlan2,wlan1 lock-to-caps-man=yes +/ip address +add address=10.30.30.81/24 interface=Bridge-LAN network=10.30.30.0 +add address=10.8.0.2/24 interface=WG network=10.8.0.0 +/ip cloud +set update-time=no +/ip dhcp-client +add add-default-route=special-classless default-route-distance=2 \ + default-route-tables=main:1 dhcp-options=clientid,clientid_duid \ + interface="ether1 - Unet" name=client1 use-peer-dns=no use-peer-ntp=no +/ip dhcp-server config +set accounting=no +/ip dhcp-server lease +add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ + 48:8F:5A:8E:EE:A8 server=masterDHCP +add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ + F0:DE:F1:91:0D:1E server=masterDHCP +add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ + 00:80:77:EC:43:86 server=masterDHCP +add address=10.30.30.70 dhcp-option=domain-search-list,HostName \ + dhcp-option-set=HP1505n mac-address=00:1E:0B:1A:88:8D server=masterDHCP +add address=10.30.30.50 client-id=1:4:7c:16:36:f5:37 mac-address=\ + 04:7C:16:36:F5:37 server=masterDHCP +add address=10.30.30.71 client-id=1:10:2d:41:2c:20:c2 mac-address=\ + 10:2D:41:2C:20:C2 server=masterDHCP +add address=10.30.30.61 client-id=1:10:8:c1:81:59:5f mac-address=\ + 10:08:C1:81:59:5F server=masterDHCP +add address=10.30.30.72 client-id=1:10:38:1f:d2:5f:13 mac-address=\ + 10:38:1F:D2:5F:13 server=masterDHCP +add address=10.30.30.99 client-id=1:10:b1:df:e9:d0:d5 mac-address=\ + 10:B1:DF:E9:D0:D5 server=masterDHCP +add address=10.30.30.111 client-id=1:fe:2:52:be:3f:16 mac-address=\ + FE:02:52:BE:3F:16 server=masterDHCP +add address=10.30.30.92 client-id=1:d4:6d:6d:fd:e5:49 mac-address=\ + D4:6D:6D:FD:E5:49 server=masterDHCP +add address=10.30.30.93 client-id=1:7e:8b:1e:cb:b8:cb mac-address=\ + CC:42:10:12:46:94 server=masterDHCP +add address=10.30.30.94 client-id=1:50:cc:f8:85:96:a mac-address=\ + 50:CC:F8:85:96:0A server=masterDHCP +add address=10.30.30.82 client-id=1:e4:18:6b:58:34:ab mac-address=\ + E4:18:6B:58:34:AB server=masterDHCP +add address=10.30.30.75 client-id=1:0:27:15:41:97:a9 mac-address=\ + 00:27:15:41:97:A9 server=masterDHCP +add address=10.30.30.77 dhcp-option=HostName dhcp-option-set=StartLife1 \ + mac-address=C4:82:E1:03:49:10 server=masterDHCP +add address=10.30.30.73 client-id=1:10:38:1f:82:81:f2 mac-address=\ + 10:38:1F:82:81:F2 server=masterDHCP +add address=10.30.30.95 client-id=1:88:ae:dd:60:39:54 dhcp-option=HostName \ + dhcp-option-set=VADOS-NUC mac-address=88:AE:DD:60:39:54 server=masterDHCP +add address=10.30.30.98 client-id=1:c8:5b:76:d8:cc:bf dhcp-option=HostName \ + dhcp-option-set=VADOS-LEN mac-address=C8:5B:76:D8:CC:BF server=masterDHCP +add address=10.30.30.96 client-id=iPhone mac-address=4A:91:ED:0E:1F:39 \ + server=masterDHCP +add address=10.30.30.74 client-id=MiTV dhcp-option=HostName dhcp-option-set=\ + MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP +add address=10.30.30.30 dhcp-option=HostName dhcp-option-set=miller \ + mac-address=F0:75:5D:1E:5F:71 server=masterDHCP +add address=10.30.30.100 client-id=iVados dhcp-option=HostName \ + dhcp-option-set=iVados mac-address=DE:4D:72:F3:1A:9F server=masterDHCP +add address=10.30.30.10 allow-dual-stack-queue=yes client-id=\ + ff:0:0:0:df:0:3:0:1:f0:75:5d:1e:5f:85 dhcp-option=HostName \ + dhcp-option-set=MikroNUC mac-address=F0:75:5D:1E:5F:85 server=masterDHCP \ + use-src-mac=yes +/ip dhcp-server network +add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ + domain-search-list dhcp-option-set=domain-search-set dns-server=\ + 10.30.30.33,109.107.177.79 domain=WORKGROUP gateway=10.30.30.81 netmask=\ + 24 ntp-server=10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +/ip dns +set allow-remote-requests=yes cache-max-ttl=1d doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=10.30.30.33,8.8.8.8 \ + verify-doh-cert=yes +/ip dns static +add address=109.107.177.79 comment="VDSina Server DNS" name=ns1.vados.ru \ + type=A +add address=109.107.177.79 name=vds.vados.ru type=A +add comment="Local DNS server for vados.ru" disabled=yes ns=10.30.30.81 \ + regexp=*.vados.ru type=NS +add comment="*.vados.ru Regexp" disabled=yes forward-to=10.30.30.81 regexp=\ + "\".*\\\\.vados\\\\.ru\"" type=FWD +add comment="*.30.30.10.in-addr.arpa Regexp" disabled=yes forward-to=\ + 10.30.30.81 regexp="\".*\\\\.30\\\\.30\\\\.10\\\\.in-addr\\\\.arpa" type=\ + FWD +add address=10.30.30.81 comment=NS.vados.ru.local disabled=yes name=\ + ns.vados.ru.local type=A +add comment="DNS ns.vados.ru.local" disabled=yes match-subdomain=yes name=\ + vados.ru ns=ns.vados.ru.local type=NS +add address=10.30.30.33 comment=reg.vados.ru name=reg.vados.ru type=A +add address=8.8.8.8 comment="Google-dns IPv4 1" match-subdomain=yes name=\ + dns.google type=A +add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +add address=10.30.30.33 comment=AMSTER name=amster.vados.ru type=A +add address=10.30.30.33 name=ros.vados.ru type=A +add address=10.30.30.95 name=vados-nuc type=A +add address=10.30.30.33 name=amster-nuc type=A +add address=10.30.30.33 name=amster type=A +add address=10.30.30.33 name=amster-reg type=A +add address=10.30.30.33 disabled=yes name=mng.vados.ru type=A +add address=10.30.30.33 name=mgr.vados.ru type=A +add address=10.30.30.33 name=prt.vados.ru type=A +add address=10.30.30.33 disabled=yes match-subdomain=yes name=\ + mikrots.vados.ru type=A +add address=10.30.30.30 comment=MILLER name=miller.vados.ru type=A +add address=10.30.30.30 name=MILLER-LEN type=A +add address=10.30.30.30 name=miller type=A +add address=1.0.0.1 comment="CloudFlare-doh IPv4 2" disabled=yes name=\ + security.cloudflare-dns.com type=A +add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" disabled=yes name=\ + security.cloudflare-dns.com type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=149.112.112.112 comment="Cuad9-dns IPv4 2" disabled=yes name=\ + dns.quad9.net type=A +add address=195.133.25.16 comment="DNS Comss" disabled=yes name=dns.comss.one \ + type=A +add address=10.30.30.81 comment=LocalNet name=MikroVados type=A +add address=10.30.30.10 name=MikroNUC type=A +add address=10.30.30.86 disabled=yes name=MikroYellow type=A +add address=10.30.30.85 disabled=yes name=MikroMic type=A +add address=10.30.30.95 name=VADOS-NUC type=A +add address=10.30.30.98 name=VADOS-LEN type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +add address=10.30.30.20 disabled=yes name=garage type=A +/ip firewall address-list +add address=91.215.120.206 list=TRUSTED +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=8.8.4.0/24 list=YouTube +add address=8.8.8.0/24 list=YouTube +add address=8.34.208.0/20 list=YouTube +add address=8.35.192.0/20 list=YouTube +add address=23.236.48.0/20 list=YouTube +add address=23.251.128.0/19 list=YouTube +add address=34.0.0.0/15 list=YouTube +add address=34.2.0.0/16 list=YouTube +add address=34.3.0.0/23 list=YouTube +add address=34.3.3.0/24 list=YouTube +add address=34.3.4.0/24 list=YouTube +add address=34.3.8.0/21 list=YouTube +add address=34.3.16.0/20 list=YouTube +add address=34.3.32.0/19 list=YouTube +add address=34.3.64.0/18 list=YouTube +add address=34.4.0.0/14 list=YouTube +add address=34.8.0.0/13 list=YouTube +add address=34.16.0.0/12 list=YouTube +add address=34.32.0.0/11 list=YouTube +add address=34.64.0.0/10 list=YouTube +add address=34.128.0.0/10 list=YouTube +add address=35.184.0.0/13 list=YouTube +add address=35.192.0.0/14 list=YouTube +add address=35.196.0.0/15 list=YouTube +add address=35.198.0.0/16 list=YouTube +add address=35.199.0.0/17 list=YouTube +add address=35.199.128.0/18 list=YouTube +add address=35.200.0.0/13 list=YouTube +add address=35.208.0.0/12 list=YouTube +add address=35.224.0.0/12 list=YouTube +add address=35.240.0.0/13 list=YouTube +add address=57.140.192.0/18 list=YouTube +add address=64.15.112.0/20 list=YouTube +add address=64.233.160.0/19 list=YouTube +add address=66.22.228.0/23 list=YouTube +add address=66.102.0.0/20 list=YouTube +add address=66.249.64.0/19 list=YouTube +add address=70.32.128.0/19 list=YouTube +add address=72.14.192.0/18 list=YouTube +add address=74.125.0.0/16 list=YouTube +add address=104.154.0.0/15 list=YouTube +add address=104.196.0.0/14 list=YouTube +add address=104.237.160.0/19 list=YouTube +add address=107.167.160.0/19 list=YouTube +add address=107.178.192.0/18 list=YouTube +add address=108.59.80.0/20 list=YouTube +add address=108.170.192.0/18 list=YouTube +add address=108.177.0.0/17 list=YouTube +add address=130.211.0.0/16 list=YouTube +add address=136.22.160.0/20 list=YouTube +add address=136.22.176.0/21 list=YouTube +add address=136.22.184.0/23 list=YouTube +add address=136.22.186.0/24 list=YouTube +add address=142.250.0.0/15 list=YouTube +add address=146.148.0.0/17 list=YouTube +add address=152.65.208.0/22 list=YouTube +add address=152.65.214.0/23 list=YouTube +add address=152.65.218.0/23 list=YouTube +add address=152.65.222.0/23 list=YouTube +add address=152.65.224.0/19 list=YouTube +add address=162.120.128.0/17 list=YouTube +add address=162.216.148.0/22 list=YouTube +add address=162.222.176.0/21 list=YouTube +add address=172.110.32.0/21 list=YouTube +add address=172.217.0.0/16 list=YouTube +add address=172.253.0.0/16 list=YouTube +add address=173.194.0.0/16 list=YouTube +add address=173.255.112.0/20 list=YouTube +add address=192.158.28.0/22 list=YouTube +add address=192.178.0.0/15 list=YouTube +add address=193.186.4.0/24 list=YouTube +add address=199.36.154.0/23 list=YouTube +add address=199.36.156.0/24 list=YouTube +add address=199.192.112.0/22 list=YouTube +add address=199.223.232.0/21 list=YouTube +add address=207.223.160.0/20 list=YouTube +add address=208.65.152.0/22 list=YouTube +add address=208.68.108.0/22 list=YouTube +add address=208.81.188.0/22 list=YouTube +add address=208.117.224.0/19 list=YouTube +add address=209.85.128.0/17 list=YouTube +add address=216.58.192.0/19 list=YouTube +add address=216.73.80.0/20 list=YouTube +add address=216.239.32.0/19 list=YouTube +add address=2ip.ru list=Test-IP +add address=wg.vados.ru comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" disabled=yes list=TRUSTED +add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +add address=love.ru comment=love.ru list=NoVdsina +add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +add address=pochta.ru comment=pochta.ru list=NoVdsina +add address=vdsina.com list=NoVdsina +add address=vdsina.ru list=NoVdsina +add address=youla.ru list=NoVdsina +add address=kupiprodai.ru list=NoVdsina +add address=myip.ru list=Test-IP +add address=geoip.co list=NoVdsina +add address=comp-lenta.ru list=NoVdsina +add address=128.85.102.70 comment=update.microsoft.com list=\ + windowsupdateslist +add address=wu-b-net.trafficmanager.net. comment=\ + ctldl.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=ctldl.windowsupdate.com.delivery.microsoft.com. comment=\ + ctldl.windowsupdate.com list=windowsupdateslist +add address=redir.update.msft.com.trafficmanager.net. comment=\ + update.microsoft.com list=windowsupdateslist +add address=geo.prod.do.dsp.trafficmanager.net. comment=\ + geo.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=13.74.139.29 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12437.d.akamaiedge.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=displaycatalog-rp.md.mp.microsoft.com.akadns.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=rp-consumer-prod-displaycatalog-geomap.trafficmanager.net. \ + comment=displaycatalog-rp.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=sls.update.microsoft.com. comment=slscr.update.microsoft.com \ + list=windowsupdateslist +add address=glb.sls.prod.dcat.dsp.trafficmanager.net. comment=\ + sls.update.microsoft.com list=windowsupdateslist +add address=fe3.delivery.mp.microsoft.com. comment=\ + fe3cr.delivery.mp.microsoft.com list=windowsupdateslist +add address=glb.cws.prod.dcat.dsp.trafficmanager.net. comment=\ + fe3.delivery.mp.microsoft.com list=windowsupdateslist +add address=fe2cr.update.msft.com.trafficmanager.net. comment=\ + fe2cr.update.microsoft.com list=windowsupdateslist +add address=download.windowsupdate.com.delivery.microsoft.com. comment=\ + download.windowsupdate.com list=windowsupdateslist +add address=wu-f-net.trafficmanager.net. comment=\ + download.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=tsfe.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=edge.ds-c7110-microsoft.global.dns.qwilted-cds.cqloud.com. \ + comment=9.au.download.windowsupdate.com list=windowsupdateslist +add address=52.158.227.125 comment=array812.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dspw65.akamai.net. comment=\ + download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.151.58.88 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net. \ + comment=licensing.mp.microsoft.com list=windowsupdateslist +add address=licensing-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-nlu-net.trafficmanager.net. comment=\ + star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.b.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-tlu-net.trafficmanager.net. comment=\ + star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=storeedgefd.xbetservices.akadns.net. comment=\ + storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net. \ + comment=storeedgefd.dsx.mp.microsoft.com.edgekey.net list=\ + windowsupdateslist +add address=e16646.dscg.akamaiedge.net. comment=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net list=\ + windowsupdateslist +add address=40.69.76.189 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=bg.microsoft.map.fastly.net. comment=\ + 3.au.download.windowsupdate.com list=windowsupdateslist +add list=windowsupdateslist +add address=40.69.75.33 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=cdp-f-ssl-tlu-net.trafficmanager.net. comment=\ + star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a2033.dscd.akamai.net. comment=\ + star.sb.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.138.242 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-nlu-net.trafficmanager.net. comment=\ + dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=1D.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-b-tlu-net.trafficmanager.net. comment=\ + 1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a122.dscg3.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=windowsupdateslist +add address=geover.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e10370.d.akamaiedge.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=52.232.182.21 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.95 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=a1683.dscd.akamai.net. comment=\ + dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net. \ + comment=collections.mp.microsoft.com list=windowsupdateslist +add address=a1847.dscd.akamai.net. comment=\ + wildcard.f.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.142.6 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=au.download.windowsupdate.com.edgesuite.net. comment=\ + 2.au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dscg3.akamai.net. comment=\ + au.download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.156.123.84 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.78.254 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=4.au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + 4.au.download.windowsupdate.com list=windowsupdateslist +add address=cl-glcb907925.gcdn.co. comment=\ + 4.au.download.windowsupdate.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.111 comment=array510.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.69.70.43 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com. \ + comment=tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=ts-frontend.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=40.69.75.248 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.74.84 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=sds.trafficmanager.net. comment=software-download.microsoft.com \ + list=windowsupdateslist +add address=40.69.74.80 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.175.242.182 comment=array804.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=dlc-shim.trafficmanager.net. comment=download.microsoft.com list=\ + windowsupdateslist +add address=e12671.dscd.akamaiedge.net. comment=\ + download.microsoft.com.edgekey.net list=windowsupdateslist +add address=20.187.55.34 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.231 comment=array513.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.222.13 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12358.d.akamaiedge.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-tlu-net.trafficmanager.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a1856.dspw65.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=52.167.164.252 comment=array506.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=13.74.137.54 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv501.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv501.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=collections-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=52.167.160.173 comment=array509.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.77.148 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.200.126 comment=array507.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.167.59 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.172 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ + purchase.mp.microsoft.com list=windowsupdateslist +add address=e110219.a.akamaiedge.net. comment=\ + purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.141 list=windowsupdateslist +add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=storesdk.xbetservices.akadns.net. comment=\ + storesdk.dsx.mp.microsoft.com list=windowsupdateslist +add address=e16646.g.akamaiedge.net. comment=\ + storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ + software-download.microsoft.com list=windowsupdateslist +add address=download.prss.microsoft.com.akamaized.net. comment=\ + software-download.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +add address=87.250.250.50 comment=YandexDisk list=NoVdsina +add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ + purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ + purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ + cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=a1996.dscd.akamai.net. comment=\ + wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.sls.update.microsoft.com list=windowsupdateslist +add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ + star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ + paymentinstruments.mp.microsoft.com list=windowsupdateslist +add address=10.30.30.33 comment=amster disabled=yes list=NoWG +add address=10.30.30.10 comment=MikroNUC disabled=yes list=NoWG +add address=89.110.101.17 comment=!!!VDSINA!!!! disabled=yes list=NoWG +add address=wg.vados.ru comment=VDSina-vpn list=VDSina +add address=80.85.244.9 list=TRUSTED +add address=disc801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + disc801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=89.110.101.17 comment="!!!VDSina Server!!!" list=NoVdsina +add address=dns.quad9.net comment=Quad9-dns disabled=yes list=Trusted-DNS +add address=dns.google comment=Google-dns list=Trusted-DNS +add address=security.cloudflare-dns.com comment=CloudFlare-dns list=\ + Trusted-DNS +add address=time.google.com comment=Google-time list=Trusted-NTP +add address=0.ru.pool.ntp.org comment=ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=1.ru.pool.ntp.org disabled=yes list=Trusted-NTP +add address=2.ru.pool.ntp.org comment=2.ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=3.ru.pool.ntp.org comment=3.ru.pool.ntp.org disabled=yes list=\ + Trusted-NTP +add address=cp.vdsina.com comment=VDSina-vpn list=VDSina +add address=vdsina.ru comment=VDSina-vpn list=VDSina +add address=ns.vados.ru comment=VDSina-vpn list=VDSina +add address=vdsina.com comment=VDSina-vpn list=VDSina +add address=cp.vdsina.ru comment=VDSina-vpn list=VDSina +add address=ns1.vdsina.ru comment=VDSina-vpn list=VDSina +add address=10.30.30.0/24 comment="Local Network" list=Local-Net +add address=10.8.0.0/24 comment="WireGuard Network" list=Local-Net +add address=146.120.64.208/29 comment="External Net" list=Unet +add address=esia.gosuslugi.ru comment=esia.gosuslugi.ru list=NoVdsina +add address=lk.gosuslugi.ru comment=lk.gosuslugi.ru list=NoVdsina +add address=trudvsem.ru comment=trudvsem.ru list=NoVdsina +add address=10.30.30.30 comment=miller disabled=yes list=NoWG +add address=10.30.30.33 comment="Direct connet to DNS servers" list=\ + Direct-DNS +add address=109.107.177.79 list=VPN-Server +add address=10.30.30.10 list=AWG-Proxy +/ip firewall filter +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=12h chain=input comment="block honeypot DNS" \ + connection-state=new dst-port=53 in-interface="ether1 - Unet" protocol=\ + udp src-address-list=!Trusted-DNS +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input connection-state=new dst-port=53 \ + in-interface="ether1 - Unet" protocol=tcp src-address-list=!Trusted-DNS +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment=\ + "block honeypot ssh rdp winbox" connection-state=new dst-port=22,8291 \ + in-interface="ether1 - Unet" protocol=tcp src-address-list=!TRUSTED +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot asterisk" \ + connection-state=new dst-port=5060 in-interface="ether1 - Unet" protocol=\ + udp +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot NTP" \ + connection-state=new dst-port=123 in-interface="ether1 - Unet" protocol=\ + udp +add action=fasttrack-connection chain=forward comment=\ + "FastTrack for non-VPN connections" connection-mark=!VPN_No_FastTrack \ + connection-state=established,related,new disabled=yes +add action=accept chain=input disabled=yes dst-port=29185 in-interface=\ + "ether1 - Unet" protocol=tcp +add action=accept chain=input disabled=yes dst-port=29185 in-interface=\ + "ether1 - Unet" protocol=udp +add action=accept chain=input comment="tcp Accept input DNS queries from LAN" \ + dst-port=53 protocol=tcp src-address=10.30.30.0/24 +add action=accept chain=input comment="udp Accept input DNS queries" \ + dst-port=53 protocol=udp src-address=10.30.30.0/24 +add action=accept chain=output comment="accept WireGuard" disabled=yes \ + dst-address-list=VPN-Server out-interface="ether1 - Unet" protocol=udp \ + src-port=13231 +add action=accept chain=output disabled=yes dst-address-list=VPN-Server \ + dst-port=29185 out-interface="ether1 - Unet" protocol=udp +add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \ + connection-state=established,related,new disabled=yes routing-mark=\ + !To-VPN +add action=accept chain=output disabled=yes protocol=tcp src-port=443 +add action=accept chain=output disabled=yes src-address=127.0.0.1 +add action=accept chain=forward comment="defconf: accept in ipsec policy" \ + disabled=yes ipsec-policy=in,ipsec +add action=accept chain=forward comment="defconf: accept out ipsec policy" \ + disabled=yes ipsec-policy=out,ipsec +add action=accept chain=forward comment=\ + "defconf: accept established,related, untracked" connection-state=\ + established,related,untracked +add action=drop chain=forward comment="defconf: drop invalid" \ + connection-state=invalid in-interface="ether1 - Unet" src-address=\ + !10.30.30.0/24 +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + connection-state=new in-interface="ether1 - Unet" src-address-list=\ + !VDSina +add action=drop chain=forward comment=\ + "Filter Rule to block FB address LIST : )" disabled=yes dst-address-list=\ + facebook +add action=drop chain=forward comment=\ + "Filter Rule to block YOUTUBE address LIST : )" disabled=yes \ + dst-address-list=YouTube +add action=accept chain=input in-interface="ether1 - Unet" protocol=icmp \ + src-address-list=VDSina +add action=accept chain=input connection-state=established disabled=yes +add action=accept chain=input connection-state=related disabled=yes +/ip firewall mangle +add action=mark-routing chain=prerouting comment="Mark Routing main for NoWG" \ + new-routing-mark=main src-address-list=NoWG +add action=mark-routing chain=prerouting comment=\ + "Mark Routing main for NoVdsina" dst-address-list=NoVdsina \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=\ + "Mark Routing main for VDSina" dst-address-list=VPN-Server \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=\ + "Mark Routing main for MikroNuc" disabled=yes dst-address-list=AWG-Proxy \ + new-routing-mark=main src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=\ + "!!!ERROR Mark Routing main for Unet!!!" disabled=yes dst-address-list=\ + Unet new-routing-mark=main passthrough=no +add action=mark-routing chain=prerouting comment="Test-IP sites" disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=Test-IP new-routing-mark=\ + To-VPN src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=FuckRKN disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=RKN-dnsLookup \ + new-routing-mark=To-VPN passthrough=no src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment="AWG for All sites" \ + disabled=yes dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina \ + new-routing-mark=*401 routing-mark=!main src-address=10.30.30.0/24 \ + src-address-list=!NoWG +add action=mark-routing chain=prerouting comment="VDSIna for All sites" \ + dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina new-routing-mark=\ + To-VPN routing-mark=!main src-address=10.30.30.0/24 src-address-list=\ + !NoWG +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" new-connection-mark=\ + VPN_No_FastTrack routing-mark=To-VPN +add action=change-mss chain=forward comment="MSS on WG" new-mss=1380 \ + out-interface=WG protocol=tcp routing-mark=To-VPN tcp-flags=syn tcp-mss=\ + 1381-65535 +add action=mark-routing chain=prerouting comment="VPN Network" dst-address=\ + 10.8.0.0/24 new-routing-mark=To-VPN src-address=10.30.30.0/24 +/ip firewall nat +add action=redirect chain=dstnat comment="udp Redirect DNS in NAT" disabled=\ + yes dst-port=53 protocol=udp src-address=10.30.30.0/24 src-address-list=\ + !NoWG to-addresses=10.30.30.33 to-ports=53 +add action=redirect chain=dstnat comment="tcp Redirect DNS in NAT" disabled=\ + yes dst-port=53 protocol=tcp src-address=10.30.30.0/24 src-address-list=\ + !NoWG to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat comment=\ + "53/tcp dst-nat to amster.loc. From VDSina Server" dst-port=53 \ + in-interface="ether1 - Unet" protocol=tcp src-address-list=VPN-Server \ + to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat comment=\ + "53/udp dst-nat to amster.loc. From VDSina Server" dst-port=53 protocol=\ + udp src-address-list=VPN-Server to-addresses=10.30.30.33 to-ports=53 +add action=dst-nat chain=dstnat disabled=yes dst-port=44333 in-interface=\ + "ether1 - Unet" protocol=udp src-address=!10.30.30.0/24 to-addresses=\ + 10.30.30.33 to-ports=44333 +add action=masquerade chain=srcnat comment="Default NAT" out-interface=\ + "ether1 - Unet" routing-mark=!To-VPN src-address=10.30.30.0/24 +add action=dst-nat chain=dstnat comment=amster.vados.ruhttps dst-port=443 \ + fragment=no in-interface="ether1 - Unet" protocol=tcp routing-mark=main \ + to-addresses=10.30.30.33 to-ports=443 +add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ + dst-port=80 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat comment="amster.vados.ru 3x-ui" disabled=yes \ + dst-port=2904 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=2904 +add action=dst-nat chain=dstnat comment=reg.vados.ru disabled=yes dst-port=\ + 5000 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=5000 +add action=dst-nat chain=dstnat comment="Docker swarm" disabled=yes dst-port=\ + 2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=2377 +add action=dst-nat chain=dstnat comment=npm dst-port=81 in-interface=\ + "ether1 - Unet" protocol=tcp routing-mark=To-VPN to-addresses=10.30.30.33 \ + to-ports=81 +add action=dst-nat chain=dstnat comment=SSH dst-port=22 in-interface=\ + "ether1 - Unet" protocol=tcp src-address-list=TRUSTED to-addresses=\ + 10.30.30.33 to-ports=22 +add action=dst-nat chain=dstnat comment="portainer agent" disabled=yes \ + dst-port=2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=2377 +add action=dst-nat chain=dstnat disabled=yes dst-port=22 in-interface=\ + "ether1 - Unet" protocol=tcp routing-mark=!To-VPN to-addresses=\ + 10.30.30.33 to-ports=22 +add action=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ + out-interface=WG routing-mark=To-VPN src-address-list=!NoWG +add action=dst-nat chain=dstnat comment="Yandex.DNS Family" disabled=yes \ + dst-port=53 in-interface=Bridge-LAN protocol=udp src-address-list=KIDS \ + time=6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +add action=dst-nat chain=dstnat disabled=yes dst-port=53 in-interface=\ + Bridge-LAN protocol=tcp src-address-list=KIDS time=\ + 6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +/ip firewall raw +add action=drop chain=prerouting comment="Drop Honeypot Hackers" \ + in-interface="ether1 - Unet" src-address-list="Honeypot Hacker" +add action=accept chain=prerouting comment="Trusted DNS" disabled=yes \ + in-interface-list=WAN src-address-list=Trusted-DNS +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + extras.getpagespeed.com content=extras.getpagespeed.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=linux.duke.edu \ + content=linux.duke.edu disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtube.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googleapis.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ggpht.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=youtu.be \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=ytimg.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googlevideo.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=gstatic.com \ + disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + googleusercontent.com disabled=yes +add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ + none-dynamic chain=prerouting comment="YouTube raw" content=\ + nhacmp3youtube.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ + content=rutube.ru disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment="me.com raw" \ + content=me.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "icloud.com raw" content=icloud.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "smtp.mail.me.com raw" content=smtp.mail.me.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "smtp.mail.me.com.akadns.net raw" content=smtp.mail.me.com.akadns.net \ + disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + "api.db-ip.com raw" content=api.db-ip.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + esia.gosuslugi.ru content=esia.gosuslugi.ru disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=gosuslugi.ru \ + content=gosuslugi.ru disabled=yes +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set irc disabled=no +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip ipsec settings +set accounting=no +/ip ipsec policy +set 0 disabled=yes dst-address=0.0.0.0/0 src-address=0.0.0.0/0 +/ip ipsec profile +set [ find default=yes ] dpd-interval=2m dpd-maximum-failures=5 +/ip proxy +set cache-administrator="" max-cache-size=none port=80,443 src-address=\ + 0.0.0.0 +/ip route +add check-gateway=none disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\ + WG routing-table=To-VPN scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api address=10.30.30.0/24 +set api-ssl address=10.30.30.0/24 disabled=yes +set www-ssl certificate=Root-YE port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ + webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=Bridge-LAN type=internal +add forced-ip=146.120.64.211 interface="ether1 - Unet" type=external +add forced-ip=109.107.177.79 interface=*E type=external +add interface=lo type=internal +add interface=wlan2 type=internal +add interface=wlan1 type=internal +/ipv6 dhcp-client +add add-default-route=yes disabled=yes interface=*F rapid-commit=no request=\ + info use-interface-duid=yes validate-server-duid=no +/ipv6 dhcp-server option sets +add name=domain-search-set options=domain-search-list +add name="=\"Client ID\"" options=HostName +/ipv6 firewall address-list +add address=::/128 comment="defconf: unspecified address" list=bad_ipv6 +add address=::1/128 comment="defconf: lo" list=bad_ipv6 +add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6 +add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6 +add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6 +add address=100::/64 comment="defconf: discard only " list=bad_ipv6 +add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6 +add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6 +add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6 +/ipv6 firewall filter +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid +add action=accept chain=input comment="defconf: accept ICMPv6" protocol=\ + icmpv6 +add action=accept chain=input comment="defconf: accept UDP traceroute" \ + dst-port=33434-33534 protocol=udp +add action=accept chain=input comment=\ + "defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\ + udp src-address=fe80::/10 +add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \ + protocol=udp +add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\ + ipsec-ah +add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\ + ipsec-esp +add action=accept chain=input comment=\ + "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +add action=drop chain=input comment=\ + "defconf: drop everything else not coming from LAN" in-interface-list=\ + !LAN +add action=accept chain=forward comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=forward comment="defconf: drop invalid" \ + connection-state=invalid +add action=drop chain=forward comment=\ + "defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6 +add action=drop chain=forward comment=\ + "defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6 +add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \ + hop-limit=equal:1 protocol=icmpv6 +add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\ + icmpv6 +add action=accept chain=forward comment="defconf: accept HIP" protocol=139 +add action=accept chain=forward comment="defconf: accept IKE" dst-port=\ + 500,4500 protocol=udp +add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\ + ipsec-ah +add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\ + ipsec-esp +add action=accept chain=forward comment=\ + "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +add action=drop chain=forward comment=\ + "defconf: drop everything else not coming from LAN" in-interface-list=\ + !LAN +/ipv6 nd +set [ find default=yes ] advertise-dns=yes disabled=yes interface=Bridge-LAN \ + managed-address-configuration=yes other-configuration=yes pref64=::/64 +/ipv6 nd prefix +add autonomous=no disabled=yes interface=Bridge-LAN on-link=no prefix=none +/ipv6 nd prefix default +set dhcp6-pd-preferred=yes +/ipv6 nd proxy +add disabled=yes interface=lo +/ipv6 nd settings +set router-advertisement-route-distance=100 +/routing settings +set single-process=no +/system clock +set time-zone-name=Europe/Moscow +/system clock manual +set time-zone=+03:00 +/system identity +set name=MikroMaster +/system logging +add action=email disabled=yes regex="* added|changed|removed *" topics=\ + system,info +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes use-local-clock=yes +/system ntp client servers +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +add address=time.google.com disabled=yes +/system package update +set check-certificate=yes-without-crl ip-version=ipv4 +/system scheduler +add comment="Every Day Set Global Environment Variables" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Update RKN DNS Looup" disabled=yes interval=20m name=\ + AM-RKN-dnsLookup on-event="/system/script { run AM-RKN-dnsLookup; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +/system watchdog +set watchdog-timer=no +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool mac-server +set allowed-interface-list=LAN +/tool mac-server mac-winbox +set allowed-interface-list=LAN +/tool netwatch +add certificate=DigiCert-Global-Root-CA check-certificate=no comment="doh, doh\ + -url=https://security.cloudflare-dns.com/dns-query, notify, name=CloudFlar\ + e-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 http-codes="" \ + interval=10s name="CloudFlare-doh IPv4 1" port=443 test-script="" type=\ + https-get up-script="" +add check-certificate=no comment="doh-fallback, doh-url=https://security.cloud\ + flare-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Cl\ + oudFlare-doh IPv4" disabled=yes down-script="" host=1.0.0.1 http-codes="" \ + name="CloudFlare-doh IPv4" port=443 test-script="" type=https-get \ + up-script="" +add comment="dns, notify, name=Google-DNS IPv4" disabled=yes dns-server=\ + 8.8.8.8 down-script="" host=dns.google http-codes="" name=\ + "Google-DNS IPv4" test-script="" type=dns up-script="" +add certificate=GTS-Root-R4 check-certificate=yes comment="doh-fallback, doh-u\ + rl=https://dns.google/dns-query, doh-cert=GTS Root R1, notify, name=Google\ + -DOH IPv4" disabled=yes dns-server=8.8.4.4 down-script="" host=dns.google \ + http-codes="" name="Google-DOH IPv4" port=443 record-type=NS src-address=\ + "" test-script="" type=dns up-script="" +add comment="dns-fallback, notify, name=Cuad9-DOH IPv4" disabled=yes \ + dns-server=9.9.9.9 down-script="" host=dns9.quad9.net http-codes="" \ + interval=10s name="Cuad9-DOH IPv4" src-address=146.120.64.211 \ + test-script="" timeout=800ms type=dns up-script="" +add certificate=DigiCert-Assured-ID-Root-CA comment="doh-fallback, doh-url=htt\ + ps://dns.quad9.net/dns-query, name=Cuad9-DOH IPv4" disabled=yes \ + down-script="" host=149.112.112.112 http-codes="" interval=10s name=\ + "Cuad9-DOH IPv4" port=443 test-script="" type=https-get up-script="" +add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ + down-script="" host=91.192.189.2 http-codes="" interval=10s name=\ + ns1.unet.ws test-script="" type=simple up-script="" +add check-certificate=yes comment=\ + "doh, doh-url=https://vds.vados.ru/vds-query, name=vds.vados.ru" \ + disabled=yes down-script="" host=109.107.177.79 http-codes="" name=\ + vds.vados.ru port=443 test-script="" type=https-get up-script="" +/user aaa +set accounting=no diff --git a/MikroMaster/tmp/Diff-Config.rsc b/MikroMaster/tmp/Diff-Config.rsc new file mode 100644 index 0000000..9b46c11 --- /dev/null +++ b/MikroMaster/tmp/Diff-Config.rsc @@ -0,0 +1,6 @@ +91,92c91,92 +< #error exporting "/ppp/profile" (timeout) +< #error exporting "/queue/interface" (timeout) +--- +> /ppp profile +> set *FFFFFFFE use-upnp=no diff --git a/MikroNUC/20260703/20260703014001-Binary.backup b/MikroNUC/20260703/20260703014001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..0d4e84f7f370ec2942b8d1661a509d4e6a5cbe06 GIT binary patch literal 378399 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 z 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�{@*mmov~KBwr%#8`M8Hu6HAePON9|F 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 Q7z{$YY4WuU=)RiD#rcD8GXMYp literal 0 HcmV?d00001 diff --git a/MikroNUC/20260703/20260703014001-Config.rsc b/MikroNUC/20260703/20260703014001-Config.rsc new file mode 100644 index 0000000..86cbbe9 --- /dev/null +++ b/MikroNUC/20260703/20260703014001-Config.rsc @@ -0,0 +1,5366 @@ +# 2026-07-03 01:40:02 by RouterOS 7.23.1 +# system id = NmJcEM+8XAP +# +/caps-man channel +add band=2ghz-g/n extension-channel=disabled frequency=2422 name=2G-3 \ + reselect-interval=20m save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXX frequency=5660 name=5G-5660 \ + save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXXXXXX frequency=5160,5200,5280 \ + name=5G-5160-5280 reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5180 name=5G-36 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5200 name=5G-40 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5220 name=5G-44 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5240 name=5G-48 \ + reselect-interval=30m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2442 name=2G-7 \ + reselect-interval=20m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2462 name=2G-11 \ + reselect-interval=20m save-selected=yes +/interface bridge +add name=BridgeLAN +/interface ethernet +set [ find default-name=ether1 ] disable-running-check=no +/interface veth +add address=172.18.0.2/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ + gateway=172.18.0.1 gateway6="" name=vetch-wg2awg +/caps-man security +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=xs-Sec +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=WPA2 +/disk +add slot=ram tmpfs-max-size=100000000 type=tmpfs +/interface list +add include=dynamic,static name=LAN +add exclude=LAN name=WAN +add exclude=LAN include=WAN name=Internet +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroMIC +/iot wiliot servers +set *1 address=mqtt.us-east-2.prod.wiliot.cloud name="Wiliot US East" +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=P1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +/ip pool +add name=dhcp ranges=10.30.30.150-10.30.30.200 +/routing table +add disabled=no fib name=to-awg +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=test owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n#:local ScriptName [ :jobname ];\r\ + \n:local expSrc;\r\ + \n:local FileName;\r\ + \n:local FilePath;\r\ + \n:local DirPath \"tmpfs/\";\r\ + \n:global WaitForFile;\r\ + \n:global IfThenElse;\r\ + \n\r\ + \n:foreach Script in=([ /system/script find where name~\"Amster-GlobalConf\ + *\" ]) do={\r\ + \n:local ScriptVal [ /system/script/get \$Script ];\r\ + \n\r\ + \n:local expName [ (\$ScriptVal->\"name\") ];\r\ + \n#[/system/script get \$expScript name];\r\ + \n:delay 2s;\r\ + \n\r\ + \n:set expSrc [/system/script print where name=\$expName];\r\ + \n/system/script print where name=\$expName;\r\ + \n#[:put [/system/script get \$expScript source]];\r\ + \n:put [\$expSrc];\r\ + \n:delay 2s;\r\ + \n:set FileName \$expName;\r\ + \n:set FilePath (\$DirPath . \$FileName);\r\ + \n\r\ + \n#:log warning \"\\n----------------------\\n\\\$expSrc = \$expSrc\\n____\ + ______________________________\";\r\ + \n:log info \"\\n\\\$FileName = '\$FileName'\";\r\ + \n:log info \"\\n\\\$FilePath = \$FilePath\";\r\ + \n#:log warning {/system/script/get source=[/system/script/get \$expScript\ + \_source];};\r\ + \n\r\ + \n#\$[/system script get [/system script find name=\"\$FileName\"] source]\ + \r\ + \n\r\ + \n#:local gettingScript \"\$FileName\";\r\ + \n#:execute script=\"[[:parse \\\"[:parse { :put (\"\$[/system script get \ + [/system script find name=\$FileName] source]\"); } \\\"]]\"; \\\r\ + \n\r\ + \n#:execute script={:put \"[:parse \\\"[:parse [/system/script get [/syste\ + m/script find name=\$gettingScript] source];\\\"]]\";} \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n:do {\r\ + \n:local fName (\$FilePath . \".rsc\");\r\ + \n#:delay 3s;\r\ + \n#/file add name=\$fName;\r\ + \n:put [:tostr [\$expSrc]];\r\ + \n/file set \$fName contents=[:put [\$expSrc]];\r\ + \n:delay 3s;\r\ + \n\$WaitForFile \$fName;\r\ + \n(\$FilePath . \".rsc\");\r\ + \n#:delay 2s;\r\ + \n\r\ + \n} on-error={\r\ + \n:log error \"\\nERROR \\\$FilePath = \$FilePath\";\r\ + \n}\r\ + \n#\$WaitForFile (\$FilePath . \".rsc\");\r\ + \n#:execute script={ :put [/system/script get [:put \$FileName] source]; }\ + ;\r\ + \n#/system/script export \$Sscript file=\$FilePath;\r\ + \n#/system/script/export [:put [/system/script/get \$expScript source]] fi\ + le=\$FilePath;\r\ + \n#:execute script={ :put [/system/script/get \$expScript source]; } \\\r\ + \n\r\ + \n#:log warning \"\\n\\\$expScript = \$expScript\";\r\ + \n# \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n#script={:put [/system/script/get \$FileName source];} file=(\$FilePath\ + \_. \".rsc\\00\");\r\ + \n#/system script export \$src file=(\$FilePath . \$FileName);\r\ + \n}\r\ + \n\r\ + \n:log warning \"\\nComplete!\";\r\ + \n\r\ + \n # :execute script={ :put [ /system/script/get Amster-GlobalConfig sou\ + rce ]; } \\\r\ + \n # file=(\$FilePath . \".conf\\00\");\r\ + \n # \$WaitForFile (\$FilePath . \".conf\");\r\ + \n # :onerror Err {\r\ + \n # /tool/fetch upload=yes url=(\$BackupUploadUrl . \"/\" . \$FileName\ + \_. \".conf\") \\\r\ + \n # user=\$BackupUploadUser password=\$BackupUploadPass src-path=(\ + \$FilePath . \".conf\");\r\ + \n # :set ConfigFile [ /file/get (\$FilePath . \".conf\") ];\r\ + \n # :set (\$ConfigFile->\"name\") (\$FileName . \".conf\");\r\ + \n " +add dont-require-permissions=no name=test1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n#:local runningVer [:find [/system/resource/get version] \"(\"];\r\ + \n\r\ + \n:local runningChannel;\r\ + \n:local runningVersion;\r\ + \n:local ParseCustom;\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n \r\ + \n:global runningChannel [\$ParseCustom [/system/resource/get version] \"(\ + \" \")\" 1];\r\ + \n:log warning [\$runningChannel];\r\ + \n:set runningVersion [\$ParseCustom [/system/resource/get version] \" \" \ + \")\" 2];\r\ + \n:log warning [\$runningVersion];\r\ + \n\r\ + \n\r\ + \n\r\ + \n# :if ([:len \$open] = 0) do={\r\ + \n# :log error \"\$SMP Could not extract installed OS channel from vers\ + ion string: `\$runningOsAndChannel`.\";\r\ + \n# :error \"\$SMP error, check logs\";\r\ + \n# }\r\ + \n# :local rest [:pick \$runningOsAndChannel (\$open+1) [:len \$runningOs\ + AndChannel]];\r\ + \n# :local close [:find \$rest \")\"];\r\ + \n# :local channel [:pick \$rest 0 \$close];\r\ + \n# :return \$channel;\r\ + \n#}" +add dont-require-permissions=no name=01-Amster-Init-Script owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# Amster Initial Script\r\ + \n#\r\ + \n#:global GlobalEnvRemove true; /system/script {run Amster-GlobalEnvRemov\ + e; };\r\ + \n#:delay 1s;\r\ + \n:#global ReloadGlobal true; \r\ + \n\r\ + \n:global AmScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global defOwner \"vados\";\r\ + \n:global AmFirstRun;\r\ + \n\r\ + \n:set AmFirstRun do={\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n #:global ParseKeyValueStore;\r\ + \n #:local AmUpdCRLF true;\r\ + \n #:local IfThenElse;\r\ + \n #:set IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1\ + \_] = true) do={:return \$2}; :return \$3}\r\ + \n #/certificate/settings/set builtin-trust-store=fetch;\r\ + \n #/tool/fetch \"\$scriptsUrl/certs/Root-YE.pem\" dst-path=\"root-ye.p\ + em\";\r\ + \n #/certificate/import file-name=\"root-ye.pem\" passphrase=\"\";\r\ + \n # For basic verification we rename the certificate and print it by f\ + ingerprint. Make sure exactly this one certificate (\"Root-YE\") is shown.\ + \r\ + \n #/certificate/set name=\"Root-YE\" [ find where common-name=\"Root Y\ + E\" ];\r\ + \n #/certificate/print proplist=name,fingerprint where fingerprint=\"e1\ + 4ffcad5b0025731006caa43a121a22d8e9700f4fb9cf852f02a708aa5d5666\";\r\ + \n #:log info \"\\nAmScriptsUrl = \$AmScriptsUrl\";\r\ + \n :local Scripts {\r\ + \n \"Amster-GlobalConfig\"\r\ + \n \"Amster-GlobalFunc\";\r\ + \n# \"Amster-SFTP-backup\"\r\ + \n# \"Amster-BkpEmail-and-upd\";\r\ + \n };\r\ + \n# /system/script/set owner=(\$ScriptVal->\"name\") \\\r\ + \n# source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRLF \$S\ + ourceNew ] \$Script;\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n /system/script { run Amster-GlobalConfig; run Amster-GlobalFunc; }\r\ + \n}\r\ + \n:global AmUpdRun;\r\ + \n:set AmUpdRun do={\r\ + \n #:local UpdScript [ :tostr \$1 ];\r\ + \n #:global ParseKeyValueStore;\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n :local Scripts {\r\ + \n# \"Amster-GlobalConfig\"\r\ + \n# \"Amster-GlobalFunc\"\r\ + \n# \"Amster-GlobalRemove\"\r\ + \n \"Amster-backup-SFTP\"\r\ + \n \"Amster-SFTP-backup\"\r\ + \n \"Amster-BkpEmail-and-upd\"\r\ + \n \"Amster-TG-Bot\"\r\ + \n \"Amster-TG-Notification\";\r\ + \n };\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"updating \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n# /system/script/add name=\$Script owner=\$AmOwner source=([ /tool/fe\ + tch check-certificate=yes-without-crl (\"\$AmScriptsUrl\" . \$Script . \".\ + rsc\") output=user as-value ]->\"data\"); };\r\ + \n}\r\ + \n\r\ + \n\$AmFirstRun;\r\ + \n#\$AmUpdRun;\r\ + \n\r\ + \n#\$setUpdExist;\r\ + \n#:global setUpdExist;\r\ + \n#:global ParseKeyValueStore;\r\ + \n#:set setUpdExist do={\r\ + \n#:do {\r\ + \n#:global ParseKeyValueStore;\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\\r\?\\n#comment=*\" ] do={\r\ + \n# :local ScriptVal [ /system/script/get \$Script ];\r\ + \n# :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"#comment\"\ + ) ];\r\ + \n# :local scriptName (\$ScriptVal->\"name\");\r\ + \n#:log warning (\"\\n\\\$scriptName = \". \$scriptName);\r\ + \n#: log warning (\"\\n\\\$ScriptInfo = \". \$ScriptInfo);\r\ + \n# }\r\ + \n#} on-error={}\r\ + \n#}\r\ + \n#\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run\ + -count;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;\r\ + \n#;(evl / (evl /docommand=;(evl / (evl /foreachcounter=\$Script;do=;(evl \ + / (evl /localname=\$ScriptVal;value=(evl (evl /system/script/getnumber=\$S\ + cript))) (evl /localname=\$ScriptInfo;value=(evl (<%% \$ParseKeyValueStore\ + \_(> \$ParseKeyValueStore);(-> \$ScriptVal comment)))) (evl /localname=\$s\ + criptName) (evl /setname=\$scriptName;value=(-> #\$ScriptVal name)) (evl /\ + log/errormessage=(. \r\ + \n# \$ ScriptInfo = \$ScriptInfo)));in=(evl (evl /system/script/findwhere\ + =\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run-c\ + ount;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;(~ \$so\ + urce (. ^#!rsc by Vados \r\ + \n# \? \r\ + \n#));5))));on-error=;(evl /)))\r\ + \n" +add dont-require-permissions=no name="Download cAP's Packages" owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# +------------------------------+\r\ + \n# | |\r\ + \n# | Mikrotik RouterOS Scripts |\r\ + \n# | _Download cAP's Packages_ |\r\ + \n# | |\r\ + \n# +------------------------------+\r\ + \n# https://github.com/sebastian13/mikrotik-routeros-scripts\r\ + \n#\r\ + \n\r\ + \n# Set a directory path providing the required space\r\ + \n# Add a microSD card https://wiki.mikrotik.com/wiki/Manual:System/Disks\ + \r\ + \n# or setup a RAM-Disk via '/disk/add type=tmpfs tmpfs-max-size=20M slot=\ + ram'\r\ + \n:local dir \"/tmpfs/capsman-packages\";\r\ + \n\r\ + \n\r\ + \n# Set Package Path if required, set policy to none if using 'upgrade-cap\ + s' script\r\ + \n/interface/wifi/capsman/set package-path=\$dir upgrade-policy=none;\r\ + \n/caps-man/manager/set package-path=\$dir upgrade-policy=none;\r\ + \n#require-same-version;\r\ + \n\r\ + \n:local installed [/system package get value-name=version [find where nam\ + e=\"routeros\"]]\r\ + \n\r\ + \n# Delete old downloads\r\ + \n# /file/remove [ find type=package name~\"capsman*\" ]\r\ + \n\r\ + \n# Starting from RouterOS version 7.13, drivers for older wireless and 60\ + GHz interfaces are\r\ + \n# part of the separate \"wireless\" package. The existing \"wifiwave2\" \ + package has been divided\r\ + \n# into distinct packages: \"wifi-qcom\" and \"wifi-qcom-ac\".\r\ + \n# RouterOS >=7.12 is required to upgrade to 7.13.\r\ + \n# https://forum.mikrotik.com/viewtopic.php\?t=202423\r\ + \n\r\ + \n:foreach architecture in={ \"arm\";\r\ + \n# \"arm64\";\r\ + \n \"x86_64\";\r\ + \n \"mipsbe\"} do={\r\ + \n :foreach package in={ \"routeros\";\r\ + \n# \"wifi-qcom-ac\";\r\ + \n# \"wifi-qcom\";\r\ + \n \"container\";\r\ + \n \"wireless\"} do={ :do {\r\ + \n :put \"\"\r\ + \n :put \"Download \$package \$installed for \$architecture\"\r\ + \n /tool fetch mode=https \\\r\ + \n url=\"https://download.mikrotik.com/routeros/\$installed/\$packa\ + ge-\$installed-\$architecture.npk\" \\\r\ + \n dst-path=\"\$dir/\$package-\$installed-\$architecture.npk\"\r\ + \n } on-error={ :put \"Error downloading the file. On a 404, note t\ + hat the package may not exist for the specified architecture!\" }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Script for setup routeros script system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros script system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe true;\r\ + \n:global RunOnce (a);\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs false;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n\r\ + \n :local UrlSuffix \$Identity;\r\ + \n :local UrlDir \"certs/\";\r\ + \n :local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\"); \ + \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ + \_\\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n /tool/fetch (\$CertUrl . \$CertFileName) dst-path=\$CertFileName\ + \_as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n /certificate/set name=\"Root-YE\" [ find where common-name=\"Roo\ + t YE\" ];\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :local Script \"mod/AM-Certs-By-Ident\";\r\ + \n \r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetch \ + check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".\ + rsc\") output=user as-value ]->\"data\");\r\ + \n /system/script run \$Script;\r\ + \n :global tmpAddCerts;\r\ + \n :while ([ \$tmpAddCerts ] = true) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n :delay 1s;\r\ + \n :put \"Removing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/729/f42d43ae\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 00:05:03 01.07.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n#\ + \n#root.mnuc.backuper\ + \n\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\ + \n#:local Script AM-GlobalConfig;\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n:global MkDir;\ + \n\ + \n:local FetchFile Manager@id_rsa.pub\ + \n:local localDir \"/\";\ + \n\ + \n\$MkDir \$localDir;\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\ + \n" +add dont-require-permissions=yes name=MkTmpfs owner=vados policy=\ + ftp,read,write,policy,test,sniff,sensitive source=\ + ":global MkDir;\r\ + \n\r\ + \n\$MkDir /usb1/tmpfs;" +add dont-require-permissions=no name=CreateContainer owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local contIF \"veth1\";\r\ + \n:local contIP \"10.10.10.10/24\";\r\ + \n:local contGW \"10.10.10.1\";\r\ + \n#/interface/veth/add name=\$contIF address=\$contIP gateway=\$contGW;\r\ + \n:local contBridgeIF \"Bridge-DOC\";\r\ + \n:local contBridgeIP \"10.10.10.1/24\";\r\ + \n/interface/bridge/add name=\$contBridgeIF;\r\ + \n/ip/address/add address=\$contBridgeIP interface=\$contBridgeIF;\r\ + \n/interface/bridge/port/add bridge=\$contBridgeIF interface=\$contIF;\r\ + \n/container/config/set ram-high=768M registry-url=https://registry-1.dock\ + er.io tmpdir=sata1/tmp\r\ + \n" +add dont-require-permissions=no name=carkeeperbot owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/mounts/add list=carkeeper_configs/.profile src=sata1/carkeeper/c\ + onfigs/.profile dst=/root/.ashrc;\r\ + \n/container/mounts/add list=carkeeper_configs/php.ini src=sata1/carkeeper\ + /configs/php.ini dst=/etc/php82/php.ini;\r\ + \n#/container/mounts/add list=carkeeper_configs src=sata1/carkeeper/config\ + s dst=/configs;\r\ + \n/container/mounts/add list=carkeeper_app src=sata1/carkeeper/app dst=/ap\ + p;\r\ + \n/container/mounts/add list=carkeeper_scripts src=sata1/carkeeper/scripts\ + \_dst=/scripts;\r\ + \n/container/mounts/add list=carkeeper_configs/sshd_config src=sata1/carke\ + eper/configs/sshd_config dst=/etc/ssh/sshd_config;\r\ + \n\r\ + \n/container/mounts/add list=carkeeper_tmp src=sata1/carkeeper/tmp dst=/va\ + r/tmp;\r\ + \n/container/mounts/add list=carkeeper_sync src=sata1/carkeeper/sync dst=/\ + var/sync;\r\ + \n" +add comment="Enable or disable ip addresses based on bridge port state" \ + dont-require-permissions=no name=mod/AM-IPbridge owner=mod/AM-IPbridge \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: mod/AM-IPbridge\r\ + \n# Script comment: Enable or disable ip addresses based on bridge port st\ + ate\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n# Add this Script scheduler\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n:log warning (\"SystemScheduler for script: \" . \$ScriptName . \" is NO\ + T SET! Fix It Now!\");\r\ + \n:local OnEvent \"/system/script/run \$ScriptName;\";\r\ + \n:local Comment \"Every Day Check For Fake Bridges\";\r\ + \n/system/scheduler/add name=\$ScriptName comment=\$Comment start-time=sta\ + rtup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:foreach Bridge in=[ /interface/bridge/find ] do={\r\ + \n :local BrName [ /interface/bridge/get \$Bridge name ];\r\ + \n :if ([ :len [ /interface/bridge/port/find where bridge=\$BrName ] ] > \ + 0) do={\r\ + \n :if ([ :len [ /interface/bridge/port/find where bridge=\$BrName and \ + inactive=no ] ] = 0) do={\r\ + \n /ip/address/disable [ find where !dynamic interface=\$BrName ];\r\ + \n } else={\r\ + \n /ip/address/enable [ find where !dynamic interface=\$BrName ];\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Use Telegram to chat with your Router and send commands" \ + dont-require-permissions=no name=mod/AM-TG-Bot owner=mod/AM-TG-Bot \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: mod/AM-TG-Bot\r\ + \n# Script comment: Use Telegram to chat with your Router and send command\ + s\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n :global Identity;\r\ + \n :global TelegramChatActive;\r\ + \n :global TelegramChatGroups;\r\ + \n :global TelegramChatId;\r\ + \n :global TelegramChatIdsTrusted;\r\ + \n :global TelegramChatOffset;\r\ + \n :global TelegramChatRunTime;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global TelegramRandomDelay;\r\ + \n :global TelegramTokenId;\r\ + \n\r\ + \n :global CertificateAvailable;\r\ + \n :global EitherOr;\r\ + \n :global EscapeForRegEx;\r\ + \n :global FileExists;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global LogPrintVerbose;\r\ + \n :global MAX;\r\ + \n :global MIN;\r\ + \n :global MkDir;\r\ + \n :global RandomDelay;\r\ + \n :global RmDir;\r\ + \n :global ScriptLock;\r\ + \n :global SendTelegram2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global WaitForFile;\r\ + \n :global WaitFullyConnected;\r\ + \n\r\ + \n :if ([ \$ScriptLock \$ScriptName ] = false) do={\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n \$WaitFullyConnected;\r\ + \n\r\ + \n :if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) \ + do={\r\ + \n /system/scheduler/add start-time=startup interval=30s name=\$ScriptN\ + ame on-event=\"/system/script/run \$ScriptName;\" comment=\"Telegram Chat \ + Bot\";\r\ + \n }\r\ + \n :if ([ :typeof \$TelegramChatOffset ] != \"array\") do={\r\ + \n :set TelegramChatOffset { 0; 0; 0 };\r\ + \n }\r\ + \n :if ([ :typeof \$TelegramRandomDelay ] != \"num\") do={\r\ + \n :set TelegramRandomDelay 0;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$ScriptName (\"Downloading required certificate \ + failed.\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n \$RandomDelay \$TelegramRandomDelay;\r\ + \n\r\ + \n :local Data false;\r\ + \n :for I from=1 to=4 do={\r\ + \n :if (\$Data = false) do={\r\ + \n :onerror Err {\r\ + \n :set Data ([ /tool/fetch check-certificate=yes-without-crl outpu\ + t=user \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TelegramTokenId . \"/get\ + Updates\?offset=\" . \\\r\ + \n \$TelegramChatOffset->0 . \"&allowed_updates=%5B%22message%22%\ + 5D\") as-value ]->\"data\");\r\ + \n :set TelegramRandomDelay [ \$MAX 0 (\$TelegramRandomDelay - 1) ]\ + ;\r\ + \n } do={\r\ + \n :if (\$I < 4) do={\r\ + \n \$LogPrint debug \$ScriptName (\"Fetch failed, \" . \$I . \". \ + try: \" . \$Err);\r\ + \n :set TelegramRandomDelay [ \$MIN 15 (\$TelegramRandomDelay + 5\ + ) ];\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Data = false) do={\r\ + \n \$LogPrint warning \$ScriptName (\"Failed getting updates.\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local JSON [ :deserialize from=json value=\$Data ];\r\ + \n :local UpdateID 0;\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :foreach Update in=(\$JSON->\"result\") do={\r\ + \n :set UpdateID (\$Update->\"update_id\");\r\ + \n \$LogPrintVerbose debug \$ScriptName (\"Update \" . \$UpdateID . \":\ + \_\" . [ :serialize to=json \$Update ]);\r\ + \n\r\ + \n :local Message (\$Update->\"message\");\r\ + \n :local IsAnyReply ([ :typeof (\$Message->\"reply_to_message\") ] = \ + \"array\");\r\ + \n :local IsMyReply (\$TelegramMessageIDs->[ :tostr (\$Message->\"reply\ + _to_message\"->\"message_id\") ]);\r\ + \n :if ((\$IsMyReply = 1 || \$TelegramChatOffset->0 > 0 || \$Uptime > 5\ + m) && \$UpdateID >= \$TelegramChatOffset->2) do={\r\ + \n :local Trusted false;\r\ + \n :local Chat (\$Message->\"chat\");\r\ + \n :local From (\$Message->\"from\");\r\ + \n :local Command (\$Message->\"text\");\r\ + \n :local ThreadId [ \$IfThenElse (\$Message->\"is_topic_message\") (\ + \$Message->\"message_thread_id\") \"\" ];\r\ + \n\r\ + \n :foreach IdsTrusted in=(\$TelegramChatId, \$TelegramChatIdsTrusted\ + ) do={\r\ + \n :if (\$From->\"id\" = \$IdsTrusted || \\\r\ + \n \$From->\"username\" = \$IdsTrusted || \\\r\ + \n \$Chat->\"id\" = \$IdsTrusted) do={\r\ + \n :set Trusted true;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Trusted = true) do={\r\ + \n :local Done false;\r\ + \n :if (\$Command = \"\?\") do={\r\ + \n \$LogPrint info \$ScriptName (\"Sending notice for update \" .\ + \_\$UpdateID . \".\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\"\ + ); silent=true; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \\\ + \r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \"\ + Telegram Chat\"); \\\r\ + \n message=([ \$IfThenElse ([ :len (\$From->\"first_name\") ] >\ + \_0) (\"Hello \" . (\$From->\"first_name\") . \"!\\n\\n\") ] . \\\r\ + \n \"Online\" . [ \$IfThenElse \$TelegramChatActive \" (and a\ + ctive!)\" ] . \", awaiting your commands!\") });\r\ + \n :set Done true;\r\ + \n }\r\ + \n :if (\$Done = false && [ :pick \$Command 0 1 ] = \"!\") do={\r\ + \n :if (\$Command ~ (\"^! *(\" . [ \$EscapeForRegEx \$Identity ] \ + . \"|@\" . \$TelegramChatGroups . \")\\\$\")) do={\r\ + \n :set TelegramChatActive true;\r\ + \n } else={\r\ + \n :set TelegramChatActive false;\r\ + \n }\r\ + \n \$LogPrint info \$ScriptName (\"Now \" . [ \$IfThenElse \$Tele\ + gramChatActive \"active\" \"passive\" ] . \\\r\ + \n \" from update \" . \$UpdateID . \"!\");\r\ + \n :set Done true;\r\ + \n }\r\ + \n :if (\$Done = false && (\$IsMyReply = 1 || (\$IsAnyReply = false\ + \_&& \\\r\ + \n \$TelegramChatActive = true)) && [ :len \$Command ] > 0) do\ + ={\r\ + \n :if ([ \$ValidateSyntax \$Command ] = true) do={\r\ + \n :local State \"\";\r\ + \n :local File (\"tmpfs/telegram-chat/\" . [ \$GetRandom20CharA\ + lNum 6 ]);\r\ + \n :if ([ \$MkDir \"tmpfs/telegram-chat\" ] = false) do={\r\ + \n \$LogPrint error \$ScriptName (\"Failed creating directory\ + !\");\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n \$LogPrint info \$ScriptName (\"Running command from update \ + \" . \$UpdateID . \": \" . \$Command);\r\ + \n :execute script=(\":do {\\n\" . \$Command . \"\\n} on-error=\ + { /file/add name=\\\"\" . \$File . \".failed\\\" };\" . \\\r\ + \n \"/file/add name=\\\"\" . \$File . \".done\\\"\") file=(\$\ + File . \"\\00\");\r\ + \n :if ([ \$WaitForFile (\$File . \".done\") [ \$EitherOr \$Tel\ + egramChatRunTime 20s ] ] = false) do={\r\ + \n :set State ([ \$SymbolForNotification \"warning-sign\" ] .\ + \_\"The command did not finish, still running in background.\\n\\n\");\r\ + \n }\r\ + \n :if ([ \$FileExists (\$File . \".failed\") ] = true) do={\r\ + \n :set State ([ \$SymbolForNotification \"cross-mark\" ] . \ + \"The command failed with an error!\\n\\n\");\r\ + \n }\r\ + \n :local Content ([ /file/read chunk-size=32768 file=\$File as\ + -value ]->\"data\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\ + \"); silent=true; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \ + \\\r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \ + \"Telegram Chat\"); \\\r\ + \n message=([ \$SymbolForNotification \"gear\" ] . \"Command:\ + \\n\" . \$Command . \"\\n\\n\" . \\\r\ + \n \$State . [ \$IfThenElse ([ :len \$Content ] > 0) \\\r\ + \n ([ \$SymbolForNotification \"memo\" ] . \"Output:\\n\" .\ + \_\$Content) \\\r\ + \n ([ \$SymbolForNotification \"memo\" ] . \"No output.\") \ + ]) });\r\ + \n \$RmDir \"tmpfs/telegram-chat\";\r\ + \n } else={\r\ + \n \$LogPrint info \$ScriptName (\"The command from update \" .\ + \_\$UpdateID . \" failed syntax validation!\");\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\ + \"); silent=false; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \ + \\\r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \ + \"Telegram Chat\"); \\\r\ + \n message=([ \$SymbolForNotification \"gear\" ] . \"Command:\ + \\n\" . \$Command . \"\\n\\n\" . \\\r\ + \n [ \$SymbolForNotification \"cross-mark\" ] . \"The comma\ + nd failed syntax validation!\") });\r\ + \n }\r\ + \n }\r\ + \n } else={\r\ + \n :local MessageText (\"Received a message from untrusted contact \ + \" . \\\r\ + \n [ \$IfThenElse ([ :len (\$From->\"username\") ] = 0) \"without\ + \_username\" (\"'\" . \$From->\"username\" . \"'\") ] . \\\r\ + \n \" (ID \" . \$From->\"id\" . \") in update \" . \$UpdateID . \ + \"!\");\r\ + \n :if (\$Command ~ (\"^! *\" . [ \$EscapeForRegEx \$Identity ] . \ + \"\\\$\")) do={\r\ + \n \$LogPrint warning \$ScriptName \$MessageText;\r\ + \n \$SendTelegram2 ({ origin=\$ScriptName; chatid=(\$Chat->\"id\"\ + ); silent=false; \\\r\ + \n replyto=(\$Message->\"message_id\"); threadid=\$ThreadId; \\\ + \r\ + \n subject=([ \$SymbolForNotification \"speech-balloon\" ] . \"\ + Telegram Chat\"); \\\r\ + \n message=(\"You are not trusted.\") });\r\ + \n } else={\r\ + \n \$LogPrint info \$ScriptName \$MessageText;\r\ + \n }\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint debug \$ScriptName (\"Already handled update \" . \$Upd\ + ateID . \".\");\r\ + \n }\r\ + \n }\r\ + \n :set TelegramChatOffset ([ :pick \$TelegramChatOffset 1 3 ], \\\r\ + \n [ \$IfThenElse (\$UpdateID >= \$TelegramChatOffset->2) (\$UpdateID +\ + \_1) (\$TelegramChatOffset->2) ]);\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +add comment="Script send Notifications in Telegram" dont-require-permissions=\ + no name=mod/AM-TG-Notifications owner=mod/AM-TG-Notifications policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: mod/AM-TG-Notifications\r\ + \n# Script comment: Script send Notifications in Telegram\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:global FlushTelegramQueue;\r\ + \n:global GetTelegramChatId;\r\ + \n:global NotificationFunctions;\r\ + \n:global PurgeTelegramQueue;\r\ + \n:global SendTelegram;\r\ + \n:global SendTelegram2;\r\ + \n# flush telegram queue\r\ + \n:set FlushTelegramQueue do={ :onerror Err {\r\ + \n :global TelegramQueue;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global CertificateAvailable;\r\ + \n :global IsFullyConnected;\r\ + \n :global LogPrint;\r\ + \n :if ([ \$IsFullyConnected ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"System is not fully connected, not flushing.\ + \");\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n :local AllDone true;\r\ + \n :local QueueLen [ :len \$TelegramQueue ];\r\ + \n :if ([ :len [ /system/scheduler/find where name=\"_FlushTelegramQueue\ + \" ] ] > 0 && \$QueueLen = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Flushing Telegram messages from scheduler,\ + \_but queue is empty.\");\r\ + \n }\r\ + \n :foreach Id,Message in=\$TelegramQueue do={\r\ + \n :if ([ :typeof \$Message ] = \"array\" ) do={\r\ + \n :onerror Err {\r\ + \n :local Data ([ /tool/fetch check-certificate=yes-without-crl out\ + put=user http-method=post \\\r\ + \n (\"https://api.telegram.org/bot\" . (\$Message->\"tokenid\") .\ + \_\"/sendMessage\") \\\r\ + \n http-data=(\$Message->\"http-data\") as-value ]->\"data\");\r\ + \n :set (\$TelegramQueue->\$Id);\r\ + \n :set (\$TelegramMessageIDs->[ :tostr ([ :deserialize from=json v\ + alue=\$Data ]->\"result\"->\"message_id\") ]) 1;\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Sending queued Telegram message failed: \ + \" . \$Err);\r\ + \n :set AllDone false;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :if (\$AllDone = true && \$QueueLen = [ :len \$TelegramQueue ]) do={\r\ + \n /system/scheduler/remove [ find where name=\"_FlushTelegramQueue\" ]\ + ;\r\ + \n :set TelegramQueue;\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# get the chat id\r\ + \n:set GetTelegramChatId do={ :onerror Err {\r\ + \n :global TelegramTokenId;\r\ + \n :global CertificateAvailable;\r\ + \n :global LogPrint;\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority - \ + G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n :local Data;\r\ + \n :onerror Err {\r\ + \n :set Data ([ /tool/fetch check-certificate=yes-without-crl output=us\ + er \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TelegramTokenId . \"/getUpd\ + ates\?offset=0\" . \\\r\ + \n \"&allowed_updates=%5B%22message%22%5D\") as-value ]->\"data\");\ + \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Fetching data failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :local JSON [ :deserialize from=json value=\$Data ];\r\ + \n :local Count [ :len (\$JSON->\"result\") ];\r\ + \n :if (\$Count = 0) do={\r\ + \n \$LogPrint info \$0 (\"No message received.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local Message (\$JSON->\"result\"->(\$Count - 1)->\"message\");\r\ + \n \$LogPrint info \$0 (\"The chat id is: \" . (\$Message->\"chat\"->\"id\ + \"));\r\ + \n :if ((\$Message->\"is_topic_message\") = true) do={\r\ + \n \$LogPrint info \$0 (\"The thread id is: \" . (\$Message->\"message_\ + thread_id\"));\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# send notification via telegram - expects one array argument\r\ + \n:set (\$NotificationFunctions->\"telegram\") do={\r\ + \n :local Notification \$1;\r\ + \n :global Identity;\r\ + \n :global IdentityExtra;\r\ + \n :global TelegramChatId;\r\ + \n :global TelegramChatIdOverride;\r\ + \n :global TelegramMessageIDs;\r\ + \n :global TelegramQueue;\r\ + \n :global TelegramThreadId;\r\ + \n :global TelegramThreadIdOverride;\r\ + \n :global TelegramTokenId;\r\ + \n :global TelegramTokenIdOverride;\r\ + \n :global CertificateAvailable;\r\ + \n :global CharacterReplace;\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ProtocolStrip;\r\ + \n :global SymbolForNotification;\r\ + \n :global UrlEncode;\r\ + \n :local EscapeMD do={\r\ + \n :local Text [ :tostr \$1 ];\r\ + \n :local Mode [ :tostr \$2 ];\r\ + \n :local Excl [ :tostr \$3 ];\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :local Chars {\r\ + \n \"body\"={ \"\\\\\"; \"`\" };\r\ + \n \"plain\"={ \"_\"; \"*\"; \"[\"; \"]\"; \"(\"; \")\"; \"~\"; \"`\"\ + ; \">\";\r\ + \n \"#\"; \"+\"; \"-\"; \"=\"; \"|\"; \"{\"; \"}\"; \".\"; \ + \"!\" };\r\ + \n }\r\ + \n :foreach Char in=(\$Chars->\$Mode) do={\r\ + \n :if ([ :typeof [ :find \$Excl \$Char ] ] = \"nil\") do={\r\ + \n :set Text [ \$CharacterReplace \$Text \$Char (\"\\\\\" . \$Char)\ + \_];\r\ + \n }\r\ + \n }\r\ + \n :if (\$Mode = \"body\") do={:return (\"```\\n\" . \$Text . \"\\n```\ + \")}\r\ + \n :return \$Text;\r\ + \n }\r\ + \n :local ChatId [ \$EitherOr (\$Notification->\"chatid\") \\\r\ + \n [ \$EitherOr (\$TelegramChatIdOverride->(\$Notification->\"origin\")\ + ) \$TelegramChatId ] ];\r\ + \n :local ThreadId [ \$EitherOr (\$Notification->\"threadid\") \\\r\ + \n [ \$EitherOr (\$TelegramThreadIdOverride->(\$Notification->\"origin\ + \")) \\\r\ + \n [ \$IfThenElse ([ :len (\$TelegramChatIdOverride->(\$Notification->\ + \"origin\")) ] = 0) \$TelegramThreadId ] ] ];\r\ + \n :local TokenId [ \$EitherOr (\$TelegramTokenIdOverride->(\$Notificatio\ + n->\"origin\")) \$TelegramTokenId ];\r\ + \n :if ([ :len \$TokenId ] = 0 || [ :len \$ChatId ] = 0) do={:return fals\ + e}\r\ + \n :if ([ :typeof \$TelegramMessageIDs ] = \"nothing\") do={:set Telegram\ + MessageIDs ({})}\r\ + \n :local Truncated false;\r\ + \n :local Text (\"*__\" . [ \$EscapeMD (\"[\" . \$IdentityExtra . \$Ident\ + ity . \"] \" . \\\r\ + \n (\$Notification->\"subject\")) \"plain\" ] . \"__*\\n\\n\");\r\ + \n :local LenSubject [ :len \$Text ];\r\ + \n :local LenMessage [ :len (\$Notification->\"message\") ];\r\ + \n :local LenLink ([ :len (\$Notification->\"link\") ] * 2);\r\ + \n :local LenSum (\$LenSubject + \$LenMessage + \$LenLink);\r\ + \n :if (\$LenSum > 3968) do={\r\ + \n :set Text (\$Text . [ \$EscapeMD ([ :pick (\$Notification->\"message\ + \") 0 (3840 - \$LenSubject - \$LenLink) ] . \"...\") \"body\" ]);\r\ + \n :set Truncated true;\r\ + \n } else={:set Text (\$Text . [ \$EscapeMD (\$Notification->\"message\")\ + \_\"body\" ])}\r\ + \n :if (\$LenLink > 0) do={\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"link\" ] .\ + \_\\\r\ + \n \"[\" . [ \$EscapeMD [ \$ProtocolStrip (\$Notification->\"link\") \ + ] \"plain\" ] . \"]\" . \\\r\ + \n \"(\" . [ \$EscapeMD (\$Notification->\"link\") \"plain\" ] . \")\ + \");\r\ + \n }\r\ + \n :if (\$Truncated = true) do={\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"scissors\"\ + \_] . \\\r\ + \n [ \$EscapeMD (\"The message was too long and has been truncated, c\ + ut off _\" . \\\r\ + \n ((\$LenSum - [ :len \$Text ]) * 100 / \$LenSum) . \"%_!\") \"plain\ + \" \"_\" ]);\r\ + \n }\r\ + \n :local HTTPData (\"chat_id=\" . \$ChatId . \"&disable_notification=\" \ + . (\$Notification->\"silent\") . \\\r\ + \n \"&reply_to_message_id=\" . (\$Notification->\"replyto\") . \"&mes\ + sage_thread_id=\" . \$ThreadId . \\\r\ + \n \"&disable_web_page_preview=true&parse_mode=MarkdownV2\");\r\ + \n :onerror Err {\r\ + \n :if ([ \$CertificateAvailable \"Go Daddy Root Certificate Authority \ + - G2\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Data ([ /tool/fetch check-certificate=yes-without-crl output=\ + user http-method=post \\\r\ + \n (\"https://api.telegram.org/bot\" . \$TokenId . \"/sendMessage\") \ + \\\r\ + \n http-data=(\$HTTPData . \"&text=\" . [ \$UrlEncode \$Text ]) as-va\ + lue ]->\"data\");\r\ + \n :set (\$TelegramMessageIDs->[ :tostr ([ :deserialize from=json value\ + =\$Data ]->\"result\"->\"message_id\") ]) 1;\r\ + \n } do={\r\ + \n \$LogPrint info \$0 (\"Failed sending Telegram notification: \" . \$\ + Err . \" - Queuing...\");\r\ + \n :if ([ :typeof \$TelegramQueue ] = \"nothing\") do={:set TelegramQue\ + ue ({})}\r\ + \n :set Text (\$Text . \"\\n\" . [ \$SymbolForNotification \"alarm-cloc\ + k\" ] . \\\r\ + \n [ \$EscapeMD (\"This message was queued since _\" . [ /system/cloc\ + k/get date ] . \\\r\ + \n \" \" . [ /system/clock/get time ] . \"_ and may be obsolete.\") \ + \"plain\" \"_\" ]);\r\ + \n :set (\$TelegramQueue->[ :len \$TelegramQueue ]) { tokenid=\$TokenId\ + ;\r\ + \n http-data=(\$HTTPData . \"&text=\" . [ \$UrlEncode \$Text ]) };\r\ + \n :if ([ :len [ /system/scheduler/find where name=\"_FlushTelegramQueu\ + e\" ] ] = 0) do={\r\ + \n /system/scheduler/add name=\"_FlushTelegramQueue\" interval=1m sta\ + rt-time=startup \\\r\ + \n on-event=(\":global FlushTelegramQueue; \\\$FlushTelegramQueue;\ + \");\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n# purge the Telegram queue\r\ + \n:set PurgeTelegramQueue do={\r\ + \n :global TelegramQueue;\r\ + \n /system/scheduler/remove [ find where name=\"_FlushTelegramQueue\" ];\ + \r\ + \n :set TelegramQueue;\r\ + \n}\r\ + \n# send notification via telegram - expects at least two string arguments\ + \r\ + \n:set SendTelegram do={ :onerror Err {\r\ + \n :global SendTelegram2;\r\ + \n \$SendTelegram2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3; sil\ + ent=\$4 });\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n# send notification via telegram - expects one array argument\r\ + \n:set SendTelegram2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n (\$NotificationFunctions->\"telegram\") (\"\\\$NotificationFunctions->\ + \\\"telegram\\\"\") \$Notification;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=testIfThenElseAndEitherOr owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source=":local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n:local ExitError;\r\ + \n#:local IfThenElse;\r\ + \n#:local EitherOr;\r\ + \n\r\ + \n:local one 11;\r\ + \n:local two 8;\r\ + \n#:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n:local Test; # [ :totime \"22s\" ];\r\ + \n\r\ + \n:local IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] \ + = true) do={:return \$2}; :return \$3;}\r\ + \n:local EitherOr do={\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:if ((\$1 != 0) = true) do={:retur\ + n \$1} else={:return \$2};}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:if ((\$1 > 0s) = true) do={:retu\ + rn \$1} else={:return \$2};}\r\ + \n :if ([ :len [ :tostr \$1 ] ] > 0) do={:return \$1} else={:return \$2};\ + \r\ + \n}\r\ + \n\r\ + \n:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n\r\ + \n:set Test [ \$EitherOr \$Test \"\" ];\r\ + \n:log warning (\"\\\$ Test = \" . \$Test);\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :local IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n\r\ + \n#:log warning ([ \$IfThenElse (\$one != 0) \$one \$two ]);\r\ + \n\r\ + \n:set ExitOK true;\r\ + \n\$ExitError \$ExitOK \$ScriptName \"Err test custom\";" +add comment="Update and Backup send notification to EMail" \ + dont-require-permissions=no name=AM-Backup-UpdateEmail owner=\ + AM-Backup-UpdateEmail policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-Backup-UpdateEmail\r\ + \n# Script comment: Update and Backup send notification to EMail\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version>=6.43.7\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# Updated: 15/04/2025\r\ + \n# Website: https://github.com/beeyev\r\ + \n# Notification e-mail (Make sure you have configured Email settings in T\ + ools -> Email)\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n:local IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] \ + = true) do={:return \$2}; :return \$3;}\r\ + \n:local EitherOr do={\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:if ((\$1 != 0) = true) do={:retur\ + n \$1} else={:return \$2};}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:if ((\$1 > 0s) = true) do={:retu\ + rn \$1} else={:return \$2};}\r\ + \n :if ([ :len [ :tostr \$1 ] ] > 0) do={:return \$1} else={:return \$2};\ + \r\ + \n}\r\ + \n:local ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :if (\$ExitOK = \"false\") do={:log error (\$Name [ \$IfThenElse ([ :p\ + ick \$Name 0 1 ] = \"\\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);}\r\ + \n}\r\ + \n\r\ + \n:global LogPrint;\r\ + \n:global EditSchedulers;\r\ + \n:global DevInfoIncludeIP;\r\ + \n\r\ + \n:local SchedInterval \"7d\";\r\ + \n:local SchedStartTime \"03:41:27\";\r\ + \n:local SchedComment \"Every 7 Day Check For Update and Backup send notif\ + ication to EMail.\";\r\ + \n\r\ + \n# Function to add or edit schedulers for scripts, to ensure they are set\ + \_up correctly\r\ + \n# How to use:\r\ + \n# Call this function with the following parameters:\r\ + \n# 1. \$1 - Scheduler name (usually same as script name) [*]\r\ + \n# 2. \$2 - Interval (e.g. \"1d\" (default is \"1d\")) [**]\r\ + \n# 3. \$3 - Start Time (e.g. \"00:00:00\", default is current time) [**]\ + \r\ + \n# 4. \$4 - Comment (optional, default: \"Scheduler for script: \")\ + \_[**]\r\ + \n# 5. \$5 - On Event command (e.g. \"/system/script { run ; }\" (de\ + fault is \"/system/script { run \$SchedName; }\")) [**]\r\ + \n# 6. \$6 - Policy (e.g. \"ftp,reboot,read,write,policy,test,password,sni\ + ff,sensitive,romon\" (default is the same)) [**]\r\ + \n# 7. \$7 - Start Date (e.g. \"jan/01/1970\", default is current date) [*\ + *]\r\ + \n# Notes:\r\ + \n# * - Scheduler name is required, and is used to identify the scheduler\ + \_to create or edit. It is usually the same as the script name (\$ScriptNa\ + me).\r\ + \n# ** - If optional parameters are not provided, default values will be u\ + sed.\r\ + \n# This allows for quick setup with minimal parameters, while still \ + providing flexibility for customization.\r\ + \n# Example usage:\r\ + \n# :if ([ \$EditSchedulers \"my-script\" ] = false) do={:set ExitOK false\ + ; :error true;}\r\ + \n# :if ([ \$EditSchedulers \"my-script\" \"1d\" \"03:41:27\" \"My custom \ + scheduler comment\" false false \"jan/01/1970\" ] = false) do={:set ExitOK\ + \_false; :error true;}\r\ + \n\r\ + \n:set EditSchedulers do={\r\ + \n :local SchedName [ :tostr \$1 ];\r\ + \n :if ([ :len \$SchedName ] = 0) do={ :return false; }\r\ + \n :local Interval [ :tostr \$2 ];\r\ + \n :if ([ :len \$Interval ] = 0) do={ :set Interval \"1d\"; }\r\ + \n :local StartTime [ :tostr \$3 ];\r\ + \n :if ([ :len \$StartTime ] = 0) do={ :set StartTime [/system/clock/get \ + time]; }\r\ + \n :local Comment [ :tostr \$4 ];\r\ + \n :if ([ :len \$Comment ] = 0) do={ :set Comment \"Scheduler for script:\ + \_\$SchedName\"; }\r\ + \n :local OnEvent [ :tostr \$5 ];\r\ + \n :if ([ :len \$OnEvent ] = 0) do={ :set OnEvent \"/system/script { run \ + \$SchedName; }\"; }\r\ + \n :local Policy [ :tostr \$6 ];\r\ + \n :if ([ :len \$Policy ] = 0) do={ :set Policy \"ftp,reboot,read,write,p\ + olicy,test,password,sniff,sensitive,romon\"; }\r\ + \n :local StartDate [ :tostr \$7 ];\r\ + \n :if ([ :len \$StartDate ] = 0) do={ :set StartDate [/system/clock/get \ + date]; }\r\ + \n\r\ + \n :onerror Err {\r\ + \n # Check if scheduler exists, if not - create it\r\ + \n :if ([ :len [ /system/scheduler/find where name=\$SchedName ] ] = 0)\ + \_do={\r\ + \n :log warning (\$SchedName . \"System Scheduler for script: \" . \$\ + SchedName . \" is NOT SET! Fix It Now!\");\r\ + \n /system/scheduler/add comment=\$Comment interval=\$Interval name=\ + \$SchedName on-event=\$OnEvent policy=\$Policy start-date=\$StartDate star\ + t-time=\$StartTime;\r\ + \n }\r\ + \n # Check if scheduler parameters are correct, if not - fix them\r\ + \n :if ([ /system/scheduler/get \$SchedName comment ] != \$Comment) do=\ + {\r\ + \n /system/scheduler/set \$SchedName comment=\$Comment;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName interval ] != \$Interval) d\ + o={\r\ + \n /system/scheduler/set \$SchedName interval=\$Interval;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName on-event ] != \$OnEvent) do\ + ={\r\ + \n /system/scheduler/set \$SchedName on-event=\$OnEvent;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName policy ] != \$Policy) do={\ + \r\ + \n /system/scheduler/set \$SchedName policy=\$Policy;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName start-date ] != \$StartDate\ + ) do={\r\ + \n /system/scheduler/set \$SchedName start-date=\$StartDate;\r\ + \n }\r\ + \n :if ([ /system/scheduler/get \$SchedName start-time ] != \$StartTime\ + ) do={\r\ + \n /system/scheduler/set \$SchedName start-time=\$StartTime;\r\ + \n }\r\ + \n } do={:log error (\$SchedName . \"Failed to add/modify scheduler for '\ + \" . \$SchedName . \"' failed: \" . \$Err); :return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:if ([ \$EditSchedulers \$ScriptName \$SchedInterval \$SchedStartTime \$\ + SchedComment ] = false) do={\r\ + \n :log error (\$ScriptName . \"Failed to add/modify scheduler for \" . \ + \$ScriptName . \"!\");\r\ + \n :set ExitOK true;\r\ + \n :error true;\r\ + \n}\r\ + \n\r\ + \n# Local Function CheckOSUpdateMode\r\ + \n:local CheckOSUpdateMode;\r\ + \n:set CheckOSUpdateMode do={\r\ + \n :local NewMode [ :tostr \$1 ];\r\ + \n :if ([ :len \$NewMode ] = 0) do={\r\ + \n :log error (\$0 . \"/nFunction /\$CheckOSUpdateMode received empty v\ + alue!\");\r\ + \n :return false;\r\ + \n :error true;\r\ + \n }\r\ + \n\r\ + \n :global BackupAndUpdateMode;\r\ + \n :global OldMode [ :tostr \$BackupAndUpdateMode ];\r\ + \n :if (\$NewMode != \$BackupAndUpdateMode && \$NewMode = \"updateOnce\")\ + \_do={\r\ + \n :set BackupAndUpdateMode [ :tostr \$NewMode ];\r\ + \n :log info (\$0 . \"/nOk. /\$BackupAndUpdateMode set to: '\" . \$NewM\ + ode . \"'.\\nYou're a good boy! ))\\nI'm launching the update in 5 seconds\ + .\");\r\ + \n :delay 5;\r\ + \n /system/script { run \$ScriptName; };\r\ + \n } else={\r\ + \n :log warning (\$0 . \"/nFunction /\$CheckOSUpdateMode received value: \ + '\" . \$NewMode . \"', but is may be only \\\"updateOnce\\\"!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n :error false;\r\ + \n}\r\ + \n\r\ + \n# :if ([ :len [ /system/scheduler/find where name=\"running-from-backup\ + -partition\" ] ] > 0) do={\r\ + \n# \$LogPrint warning \$ScriptName (\"Running from backup partition, r\ + efusing to act.\");\r\ + \n# :set ExitOK true;\r\ + \n# :error false;\r\ + \n# }\r\ + \n\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n:global forceBackup;\r\ + \n:global BackupPassword;\r\ + \n:global BackupSens;\r\ + \n:global updateChannel;\r\ + \n\r\ + \n:global DevInfoIncludeIP;\r\ + \n\r\ + \n# Installs patch updates only (BackupAndUpdateMode = \"osupdate\").\r\ + \n# Works for `stable` and `long-term` channels.\r\ + \n# Updates only if MAJOR.MINOR match (e.g. 6.43.2 > 6.43.6 allowed, 6.44.\ + 1 skipped).\r\ + \n# Sends info if a newer (non-patch) version is found.\r\ + \n:local installOnlyPatchUpdates false;\r\ + \n:local scriptVersion \"26.04.30\";\r\ + \n:local copyrightUrl \"https://www.github.com/vados-dev/\";\r\ + \n#Script messages prefix\r\ + \n:local SMP \"BkpAndUpdate:\";\r\ + \n\r\ + \n:local exitErrorMessage \"\$SMP script stopped due to an error. Please c\ + heck logs for more details.\";\r\ + \n:log info \"\\n\\n\$SMP Script \\\"Mikrotik RouterOS automatic backup & \ + update\\\" v.\$scriptVersion started.\";\r\ + \n:log info \"\$SMP Script Mode: `\$BackupAndUpdateMode`, Update channel: \ + `\$updateChannel`, Force backup: `\$forceBackup`, Install only patch updat\ + es: `\$installOnlyPatchUpdates`\";\r\ + \n\r\ + \n## vv FUNCTIONS vv ##\r\ + \n:global WaitCheckUpdates; \$WaitCheckUpdates;\r\ + \n:global MiniDateTimeStamp;\r\ + \n:local MDTSFix [\$MiniDateTimeStamp];\r\ + \n:global Identity;\r\ + \n:global IdentityShort;\r\ + \n:global devBoardName;\r\ + \n:global runningVersion;\r\ + \n:global runningChannel;\r\ + \n:global devModel;\r\ + \n:global devRbSerialNumber;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n\r\ + \n# Checks if two RouterOS version strings differ only by the patch versio\ + n\r\ + \n# :put [\$FuncIsPatchUpdateOnly \"6.2.1\" \"6.2.4\"] # Output: true\r\ + \n# :put [\$FuncIsPatchUpdateOnly \"6.2.1\" \"6.3.1\"] # Output: false\r\ + \n:local FuncIsPatchUpdateOnly do={\r\ + \n :local ver1 \$1;\r\ + \n :local ver2 \$2;\r\ + \n # Extract the major and minor components from a version\r\ + \n :local extractMajorMinor do={\r\ + \n :local ver \$1;\r\ + \n :local dot1 [:find \$ver \".\"];\r\ + \n :if (\$dot1 = -1) do={:return \$ver}\r\ + \n :local major [:pick \$ver 0 \$dot1];\r\ + \n :local rest [:pick \$ver (\$dot1 + 1) [:len \$ver]];\r\ + \n :local dot2 [:find \$rest \".\"];\r\ + \n :local minor \$rest;\r\ + \n :if (\$dot2 >= 0) do={:set minor [:pick \$rest 0 \$dot2]}\r\ + \n :return (\$major . \".\" . \$minor);\r\ + \n }\r\ + \n\r\ + \n# Compare the major and minor components of both version strings\r\ + \n:if ([\$extractMajorMinor \$ver1] = [\$extractMajorMinor \$ver2]) do={:r\ + eturn true}\r\ + \n :return false;\r\ + \n}\r\ + \n# Creates backups and returns array of names\r\ + \n# Possible arguments:\r\ + \n# \$1 - file name, without extension\r\ + \n# \$2 - password (optional)\r\ + \n# \$3 - sensitive data in config (optional, default: false)\r\ + \n# Example:\r\ + \n#:put [\$FuncCreateBackups \$backupName]\r\ + \n:local FuncCreateBackups do={\r\ + \n :local backupName [ :tostr \$1 ];\r\ + \n :local BackPass \$2;\r\ + \n :local BackSens \$3;\r\ + \n\r\ + \n #Script messages prefix\r\ + \n :local SMP \"BkpAndUpdate:\";\r\ + \n :local exitErrorMessage \"\$SMP script stopped due to an error. Please\ + \_check logs for more details.\";\r\ + \n :log info (\"\$SMP global function `FuncCreateBackups` started, input:\ + \_`\$backupName`\");\r\ + \n\r\ + \n # validate required parameter: backupName\r\ + \n :if ([:typeof \$backupName] != \"str\" or [:len \$backupName] = 0) do=\ + {\r\ + \n :log error \"\$SMP parameter 'backupName' is required and must be a \ + non-empty string\";\r\ + \n# :log warning \"\$SMP parameter '\\\$backupName' is required and mus\ + t be a non-empty string.\\nI set '\\\$backupName' to 'default-backup'\";\r\ + \n# :set \$backupName \"default-backup\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n\r\ + \n :local backupFileSys \"\$backupName.backup\";\r\ + \n :local backupFileConfig \"\$backupName.rsc\";\r\ + \n :local backupNames {\$backupFileSys;\$backupFileConfig};\r\ + \n\r\ + \n ## Perform system backup\r\ + \n :if ([:len \$BackPass] = 0) do={\r\ + \n :log info (\"\$SMP starting backup without password, backup name: `\ + \$backupName`\");\r\ + \n /system backup save dont-encrypt=yes name=\$backupName;\r\ + \n } else={\r\ + \n :log info (\"\$SMP starting backup with password, backup name: `\$ba\ + ckupName`\");\r\ + \n /system backup save password=\$BackPass name=\$backupName;\r\ + \n }\r\ + \n :log info (\"\$SMP system backup created: `\$backupFileSys`\");\r\ + \n ## Export config file\r\ + \n :if (\$BackSens = true) do={\r\ + \n :log info (\"\$SMP starting export config with sensitive data, backu\ + p name: `\$backupName`\");\r\ + \n # Since RouterOS v7 it needs to be explicitly set that we want to ex\ + port sensitive data\r\ + \n :if ([:pick [/system resource get version] 0 1] < 7) do={\r\ + \n :execute \"/export compact terse file=\$backupName\";\r\ + \n } else={\r\ + \n :execute \"/export compact show-sensitive terse file=\$backupName\ + \";\r\ + \n }\r\ + \n } else={\r\ + \n :log info (\"\$SMP starting export config without sensitive data, ba\ + ckup name: `\$backupName`\");\r\ + \n /export compact hide-sensitive terse file=\$backupName;\r\ + \n }\r\ + \n :log info (\"\$SMP Config export complete: `\$backupFileConfig`\");\r\ + \n :log info (\"\$SMP Waiting a little to ensure backup files are written\ + \");\r\ + \n :delay 20;\r\ + \n :if ([:len [/file find name=\$backupFileSys]] > 0) do={\r\ + \n :log info (\"\$SMP system backup file successfully saved to the file\ + \_system: `\$backupFileSys`\");\r\ + \n } else={\r\ + \n :log error (\"\$SMP system backup was not created, file does not exi\ + st: `\$backupFileSys`\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :if ([:len [/file find name=\$backupFileConfig]] > 0) do={\r\ + \n :log info (\"\$SMP config backup file successfully saved to the file\ + \_system: `\$backupFileConfig`\");\r\ + \n } else={\r\ + \n :log error (\"\$SMP config backup was not created, file does not exi\ + st: `\$backupFileConfig`\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :log info (\"\$SMP global function `FuncCreateBackups` finished. Creat\ + ed backups, system: `\$backupFileSys`, config: `\$backupFileConfig`\")\r\ + \n :return \$backupNames;\r\ + \n}\r\ + \n# Sends an email\r\ + \n# Parameters:\r\ + \n# \$1 - to (email address)\r\ + \n# \$2 - subject\r\ + \n# \$3 - body\r\ + \n# \$4 - file attachments (optional; pass \"\" if not needed)\r\ + \n#\r\ + \n# Example:\r\ + \n# \$FuncSendEmailSafe \"admin@domain.com\" \"Backup Done\" \"Backup comp\ + lete.\" \"backup1.backup\"\r\ + \n:local FuncSendEmailSafe do={\r\ + \n :global EmailGeneralTo;\r\ + \n :local emailSubject \$2;\r\ + \n :local emailBody \$3;\r\ + \n :local emailAttachments \$4;\r\ + \n :local SMP \"Bkp&Upd:\";\r\ + \n :local exitErrorMessage \"\$SMP script stopped due to an error. Please\ + \_check logs for more details.\";\r\ + \n :log info \"\$SMP Attempting to send email to `\$EmailGeneralTo`\";\r\ + \n # SAFETY: wait for any previously queued email to finish\r\ + \n :local waitTimeoutPre 60;\r\ + \n :local waitCounterPre 0;\r\ + \n :while (([/tool e-mail get last-status] = \"resolving-dns\" or [/tool \ + e-mail get last-status] = \"in-progress\")) do={\r\ + \n :if (\$waitCounterPre >= \$waitTimeoutPre) do={\r\ + \n :log error \"\$SMP Email send aborted: previous send did not compl\ + ete after \$waitTimeoutPre seconds\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n :log info \"\$SMP Waiting for previous email to finish (status: \$[/\ + tool e-mail get last-status])...\";\r\ + \n :delay 1; \r\ + \n :set waitCounterPre (\$waitCounterPre + 1);\r\ + \n }\r\ + \n # Send the email\r\ + \n :do {\r\ + \n /tool e-mail send to=\$EmailGeneralTo subject=\$emailSubject body=\$\ + emailBody file=\$emailAttachments;\r\ + \n } on-error={\r\ + \n :log error \"\$SMP Email send command failed to execute. Check logs \ + and verify email settings.\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n # Wait for send status to change from \"in-progress\" / \"resolving-dn\ + s\"\r\ + \n :local waitTimeout 60;\r\ + \n :local waitCounter 0;\r\ + \n :local emailStatus \"\";\r\ + \n :log info \"\$SMP Waiting for email to be sent, timeout in `\$waitTime\ + out` seconds...\";\r\ + \n :while (\$waitCounter < \$waitTimeout) do={\r\ + \n :set emailStatus [/tool e-mail get last-status];\r\ + \n :if (\$emailStatus != \"in-progress\" and \$emailStatus != \"resolvi\ + ng-dns\") do={\r\ + \n :log info \"\$SMP Email send status received: \$emailStatus\";\r\ + \n # exit loop\r\ + \n :set waitCounter \$waitTimeout;\r\ + \n } else={:delay 1; :set waitCounter (\$waitCounter + 1)}\r\ + \n }\r\ + \n # Final decision based on last status\r\ + \n :if (\$emailStatus = \"succeeded\") do={\r\ + \n :log info \"\$SMP Email successfully sent to `\$EmailGeneralTo`\";\ + \r\ + \n } else={\r\ + \n :log error \"\$SMP Email failed to send. Status: `\$emailStatus`. Ch\ + eck logs for more details and verify email settings.\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n}\r\ + \n# Global variable to track current update step\r\ + \n# They need to be initialized here first to be available in the script\r\ + \n:global buGlobalVarTargetOsVersion;\r\ + \n:global buGlobalVarScriptStep;\r\ + \n:local scriptStep \$buGlobalVarScriptStep;\r\ + \n:do {\r\ + \n /system/script/environment remove buGlobalVarScriptStep;\r\ + \n} on-error={}\r\ + \n:if ([:len \$scriptStep] = 0) do={\r\ + \n :set scriptStep 1;\r\ + \n}\r\ + \n## ^^ FUNCTIONS ^^ ##\r\ + \n#\r\ + \n# Initial validation\r\ + \n## Check email settings\r\ + \n:if ([:len \$EmailGeneralTo] < 3) do={\r\ + \n :log error (\"\$SMP Parameter `\\\$EmailGeneralTo` is not set, or cont\ + ains invalid value. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Values will be defined later in the script\r\ + \n:local emailServer \"\";\r\ + \n:local emailFromAddress [/tool e-mail get from];\r\ + \n:log info \"\$SMP Validating email settings...\";\r\ + \n:do {\r\ + \n :set emailServer [/tool e-mail get server];\r\ + \n} on-error={\r\ + \n # This is a workaround for the RouterOS v7.12 and older versions\r\ + \n :set emailServer [/tool e-mail get address];\r\ + \n}\r\ + \n:if (\$emailServer = \"0.0.0.0\") do={\r\ + \n :log error (\"\$SMP Email server address is not correct: `\$emailServe\ + r`, check `Tools -> Email`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n:if ([:len \$emailFromAddress] < 3) do={\r\ + \n :log error (\"\$SMP Email configuration FROM address is not correct: `\ + \$emailFromAddress`, check `Tools -> Email`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Script mode validation\r\ + \n:if (\$BackupAndUpdateMode != \"backup\" and \$BackupAndUpdateMode != \"\ + osupdate\" and \$BackupAndUpdateMode != \"updateOnce\" and \$BackupAndUpda\ + teMode != \"osnotify\") do={\r\ + \n :log error (\"\$SMP Script parameter `\\\$BackupAndUpdateMode` is not \ + set, or contains invalid value: `\$BackupAndUpdateMode`. Script stopped.\"\ + );\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Update channel validation\r\ + \n:if (\$updateChannel != \"stable\" and \$updateChannel != \"long-term\" \ + and \$updateChannel != \"testing\" and \$updateChannel != \"development\")\ + \_do={\r\ + \n :log error (\"\$SMP Script parameter `\\\$updateChannel` is not set, o\ + r contains invalid value: `\$updateChannel`. Script stopped.\");\r\ + \n :error \$exitErrorMessage;\r\ + \n}\r\ + \n# Verify if script is set to install patch updates and if the update cha\ + nnel is valid\r\ + \n:if ((\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \"\ + updateOnce\") and \$installOnlyPatchUpdates = true) do={\r\ + \n :if (\$updateChannel != \"stable\" and \$updateChannel != \"long-term\ + \") do={\r\ + \n :log error (\"\$SMP Patch-only updates enabled, but update channel `\ + \$updateChannel` is invalid. Only `stable` and `long-term` are supported. \ + Script stopped\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n \r\ + \n :if (\$runningChannel != \"stable\" and \$runningChannel != \"long-ter\ + m\") do={\r\ + \n :log error (\"\$SMP Script is set to install only patch updates, but\ + \_the installed RouterOS version is not from `stable` or `long-term` chann\ + el: `\$runningChannel`. Script stopped\");\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n}\r\ + \n#\r\ + \n\r\ + \n:local rawTime [/system clock get time];\r\ + \n:local rawDate [/system clock get date];\r\ + \n\r\ + \n:local deviceOsVerAndChannelRunning [/system/resource/get version];\r\ + \n\r\ + \n:local backupNameTemplate (\"backup_v\" . \$runningVersion . \"_\" .\ + \_\$runningChannel . \"_\" . \$MDTSFix);\r\ + \n:local backupNameBeforeUpdate (\$backupNameTemplate . \"_before_update\"\ + );\r\ + \n:local backupNameAfterUpdate (\$backupNameTemplate . \"_after_update\")\ + ;\r\ + \n\r\ + \n## Email body template\r\ + \n:local mailSubjectPrefix \"\$SMP Device - `\$IdentityShort`\";\r\ + \n:local mailBodyCopyright \"Mikrotik RouterOS automatic backup & update \ + (ver. \$scriptVersion) \\n\$copyrightUrl\";\r\ + \n:local changelogUrl \"Check RouterOS changelog: https://mikrotik.com\ + /download/changelogs/\";\r\ + \n:local mailBodyDeviceInfo \"\";\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"Device information:\")\ + ;\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\n-------------------\ + --\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nName: \$Identity\")\ + ;\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nModel: \$devModel\"\ + );\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nBoard: \$devBoardNa\ + me\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nSerial number: \$de\ + vRbSerialNumber\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nRouterOS version: v\ + \$deviceOsVerAndChannelRunning\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nBuild time: \$[/sys\ + tem/resource/get build-time]\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nRouterboard FW Avai\ + lable: \$ROsVerAvail\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nDevice date-time: \ + \$rawDate \$rawTime (\$[/system/clock/get time-zone-name ])\");\r\ + \n:set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nUptime: \$[/system/\ + resource/get uptime]\");\r\ + \n## IP address detection\r\ + \n:if ([ \$DevInfoIncludeIP ] = true) do={\r\ + \n :global GetPubIp;\r\ + \n :local PublicIpAddress [ \$GetPubIp ];\r\ + \n :set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nPublic IP address\ + : \" . \$PublicIpAddress . \".\");\r\ + \n :log info \"\$SMP Public IP address detected: \$PublicIpAddress\";\r\ + \n} \r\ + \n\r\ + \n:local mailAttachments [:toarray \"\"];\r\ + \n:if (\$scriptStep = 1 or \$scriptStep = 3) do={\r\ + \n :if (\$scriptStep = 3) do={\r\ + \n :log info (\"\$SMP Waiting for one minute before continuing to the f\ + inal step.\");\r\ + \n :delay 1m;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n## STEP 1: Create backups, check for new RouterOS, and send email\r\ + \n## Steps 2\C3\A23 run only if auto-update is enabled and a new version i\ + s available\r\ + \n:if (\$scriptStep = 1) do={\r\ + \n :global BackupPassword;\r\ + \n :global BackupSens;\r\ + \n :local isNewOsUpdateAvailable false;\r\ + \n :local isLatestOsAlreadyInstalled true;\r\ + \n :local isOsNeedsToBeUpdated false;\r\ + \n :local isUpdateCheckSucceeded false;\r\ + \n :local isEmailNeedsToBeSent false;\r\ + \n :local mailSubjectPartAction \"\";\r\ + \n :local mailPtBodyAction \"\";\r\ + \n :local mailPtSubjectBackup \"\";\r\ + \n :local mailPtBodyBackup \"\";\r\ + \n # Checking for new version\r\ + \n :if (\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \ + \"osnotify\" or \$BackupAndUpdateMode = \"updateOnce\") do={\r\ + \n :log info (\"\$SMP Setting update channel to `\$updateChannel`\");\r\ + \n /system/package/update/set channel=\$updateChannel;\r\ + \n :log info (\"\$SMP Checking for new RouterOS version. Current instal\ + led version is: `\$runningVersion`\");\r\ + \n \$LogPrint debug \$ScriptName (\"Checking for updates...\");\r\ + \n \r\ + \n# /system/package/update/check-for-updates without-paging as-value;\ + \r\ + \n# /system/package/update check-for-updates;\r\ + \n :delay 5s;\r\ + \n :set PkgUpdStatus [ /system/package/update/get status ];\r\ + \n :if (\$PkgUpdStatus = \"New version is available\") do={\r\ + \n :set ROsVerAvail [/system/package/update/get latest-version];\r\ + \n }\r\ + \n\r\ + \n :if (\$PkgUpdStatus = \"New version is available\") do={\r\ + \n :log info (\"\$SMP New RouterOS version is available: `\$ROsVerAva\ + il`\");\r\ + \n :set isNewOsUpdateAvailable true;\r\ + \n :set isLatestOsAlreadyInstalled false;\r\ + \n :set isUpdateCheckSucceeded true;\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :set mailSubjectPartAction \"New RouterOS available\";\r\ + \n :set mailPtBodyAction \"New RouterOS version is available, curren\ + t version: v\$runningVersion, new version: v\$ROsVerAvail. \\n\$changelogU\ + rl\";\r\ + \n } else={\r\ + \n :if (\$PkgUpdStatus = \"System is already up to date\") do={\r\ + \n :log info (\"\$SMP No new RouterOS version is available, the lat\ + est version is already installed: `v\$runningVersion`\");\r\ + \n :set isUpdateCheckSucceeded true;\r\ + \n :set mailSubjectPartAction \"No os update available\";\r\ + \n :set mailPtBodyAction \"No new RouterOS version is available, t\ + he latest version is already installed: `v\$runningVersion`\";\r\ + \n } else={\r\ + \n :log error (\"\$SMP Failed to check for new RouterOS version. Pa\ + ckage check status: `\$PkgUpdStatus`\");\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :set mailSubjectPartAction \"Error unable to check new os versio\ + n\";\r\ + \n :set mailPtBodyAction \"An error occurred while checking for a \ + new RouterOS version.\\nStatus returned: `\$PkgUpdStatus`\\n\\nPlease revi\ + ew the logs on the device for more details and verify internet connectivit\ + y.\";\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n # Checking if the script needs to install new os version\r\ + \n :if ((\$BackupAndUpdateMode = \"osupdate\" or \$BackupAndUpdateMode = \ + \"updateOnce\") and \$isNewOsUpdateAvailable = true) do={\r\ + \n :if (\$installOnlyPatchUpdates = true) do={\r\ + \n :if ([\$FuncIsPatchUpdateOnly \$runningVersion \$ROsVerAvail] = tr\ + ue) do={\r\ + \n :log info \"\$SMP New RouterOS version is available, and it is a\ + \_patch update. Current version: v\$runningVersion, new version: v\$ROsVer\ + Avail\";\r\ + \n :set isOsNeedsToBeUpdated true;\r\ + \n } else={\r\ + \n :log info \"\$SMP The script will not install this update, becau\ + se it is not a patch update. Current version: v\$runningVersion, new versi\ + on: v\$ROsVerAvail\";\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nThis update wil\ + l not be installed, because the script is set to install only patch update\ + s.\");\r\ + \n }\r\ + \n } else={\r\ + \n :set isOsNeedsToBeUpdated true;\r\ + \n }\r\ + \n }\r\ + \n # Checking If the script needs to create a backup\r\ + \n :if (\$forceBackup = true or \$BackupAndUpdateMode = \"backup\" or \$i\ + sOsNeedsToBeUpdated = true) do={\r\ + \n :log info (\"\$SMP Starting backup process.\");\r\ + \n :set isEmailNeedsToBeSent true;\r\ + \n :local backupName \$backupNameTemplate;\r\ + \n # This means it's the first step where we create a backup before the\ + \_update process\r\ + \n :if (\$isOsNeedsToBeUpdated = true) do={\r\ + \n :set backupName \$backupNameBeforeUpdate;\r\ + \n #Email body if the purpose of the script is to update the device\r\ + \n :set mailSubjectPartAction \"Update preparation\";\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nThe update proces\ + s for device '\$Identity' is scheduled to upgrade RouterOS from version v.\ + \$runningVersion to version v.\$ROsVerAvail (Update channel: \$updateChann\ + el)\");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nPlease note: The \ + update will proceed only after a successful backup.\");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nA final report wi\ + th detailed information will be sent once the update process is completed.\ + \");\r\ + \n :set mailPtBodyAction (\$mailPtBodyAction . \"\\nIf you do not rec\ + eive a second email within the next 10 minutes, there may be an issue. Ple\ + ase check your device logs for further information.\");\r\ + \n }\r\ + \n :do {\r\ + \n :set mailAttachments [\$FuncCreateBackups \$backupName \$BackupPas\ + sword \$BackupSens];\r\ + \n :set mailPtSubjectBackup \"Backup created\";\r\ + \n :set mailPtBodyBackup \"System backups have been successfully crea\ + ted and attached to this email.\";\r\ + \n } on-error={\r\ + \n :set isOsNeedsToBeUpdated false;\r\ + \n :set mailPtSubjectBackup \"Backup failed\";\r\ + \n :set mailPtBodyBackup \"The script failed to create backups. Pleas\ + e check device logs for more details.\";\r\ + \n :log warning \"\$SMP Backup creation failed. Update process will b\ + e canceled if automatic update is enabled\";\r\ + \n }\r\ + \n }\r\ + \n :if (\$isEmailNeedsToBeSent = true) do={\r\ + \n :log info \"\$SMP Preparing to send email...\";\r\ + \n :local mailStep1Subject \$mailSubjectPrefix;\r\ + \n :local mailStep1Body \"\";\r\ + \n # subject\r\ + \n :if (\$mailSubjectPartAction != \"\") do={:set mailStep1Subject (\$\ + mailStep1Subject . \" - \" . \$mailSubjectPartAction)}\r\ + \n :if (\$mailPtSubjectBackup != \"\") do={:set mailStep1Subject (\$ma\ + ilStep1Subject . \" - \" . \$mailPtSubjectBackup)}\r\ + \n # body\r\ + \n :if (\$mailPtBodyAction != \"\") do={:set mailStep1Body (\$mailStep1\ + Body . \$mailPtBodyAction . \"\\n\\n\")}\r\ + \n :if (\$mailPtBodyBackup != \"\") do={:set mailStep1Body (\$mailStep1\ + Body . \$mailPtBodyBackup . \"\\n\\n\")}\r\ + \n :set mailStep1Body (\$mailStep1Body . \$mailBodyDeviceInfo . \"\\n__\ + ________\\n\" . \$mailBodyCopyright);\r\ + \n :set mailStep1Body (\$mailStep1Body . \"\\n[*** TEST START ***]\\n\\\ + \$DeviceInfo: \" . [ \$DeviceInfo ] . \"\\n[*** TEST END ***]\\n\");\r\ + \n # Send email with backups\r\ + \n :do {\$FuncSendEmailSafe \$EmailGeneralTo \$mailStep1Subject \$mailS\ + tep1Body \$mailAttachments} on-error={\r\ + \n :set isOsNeedsToBeUpdated false;\r\ + \n :log error \"\$SMP The script will not proceed with the update pro\ + cess, because the email was not sent.\";\r\ + \n }\r\ + \n }\r\ + \n :if ([:len \$mailAttachments] > 0) do={\r\ + \n :log info \"\$SMP Cleaning up backup files from the file system...\"\ + ;\r\ + \n /file remove \$mailAttachments;\r\ + \n :delay 2s;\r\ + \n }\r\ + \n :if (\$isOsNeedsToBeUpdated = true) do={\r\ + \n :global OldMode;\r\ + \n :log info \"\$SMP everything is ready to install new RouterOS, going\ + \_to start the update process and reboot the device.\";\r\ + \n :do {\r\ + \n :local nextStep 2;\r\ + \n :if (\$isCloudHostedRouter = true) do={\r\ + \n :log info \"\$SMP The device is a cloud hosted router, the secon\ + d step updating the Routerboard firmware will be skipped.\";\r\ + \n :set nextStep 3;\r\ + \n }\r\ + \n :local scheduledCommand (\":delay 5s; /system/scheduler remove BKP\ + UPD-NEXT-BOOT-TASK; \\\r\ + \n :global buGlobalVarScriptStep \$nextStep; :global buGlobalVarTarg\ + etOsVersion \\\"\$ROsVerAvail\\\"; \\\r\ + \n :delay 10s; /system/script { run \$ScriptName; }\");\r\ + \n /system/scheduler add name=BKPUPD-NEXT-BOOT-TASK on-event=\$schedu\ + ledCommand start-time=startup interval=0;\r\ + \n /system/package/update install;\r\ + \n } on-error={\r\ + \n # Failed to install new os version, remove the task and variables\ + \r\ + \n :do {\r\ + \n /system/scheduler remove BKPUPD-NEXT-BOOT-TASK;\r\ + \n :set BackupAndUpdateMode \$OldMode;\r\ + \n :delay 2;\r\ + \n :do {\r\ + \n :global buGlobalVarTargetOsVersion (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \"ERROR Remove\ + \_global variable \\\$buGlobalVarTargetOsVersion failed!\");\r\ + \n }\r\ + \n# :if ([ :len \$OldMode ] > 0) do={\r\ + \n# :do {\r\ + \n# :global OldMode (a);\r\ + \n# } on-error={\r\ + \n# :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Re\ + move global variable \\\$OldMode failed!\");\r\ + \n# }\r\ + \n# }\r\ + \n } on-error={\r\ + \n :log error \"\$SMP Failed to install new RouterOS version. Pleas\ + e check device logs for more details. \\\r\ + \n \\nAnd Failed to remove task and variables! Check it!\";\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Remove \ + task and global variables!\");\r\ + \n }\r\ + \n :log error \"\$SMP Failed to install new RouterOS version. Please \ + check device logs for more details.\";\r\ + \n :local mailUpdateErrorSubject (\$mailSubjectPrefix . \" - Update f\ + ailed\");\r\ + \n :local mailUpdateErrorBody \"The script was unable to install new \ + RouterOS version. Please check device logs for more details.\";\r\ + \n # Send email with error\r\ + \n \$FuncSendEmailSafe \$EmailGeneralTo \$mailUpdateErrorSubject \$ma\ + ilUpdateErrorBody \"\";\r\ + \n :error \$exitErrorMessage;\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n## STEP 2: (Post-reboot) Upgrade RouterBOARD firmware\r\ + \n## Runs only if auto-update is enabled and a new RouterOS version was fo\ + und\r\ + \n:if (\$scriptStep = 2) do={\r\ + \n :log info \"\$SMP The script is in the second step, updating Routerboa\ + rd firmware.\";\r\ + \n :log info \"\$SMP Upgrading routerboard firmware from v.\$deviceRbCurr\ + entFw to v.\$deviceRbUpgradeFw\";\r\ + \n /system routerboard upgrade;\r\ + \n :delay 2;\r\ + \n :log info \"\$SMP routerboard upgrade process was completed, going to \ + reboot in a moment!\";\r\ + \n ## Set task to send final report on the next boot\r\ + \n /system scheduler add name=BKPUPD-NEXT-BOOT-TASK on-event=\":delay 2; \ + :global buGlobalVarScriptStep 3; \\\r\ + \n :global buGlobalVarTargetOsVersion \\\"\$buGlobalVarTargetOsVersion\\\ + \"; :delay 10s; /system/script { run \$ScriptName; }; \\ \r\ + \n :delay 5s; /system/scheduler remove BKPUPD-NEXT-BOOT-TASK;\" start-ti\ + me=startup interval=0;\r\ + \n :delay 2;\r\ + \n /system reboot;\r\ + \n}\r\ + \n\r\ + \n## STEP 3: Final report (after second reboot, with delay).\r\ + \n## Runs only if auto-update is enabled and a new RouterOS version was fo\ + und.\r\ + \n:if (\$scriptStep = 3) do={\r\ + \n :log info (\"\$SMP The script is in the third step, sending final repo\ + rt.\");\r\ + \n :local targetOsVersion \$buGlobalVarTargetOsVersion;\r\ + \n :do {\r\ + \n# /system/script/environment remove [find name=\"buGlobalVarTargetOsV\ + ersion\"];\r\ + \n :global buGlobalVarTargetOsVersion (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR Remove glob\ + al variable \\\$buGlobalVarTargetOsVersion failed!\");\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$OldMode ] != 0) do={\r\ + \n :do {\r\ + \n# /system/script/environment remove [find name=\"OldMode\"];\r\ + \n :global OldMode (a);\r\ + \n } on-error={\r\ + \n :set \$mailSubjectPrefix (\$mailSubjectPrefix . \" ERROR! Remove\ + \_global variable \\\$OldMode failed!\");\r\ + \n }\r\ + \n }\r\ + \n :if ([:len \$targetOsVersion] = 0) do={\r\ + \n :log warning \"\$SMP Something is wrong, the script was unable to ge\ + t the target updated OS version from the global variable.\";\r\ + \n }\r\ + \n :local mailStep3Subject \$mailSubjectPrefix;\r\ + \n :local mailStep3Body \"\";\r\ + \n :if (\$targetOsVersion = \$runningVersion) do={\r\ + \n :log info \"\$SMP Successfully verified new RouterOS version: target\ + : `\$targetOsVersion`, current: `\$runningVersion`\";\r\ + \n :set mailStep3Subject (\$mailStep3Subject . \" - Update completed - \ + Backup created\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"RouterOS and routerboard upg\ + rade process was completed\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"\\nNew RouterOS version: v.\ + \$targetOsVersion, routerboard firmware: v.\$deviceRbCurrentFw\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"\\n\$changelogUrl\\nBackups \ + of the upgraded system are in the attachment of this email.\\n\\n\$mailBod\ + yDeviceInfo\\n\\n\$mailBodyCopyright\");\r\ + \n :set mailAttachments [\$FuncCreateBackups \$backupNameAfterUpdate \$\ + BackupPassword \$BackupSens];\r\ + \n } else={\r\ + \n :log error \"\$SMP Failed to verify new RouterOS version: target: `\ + \$targetOsVersion`, current: `\$runningVersion`\";\r\ + \n :set mailStep3Subject (\$mailStep3Subject . \" - Update failed\");\r\ + \n :set mailStep3Body (\$mailStep3Body . \"The script was unable to ver\ + ify that the new RouterOS version was installed, target version: `\$target\ + OsVersion`, current version: `\$runningVersion`\\nCheck device logs for mo\ + re details.\\n\\n\$mailBodyDeviceInfo\\n\\n\$mailBodyCopyright\");\r\ + \n }\r\ + \n \$FuncSendEmailSafe \$EmailGeneralTo \$mailStep3Subject \$mailStep3Bod\ + y \$mailAttachments;\r\ + \n :if ([:len \$mailAttachments] > 0) do={\r\ + \n :log info \"\$SMP Cleaning up backup files from the file system...\"\ + ;\r\ + \n /file remove \$mailAttachments;\r\ + \n :delay 2;\r\ + \n }\r\ + \n :log info (\"\$SMP Final report email sent successfully, and the scrip\ + t has finished.\");\r\ + \n}\r\ + \n:log info (\"\$SMP the script has finished, script step: `\$scriptStep` \ + \\n\\n\");\r\ + \n\r\ + \n} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n" +add dont-require-permissions=no name=testGetPubIP owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global DevInfoIncludeIP;\r\ + \n:global CharacterReplace;\r\ + \n:global EscapeForRegEx;\r\ + \n:global UrlEncode;\r\ + \n\r\ + \n:if ([ \$DevInfoIncludeIP ] = true) do={\r\ + \n :global GetPubIp;\r\ + \n :local Char (\"\\n\\r\");\r\ + \n :local PublicIpAddress [\$GetPubIp];\r\ + \n# :if ([ :pick \$PublicIpAddress ([ :len \$PublicIpAddress ] - 2) ] = \ + \"\\n\") do={:error true}; :set error falseon-error={:set PublicIpAddress \ + (\$PublicIpAddress . Char)};\r\ + \n#:if ([ :pick \$PublicIpAddress ([ :len \$PublicIpAddress ] - 1) ] = \"/\ + n\") do={\r\ + \n#:log warning \"N is = //n\"; \r\ + \n# :set PublicIpAddress [ \$CharacterReplace \$PublicIpAddress \$Char \"\ + \" ];\r\ + \n#}\r\ + \n# :set PublicIpAddress [ \$UrlEncode \$PublicIpAddress ];\r\ + \n#:local IpLen ([ :len \$PublicIpAddress ] -1);\r\ + \n#:set PublicIpAddress [:pick \$PublicIpAddress 0 \$IpLen];\r\ + \n :log warning \"Public IP address detected: \$PublicIpAddress , len = \ + \$IpLen\";\r\ + \n}\r\ + \n" +add comment="download, import and update firewall address-lists" \ + dont-require-permissions=no name=AM-FwAddrLists owner=AM-FwAddrLists \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: AM-FwAddrLists\r\ + \n# Script comment: download, import and update firewall address-lists\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# https://ros.vados.ru/doc/fw-addr-lists.md\r\ + \n:local ExitOK false;\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady; :global GlobalFuncReady;\r\ + \n :retry { :if (\$GlobalConfReady != true || \$GlobalFuncReady != true) \ + \\\r\ + \n do={ :error (\"Global config and/or functions not ready.\"); }; } \ + delay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ListsDirName (\"fw-addr-lists.d/\" . [ /system identity get nam\ + e ] . \"/\");\r\ + \n :local ListsUrl (\$GlobalScriptsUrl . \$ListsDirName);\r\ + \n :local ListsIndex \"index.lst\";\r\ + \n :local AddrListsTimeOut 1d;\r\ + \n :local CheckCerts false;\r\ + \n\r\ + \n :global CertificateAvailable;\r\ + \n :global EitherOr;\r\ + \n :global FetchHugeFiles;\r\ + \n :global HumanReadableNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global NetMask4;\r\ + \n :global NetMask6;\r\ + \n :global ScriptLock;\r\ + \n \r\ + \n :local FindDelim do={\r\ + \n :local ValidChars \"0123456789.:/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi\ + jklmnopqrstuvwxyz-\";\r\ + \n :for I from=0 to=[ :len \$1 ] do={\r\ + \n :if ([ :typeof [ :find \$ValidChars [ :pick (\$1 . \" \") \$I ] ] \ + ] != \"num\") do={\r\ + \n :return \$I;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local GetBranch do={\r\ + \n :global EitherOr;\r\ + \n :return [ :pick [ :convert transform=md5 to=hex [ :pick \$1 0 [ \$Ei\ + therOr [ :find \$1 \"/\" ] [ :len \$1 ] ] ] ] 0 2 ];\r\ + \n }\r\ + \n \r\ + \n :if ([ \$ScriptLock \$ScriptName ] = false) do={\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local ListComment (\"managed by \" . \$ScriptName);\r\ + \n :local Url (\$ListsUrl . \$ListsIndex);\r\ + \n :local tmpIndex false;\r\ + \n\r\ + \n :for I from=1 to=5 do={\r\ + \n :if (\$tmpIndex = false) do={\r\ + \n :set tmpIndex [ :tolf [ \$FetchHugeFiles \$ScriptName \$Url \$Chec\ + kCerts ] ];\r\ + \n :if (\$tmpIndex = false && \$I < 5) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading address-list \ + index, \" . \$I . \". try from: \" . \$Url);\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :if (\$tmpIndex = false) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading address-list inde\ + x from: \" . \$Url);\r\ + \n :set tmpIndex \"\";\r\ + \n }\r\ + \n\r\ + \n :foreach List in=[ :deserialize \$tmpIndex delimiter=\"\\n\" from=dsv \ + options=dsv.plain ] do={\r\ + \n# :set List (\$List->0);\r\ + \n :local ListName;\r\ + \n :local Delim [ \$FindDelim \$List ];\r\ + \n :if (\$Delim = 0) do={ :set List \"\"; };\r\ + \n :log warning (\$ScriptName . \" Parsing address-list index entry: \"\ + \_. \$List);\r\ + \n :if ([ :len \$List ] = 0) do={\r\ + \n :log error (\$ScriptName . \" Failed parsing address-list index en\ + try: \" . \$List);\r\ + \n } else={\r\ + \n :set ListName [ :pick \$List 0 \$Delim ];\r\ + \n }\r\ + \n :log warning (\$ScriptName . \" Parsing address-list index entry: \"\ + \_. \$ListName . \" - Ok.\");\r\ + \n :local ListUrl (\$ListsUrl . \$ListName);\r\ + \n :local CntAdd 0;\r\ + \n :local CntRenew 0;\r\ + \n :local CntRemove 0;\r\ + \n :local IPv4Addresses ({});\r\ + \n :local IPv6Addresses ({});\r\ + \n :local Failure false;\r\ + \n :local Data false;\r\ + \n :local TimeOut \$AddrListTimeOut;\r\ + \n\r\ + \n :for I from=1 to=5 do={\r\ + \n :if (\$Data = false) do={\r\ + \n :set Data [ :tolf [ \$FetchHugeFiles \$ScriptName \$ListUrl \$Ch\ + eckCerts ] ];\r\ + \n :if (\$Data = false && \$I < 5) do={\r\ + \n :log warning (\$ScriptName . \" Failed downloading for list '\ + \" . \$ListName . \"', \" . \$I . \". try from: \" . \$ListUrl);\r\ + \n :delay ((\$I * \$I) . \"s\");\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if (\$Data = false) do={\r\ + \n :set Data \"\";\r\ + \n :set Failure true;\r\ + \n :log warning (\$ScriptName . \" Failed downloading for list '\" . \ + \$ListName . \"' from: \" . \$ListUrl);\r\ + \n } else={\r\ + \n :log warning (\$ScriptName . \" Downloaded \" . [ \$HumanReadableN\ + um [ :len \$Data ] 1024 ] . \"B for list '\" . \$ListName . \"' from: \" .\ + \_\$ListUrl);\r\ + \n }\r\ + \n\r\ + \n :foreach Line in=[ :deserialize \$Data delimiter=\"\\n\" from=dsv op\ + tions=dsv.plain ] do={\r\ + \n :set Line (\$Line->0);\r\ + \n :local Address;\r\ + \n :if ([ :pick \$Line 0 1 ] = \"{\" && [ :pick \$Line ([ :len \$Line\ + \_] - 1) ] = \"}\") do={\r\ + \n :do {\r\ + \n :set Address [ :tostr ([ :deserialize from=json \$Line ]->\"ci\ + dr\") ];\r\ + \n } on-error={ }\r\ + \n } else={\r\ + \n :set Address ([ :pick \$Line 0 [ \$FindDelim \$Line ] ] . (\$L\ + ist->\"cidr\"));\r\ + \n }\r\ + \n :do {\r\ + \n :local Branch;\r\ + \n :if (\$Address ~ \"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\\ + .[0-9]{1,3}(/[0-9]{1,2})\?\\\$\") do={\r\ + \n :local Net \$Address;\r\ + \n :local CIDR 32;\r\ + \n :local Slash [ :find \$Address \"/\" ];\r\ + \n :if ([ :typeof \$Slash ] = \"num\") do={\r\ + \n :set Net [ :toip [ :pick \$Address 0 \$Slash ] ]\r\ + \n :set CIDR [ :pick \$Address (\$Slash + 1) [ :len \$Address ]\ + \_];\r\ + \n :set Address [ :tostr (([ :toip \$Net ] & [ \$NetMask4 \$CID\ + R ]) . [ \$IfThenElse (\$CIDR < 32) (\"/\" . \$CIDR) ]) ];\r\ + \n }\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n :if (\$Address ~ \"^[0-9a-zA-Z]*:[0-9a-zA-Z:\\\\.]+(/[0-9]{1,3})\ + \?\\\$\") do={\r\ + \n :local Net \$Address;\r\ + \n :local CIDR 128;\r\ + \n :local Slash [ :find \$Address \"/\" ];\r\ + \n :if ([ :typeof \$Slash ] = \"num\") do={\r\ + \n :set Net [ :toip6 [ :pick \$Address 0 \$Slash ] ]\r\ + \n :set CIDR [ :pick \$Address (\$Slash + 1) [ :len \$Address ]\ + \_];\r\ + \n }\r\ + \n :set Address (([ :toip6 \$Net ] & [ \$NetMask6 \$CIDR ]) . \"/\ + \" . \$CIDR);\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n :if (\$Address ~ \"^[\\\\.a-zA-Z0-9-]+\\\\.[a-zA-Z]{2,}\\\$\") d\ + o={\r\ + \n :set Branch [ \$GetBranch \$Address ];\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address) \$TimeOut;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n \r\ + \n\r\ + \n :foreach Entry in=[ /ip/firewall/address-list/find where \\\r\ + \n list=\$ListName comment=\$ListComment ] do={\r\ + \n :local Address [ /ip/firewall/address-list/get \$Entry address ];\ + \r\ + \n :local Branch [ \$GetBranch \$Address ];\r\ + \n :local TimeOut (\$IPv4Addresses->\$Branch->\$Address);\r\ + \n :if ([ :typeof \$TimeOut ] = \"time\") do={\r\ + \n :log warning (\$ScriptName . \" Renewing IPv4 address \" . \$Add\ + ress . \\\r\ + \n \" in list '\" . \$ListName . \"' with \" . \$TimeOut . \".\ + \");\r\ + \n /ip/firewall/address-list/set \$Entry timeout=\$TimeOut;\r\ + \n :set (\$IPv4Addresses->\$Branch->\$Address);\r\ + \n :set CntRenew (\$CntRenew + 1);\r\ + \n } else={\r\ + \n :if (\$Failure = false) do={\r\ + \n :log warning (\$ScriptName . \" Removing IPv4 address \" . \$A\ + ddress . \\\r\ + \n \" from list '\" . \$ListName . \".\");\r\ + \n /ip/firewall/address-list/remove \$Entry;\r\ + \n :set CntRemove (\$CntRemove + 1);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach Entry in=[ /ipv6/firewall/address-list/find where \\\r\ + \n list=\$ListName comment=\$ListComment ] do={\r\ + \n :local Address [ /ipv6/firewall/address-list/get \$Entry address ]\ + ;\r\ + \n :local Branch [ \$GetBranch \$Address ];\r\ + \n :local TimeOut (\$IPv6Addresses->\$Branch->\$Address);\r\ + \n :if ([ :typeof \$TimeOut ] = \"time\") do={\r\ + \n :log warning (\$ScriptName . \" Renewing IPv6 address \" . \$Add\ + ress . \\\r\ + \n \" in list '\" . \$ListName . \"' with \" . \$TimeOut . \".\ + \");\r\ + \n /ipv6/firewall/address-list/set \$Entry timeout=\$TimeOut;\r\ + \n :set (\$IPv6Addresses->\$Branch->\$Address);\r\ + \n :set CntRenew (\$CntRenew + 1);\r\ + \n } else={\r\ + \n :if (\$Failure = false) do={\r\ + \n :log warning (\$ScriptName . \" Removing IPv6 address \" . \$A\ + ddress . \\\r\ + \n \" from list '\" . \$ListName . \".\");\r\ + \n /ipv6/firewall/address-list/remove \$Entry;\r\ + \n :set CntRemove (\$CntRemove + 1);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach BranchName,Branch in=\$IPv4Addresses do={\r\ + \n :log warning (\$ScriptName . \" Handling branch: \" . \$BranchName\ + );\r\ + \n :foreach Address,Timeout in=\$Branch do={\r\ + \n :log warning (\$ScriptName . \" Adding IPv4 address \" . \$Addre\ + ss . \\\r\ + \n \" to list '\" . \$ListName . \"' with \" . \$Timeout . \".\ + \");\r\ + \n :onerror Err {\r\ + \n /ip/firewall/address-list/add list=\$ListName comment=\$ListCo\ + mment \\\r\ + \n address=\$Address timeout=\$Timeout;\r\ + \n :set CntAdd (\$CntAdd + 1);\r\ + \n } do={\r\ + \n :log warning (\$ScriptName . \" Failed to add IPv4 address \" \ + . \$Address . \\\r\ + \n \" to list '\" . \$ListName . \"': \" . \$Err);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach BranchName,Branch in=\$IPv6Addresses do={\r\ + \n :log warning (\$ScriptName . \" Handling branch: \" . \$BranchName\ + );\r\ + \n :foreach Address,Timeout in=\$Branch do={\r\ + \n :log warning (\$ScriptName . \" Adding IPv6 address \" . \$Addre\ + ss . \\\r\ + \n \" to list '\" . \$ListName . \"' with \" . \$Timeout . \".\ + \");\r\ + \n :onerror Err {\r\ + \n /ipv6/firewall/address-list/add list=\$ListName comment=\$List\ + Comment \\\r\ + \n address=\$Address timeout=\$Timeout;\r\ + \n :set CntAdd (\$CntAdd + 1);\r\ + \n } do={\r\ + \n :log warning (\$ScriptName . \" Failed to add IPv6 address \" \ + . \$Address . \\\r\ + \n \" to list '\" . \$ListName . \"': \" . \$Err);\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :log info (\$ScriptName . \" list: \" . \$ListName . \\\r\ + \n \" (\" . [ \$HumanReadableNum (\$CntAdd + \$CntRenew) 1000 ] . \ + \")\" . \\\r\ + \n \" -- added: \" . [ \$HumanReadableNum \$CntAdd 1000 ] . \\\r\ + \n \" - renewed: \" . [ \$HumanReadableNum \$CntRenew 1000 ] . \\\r\ + \n \" - removed: \" . [ \$HumanReadableNum \$CntRemove 1000 ]);\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=awg-env owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/envs/add list=awg-proxy-env key=AWG_LISTEN value=\":55055\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_REMOTE value=\"109.107.17\ + 7.79:55055\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JC value=\"9\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JMIN value=\"105\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_JMAX value=\"920\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S1 value=\"90\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S2 value=\"136\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S3 value=\"45\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_S4 value=\"27\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H1 value=\"472437748-4724\ + 38637\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H2 value=\"707808381-7078\ + 09250\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H3 value=\"1609078552-160\ + 9079495\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_H4 value=\"1012329484-101\ + 2329741\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I1 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I2 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I3 value=\"\ + \"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I4 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_I5 value=\"\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_SERVER_PUB value=\"o5IgCl\ + 1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\ + \n/container/envs/add list=awg-proxy-env key=AWG_CLIENT_PUB value=[/interf\ + ace/wireguard/get [find name=wg-awg-proxy] public-key]" +add dont-require-permissions=no name=awg-container-add owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/add file=sata1/tmp/awg-proxy-amd64.tar.gz interface=veth-awg-pro\ + xy envlist=awg-proxy-env \\\ + \n hostname=awg-proxy root-dir=sata1/awg-proxy logging=yes shm-size=4M \ + start-on-boot=yes\ + \n/container/start [find where tag~\"awg-proxy\"]" +add dont-require-permissions=yes name=awg2-webui owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + put \"Download image, and save him to usb1/tmp\"\ + \n/tool/fetch url=\"https://ros.vados.ru/docker/awg2-webui-chr.tar\" dst-p\ + ath=sata1/tmp/awg2-webui.tar\ + \n\ + \n:put \"1. Create veth interface\"\ + \n/interface veth add name=veth-awg address=10.9.9.2/24 gateway=10.9.9.1\ + \n\ + \n:put \"2. Create bridge and add veth\"\ + \n/interface bridge add name=br-awg\ + \n/interface bridge port add bridge=br-awg interface=veth-awg\ + \n\ + \n:put \"3. Assign IP to bridge\"\ + \n/ip address add address=10.9.9.1/24 interface=br-awg\ + \n\ + \n:put \"4. NAT: masquerade container traffic\"\ + \n/ip firewall nat add chain=srcnat src-address=10.9.9.0/24 action=masquer\ + ade\ + \n\ + \n:put \"5. Port forward: UDP 443 \? container (AmneziaWG QUIC mimicry)\"\ + \n/ip firewall nat add chain=dstnat protocol=udp dst-port=443 action=dst-n\ + at to-addresses=10.9.9.2 to-ports=55055 in-interface=ether1\ + \n\ + \n:put \"6. Port forward: HTTPS 9443 \? container Web UI\"\ + \n/ip firewall nat add chain=dstnat protocol=tcp dst-port=9443 action=dst-\ + nat to-addresses=10.9.9.2 to-ports=443 in-interface=ether1\ + \n\ + \n:put \"Create environment list..\"\ + \n/container envs add list=awgui-env key=WEB_USER value=vados\ + \n/container envs add list=awgui-env key=WEB_PASS value=zoomzoomrulezz\ + \n/container envs add list=awgui-env key=SECRET_KEY value=RanDomSecret32Sy\ + mboLs2325272931q\ + \n/container envs add list=awgui-env key=AWG_ENDPOINT value=10.30.30.10:44\ + 3\ + \n\ + \n:put \"Load and start container...\"\ + \n/container add file=sata1/tmp/awg2-webui.tar interface=veth-awg hostname\ + =awg2-webui \\\ + \nroot-dir=sata1/awg2-webui layer-dir=sata1/docker/awg2-webu/ envlist=awgu\ + i-env start-on-boot=yes logging=yes shm-size=4M\ + \n\ + \n:put \"Start...\"\ + \n/container start 0\ + \n\ + \n:put \"Verify...\"\ + \n/container print\ + \n\ + \n:put \"Should show: status=running\"\ + \n\ + \n/log print where topics~\"container\"\ + \n\ + \n:put \"Should show: AWG started, nginx running\"\ + \n" +add dont-require-permissions=no name=awg-proxy-go-Client owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n:put \"[::::::::::::::: START :::::::::::::::]\"\ + \n:put \"\"\ + \n:put \"Add ram disk tmpfs\"\ + \n#/disk add type=tmpfs tmpfs-max-size=100M slot=ram\ + \n\ + \n:put \"veth and network:\"\ + \n /interface/bridge add name=docker port-cost-mode=short\ + \n /ip/address/add address=192.168.100.1/24 interface=docker\ + \n\ + \n /interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ + =awg-proxy-go-client\ + \n /interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ + \n\ + \n:put \"add config-client.json\"\ + \n/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ + \n/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json d\ + st=/app/config.json list=awgcfg-client\ + \n\ + \n#:put \"Download image, and save him to sata1/tmp/awgproxy-0.0.1-0034-am\ + d64.tar.gz\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/amneziawg/img/awgproxy-0.0.1-003\ + 4-amd64.tar.gz\" dst-#path=\"tmp/awgproxy-0.0.1-0034-amd64.tar.gz\"\ + \n\ + \n:put \"Add container\"\ + \n/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interface\ + =awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-proxy\ + -client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pro\ + xy-go-client\" mountlists=awgcfg-client\ + \n\ + \n:put \"Start container\"\ + \n#/container/start awg-proxy-go-client\ + \n\ + \n:put \"Add user:\"\ + \n /user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ + peskar55\ + \n\ + \n:put \"Add forwarding port web-ui\"\ + \n /ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ + face=ether1 protocol=tcp to-addresses=192.168.100.3 to-port=8088\ + \n\ + \n:put \"Add native WireGuard-server wg-awg, add address.\"\ + \n /interface/wireguard/add name=wg-awg-client\ + \n /ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ + \n\ + \n:put \"\"\ + \n:put \"[::::::::::::::: END :::::::::::::::]\"\ + \n" +add comment=awg2wg dont-require-permissions=no name=awg2wg-uninstall owner=\ + Manager policy=ftp,read,write,policy source="\r\ + \n :put \"Uninstalling AmneziaWG...\"\r\ + \n :log info \"Uninstalling AmneziaWG...\"\r\ + \n /ip/route/remove [find where comment=awg2wg-tunnel]\r\ + \n :do { /tool/netwatch/remove [find where comment=Monitor-AWG2WG] } on-e\ + rror={}\r\ + \n :do { /ip/route/remove [find where comment=Monitor-AWG2WG] } on-error=\ + {}\r\ + \n /container/stop [find where interface=veth-awg2wg]\r\ + \n :delay 7s\r\ + \n /interface/list/member/remove [find where interface=wg-awg2wg]\r\ + \n /container/remove [find where interface=veth-awg2wg]\r\ + \n /container/envs/remove [find where list=\"awg2wg-env\"]\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg2wg\"]\r\ + \n /ip/address/remove [find where address=\"172.20.0.1/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg2wg\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg2wg\"]\ + \r\ + \n /ip/address/remove [find where interface=\"wg-awg2wg\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg2wg\"]\r\ + \n :do { /file/remove [find where name~\"awg2wg.+tar\"] } on-error={}\r\ + \n :do { /file/remove [find where name=\"disk1/awg2wg\"] } on-error={}\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg2wg-uninstall]\r\ + \n" +add dont-require-permissions=no name=amneziawg-mikrotik-c owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ + \n:global imagesPath \"amneziawg/img/\";\ + \n:local Image \"awg-proxy-amd64-7.20-Docker.tar.gz\";\ + \n\ + \n:global DstDir \"sata1/dst/\";\ + \n\ + \n:local Url=(\$GlobalScriptsUrl . \$ImagesPath . \$Image);\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n" +add comment=Generator dont-require-permissions=no name=awg-VDSina owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# ============================================================\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\ + \n# 2026-06-30 22:08:12\ + \n# ============================================================\ + \n\ + \n# 0. Check prerequisites\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\ + \n :error \"Usage: /system/device-mode/update container=yes\"\ + \n}\ + \n\ + \n# Auto-detect storage\ + \n:global awgDisk \"disk1\"\ + \n{\ + \n :local usbFree 0\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \n } else={\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\ + \n :put \"USB found but not mounted. Format as ext4\?\"\ + \n :put \"Press 'y' to confirm:\"\ + \n :local key [/terminal/inkey timeout=30]\ + \n :if (\$key = 121 || \$key = 89) do={\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\ + \n :delay 3s\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n } else={ :put \"Format failed, using disk1\" }\ + \n } else={ :put \"Using disk1\" }\ + \n } else={ :put \"No USB, using disk1\" }\ + \n }\ + \n}\ + \n\ + \n# 1. Uninstall script\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \n :put \"Uninstallimg AmneziaWG...\"\ + \n :log info \"Uninstallimg AmneziaWG...\"\ + \n :local prevDNS \"\"\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\ + \n :local storageDisk \"disk1\"\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\ + \n :local prevTmpdir \"\"\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ + \n }\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\ + \n /container/stop [find where interface=veth-awg-VDSina]\ + \n :delay 7s\ + \n /container/remove [find where interface=veth-awg-VDSina]\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\ + \n :if (\$prevDNS != \"\") do={\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ + \n :put (\"DNS restored to: \$prevDNS\")\ + \n }\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n /container/config set tmpdir=\$prevTmpdir\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ + \n }\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\ + \n }\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\ + \n}\ + \n\ + \n# 2. Network infrastructure\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\ + \n\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ + yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ + QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\ + \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\ + \n\ + \n# 4. Container environment variables\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\ + \n\ + \n# 5. DNS\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\ + \n# NOTE: replaces existing DNS configuration\ + \n/ip/dns/set servers=109.107.177.79\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\ + \n\ + \n# 6. Download, create and start container\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \n:if (\$awgDisk != \"disk1\") do={\ + \n :local tmpPath (\$awgDisk . \"/pull\")\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\ + \n}\ + \n{\ + \n :local arch [/system/resource/get architecture-name]\ + \n :local ver [/system/resource/get version]\ + \n :local dotPos [:find \$ver \".\"]\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\ + \n :local endPos [:find \$rest \".\"]\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\ + \n :local suffix \"\"\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\ + \n :local file \"\"\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\ + \n :local filePath \$file\ + \n :if (\$awgDisk != \"disk1\") do={\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\ + \n }\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\ + \n :local freeStorage 0\ + \n :if (\$awgDisk = \"disk1\") do={\ + \n :set freeStorage [/system/resource/get free-hdd-space]\ + \n } else={\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\ + \n }\ + \n :if (\$freeStorage < 262144) do={\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\ + \n :error \"Insufficient disk space\"\ + \n }\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \n } else={\ + \n :put (\"File already exists: \" . \$filePath)\ + \n }\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\ + \n /file/remove \$filePath\ + \n :local freeMem [/system/resource/get free-memory]\ + \n :if (\$freeMem < 16777216) do={\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\ + \n }\ + \n /container/start [find where interface=veth-awg-VDSina]\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\ + \n :put \"Waiting for container to start...\"\ + \n :delay 5s\ + \n /interface/wireguard/enable wg-awg-VDSina\ + \n :put \"WireGuard interface enabled\"\ + \n :put \"Installation complete!\"\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\ + \n /ping 109.107.177.79 count=10 interval=1\ + \n :put \"\"\ + \n :put \"======= NEXT STEPS =======\"\ + \n :put \"\"\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\ + \n :put \"\"\ + \n :put \" Route a single host:\"\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Route a subnet:\"\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Remove a route:\"\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\ + \n :put \"\"\ + \n :put \" Show all tunnel routes:\"\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Uninstall:\"\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\ + \n :put \"=========================\"\ + \n}\ + \n\ + \n# 7. Verification\ + \n# /container/print\ + \n# /interface/wireguard/print\ + \n# /interface/wireguard/peers/print\ + \n" +add comment="wg2awg GH repo in client mode" dont-require-permissions=no name=\ + "wg2awg client" owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n\ + \n:local WorkDisk \"sata1\";\ + \n:local Name wg2awg;\ + \n:local Bridge (\"Bridge-\" . \$Name);\ + \n:local Vetch (\"vetch-\" . \$Name);\ + \n:local Env (\$Name . \"-env\");\ + \n:local ConfDir (\"/etc/\" . \$Name . \"/\");\ + \n:local ConfFile (\$Name . \".conf\");\ + \n:local Mounts (\$WorkDisk . \"/mounts/\" . \$Name . \"/\");\ + \n#:put \"\"\ + \n#put \"Add ram disk tmpfs\"\ + \n#/disk add type=tmpfs tmpfs-max-size=100M slot=ram\ + \n\ + \n\ + \n:log warning \"[::::::::::::::: START :::::::::::::::]\"\ + \n:log warning \"Add veth and nat...\";\ + \n:do {\ + \n/interface/veth/add name=\$Vetch address=172.18.0.2/30 gateway=172.18.0.\ + 1;\ + \n/ip/address/add address=172.18.0.1/30 interface=\$Vetch;\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.18.0\ + .0/30;\ + \n} on-error={}\ + \n\ + \n#:do {\ + \n#/file add type=directory name=\$Mounts\ + \n#} on-error={}\ + \n\ + \n:do {\ + \n:log warning \"Add config file...\";\ + \n/file add type=file name=(\$Mounts . \$ConfFile) contents=\"[Interface]\ + \nPrivateKey = 4CHyNhbOs923/EyNDguMXJXdghL2I3UyzXPwrANVgHs=\ + \nAddress = 10.9.0.3/32\ + \nMTU = 1280\ + \nDNS = 109.107.177.79\ + \nPreUp = ip route add 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nPostDown = ip route del 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nJc = 9\ + \nJmin = 105\ + \nJmax = 920\ + \nS1 = 90\ + \nS2 = 136\ + \nS3 = 45\ + \nS4 = 27\ + \nH1 = 472437748-472438637\ + \nH2 = 707808381-707809250\ + \nH3 = 1609078552-1609079495\ + \nH4 = 1012329484-1012329741\ + \nI1 = <\ + r 4>\ + \nI2 = \ + \nI3 = \ + \nI4 = \ + \nI5 = \ + \n\ + \n[Peer]\ + \nPublicKey = o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\ + \nAllowedIPs = 0.0.0.0/0\ + \nEndpoint = 109.107.177.79:55055\ + \nPersistentKeepalive = 10\ + \nPresharedKey = RNvF7T1cg5tyXcYQnD9N5BEp6e20vVJQTv0GMjyvHU0=\";\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Add mounts...\");\ + \n/container/mounts/add src=(\$Mounts . \$ConfFile) dst=(\$ConfDir . \$Con\ + fFile) list=\$Env\ + \n:log warning (\"Add mounts Environment key.\");\ + \n/container/envs/add list=\$Env key=AWG_CONFIG value=(\$ConfDir . \$ConfF\ + ile);\ + \n} on-error={}\ + \n\ + \n\ + \n#/interface/bridge add name=\$Bridge port-cost-mode=short;\ + \n#/ip/address/add address=192.168.100.1/24 interface=\$Bridge;\ + \n\ + \n#/interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ + =awg-proxy-go-client\ + \n#/interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ + \n\ + \n#:put \"add config-client.json\"\ + \n#/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ + \n#/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json \ + dst=/app/config.json list=awgcfg-client\ + \n\ + \n#:put \"Download image, and save him to sata1/tmp/awgproxy-0.0.1-0034-am\ + d64.tar.gz\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/amneziawg/img/awgproxy-0.0.1-003\ + 4-amd64.tar.gz\" dst-#path=\"tmp/awgproxy-0.0.1-0034-amd64.tar.gz\"\ + \n\ + \n#:put \"Add container\"\ + \n#/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interfac\ + e=awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-prox\ + y-client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pr\ + oxy-go-client\" mountlists=awgcfg-client\ + \n\ + \n#:put \"Start container\"\ + \n#/container/start awg-proxy-go-client\ + \n\ + \n#:put \"Add user:\"\ + \n#/user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ + peskar55\ + \n\ + \n#:put \"Add forwarding port web-ui\"\ + \n#/ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ + face=ether1 protocol=tcp to-addresses=192.168.100.3 to-port=8088\ + \n\ + \n#:put \"Add native WireGuard-server wg-awg, add address.\"\ + \n#/interface/wireguard/add name=wg-awg-client\ + \n#/ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ + \n\ + \n:put \"\"\ + \n:put \"[::::::::::::::: END :::::::::::::::]\"\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +add name=manager policy="local,ssh,ftp,read,write,policy,api,rest-api,!telnet,\ + !reboot,!test,!winbox,!password,!web,!sniff,!sensitive,!romon" +/app +set cinny firewall-redirects=8094:80:tcp:web +set goaway container-command-lines=goaway:none:docker.io/pommee/goaway:latest +set home-assistant container-command-lines=\ + home-assistant:none:lscr.io/linuxserver/homeassistant +set n8n firewall-redirects=5678:5678:tcp:web +set nextcloud container-command-lines="db:none:docker.io/postgres:17,redis:non\ + e:docker.io/valkey/valkey:/bin/sh -c 'valkey-server --port 6379 --appendon\ + ly yes --requirepass \$VALKEY_PASSWORD',server:none:docker.io/nextcloud:ap\ + ache" +set pihole environment="pihole:FTLCONF_dns_listeningMode=all,pihole:FTLCONF_we\ + bserver_api_password=password" +set redlib firewall-redirects=8087:8080:tcp:web +set solr container-command-lines=solr:none:docker.io/solr:latest +set uptime-kuma container-command-lines=\ + uptime-kuma:none:docker.io/louislam/uptime-kuma:1 +/app settings +set auto-update=yes disk=*7 lan-bridge=*3 registry-mirrors="https://reg.vados.\ + ru:5000/:https://reg.vados.ru/,https://registry-1.docker.io" +/caps-man aaa +set called-format=ssid +/caps-man access-list +add action=reject allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-120..-80 ssid-regexp="" +add action=accept allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-79..120 ssid-regexp="" +/caps-man configuration +add channel.band=2ghz-b/g/n country=no_country_set datapath=xs-DataPath mode=\ + ap name=xs-2G rx-chains=0,1,2,3 security=xs-Sec ssid=vados tx-chains=\ + 0,1,2,3 +add channel.band=5ghz-a/n/ac country=no_country_set datapath=xs-DataPath \ + installation=any mode=ap name=xs-5G rx-chains=0,1,2,3 security=xs-Sec \ + ssid=vados5g tx-chains=0,1,2,3 +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX .frequency=2422,2442,2462 .reselect-interval=20m country=belarus \ + datapath=DataPath datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes hw-protection-mode=rts-cts installation=any name=2G \ + rx-chains=0,1,2,3 security=WPA2 ssid=vados tx-chains=0,1,2,3 +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX .frequency=5180,5200,5220,5240,5260 .reselect-interval=20m \ + .skip-dfs-channels=yes country=belarus datapath=DataPath \ + datapath.client-to-client-forwarding=yes .local-forwarding=yes \ + hw-protection-mode=rts-cts installation=any name=5G security=WPA2 ssid=\ + vados5g +/caps-man datapath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + xs-DataPath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + DataPath +/caps-man manager +set ca-certificate=CAPsMAN-CA-51B25E507D07 certificate=CAPsMAN-51B25E507D07 \ + enabled=yes require-peer-certificate=yes +/caps-man manager interface +set [ find default=yes ] forbid=yes +add disabled=no interface=BridgeLAN +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=g,gn,b \ + master-configuration=2G name-format=prefix-identity name-prefix=2G +add action=create-dynamic-enabled hw-supported-modes=an,ac,a \ + master-configuration=5G name-format=prefix-identity name-prefix=5G +add action=create-dynamic-enabled disabled=yes hw-supported-modes=ac,an,a \ + master-configuration=2G name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled disabled=yes hw-supported-modes=an \ + master-configuration=5G name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set crl-store=system +/container config +set layer-dir=/sata1/docker/layers memory-high=200.0MiB memory-max=4096.0MiB \ + registry-url=https://registry-1.docker.io tmpdir=/sata1/tmp username=\ + amsternl +/container envs +add key=AWG_CONFIG list=wg2awg-env value=/etc/wg2awg/wg2awg.conf +/container mounts +add dst=/etc/wg2awg/wg2awg.conf list=wg2awg-env src=\ + /sata1/mounts/wg2awg/wg2awg.conf +/ip smb +set enabled=no +/interface bridge port +add bridge=BridgeLAN interface=ether1 +add bridge=BridgeLAN interface=2G-MikroGig-1 +add bridge=BridgeLAN interface=2G-MikroMaster-1 +add bridge=BridgeLAN interface=5G-MikroGig-1 +add bridge=BridgeLAN interface=5G-MikroMaster-1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes +/interface detect-internet +set detect-interface-list=all internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +add interface=ether1 list=WAN +/interface wifi cap +set discovery-interfaces=*DF +/interface wifi capsman +set package-path=/tmpfs/capsman-packages upgrade-policy=none +/ip address +add address=10.30.30.10/24 interface=BridgeLAN network=10.30.30.0 +add address=172.18.0.1/30 interface=vetch-wg2awg network=172.18.0.0 +/ip dhcp-client +add disabled=yes interface=ether1 name=client1 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set disabled=yes interface=*3 lease-script=\ + lease-script lease-time=10m name=nucDHCP server-address=10.30.30.10 +/ip dns +set allow-remote-requests=yes doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=10.30.30.33,109.107.177.79 \ + verify-doh-cert=yes +/ip firewall nat +add action=masquerade chain=srcnat src-address=172.18.0.0/30 +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip route +add check-gateway=none disabled=no distance=2 dst-address=0.0.0.0/0 gateway=\ + BridgeLAN routing-table=main scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set reverse-proxy disabled=yes +set ssh port=2222 +set www-ssl port=4443 +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ + webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=*3 type=external +add interface=*B5 type=internal +/ipv6 firewall address-list +add address=2400:cb00::/32 list=CLOUDFLARE-IP-Address +add address=2606:4700::/32 list=CLOUDFLARE-IP-Address +add address=2803:f800::/32 list=CLOUDFLARE-IP-Address +add address=2405:b500::/32 list=CLOUDFLARE-IP-Address +add address=2405:8100::/32 list=CLOUDFLARE-IP-Address +add address=2a06:98c0::/29 list=CLOUDFLARE-IP-Address +add address=2c0f:f248::/32 list=CLOUDFLARE-IP-Address +/special-login +add port=serial0 +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system gps +set set-system-time=yes +/system identity +set name=MikroNUC +/system note +set show-at-login=no +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes +/system ntp client servers +add address=10.30.30.81 +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +/system scheduler +add comment="Every Day Set Global Environment Variables" disabled=yes name=\ + AM-SetGlobalEnv on-event=\ + "/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" disabled=yes interval=1d \ + name=AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Fake Bridges" disabled=yes interval=1d name=\ + mod/AM-IPbridge on-event="/system/script/run mod/AM-IPbridge;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Telegram Chat Bot" disabled=yes interval=30s name=mod/AM-TG-Bot \ + on-event="/system/script/run mod/AM-TG-Bot;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment=\ + "Every 7 Day Check For Update and Backup send notification to EMail." \ + disabled=yes interval=1w name=AM-Backup-UpdateEmail on-event=\ + "/system/script { run AM-Backup-UpdateEmail; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-06-25 start-time=03:41:27 +/tool e-mail +set certificate-verification=no from=MikroNUC port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260703/20260703014001-Diff-Config.rsc b/MikroNUC/history/20260703/20260703014001-Diff-Config.rsc new file mode 100644 index 0000000..bb4434d --- /dev/null +++ b/MikroNUC/history/20260703/20260703014001-Diff-Config.rsc @@ -0,0 +1,178 @@ +27,29d26 +< /interface veth +< add address=172.18.0.2/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ +< gateway=172.18.0.1 gateway6="" name=vetch-wg2awg +5054,5055c5051 +< \n\ +< \n:local WorkDisk \"sata1\";\ +--- +> \n:put \"[::::::::::::::: START :::::::::::::::]\"\ +5057,5062c5053 +< \n:local Bridge (\"Bridge-\" . \$Name);\ +< \n:local Vetch (\"vetch-\" . \$Name);\ +< \n:local Env (\$Name . \"-env\");\ +< \n:local ConfDir (\"/etc/\" . \$Name . \"/\");\ +< \n:local ConfFile (\$Name . \".conf\");\ +< \n:local Mounts (\$WorkDisk . \"/mounts/\" . \$Name . \"/\");\ +--- +> \n:local Bridge (\"Bridge\" . \$Name);\ +5067,5073c5058,5061 +< \n\ +< \n:log warning \"[::::::::::::::: START :::::::::::::::]\"\ +< \n:log warning \"Add veth and nat...\";\ +< \n:do {\ +< \n/interface/veth/add name=\$Vetch address=172.18.0.2/30 gateway=172.18.0.\ +< 1;\ +< \n/ip/address/add address=172.18.0.1/30 interface=\$Vetch;\ +--- +> \n:put \"veth and network:\"\ +> \n/interface/veth/add name=veth-awg address=172.18.0.2/30 gateway=172.18.0\ +> .1\ +> \n/ip/address/add address=172.18.0.1/30 interface=veth-awg\ +5075,5125c5063,5065 +< .0/30;\ +< \n} on-error={}\ +< \n\ +< \n#:do {\ +< \n#/file add type=directory name=\$Mounts\ +< \n#} on-error={}\ +< \n\ +< \n:do {\ +< \n:log warning \"Add config file...\";\ +< \n/file add type=file name=(\$Mounts . \$ConfFile) contents=\"[Interface]\ +< \nPrivateKey = 4CHyNhbOs923/EyNDguMXJXdghL2I3UyzXPwrANVgHs=\ +< \nAddress = 10.9.0.3/32\ +< \nMTU = 1280\ +< \nDNS = 109.107.177.79\ +< \nPreUp = ip route add 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ +< \nPostDown = ip route del 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ +< \nJc = 9\ +< \nJmin = 105\ +< \nJmax = 920\ +< \nS1 = 90\ +< \nS2 = 136\ +< \nS3 = 45\ +< \nS4 = 27\ +< \nH1 = 472437748-472438637\ +< \nH2 = 707808381-707809250\ +< \nH3 = 1609078552-1609079495\ +< \nH4 = 1012329484-1012329741\ +< \nI1 = <\ +< r 4>\ +< \nI2 = \ +< \nI3 = \ +< \nI4 = \ +< \nI5 = \ +< \n\ +< \n[Peer]\ +< \nPublicKey = o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\ +< \nAllowedIPs = 0.0.0.0/0\ +< \nEndpoint = 109.107.177.79:55055\ +< \nPersistentKeepalive = 10\ +< \nPresharedKey = RNvF7T1cg5tyXcYQnD9N5BEp6e20vVJQTv0GMjyvHU0=\";\ +< \n} on-error={}\ +< \n\ +< \n:do {\ +< \n:log warning (\"Add mounts...\");\ +< \n/container/mounts/add src=(\$Mounts . \$ConfFile) dst=(\$ConfDir . \$Con\ +< fFile) list=\$Env\ +< \n:log warning (\"Add mounts Environment key.\");\ +< \n/container/envs/add list=\$Env key=AWG_CONFIG value=(\$ConfDir . \$ConfF\ +< ile);\ +< \n} on-error={}\ +< \n\ +--- +> .0/30\ +> \n /interface/bridge add name=Bridge-\$name port-cost-mode=short\ +> \n /ip/address/add address=192.168.100.1/24 interface=Bridge-\$name\ +5127,5130c5067 +< \n#/interface/bridge add name=\$Bridge port-cost-mode=short;\ +< \n#/ip/address/add address=192.168.100.1/24 interface=\$Bridge;\ +< \n\ +< \n#/interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ +--- +> \n /interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ +5132c5069 +< \n#/interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ +--- +> \n /interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ +5134,5137c5071,5074 +< \n#:put \"add config-client.json\"\ +< \n#/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ +< \n#/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json \ +< dst=/app/config.json list=awgcfg-client\ +--- +> \n:put \"add config-client.json\"\ +> \n/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ +> \n/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json d\ +> st=/app/config.json list=awgcfg-client\ +5144,5148c5081,5085 +< \n#:put \"Add container\"\ +< \n#/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interfac\ +< e=awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-prox\ +< y-client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pr\ +< oxy-go-client\" mountlists=awgcfg-client\ +--- +> \n:put \"Add container\"\ +> \n/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interface\ +> =awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-proxy\ +> -client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pro\ +> xy-go-client\" mountlists=awgcfg-client\ +5150c5087 +< \n#:put \"Start container\"\ +--- +> \n:put \"Start container\"\ +5153,5154c5090,5091 +< \n#:put \"Add user:\"\ +< \n#/user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ +--- +> \n:put \"Add user:\"\ +> \n /user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ +5157,5158c5094,5095 +< \n#:put \"Add forwarding port web-ui\"\ +< \n#/ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ +--- +> \n:put \"Add forwarding port web-ui\"\ +> \n /ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ +5161,5163c5098,5100 +< \n#:put \"Add native WireGuard-server wg-awg, add address.\"\ +< \n#/interface/wireguard/add name=wg-awg-client\ +< \n#/ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ +--- +> \n:put \"Add native WireGuard-server wg-awg, add address.\"\ +> \n /interface/wireguard/add name=wg-awg-client\ +> \n /ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ +5166a5104,5125 +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +> \n\ +5243,5247d5201 +< /container envs +< add key=AWG_CONFIG list=wg2awg-env value=/etc/wg2awg/wg2awg.conf +< /container mounts +< add dst=/etc/wg2awg/wg2awg.conf list=wg2awg-env src=\ +< /sata1/mounts/wg2awg/wg2awg.conf +5269d5222 +< add address=172.18.0.1/30 interface=vetch-wg2awg network=172.18.0.0 +5280,5281d5232 +< /ip firewall nat +< add action=masquerade chain=srcnat src-address=172.18.0.0/30 -- 2.52.0