From c538ecf26ed0349e3a8aced783b6ec084a28b79e Mon Sep 17 00:00:00 2001 From: vados-dev Date: Wed, 1 Jul 2026 00:40:03 +0300 Subject: [PATCH] Backup for MikroNUC created successfully at Jul 01 00:40:03. --- .../20260701/20260701002003-Config.rsc | 3694 ++++++++++++ MikroMaster/tmp/Diff-Config.rsc | 4 + .../20260701/20260701004001-Binary.backup | Bin 0 -> 366465 bytes MikroNUC/20260701/20260701004001-Config.rsc | 5011 +++++++++++++++++ .../20260701/20260701004001-Diff-Config.rsc | 43 + 5 files changed, 8752 insertions(+) create mode 100644 MikroMaster/20260701/20260701002003-Config.rsc create mode 100644 MikroMaster/tmp/Diff-Config.rsc create mode 100644 MikroNUC/20260701/20260701004001-Binary.backup create mode 100644 MikroNUC/20260701/20260701004001-Config.rsc create mode 100644 MikroNUC/history/20260701/20260701004001-Diff-Config.rsc diff --git a/MikroMaster/20260701/20260701002003-Config.rsc b/MikroMaster/20260701/20260701002003-Config.rsc new file mode 100644 index 0000000..dbc2d80 --- /dev/null +++ b/MikroMaster/20260701/20260701002003-Config.rsc @@ -0,0 +1,3694 @@ +# 2026-07-01 00:20:10 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: 5260/20-Ceee/ac/DP(18dBm), 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 dns-servers=1.0.0.1,1.1.1.1 name=blsp.at verify-doh-cert=no +add comment=Kra dns-servers=1.0.0.1,1.1.1.1 name=slon2.to verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ipv6 dhcp-client option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=DUID value=0x00030001488f5a8e1abc +add code=61 name=clientid +/ipv6 dhcp-server option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=CLIENT_DUID +add code=61 name=CLIENT_MAC +/ppp profile +set *FFFFFFFE use-upnp=no +/routing bgp template +set default disabled=no output.network=bgp-networks +/routing table +add disabled=no fib name=To-VPN +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n\r\ + \n#:local Script AM-setup\ + \n;\r\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n\r\ + \n#\ + \n\r\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n\r\ + \n#\r\ + \n\ + \n#root.mnuc.backuper\ + \n\ + \n\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\r\ + \n\ + \n#:local Script AM-GlobalConfig;\ + \n\r\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\r\ + \n\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n\r\ + \n\r\ + \n#\ + \n:global MkDir;\ + \n\r\ + \n\ + \n#:local FetchFile Binary.backup\ + \n:local localDir \"\";\ + \n\ + \n\r\ + \n#\$MkDir \$localDir;\r\ + \n\ + \n#\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/727/203f86a6\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 13:30:05 29.06.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add comment=\ + "Lookup IP addresses for RKN list and add them to firewall address-list" \ + dont-require-permissions=no name=AM-RKN-dnsLookup owner=AM-RKN-dnsLookup \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\r\ + \n# RouterOS script: AM-RKN-dnsLookup\r\ + \n# Script comment: Lookup IP addresses for RKN list and add them to firew\ + all address-list\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# Script description: This script is intended to be run periodically, e.\ + g. once a day, to update the IP addresses in the firewall address-list bas\ + ed on the RKN list.\r\ + \n# It resolves the domain names in the RKN list and a\ + dds the corresponding IP addresses to the specified firewall address-list.\ + \r\ + \n# The script also handles CNAME records by following\ + \_them until it finds A records.\r\ + \n# Usage:\r\ + \n# /system/script { run AM-RKN-dnsLookup; }\r\ + \n:local ScriptName [ :jobname ];\r\ + \n\r\ + \n:global dnsLookupReady false;\r\ + \n:if ([:typeof \$dnsLookupReady] != \"boolean\") do={ :set dnsLookupReady\ + \_true; }\r\ + \nwhile (!\$dnsLookupReady) do={ :nothing; }\r\ + \n:set dnsLookupReady false;\r\ + \n\r\ + \n:local arrRKN {\r\ + \n \"telegra.ph\"\r\ + \n \"grani.ru\"\r\ + \n \"xhamster.com\"\r\ + \n \"lostfilm.tv\"\r\ + \n \"rutracker.org\"\r\ + \n \"lurkmore.to\"\r\ + \n \"dou.ua\"\r\ + \n \"youporn.com\"\r\ + \n \"pornolab.net\"\r\ + \n \"crimerussia.com\"\r\ + \n \"telegram.org\"\r\ + \n \"api.telegram.org\"\r\ + \n \"facebook.com\"\r\ + \n \"instagram.com\"\r\ + \n \"x.com\"\r\ + \n \"twitter.com\"\r\ + \n \"youtube.com\"\r\ + \n \"googleapis.com\"\r\ + \n \"youtu.be\"\r\ + \n \"googlevideo.com\"\r\ + \n \"gstatic.com\"\r\ + \n \"googleusercontent.com\"\r\ + \n \"nhacmp3youtube.com\"\r\ + \n \"telegram.me\"\r\ + \n \"t.me\";}\r\ + \n\r\ + \n:local ListRKN \"RKN-dnsLookup\";\r\ + \n:local ListComment (\"ListRKN managed by \" . \$ScriptName);\r\ + \n:foreach aListItem in=[/ip/firewall/address-list find list=\$ListRKN] do\ + ={\r\ + \n /ip firewall address-list remove \$aListItem;\r\ + \n}\r\ + \n:foreach aItem in=\$arrRKN do={\r\ + \n# :do {\r\ + \n :retry delay=500ms max=5 on-error={:log error \"dns resolve fail\ + ure [ \$aItem - resolve ip ]\"} command={:resolve \$aItem}\r\ + \n# } on-error={\r\ + \n# :log error \"dns resolve failure [ \$arItem - resolve ip ]\";\r\ + \n# }\r\ + \n :foreach dnsRecord in=[/ip dns cache all find where (name=\$aItem)] \ + do={\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"A\") do={\r\ + \n :local newAddress [/ip dns cache all get \$dnsRecord data];\ + \r\ + \n :do {\r\ + \n /ip firewall address-list add list=\$ListRKN address=\$newA\ + ddress comment=\$aItem;\r\ + \n :log warning \"Successfully adding ip to list A record: \ + \$dnsRecord, address: \$newAddress domain: \$aItem\";\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list A record: \$dn\ + sRecord, address: \$newAddress domain: \$aItem\";\r\ + \n }\r\ + \n }\r\ + \n :if ([/ip dns cache all get \$dnsRecord type]=\"CNAME\") do={\r\ + \n :local cname;\r\ + \n :local nextCname;\r\ + \n :local cnameAddress;\r\ + \n :set cname [/ip dns cache all find where (name=\$aItem && ty\ + pe=\"CNAME\")];\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip dns \ + cache all get \$cname data] && type=\"CNAME\")];\r\ + \n :while (\$nextCname != \"\") do={\r\ + \n :set cname \$nextCname;\r\ + \n :set nextCname [/ip dns cache all find where (name=[/ip \ + dns cache all get \$cname data] && type=\"CNAME\")];\r\ + \n }\r\ + \n :foreach aRecord in=[/ip dns cache all find where (name=[/ip\ + \_dns cache all get \$cname data] && type=\"A\")] do={\r\ + \n :do {\r\ + \n :set cnameAddress [/ip dns cache all get \$aRecord d\ + ata];\r\ + \n /ip firewall address-list add list=\$ListRKN address\ + =\$cnameAddress comment=\$aItem;\r\ + \n :log warning \"Succesfully adding ip to list CNAME r\ + ecord: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \ + \$aItem.\";\r\ + \n# /ip firewall raw add action=add-dst-to-address-list\ + \_address-list=\$ListRKN address-list-timeout=none-dynamic chain=preroutin\ + g comment=\$aItem content=\$aItem;\r\ + \n } on-error={\r\ + \n :log error \"error when adding ip to list CNAME reco\ + rd: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \$aI\ + tem.\";\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n :log error (\$ScriptName . \"System Scheduler for script: \" . \$Scri\ + ptName . \" is NOT SET! Fix It Now!\");\r\ + \n /system/scheduler/add name=\$ScriptName on-event=\"/system/script { \ + run \$ScriptName; }\" comment=\"Update RKN DNS Looup\" interval=00:30:00 p\ + olicy=\"ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon\"\ + \_start-time=startup;\r\ + \n }\r\ + \n:set dnsLookupReady true;\r\ + \ndelay 2s; \r\ + \n:global dnsLookupReady (a);\r\ + \n" +add dont-require-permissions=no name="renameLists " owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local oldName \"Test\";\ + \n:local newName \"Test-IP\";\ + \n/ip firewall address-list\ + \n:foreach i in=[find list=\$oldName] do={\ + \nset \$i list=\$newName;\ + \n}\ + \n" +add dont-require-permissions=no name=IPv6-Settings owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + #############Script Settings##################\ + \n\ + \n:local \"IF-TUN\" \"6to4-tun\"\ + \n:local \"IF-LOC\" \"Bridge-LAN\"\ + \n:local \"POOL-6TO4\" \"poolV6-local\"\ + \n:local \"force-update\" false\ + \n############ use then static ip #######################\ + \n:local \"lease-address\" [/ip address get [find interface=\$\"IF-LOC\"] \ + address]\ + \n#:local \"interface\" \"ext\"\ + \n:local bound 0\ + \n\ + \n###############################################\ + \n\ + \n:local 6to4prefix do={\ + \n :global dec2hex\ + \n :local ipv4 \$1\ + \n :local ipv6 \"2002:\"\ + \n :for i from=0 to=2 step=1 do={ \ + \n :if ( \$i = 2) do={\ + \n :set ipv6 (\$ipv6.\":\")\ + \n }\ + \n :local fp [:find \$ipv4 \".\"]\ + \n :if ( \$fp > 0 ) do={\ + \n :set ipv6 (\$ipv6.[\$dec2hex [:pick \$ipv4 0 \$fp]])\ + \n :set ipv4 [:pick \$ipv4 (\$fp + 1 ) [:len \$ipv4]]\ + \n }\ + \n }\ + \n :return (\$ipv6.[\$dec2hex \$ipv4])\ + \n}\ + \n:local \"str_replace\" do={\ + \n :local \"str-pos\" [:find \$1 \$2]\ + \n :local \"str-len\" [:len \$2]\ + \n :local str \"\"\ + \n :local rest \$1\ + \n :while (\$\"str-pos\" >= 0) do={\ + \n :local t [:pick \$rest 0 \$\"str-pos\"]\ + \n :if ( \$4 > 0 ) do={\ + \n :for i from=1 to=(\$4 - [:len \$t]) step=1 do={\ + \n :set str (\$str.\$5)\ + \n }\ + \n }\ + \n :set str (\$str.\$t.\$3)\ + \n :set rest [:pick \$rest (\$\"str-pos\"+\$\"str-len\") [:len \$re\ + st]]\ + \n :set \"str-pos\" [:find \$rest \$2]\ + \n }\ + \n :return (\$str.\$rest)\ + \n}\ + \n\ + \n:if (\$bound=1) do={\ + \n :local t [:find \$\"lease-address\" \"/\"]\ + \n\ + \n :if ( \$t >= 0 ) do={\ + \n :set \"lease-address\" [:pick \$\"lease-address\" 0 \$t]\ + \n }\ + \n\ + \n :if ( [/interface 6to4 print count-only where name=\$\"IF-TUN\"] = 0\ + ) do={\ + \n /interface 6to4 add !keepalive local-address=\$\"lease-address\"\ + \_mtu=1280 name=\$\"IF-TUN\" remote-address=10.30.30.0\ + \n :set \"force-update\" true\ + \n }\ + \n\ + \n :local \"IPv4-TUN\" [/interface 6to4 get [find name=\$\"IF-TUN\"] lo\ + cal-address];\ + \n\ + \n :if ( \$\"lease-address\" != \$\"IPv4-TUN\" || \$\"force-update\" = \ + true) do={\ + \n /interface 6to4 set [find name=\$\"IF-TUN\"] local-address=\$\"l\ + ease-address\"\ + \n /ipv6 address remove [find interface=\$\"IF-TUN\"]\ + \n /ipv6 address remove [find interface=\$\"IF-LOC\"]\ + \n /ipv6 route remove [find gateway ~ \$\"IF-TUN\" and dst-address=\ + \"::/0\"]\ + \n :local \"pool-prefix\" [\$6to4prefix \$\"lease-address\"]\ + \n :if ( [/ipv6 pool print count-only where name=\$\"POOL-6TO4\"] =\ + \_0) do={ \ + \n /ipv6 pool add name=\$\"POOL-6TO4\" prefix=(\$\"pool-prefix\ + \".\":1::/64\") prefix-length=64\ + \n } else={\ + \n /ipv6 pool set [/ipv6 pool find where name=\$\"POOL-6TO4\"] \ + prefix=(\$\"pool-prefix\".\":1::/64\")\ + \n }\ + \n /ipv6 address add address=(\$\"pool-prefix\".\"::\".[\$MAC2EUI64\ + \_[/interface get [find name=\$\"interface\"] mac-address]].\"/3\") interf\ + ace=\$\"IF-TUN\" advertise=no\ + \n /ipv6 address add eui-64=yes from-pool=\$\"POOL-6TO4\" interface\ + =\$\"IF-LOC\" advertise=yes\ + \n /ipv6 route add dst-address=::/0 gateway=(\"::10.30.30.81%\".\$\ + \"IF-TUN\")\ + \n :local t [/ipv6 address get [find interface=\$\"IF-LOC\"] addres\ + s]\ + \n :set t [:pick \$t 0 [:find \$t \"/\"]]\ + \n :if ( [/ipv6 dhcp-server option print count-only where name=DNS]\ + \_= 0) do={\ + \n /ipv6 dhcp-server option add code=23 name=DNS value=(\"0x\".\ + [\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n } else={\ + \n /ipv6 dhcp-server option set [/ipv6 dhcp-server option find \ + where name=DNS] value=(\"0x\".[\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ + \n }\ + \n :if ( [/ipv6 dhcp-server print count-only where interface=\$\"IF\ + -LOC\"] = 0) do={\ + \n /ipv6 dhcp-server add address-pool=\$\"POOL-6TO4\" dhcp-opti\ + on=DNS interface=\$\"IF-LOC\" lease-time=1d name=\$\"IF-LOC\"\ + \n }\ + \n :if ( [ipv6 nd print count-only where interface=\$\"IF-LOC\"] = \ + 0) do={\ + \n /ipv6 nd add advertise-dns=no interface=\$\"IF-LOC\" other-c\ + onfiguration=yes\ + \n }\ + \n }\ + \n}" +add dont-require-permissions=no name=IPv6-GlobalFunc owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + global MAC2EUI64 do={\ + \n :local EUI64 \"\"\ + \n :local MAC \$1\ + \n :local HEX2DEC \"0123456789ABCDEF\"\ + \n :for i from=0 to=5 step=1 do={\ + \n :if ( \$i = 0 ) do={\ + \n :set EUI64 [:pick \$MAC 0]\ + \n :set EUI64 (\$EUI64.[:tostr [:pick \$\"HEX2DEC\" ([:find \$\ + \"HEX2DEC\" [:pick \$MAC 1]] ^ 2)]])\ + \n }\ + \n :if ( \$i = 1 || \$i = 3) do={\ + \n :set EUI64 (\$EUI64.\":\")\ + \n }\ + \n :if ( \$i = 2 ) do={\ + \n :set EUI64 (\$EUI64.\"FF:FE\")\ + \n }\ + \n :if ( [:find \$MAC \":\"] = 2 ) do={\ + \n :set MAC [:pick \$MAC 3 [:len \$MAC]]\ + \n :set EUI64 (\$EUI64.[:pick \$MAC 0 2])\ + \n }\ + \n }\ + \n :return (\$EUI64)\ + \n}\ + \n\ + \n:global dec2hex do={\ + \n :local hex \"\"\ + \n :local dec [:tonum \$1]\ + \n :for i from=0 to=4 step=4 do={\ + \n :set hex ([:pick \"0123456789ABCDEF\" ((\$dec>>\$i)&0xf) (((\$de\ + c>>\$i)&0xf)+1)].\$hex)\ + \n }\ + \n :return ([:tostr \$hex])\ + \n}" +/user group +add name=backup policy="ssh,read,write,policy,test,web,sniff,sensitive,api,res\ + t-api,!local,!telnet,!ftp,!reboot,!winbox,!password,!romon" +/ip smb +set enabled=no interfaces=lo +/interface bridge port +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether4 trusted=yes +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/interface bridge settings +set use-ip-firewall=yes +/ip firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN lldp-med=no lldp-poe-power=no +/ip settings +set accept-redirects=yes ipv4-multipath-hash-policy=l4 max-neighbor-entries=\ + 8192 +/ipv6 settings +set disable-ipv6=yes disable-link-local-address=yes forward=no \ + max-neighbor-entries=8192 multipath-hash-policy=l4 +/interface detect-internet +set detect-interface-list=WAN 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 disabled=yes 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:2 dhcp-options=clientid,clientid_duid \ + interface="ether1 - Unet" name=client1 use-peer-dns=no use-peer-ntp=no +/ip dhcp-server config +set accounting=no +/ip dhcp-server lease +add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ + 48:8F:5A:8E:EE:A8 server=masterDHCP +add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ + F0:DE:F1:91:0D:1E server=masterDHCP +add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ + 00:80:77:EC:43:86 server=masterDHCP +add address=10.30.30.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,109.107.177.79 \ + 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" \ + disabled=yes 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 +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 disabled=yes +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-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=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 +#error exporting "/snmp/community" (timeout) +/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 +#error exporting "/system/routerboard/settings" (timeout) +/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..d101469 --- /dev/null +++ b/MikroMaster/tmp/Diff-Config.rsc @@ -0,0 +1,4 @@ +3613d3612 +< #error exporting "/snmp/community" (timeout) +3635d3633 +< #error exporting "/system/routerboard/settings" (timeout) diff --git a/MikroNUC/20260701/20260701004001-Binary.backup b/MikroNUC/20260701/20260701004001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..488055ddf079875b71940acb9c689761a7482f96 GIT binary patch literal 366465 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

$I7!nwU1R>+d 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%0DLPd);>@bx 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 literal 0 HcmV?d00001 diff --git a/MikroNUC/20260701/20260701004001-Config.rsc b/MikroNUC/20260701/20260701004001-Config.rsc new file mode 100644 index 0000000..244534f --- /dev/null +++ b/MikroNUC/20260701/20260701004001-Config.rsc @@ -0,0 +1,5011 @@ +# 2026-07-01 00: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=Bridge-LAN +/interface ethernet +set [ find default-name=ether1 ] disable-running-check=no +/interface veth +add address=172.20.0.2/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ + gateway=172.20.0.1 gateway6="" name=veth-awg2wg +/interface wireguard +add disabled=yes listen-port=12430 mtu=1360 name=wg-awg2wg +/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 +/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" +/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=Bridge-LAN +/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 +/ip smb +set enabled=no +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=*104 +add bridge=Bridge-LAN interface=*103 +add bridge=Bridge-LAN interface=5G-MikroGig-1 +add bridge=*107 interface=*108 +add bridge=*109 interface=*10A +add bridge=*10C interface=*10D +add bridge=*10E interface=*10F +add bridge=*110 interface=*111 +add bridge=*112 interface=*113 +add bridge=*114 interface=*115 +add bridge=*116 interface=*117 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes +/interface detect-internet +set detect-interface-list=WAN internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +add interface=ether1 list=WAN +/interface wifi cap +set discovery-interfaces=*DF +/interface wifi capsman +set package-path=/tmpfs/capsman-packages upgrade-policy=none +/interface wireguard peers +add allowed-address=0.0.0.0/0,::/0 endpoint-address=172.20.0.2 endpoint-port=\ + 51820 interface=wg-awg2wg name=awg2wg persistent-keepalive=45s \ + public-key="o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +/ip address +add address=10.30.30.10/24 interface=ether1 network=10.30.30.0 +add address=172.20.0.1/30 interface=veth-awg2wg network=172.20.0.0 +add address=10.9.0.3 interface=wg-awg2wg network=10.9.0.3 +/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 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=1 dst-address=0.0.0.0/0 gateway=\ + 10.30.30.81 routing-table=main scope=30 target-scope=10 +add comment=Monitor-AWG2WG distance=1 dst-address=9.9.9.9/32 gateway=\ + wg-awg2wg +/ip service +set ftp disabled=yes +set telnet 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 +/tool netwatch +add disabled=yes down-script=\ + ":local msg \"Host MikroYellow is DOWN\";\r\ + \n\$TGSendMessage \$msg;" host=10.30.30.86 http-codes="" interval=10s \ + test-script="" type=simple up-script=\ + ":global TGSendMessage;\r\ + \n\$TGSendMessage \"Host MikroYellow is UP\";" +add comment=Monitor-AWG2WG down-script=\ + "/ip route disable [find comment=\"Route-AWG2WG\"]" host=9.9.9.9 \ + interval=10s packet-count=5 thr-avg=0ms thr-loss-count=4 timeout=5s type=\ + icmp up-script="/ip route enable [find comment=\"Route-AWG2WG\"]" +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260701/20260701004001-Diff-Config.rsc b/MikroNUC/history/20260701/20260701004001-Diff-Config.rsc new file mode 100644 index 0000000..b3ffed1 --- /dev/null +++ b/MikroNUC/history/20260701/20260701004001-Diff-Config.rsc @@ -0,0 +1,43 @@ +823c823 +< \n:global CommitId \"main/729/f42d43ae\";\r\ +--- +> \n:global CommitId \"main/700/f14f095d\";\r\ +826c826 +< r: root, in 00:05:03 01.07.2026.\";\r\ +--- +> r: root, in 13:30:03 22.06.2026.\";\r\ +4765,4793c4765,4768 +< 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" +--- +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ +> local image \"https://ros.vados.ru/amneziawg/img/awg-proxy-amd64-7.20-Dock\ +> er.tar.gz\";\ +> \n:global " -- 2.52.0