From b407507014bff3f163292f9977dc14717850fc2e Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 3 Jul 2026 04:40:03 +0300 Subject: [PATCH] Backup for MikroNUC created successfully at Jul 03 04:40:03. --- .../20260703/20260703024003-Config.rsc | 93 + MikroMaster/tmp/Diff-Config.rsc | 3618 +++++++++++ .../20260703/20260703044001-Binary.backup | Bin 0 -> 381538 bytes MikroNUC/20260703/20260703044001-Config.rsc | 5424 +++++++++++++++++ .../20260703/20260703044001-Diff-Config.rsc | 60 + 5 files changed, 9195 insertions(+) create mode 100644 MikroMaster/20260703/20260703024003-Config.rsc create mode 100644 MikroMaster/tmp/Diff-Config.rsc create mode 100644 MikroNUC/20260703/20260703044001-Binary.backup create mode 100644 MikroNUC/20260703/20260703044001-Config.rsc create mode 100644 MikroNUC/history/20260703/20260703044001-Diff-Config.rsc diff --git a/MikroMaster/20260703/20260703024003-Config.rsc b/MikroMaster/20260703/20260703024003-Config.rsc new file mode 100644 index 0000000..f1ea2d1 --- /dev/null +++ b/MikroMaster/20260703/20260703024003-Config.rsc @@ -0,0 +1,93 @@ +# 2026-07-03 02:40:11 by RouterOS 7.23.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BF auto-mac=no dhcpv6-agent-circuit-id=\ + "\$(INTERFACE):\$(VID)" dhcpv6-agent-remote-id="\$(BRIDGEMAC)" name=\ + Bridge-LAN port-cost-mode=short +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" loop-protect=off name=\ + "ether1 - Unet" rx-flow-control=auto tx-flow-control=auto +set [ find default-name=ether2 ] comment=LAN-2 +set [ find default-name=ether3 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-3 +set [ find default-name=ether4 ] comment=LAN-4 +set [ find default-name=ether5 ] advertise="10M-baseT-half,10M-baseT-full,100M\ + -baseT-half,100M-baseT-full,1G-baseT-full,1G-baseX" comment=LAN-5 \ + loop-protect=on poe-out=off rx-flow-control=auto tx-flow-control=auto +/interface wireless +# managed by CAPsMAN +# channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados wireless-protocol=802.11 +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] country=belarus disabled=no mode=ap-bridge \ + ssid=vados5g wireless-protocol=802.11 +/interface wireguard +add comment=WG listen-port=13231 mtu=1320 name=WG +/interface list +add include=static name=LAN +add name=Internet +add include=Internet name=WAN +#error exporting "/queue/interface" (timeout) +#error exporting "/interface/wireless/security-profiles" (timeout) +/iot wiliot servers +set *1 address=mqtt.us-east-2.prod.wiliot.cloud name="Wiliot US East" +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +add name=iVados options=HostName +/ip dns forwarders +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=blsp.at verify-doh-cert=no +add comment=Kra disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon2.to \ + verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=\ + no +add disabled=yes dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +#error exporting "/ip/ipsec/policy/group" (timeout) +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ipv6 dhcp-client option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=DUID value=0x00030001488f5a8e1abc +add code=61 name=clientid +/ipv6 dhcp-server option +add code=119 name=domain-search-list value="0x03'WORKGROUP'0x00" +add code=12 name=HostName value="\$(HOSTNAME)" +add code=61 name=CLIENT_DUID +add code=61 name=CLIENT_MAC +#error exporting "/ppp/profile" (timeout) +#error exporting "/routing/bgp/instance" (timeout) +/routing bgp template diff --git a/MikroMaster/tmp/Diff-Config.rsc b/MikroMaster/tmp/Diff-Config.rsc new file mode 100644 index 0000000..9da7771 --- /dev/null +++ b/MikroMaster/tmp/Diff-Config.rsc @@ -0,0 +1,3618 @@ +35,36c35,37 +< #error exporting "/queue/interface" (timeout) +< #error exporting "/interface/wireless/security-profiles" (timeout) +--- +> /interface wireless security-profiles +> set [ find default=yes ] authentication-types=wpa-psk,wpa2-psk mode=\ +> dynamic-keys supplicant-identity=MikroTik +69d69 +< #error exporting "/ip/ipsec/policy/group" (timeout) +91,92c91,92 +< #error exporting "/ppp/profile" (timeout) +< #error exporting "/routing/bgp/instance" (timeout) +--- +> /ppp profile +> set *FFFFFFFE use-upnp=no +93a94,3695 +> set default disabled=no output.network=bgp-networks +> /routing table +> add disabled=no fib name=To-VPN +> /system logging action +> add email-start-tls=yes email-to=vados@vados.ru name=email target=email +> /system script +> add dont-require-permissions=no name=fetchCustom owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ +> global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +> \n\r\ +> \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ +> 0.30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ +> \n\r\ +> \n#:local Script AM-setup\ +> \n;\r\ +> \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ +> heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ +> sc\") output=user as-value ]->\"data\");\r\ +> \n\ +> \n#/usb1/mikro_bak_rsa.pub\ +> \n\ +> \n\r\ +> \n#\ +> \n\r\ +> \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ +> 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ +> \n\r\ +> \n#\r\ +> \n\ +> \n#root.mnuc.backuper\ +> \n\ +> \n\r\ +> \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ +> .30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\r\ +> \n\ +> \n#:local Script AM-GlobalConfig;\ +> \n\r\ +> \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ +> heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ +> sc\") output=user as-value ]->\"data\");\r\ +> \n\ +> \n#/usb1/mikro_bak_rsa.pub\ +> \n#:local FetchFile AM-DOHCert.rsc\ +> \n\ +> \n\r\ +> \n\r\ +> \n#\ +> \n:global MkDir;\ +> \n\r\ +> \n\ +> \n#:local FetchFile Binary.backup\ +> \n:local localDir \"\";\ +> \n\ +> \n\r\ +> \n#\$MkDir \$localDir;\r\ +> \n\ +> \n#\ +> \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ +> \$localDir . \$FetchFile);\r\ +> \n" +> add comment="Global Config Script" dont-require-permissions=no name=\ +> AM-GlobalConfig owner=AM-GlobalConfig policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +> !rsc by Vados\r\ +> \n# RouterOS script: AM-GlobalConfig\r\ +> \n# Script comment: Global Config Script\r\ +> \n# Copyright (c) 2007-2026 Vados \r\ +> \n#\r\ +> \n#\r\ +> \n# Warning: Dont touch this line!\r\ +> \n:global Identity [/system/identity/get name];\r\ +> \n:global GlobalConfReady false;\r\ +> \n#\r\ +> \n#\r\ +> \n# Global Url For Amster scripts to fetch\r\ +> \n# most be defined in AM-Init-Script or AM-setup scripts\r\ +> \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +> \n:global ScriptsUrlSuffix (a);\r\ +> \n:global CheckSumsVerify true;\r\ +> \n\r\ +> \n:global ScriptUpdatesCRLF true;\r\ +> \n:global CommentsInScripts true;\r\ +> \n\r\ +> \n# Debug output:\r\ +> \n:global PrintDebug true; #false;\r\ +> \n\r\ +> \n# Debug output for specific script:\r\ +> \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ +> \n\r\ +> \n# Debug logs\r\ +> \n# Other actions (disk, email, remote or support) can be used as well.\r\ +> \n# I do not recommend using echo - use debug output instead (https://rsc.\ +> eworm.de/main/DEBUG.html#debug-output).\r\ +> \n#/system/logging/add topics=script,debug action=memory;\r\ +> \n\r\ +> \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ +> \n:global Domain \"WORKGROUP\";\r\ +> \n\r\ +> \n:global EmailGeneralTo \"vados@vados.ru\";\r\ +> \n#:global EmailGeneralCc \"\";\r\ +> \n\r\ +> \n# \$ScriptInstallUpdate mod/notification-telegram\r\ +> \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ +> \";\r\ +> \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ +> \n# Use this to send notifications to a specific topic in group.\r\ +> \n#:global TelegramThreadId \"30\";\r\ +> \n# Using telegram-chat you have to define trusted chat ids (not group ids\ +> !)\r\ +> \n# or user names. Groups allow to chat with devices simultaneously.\r\ +> \n:global TelegramChatIdsTrusted {\r\ +> \n \"454403445\"\r\ +> \n \"-1003631309063\"\r\ +> \n \"-5124482807\"\r\ +> \n \"1087968824\";\r\ +> \n};\r\ +> \n# \"-5294757340\";\r\ +> \n\r\ +> \n:global TelegramChatGroups \"(all)\";\r\ +> \n#:global TelegramChatGroups \"(all|home|office)\";\r\ +> \n\r\ +> \n:global NotificationFunctions {\r\ +> \n \"email\"\r\ +> \n \"telegram\";\r\ +> \n};\r\ +> \n# Toggle this to disable symbols in notifications.\r\ +> \n:global NotificationsWithSymbols true;\r\ +> \n:global TerminalColorOutput true;\r\ +> \n\r\ +> \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ +> \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ +> \n\r\ +> \n## Update channel. Possible values: stable, long-term, testing, developm\ +> ent\r\ +> \n:global updateChannel \"stable\";\r\ +> \n\r\ +> \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ +> \");\r\ +> \n:global CertRenewTime 2w;\r\ +> \n:global CertRenewPass (a); #{\r\ +> \n# \"\";\r\ +> \n# \"v3ry-s3cr3t\";\r\ +> \n# \"4n0th3r-s3cr3t\";\r\ +> \n#};\r\ +> \n:global CertWarnTime 1w;\r\ +> \n:global CertIssuedExportPass (a); # {\r\ +> \n# \"\";\r\ +> \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ +> \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ +> \n#};\r\ +> \n\r\ +> \n# Script BackupAndUpdate mode, possible values: backup,\r\ +> \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ +> n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ +> \n# osupdate - Update if available and creates backups before/after update\ +> \_(ignores `forceBackup`)\r\ +> \n# Set `forceBackup` to true to always create backups, even\ +> \_without updates\r\ +> \n# osnotify - Set `forceBackup` to always create backups on every run\r\ +> \n:global DevInfoIncludeIP true;\r\ +> \n:global BackupAndUpdateMode \"osnotify\"\r\ +> \n\r\ +> \n:global forceBackup true;\r\ +> \n:global BackupPassword \"Peskar55\";\r\ +> \n\r\ +> \n# SFTP Backup Variables\r\ +> \n:global BackupRandomDelay 0;\r\ +> \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ +> \n:global BackupUploadUser \$Identity;\r\ +> \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ +> \n\r\ +> \n:global BackupSendBinary true;\r\ +> \n:global BackupSendExport true;\r\ +> \n:global BackupSendGlobalConfig true;\r\ +> \n:global BackupSendScripts true;\r\ +> \n\r\ +> \n# Remove local file after uploading if no errors\r\ +> \n:global BackupRmLocal true;\r\ +> \n\r\ +> \n# Local Backups Root Directory \r\ +> \n:global BackupLocalRoot \"tmpfs\";\r\ +> \n\r\ +> \n# Encrypt Backup\r\ +> \n:global BackupEncrypt true;\r\ +> \n\r\ +> \n# Sensitive information in Backups\r\ +> \n:global BackupSens true;\r\ +> \n\r\ +> \n# User Export\r\ +> \n:global BackupUser true;\r\ +> \n\r\ +> \n# License Export (not for CHR, will silently skip)\r\ +> \n:global BackupLicense false;\r\ +> \n\r\ +> \n# SSH Keys\r\ +> \n:global BackupSshKeys true;\r\ +> \n\r\ +> \n# Certificate Export\r\ +> \n:global BackupCerts true;\r\ +> \n\r\ +> \n# Certificate Password\r\ +> \n:global BackupCertsPasswd \"\";\r\ +> \n\r\ +> \n# User-Manager Export\r\ +> \n:global BackupUserMan false;\r\ +> \n\r\ +> \n# The Dude Export\r\ +> \n:global BackupDude false;\r\ +> \n\r\ +> \n# User Files to export, comma-separated string or array of strings\r\ +> \n# User Files are not removed on backup\r\ +> \n# Any directory paths will be removed (/ -> _) on remote file\r\ +> \n# Nonpresent files are silently skipped\r\ +> \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ +> \n\r\ +> \n# load functions and any custom scripts\r\ +> \n# [ /system/script/find where name=\"global-config-ov\ +> erlay\" ], \\\r\ +> \n# [ /system/script/find where name~\"^global-config-o\ +> verlay\\\\.d/.\" ]\r\ +> \n#\r\ +> \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ +> ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ +> \r\ +> \n# :onerror Err {\r\ +> \n# /system/script/run \$Script;\r\ +> \n# } do={\r\ +> \n# :log error (\"Loading configuration from configs and functions\"\ +> \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ +> \n# }\r\ +> \n#}\r\ +> \n#:log info \"\\ndevMode = \$devMode\";\r\ +> \n#:log info \"\\ndevRunning = \$devRunning\";\r\ +> \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ +> GlobalRUN\\r\?\\n\" ] do={\r\ +> \n :onerror Err {\r\ +> \n /system/script/run \$Script;\r\ +> \n } do={\r\ +> \n :log error (\"Run script \" . [ /system/script/get \$Script name \ +> ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n# signal we are ready\r\ +> \n:set GlobalConfReady true;\r\ +> \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ +> \n" +> add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ +> owner=AM-GlobalFunc policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +> !rsc by Vados\r\ +> \n# RouterOS script: AM-GglobalFunc\r\ +> \n# Script comment: Global functions\r\ +> \n# Copyright (c) 2005-2026 Vados \r\ +> \n#\r\ +> \n#\r\ +> \n# requires RouterOS, version=7.19\r\ +> \n# requires device-mode, fetch, scheduler\r\ +> \n:local ExitOK false;\r\ +> \n:local ScriptName [ :jobname ];\r\ +> \n#:global checkRunJob \$SriptName;\r\ +> \n#:global fixCRLF;\r\ +> \n#:if (\$fixCRLF != false) do={\r\ +> \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ +> ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ +> }\r\ +> \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ +> et \$fixScript source ] ] \$fixScript};};\r\ +> \n#}\r\ +> \n:global GlobalFuncReady false;\r\ +> \n\r\ +> \n# Git commit id & info, expected configuration version\r\ +> \n:global CommitId \"main/727/203f86a6\";\r\ +> \n:global CommitTAG \"unknown\";\r\ +> \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ +> r: root, in 13:30:05 29.06.2026.\";\r\ +> \n\r\ +> \n# The variables are received right here.\r\ +> \n:global GlobalConfVersion 140;\r\ +> \n\r\ +> \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ +> \n\r\ +> \n:global Identity [/system/identity/get name];\r\ +> \n:global IdentityShort [:pick \$Identity 0 18];\r\ +> \n\r\ +> \n:global devBoardName [/system/resource/get board-name];\r\ +> \n:global devMode [/system/device-mode/get mode];\r\ +> \n:global devCurArch [/system/resource/get architecture-name];\r\ +> \n:global devCurVersion [/system/resource/get version];\r\ +> \n\r\ +> \n# Variables defined in AM-GlobalConfig.rsc\r\ +> \n:global TerminalColorOutput;\r\ +> \n:global CommentsInScripts;\r\ +> \n:global DetectIpAddrDefault;\r\ +> \n:global DetectIpAddrFallback;\r\ +> \n:global updateChannel;\r\ +> \n:global Domain;\r\ +> \n:global EmailGeneralTo;\r\ +> \n:global BackupAndUpdateMode;\r\ +> \n\r\ +> \n# Single functions, without nested functions.\r\ +> \n:global MiniDateTimeStamp;\r\ +> \n:global MicroDateTimeStamp;\r\ +> \n\r\ +> \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ +> \n:global LogPrint;\r\ +> \n\r\ +> \n# DeviceInfo and Updates\r\ +> \n:global IsCheckUpdates;\r\ +> \n:global WaitCheckUpdates;\r\ +> \n:global GetPubIp;\r\ +> \n\r\ +> \n:global GetArrDeviceInfo;\r\ +> \n:global WaitArrDeviceInfo;\r\ +> \n\r\ +> \n:global devModel;\r\ +> \n:global devRunningMode;\r\ +> \n\r\ +> \n:global devRbRevision;\r\ +> \n:global devRbSerialNumber;\r\ +> \n:global devRbVerAvail;\r\ +> \n\r\ +> \n:global runningChannelVersion;\r\ +> \n:global runningChannel;\r\ +> \n:global runningVersion;\r\ +> \n\r\ +> \n:global devBuildTime;\r\ +> \n:global ROsVerAvail;\r\ +> \n:global PkgUpdStatus;\r\ +> \n:global currentUpdateChannel;\r\ +> \n\r\ +> \n:global ScriptInstallUpdate;\r\ +> \n\r\ +> \n:global DeviceInfo;\r\ +> \n\r\ +> \n:global OldMode;\r\ +> \n\r\ +> \n:global ParseKeyValueStore;\r\ +> \n:global RandomDelay;\r\ +> \n:global GetRandomNumber;\r\ +> \n:global EscapeForRegEx;\r\ +> \n:global CharacterMultiply;\r\ +> \n:global CharacterReplace;\r\ +> \n:global CleanFilePath;\r\ +> \n:global CleanName;\r\ +> \n\r\ +> \n:global CommitBrief;\r\ +> \n\r\ +> \n:global EitherOr;\r\ +> \n:global FormatLine;\r\ +> \n:global GetRandom20CharAlNum;\r\ +> \n:global GetRandom20CharHex;\r\ +> \n:global GetRandomNumber;\r\ +> \n:global Grep;\r\ +> \n:global IfThenElse;\r\ +> \n:global MAX;\r\ +> \n:global MIN;\r\ +> \n:global HumanReadableNum;\r\ +> \n\r\ +> \n:global IsFullyConnected;\r\ +> \n:global IsDNSResolving;\r\ +> \n:global IsTimeSync;\r\ +> \n:global IsTimeSyncCached;\r\ +> \n:global IsTimeSyncResetNtp;\r\ +> \n\r\ +> \n:global MkDir;\r\ +> \n:global RmDir;\r\ +> \n:global RmFile;\r\ +> \n:global FileGet;\r\ +> \n:global Unix2Dos;\r\ +> \n:global UrlEncode;\r\ +> \n:global WaitForFile;\r\ +> \n:global ScriptLock;\r\ +> \n:global SendTelegram;\r\ +> \n:global NotificationFunctions;\r\ +> \n:global SendNotification;\r\ +> \n:global SendNotification2;\r\ +> \n:global SymbolForNotification;\r\ +> \n:global SymbolByUnicodeName;\r\ +> \n:global ValidateSyntax;\r\ +> \n:global CheckSumsVerify;\r\ +> \n:global GlobalConfChanges;\r\ +> \n:global GlobalConfMigration;\r\ +> \n:global VersionToNum;\r\ +> \n:global RequiredRouterOS;\r\ +> \n:global ExitError;\r\ +> \n:global ExitOnError;\r\ +> \n\r\ +> \n:global FetchHugeFiles;\r\ +> \n:global FetchUserAgentStr;\r\ +> \n:global FileExists;\r\ +> \n:global CertificateAvailable;\r\ +> \n:global CertificateDownload;\r\ +> \n:global CertificateNameByCN;\r\ +> \n:global CharacterMultiply;\r\ +> \n\r\ +> \n:global InspectVar;\r\ +> \n:global InspectVarRet;\r\ +> \n:global ParseCustom;\r\ +> \n\r\ +> \n:set IsCheckUpdates do={\r\ +> \n :local isInfo [:tobool \$1];\r\ +> \n :global updateChannel;\r\ +> \n :global PkgUpdStatus;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n :global arrDeviceInfo;\r\ +> \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ +> \n :local CurrentChannel [ /system/package/update/get channel ];\r\ +> \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ +> el) do={\r\ +> \n :retry command={/system/package/update set channel=\$updateChannel} \ +> \_delay=300ms max=5 on-error={};\r\ +> \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ +> \n }\r\ +> \n :local Update [ /system/package/update/get ];\r\ +> \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set currentUpdateChannel \$Channel;\r\ +> \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ +> \n :local StatusPkg \"undefined\";\r\ +> \n :log info (\$0 . \" Checking for updates...\");\r\ +> \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ +> dates without-paging as-value]->\"status\")} \\\r\ +> \n delay=300ms max=5 on-error={};\r\ +> \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ +> \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ +> s true; } else={ :set PkgUpdStatus false; }\r\ +> \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ +> ] ];\r\ +> \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +> \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ +> \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +> \n }\r\ +> \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ +> kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ +> \n :return true;\r\ +> \n } else={\r\ +> \n :return \$PkgUpdStatus;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitCheckUpdates do={\r\ +> \n :global IsCheckUpdates;\r\ +> \n :global PkgUpdStatus;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n :global arrDeviceInfo;\r\ +> \n :local Status \"\";\r\ +> \n :local Update;\r\ +> \n :local WaitCount 0;\r\ +> \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +> \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ +> \") && \$WaitCount < 60) do={\r\ +> \n :delay 1s;\r\ +> \n :set WaitCount (\$WaitCount + 1);\r\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +> \n }\r\ +> \n :set Update [ /system/package/update/get ];\r\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +> \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ +> \n :set PkgUpdStatus true;\r\ +> \n } else={\r\ +> \n :set PkgUpdStatus false;\r\ +> \n }\r\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +> \n }\r\ +> \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ +> \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ +> do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitArrDeviceInfo do={\r\ +> \n :global GetArrDeviceInfo;\r\ +> \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ +> \n :delay 1s;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set GetArrDeviceInfo do={\r\ +> \n :global LogPrint;\r\ +> \n :global arrDeviceInfo;\r\ +> \n :global devBoardName;\r\ +> \n :global devModel;\r\ +> \n :global devRunning;\r\ +> \n :global devCurArch;\r\ +> \n :global devRbRevision;\r\ +> \n :global devRbSerialNumber;\r\ +> \n :global devBuildTime;\r\ +> \n :global runningChannelVersion;\r\ +> \n :global runningChannel;\r\ +> \n :global runningVersion;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n\r\ +> \n :local DeviceInfo;\r\ +> \n :local Resource [/system/resource/get];\r\ +> \n :local Update [ /system/package/update/get ];\r\ +> \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ +> \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ +> \n :local RouterBoard;\r\ +> \n :local IsRouterBoard false;\r\ +> \n :local RunningMode \"\";\r\ +> \n\r\ +> \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ +> \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ +> \n :set runningChannelVersion \$VersionString;\r\ +> \n :set runningVersion \$VersionString;\r\ +> \n :set runningChannel \"\";\r\ +> \n\r\ +> \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ +> {\r\ +> \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ +> \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ +> len \$VersionString ] ];\r\ +> \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ +> \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ +> \r\ +> \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +> \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ +> \_3] != \"x86\") do={\r\ +> \n :do {\r\ +> \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ +> \n# :set RouterBoard [ /system/routerboard/get ];\r\ +> \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ +> \n :set IsRouterBoard true;\r\ +> \n }\r\ +> \n } on-error={}\r\ +> \n }\r\ +> \n\r\ +> \n :do {\r\ +> \n :set RunningMode [ /system/device-mode/get mode ];\r\ +> \n } on-error={\r\ +> \n :do {\r\ +> \n :set RunningMode [ /system/device-mode/get running ];\r\ +> \n } on-error={\r\ +> \n :set RunningMode \"\";\r\ +> \n }\r\ +> \n }\r\ +> \n :set devRunning \$RunningMode;\r\ +> \n\r\ +> \n :if (\$IsRouterBoard = true) do={\r\ +> \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ +> \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ +> \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ +> ];\r\ +> \n } else={\r\ +> \n :set devModel \$devBoardName;\r\ +> \n :set devRbRevision \"\";\r\ +> \n :set devRbSerialNumber \"\";\r\ +> \n }\r\ +> \n\r\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +> \n\r\ +> \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ +> \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ +> \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ +> \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ +> \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ +> \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ +> \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ +> \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ +> ion;\r\ +> \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ +> \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ +> \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ +> \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ +> current-firmware\") ];\r\ +> \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ +> upgrade-firmware\") ];\r\ +> \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ +> \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ +> alled-version\") ];\r\ +> \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ +> \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ +> ) ];\r\ +> \n\r\ +> \n :set arrDeviceInfo \$DeviceInfo;\r\ +> \n :return \$DeviceInfo;\r\ +> \n}\r\ +> \n\r\ +> \n:set DeviceInfo do={\r\ +> \n :global GetArrDeviceInfo;\r\ +> \n :global GlobalConfVersion;\r\ +> \n :global Identity;\r\ +> \n :global IfThenElse;\r\ +> \n :global FormatLine;\r\ +> \n :global CommitBrief;\r\ +> \n\r\ +> \n :local License [/system/license/get];\r\ +> \n :local Snmp [ /snmp/get ];\r\ +> \n :local Info [ \$GetArrDeviceInfo ];\r\ +> \n\r\ +> \n :if ([ :typeof \$Info ] != \"array\") do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :return ( \\\r\ +> \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ +> \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ +> \_. \\\r\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ +> \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ +> \_\\\r\ +> \n \"Hardware:\\n\" . \\\r\ +> \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ +> \\\r\ +> \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ +> n\" . \\\r\ +> \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ +> \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ +> \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ +> \\n\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ +> \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ +> \")) ] . \"\\n\") ] . \\\r\ +> \n \"RouterOS:\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ +> \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ +> \")) ] . \"\\n\") ] . \\\r\ +> \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ +> \\n\" . \\\r\ +> \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ +> \_\"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ +> \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ +> \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ +> \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ +> \"\\n\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ +> \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ +> \_\\\r\ +> \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ +> \_\"\\n\") ] . \\\r\ +> \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ +> \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ +> ) \\\r\ +> \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ +> \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ +> \n \"RouterOS-Scripts:\\n\" . \\\r\ +> \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ +> \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ +> \n}\r\ +> \n\r\ +> \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ +> tionFunctions ({})}\r\ +> \n\r\ +> \n:set GetRandom20CharAlNum do={\r\ +> \n :global EitherOr;\r\ +> \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ +> FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ +> \n}\r\ +> \n\r\ +> \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ +> \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ +> \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ +> \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ +> \n\r\ +> \n:global checkRunJob;\r\ +> \n:set checkRunJob do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLock; \r\ +> \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ +> \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ +> :set Job [ /system/script/job/get \$Job ];\r\ +> \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ +> stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ +> \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ +> lse; \r\ +> \n}\r\ +> \n\r\ +> \n:set InspectVar do={\r\ +> \n :global InspectVarRet;\r\ +> \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ +> \n}\r\ +> \n\r\ +> \n:set CommitBrief do={\r\ +> \n :global CommitId;\r\ +> \n :global CommitInfo;\r\ +> \n :if (\$CommitId = \"unknown\") do={\r\ +> \n :return \"unknown\";\r\ +> \n }\r\ +> \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ +> \n}\r\ +> \n\r\ +> \n:set InspectVarRet do={\r\ +> \n :local Input \$1;\r\ +> \n :local Level (0 + [ :tonum \$2 ]);\r\ +> \n :global CharacterReplace;\r\ +> \n :global IfThenElse;\r\ +> \n :global InspectVarRet;\r\ +> \n :local IndentReturn do={\r\ +> \n :local Prefix [ :tostr \$1 ];\r\ +> \n :local Value [ :tostr \$2 ];\r\ +> \n :local Level [ :tonum \$3 ];\r\ +> \n :global CharacterMultiply;\r\ +> \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ +> fix . \"-> \" . \$Value);\r\ +> \n }\r\ +> \n :local TypeOf [ :typeof \$Input ];\r\ +> \n :local Len [ :len \$Input ];\r\ +> \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ +> \n :if (\$TypeOf = \"array\") do={\r\ +> \n :foreach Key,Value in=\$Input do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +> \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ +> \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ +> \n }\r\ +> \n } else={\r\ +> \n :if (\$TypeOf = \"str\") do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +> \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ +> \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ +> \n }\r\ +> \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ +> \n }\r\ +> \n }\r\ +> \n :if (\$TypeOf != \"nothing\") do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +> \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ +> \_\\\r\ +> \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ +> \n }\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set GetPubIp do={\r\ +> \n :global DetectIpAddrDefault;\r\ +> \n :global DetectIpAddrFallback;\r\ +> \n\r\ +> \n :local PubIpAddr false;\r\ +> \n :local Url \$DetectIpAddrDefault;\r\ +> \n :local JobName [ :jobname ];\r\ +> \n\r\ +> \n :do {\r\ +> \n :log debug (\$0 . \" Trying to detect public IP using default serv\ +> ice: \" . \$Url . \"...\");\r\ +> \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ +> \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ +> )} \\\r\ +> \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ +> detect public IP using default service: \" . \$Url . \".\")}\r\ +> \n } on-error={\r\ +> \n :log error (\$0 . \" Failed to detect public IP using default serv\ +> ice: \" . \$Url . \".\");\r\ +> \n :set Url \$DetectIpAddrFallBack;\r\ +> \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ +> vice: \" . \$Url . \"...\");\r\ +> \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ +> \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ +> )} \\\r\ +> \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ +> \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ +> \n };\r\ +> \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ +> \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ +> {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ +> \n :return \$PubIpAddr;\r\ +> \n}\r\ +> \n\r\ +> \n:set FormatLine do={\r\ +> \n :local Key [ :tostr \$1 ];\r\ +> \n :local Value [ :tostr \$2 ];\r\ +> \n :local Indent [ :tonum \$3 ];\r\ +> \n :local Spaces;\r\ +> \n :local Return \"\";\r\ +> \n :global CharacterMultiply;\r\ +> \n :global EitherOr;\r\ +> \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ +> \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ +> \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ +> \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ +> n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ +> \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ +> \$Return ]) ] . \$Value)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ParseCustom do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ +> \n :local End [ :tostr \$3 ];\r\ +> \n :local Num [ :tonum \$4 ];\r\ +> \n :local Return;\r\ +> \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ +> \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ +> \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ +> lse={\r\ +> \n :set End [:find \$rest \$End];\r\ +> \n :set Return [:pick \$rest 0 \$End];\r\ +> \n }\r\ +> \n:return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set LogPrint do={\r\ +> \n :local Severity [ :tostr \$1 ];\r\ +> \n :local Name [ :tostr \$2 ];\r\ +> \n :local Message [ :tostr \$3 ];\r\ +> \n :global PrintDebug;\r\ +> \n :global PrintDebugOverride;\r\ +> \n :global EitherOr;\r\ +> \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ +> ];\r\ +> \n :local PrintSeverity do={\r\ +> \n :global TerminalColorOutput;\r\ +> \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ +> \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ +> \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ +> \n}\r\ +> \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ +> \r\ +> \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ +> \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ +> \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ +> \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ +> \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ +> \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ +> erity \$Severity ] . \": \" . \$Message)}\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateAvailable do={\r\ +> \n :local CommonName [ :tostr \$1 ];\r\ +> \n :local UseFor [ :tostr \$2 ];\r\ +> \n\r\ +> \n :global CertificateDownload;\r\ +> \n :global ParseKeyValueStore;\r\ +> \n\r\ +> \n :if ([ :len \$UseFor ] = 0) do={\r\ +> \n :log warning (\$0 . \"The intended use is undefined!\");\r\ +> \n :set UseFor \"undefined\";\r\ +> \n }\r\ +> \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ +> \n [ /certificate/settings/get crl-download ] = true && \\\r\ +> \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ +> \n :log warning (\$0 . \"This system has low free flash space but \" . \ +> \\\r\ +> \n \"is configured to download certificate CRLs to system!\");\r\ +> \n }\r\ +> \n :if ([ :len \$CommonName ] = 0) do={\r\ +> \n :log warning (\$0 . \"No CommonName given!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local CertSettings [ /certificate/settings/get ];\r\ +> \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ +> \r\ +> \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ +> \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ +> \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ +> \_] ] > 0) do={\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ +> ) do={\r\ +> \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ +> \"' not available.\");\r\ +> \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ +> ) do={\r\ +> \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ +> \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ +> e ] ];\r\ +> \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ +> ertVal->\"skid\")) do={\r\ +> \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ +> \_= 0) do={\r\ +> \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ +> >\"CN\");\r\ +> \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ +> is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +> \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ +> \") ] ];\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateDownload do={\r\ +> \n :local CommonName [ :tostr \$1 ];\r\ +> \n :global ScriptUpdatesBaseUrl;\r\ +> \n :global ScriptUpdatesUrlSuffix;\r\ +> \n :global CertificateNameByCN;\r\ +> \n :global CleanName;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global RmFile;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +> \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ +> \r\ +> \n \"CommonName '\" . \$CommonName . \"'.\");\r\ +> \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ +> \n :do {\r\ +> \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ +> -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +> \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ +> sUrlSuffix) \\\r\ +> \n dst-path=\$FileName as-value;\r\ +> \n \$WaitForFile \$FileName;\r\ +> \n } on-error={\r\ +> \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ +> e '\" . \$CommonName . \\\r\ +> \n \"' from repository! Trying fallback to mkcert.org...\");\r\ +> \n :do {\r\ +> \n :local CertSettings [ /certificate/settings/get ];\r\ +> \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ +> \_] ] = 0 && \\\r\ +> \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ +> || \\\r\ +> \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ +> \\\r\ +> \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +> \r\ +> \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ +> \_Root X1\" ] ] > 0)) do={\r\ +> \n :log error (\$0 . \" Required certificate is not available.\");\ +> \r\ +> \n :return false;\r\ +> \n }\r\ +> \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ +> er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +> \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ +> n ({ \$CommonName }) ] \\\r\ +> \n dst-path=\$FileName as-value;\r\ +> \n \$WaitForFile \$FileName;\r\ +> \n :if ([ /file/get \$FileName size ] = 0) do={\r\ +> \n \$RmFile \$FileName;\r\ +> \n :error false;\r\ +> \n }\r\ +> \n } on-error={\r\ +> \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ +> e '\" . \$CommonName . \"'!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ +> \n :delay 1s;\r\ +> \n \$RmFile \$FileName;\r\ +> \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ +> ) do={\r\ +> \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ +> +\\\$\") ];\r\ +> \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ +> e . \"' still unavailable!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ +> \"_[0-9]+\\\$\") ] do={\r\ +> \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateNameByCN do={\r\ +> \n :local Match [ :tostr \$1 ];\r\ +> \n :global CleanName;\r\ +> \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ +> rint=\$Match or name=\$Match) ]->0);\r\ +> \n :if ([ :len \$Cert ] = 0) do={\r\ +> \n :log warning (\$0 .\" No matching certificate found.\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ +> \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterMultiply do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Num [ :tonum \$2 ];\r\ +> \n :if (\$Num = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set FileExists do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :local Type [ :tostr \$2 ];\r\ +> \n :global FileGet;\r\ +> \n :local FileVal [ \$FileGet \$FileName ];\r\ +> \n :if (\$FileVal = false) do={ :return false; }\r\ +> \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ +> \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ +> \_true; }\r\ +> \n :return false;\r\ +> \n}\r\ +> \n\r\ +> \n:set Grep do={\r\ +> \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ +> \n :local Pattern [ :tostr \$2 ];\r\ +> \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ +> }\r\ +> \n :do {\r\ +> \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ +> \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ +> \$Line}\r\ +> \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ +> Input ] ];\r\ +> \n } while=([ :len \$Input ] > 0);\r\ +> \n :return [];\r\ +> \n}\r\ +> \n\r\ +> \n:set HumanReadableNum do={\r\ +> \n :local Input [ :tonum \$1 ];\r\ +> \n :local Base [ :tonum \$2 ];\r\ +> \n :global EitherOr;\r\ +> \n :global IfThenElse;\r\ +> \n :local Prefix \"kMGTPE\";\r\ +> \n :local Pow 1;\r\ +> \n :set Base [ \$EitherOr \$Base 1024 ];\r\ +> \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ +> \n :if (\$Input < \$Base) do={:return \$Input}\r\ +> \n :for I from=0 to=[ :len \$Prefix ] do={\r\ +> \n :set Pow (\$Pow * \$Base);\r\ +> \n :if (\$Input / \$Base < \$Pow) do={\r\ +> \n :set Prefix [ :pick \$Prefix \$I ];\r\ +> \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ +> \n :local Tmp2 (\$Tmp1 / 100);\r\ +> \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ +> \n :return (\$Tmp2 . \".\" . \\\r\ +> \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ +> 2 ] + 1) ] . \\\r\ +> \n \$Prefix . \$Bin);\r\ +> \n }\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set CleanFilePath do={\r\ +> \n :local Path [ :tostr \$1 ];\r\ +> \n :global CharacterReplace;\r\ +> \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ +> \"//\" \"/\" ]; }\r\ +> \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ +> n \$Path ] ]; }\r\ +> \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ +> :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ +> \n :return \$Path;\r\ +> \n}\r\ +> \n\r\ +> \n:set CleanName do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :local Return \"\";\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +> \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ +> stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ +> \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ +> \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ +> ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ +> \n };\r\ +> \n :set Return (\$Return . \$Char)};\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set RandomDelay do={\r\ +> \n :local Time [ :tonum \$1 ];\r\ +> \n :local Unit [ :tostr \$2 ];\r\ +> \n :global EitherOr;\r\ +> \n :global GetRandomNumber;\r\ +> \n :global MAX;\r\ +> \n :if (\$Time = 0) do={:return false}\r\ +> \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ +> [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ +> \n}\r\ +> \n\r\ +> \n:set EscapeForRegEx do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +> \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ +> \n :set Return (\$Return . \$Char);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ExitError do={\r\ +> \n :local ExitOK [ :tostr \$1 ];\r\ +> \n :local Name [ :tostr \$2 ];\r\ +> \n :local Error [ :tostr \$3 ];\r\ +> \n :global IfThenElse;\r\ +> \n :if (\$ExitOK = \"false\") do={\r\ +> \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ +> \\\r\ +> \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ +> ror\" . \\\r\ +> \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ +> \$Error) \".\" ]);\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set ExitOnError do={\r\ +> \n :local Name [ :tostr \$1 ];\r\ +> \n :local Error [ :tostr \$2 ];\r\ +> \n :global IfThenElse;\r\ +> \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ +> \\\$\") \\\r\ +> \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ +> r\" . \\\r\ +> \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ +> rror) \".\" ]);\r\ +> \n}\r\ +> \n\r\ +> \n:set MiniDateTimeStamp do={\r\ +> \n :local mikro [ :tobool \$1 ];\r\ +> \n /system/clock;\r\ +> \n :local vdate [get date];\r\ +> \n :local vtime [get time];\r\ +> \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ +> \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ +> \n :local M [:tonum \$MM];\r\ +> \n :if (\$vdate ~ \".../../....\") do={\r\ +> \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ +> \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ +> PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ +> \n :if (\$M>12) do={:set M (\$M - 12)}\r\ +> \n :set MM [:pick (100 + \$M) 1 3];\r\ +> \n }\r\ +> \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ +> \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ +> \n :local HH [:pick \$vtime 0 2];\r\ +> \n :local mm [:pick \$vtime 3 5];\r\ +> \n :local ss [:pick \$vtime 6 8];\r\ +> \n :local Return;\r\ +> \n :if (\$mikro = true) do={\r\ +> \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ +> \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ +> \n } else={\r\ +> \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ +> \r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitForFile do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :local WaitTime [ :totime \$2 ];\r\ +> \n :global CleanFilePath;\r\ +> \n :global EitherOr;\r\ +> \n :global MAX;\r\ +> \n :set FileName [ \$CleanFilePath \$FileName ];\r\ +> \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ +> \n :do {\r\ +> \n :retry {\r\ +> \n /file/get \$FileName;\r\ +> \n :return true;\r\ +> \n } delay=\$Delay max=10;\r\ +> \n } on-error={ }\r\ +> \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ +> \n :do {\r\ +> \n /file/get \$FileName;\r\ +> \n :return true;\r\ +> \n } on-error={ }\r\ +> \n :delay \$Delay;\r\ +> \n :set Delay (\$Delay * 3 / 2);\r\ +> \n }\r\ +> \n :return false;\r\ +> \n}\r\ +> \n\r\ +> \n:set FileGet do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :global WaitForFile;\r\ +> \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local FileVal false;\r\ +> \n :do {\r\ +> \n :set FileVal [ /file/get \$FileName ];\r\ +> \n } on-error={ }\r\ +> \n :return \$FileVal;\r\ +> \n}\r\ +> \n\r\ +> \n:set RmDir do={\r\ +> \n :local DirName [ :tostr \$1 ];\r\ +> \n :global FileGet;\r\ +> \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ +> \n :local DirVal [ \$FileGet \$DirName ];\r\ +> \n :if (\$DirVal = false) do={\r\ +> \n :log debug (\$0 . \" ... which does not exist.\");\r\ +> \n :return true;\r\ +> \n };\r\ +> \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ +> \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ +> ory.\");\r\ +> \n :return false;\r\ +> \n };\r\ +> \n :onerror Err {\r\ +> \n /file/remove \$DirName;\r\ +> \n } do={\r\ +> \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ +> : \" . \$Err);\r\ +> \n :return false;\r\ +> \n };\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set RmFile do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :global FileGet;\r\ +> \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ +> \n :local FileVal [ \$FileGet \$FileName ];\r\ +> \n :if (\$FileVal = false) do={\r\ +> \n :log debug (\$0 . \" ... which does not exist.\");\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ +> sk\") do={\r\ +> \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ +> \r\ +> \n :return false;\r\ +> \n }\r\ +> \n :onerror Err {\r\ +> \n /file/remove \$FileName;\r\ +> \n } do={\r\ +> \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ +> \_. \$Err); :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set MkDir do={\r\ +> \n :local Path [ :tostr \$1 ];\r\ +> \n :global CleanFilePath;\r\ +> \n :global FileGet;\r\ +> \n :global RmDir;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +> \n :local MkTmpfs do={\r\ +> \n :global WaitForFile;\r\ +> \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ +> \n :if ([ :len \$TmpFs ] = 1) do={\r\ +> \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ +> \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ +> \n /disk/enable \$TmpFs;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ +> \n \$RmDir \"tmpfs\";\r\ +> \n :onerror Err {\r\ +> \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ +> /get total-memory ] / 3);\r\ +> \n \$WaitForFile \"tmpfs\";\r\ +> \n } do={\r\ +> \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ +> Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :set Path [ \$CleanFilePath \$Path ];\r\ +> \n :if (\$Path = \"\") do={\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ +> \n :local PathVal [ \$FileGet \$Path ];\r\ +> \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ +> \n :log debug (\$0 . \" ... which already exists.\");\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ +> \n :if ([ \$MkTmpfs ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n :onerror Err {\r\ +> \n /file/add type=\"directory\" name=\$Path;\r\ +> \n \$WaitForFile \$Path;\r\ +> \n } do={\r\ +> \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ +> \" . \$Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ +> \n :return \$2;\r\ +> \n}\r\ +> \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ +> \n :return \$2;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterMultiply do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Num [ :tonum \$2 ];\r\ +> \n :if (\$Num = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterReplace do={\r\ +> \n :local String [ :tostr \$1 ];\r\ +> \n :local ReplaceFrom [ :tostr \$2 ];\r\ +> \n :local ReplaceWith [ :tostr \$3 ];\r\ +> \n :local Return \"\";\r\ +> \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ +> \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ +> \r\ +> \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ +> \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ +> \r\ +> \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ +> \_\$String ] ];\r\ +> \n }\r\ +> \n :return (\$Return . \$String);\r\ +> \n}\r\ +> \n\r\ +> \n:set IfThenElse do={\r\ +> \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ +> \$2};\r\ +> \n :return \$3;\r\ +> \n}\r\ +> \n\r\ +> \n:set EitherOr do={\r\ +> \n :global IfThenElse;\r\ +> \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ +> \$1 \$2 ]}\r\ +> \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ +> \_\$1 \$2 ]}\r\ +> \n# this works for boolean values, literal ones with parentheses\r\ +> \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ +> \n}\r\ +> \n\r\ +> \n:set ParseKeyValueStore do={\r\ +> \n :local Source \$1;\r\ +> \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ +> \n :do {\r\ +> \n :return [ :deserialize from=json \$Source ];\r\ +> \n } on-error={ }\r\ +> \n } \r\ +> \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ +> }\r\ +> \n :local Result ({});\r\ +> \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ +> \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ +> \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ +> \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ +> \_:len \$KeyValue ] ];\r\ +> \n :if (\$Value=\"true\") do={:set Value true}\r\ +> \n :if (\$Value=\"false\") do={:set Value false}\r\ +> \n :set (\$Result->\$Key) \$Value;\r\ +> \n } else={:set (\$Result->\$KeyValue) true}\r\ +> \n }\r\ +> \n :return \$Result;\r\ +> \n}\r\ +> \n:set RequiredRouterOS do={\r\ +> \n :local Caller [ :tostr \$1 ];\r\ +> \n :local Required [ :tostr \$2 ];\r\ +> \n :local Warn [ :tostr \$3 ];\r\ +> \n :global IfThenElse;\r\ +> \n :global VersionToNum;\r\ +> \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ +> \\\$\")) do={\r\ +> \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ +> e/update/get installed-version ] ]) do={\r\ +> \n :if (\$Warn = \"true\") do={\r\ +> \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ +> 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ +> \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ +> es RouterOS \" . \$Required . \". Please update!\");\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set ValidateSyntax do={\r\ +> \n :local Code [ :tostr \$1 ];\r\ +> \n :global LogPrint;\r\ +> \n :onerror Err {\r\ +> \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ +> \n } do={\r\ +> \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set VersionToNum do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :local Multi 0x1000000;\r\ +> \n :local Return 0;\r\ +> \n :global CharacterReplace;\r\ +> \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ +> \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ +> \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ +> \r\ +> \n }\r\ +> \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ +> \n :local Num [ :tonum \$Value ];\r\ +> \n :if (\$Multi = 0x100) do={\r\ +> \n :if ([ :typeof \$Num ] = \"num\") do={\r\ +> \n :set Return (\$Return + 0xff00);\r\ +> \n :set Multi (\$Multi / 0x100);\r\ +> \n } else={\r\ +> \n :if (\$Value = \"zero\") do={ }\r\ +> \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ +> }\r\ +> \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ +> \r\ +> \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ +> lue * \$Multi)); }\r\ +> \n :set Multi (\$Multi / 0x100);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ScriptLock do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local WaitMax [ :totime \$2 ];\r\ +> \n :global GetRandom20CharAlNum;\r\ +> \n :global IfThenElse;\r\ +> \n :global ScriptLockOrder;\r\ +> \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ +> \n :set ScriptLockOrder ({});\r\ +> \n }\r\ +> \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n }\r\ +> \n :local JobCount do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ +> \r\ +> \n }\r\ +> \n :local TicketCount do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :local Count 0;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ +> + 1)}\r\ +> \n }\r\ +> \n :return \$Count;\r\ +> \n }\r\ +> \n :local IsFirstTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Check [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :if (\$Ticket = \$Check) do={:return true}\r\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ +> o={:return false}\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local AddTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Add [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :while (true) do={\r\ +> \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ +> \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ +> \n :delay 10ms;\r\ +> \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ +> e}\r\ +> \n }\r\ +> \n }\r\ +> \n :local RemoveTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Remove [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ +> \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ +> \n :delay 10ms;\r\ +> \n }\r\ +> \n }\r\ +> \n }\r\ +> \n :local CleanupTickets do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ +> \n }\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n }\r\ +> \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ +> \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ +> \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ +> ist!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$JobCount \$Script ] = 0) do={\r\ +> \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ +> );\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ +> \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ +> t . \"', resetting!\");\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n /system/script/job/remove [ find where script=\$Script ];\r\ +> \n }\r\ +> \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ +> \n \$AddTicket \$Script \$MyTicket;\r\ +> \n :local WaitInterval (\$WaitMax / 20);\r\ +> \n :local WaitTime \$WaitMax;\r\ +> \n :while (\$WaitTime > 0 && \\\r\ +> \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ +> \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ +> \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ +> \n :delay \$WaitInterval;\r\ +> \n }\r\ +> \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ +> \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ +> \n \$RemoveTicket \$Script \$MyTicket;\r\ +> \n \$CleanupTickets \$Script;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n \$RemoveTicket \$Script \$MyTicket;\r\ +> \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ +> once\" . \\\r\ +> \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ +> \_lock\" \"\" ] . \"...\");\r\ +> \n :return false;\r\ +> \n}\r\ +> \n\r\ +> \n:set SendNotification do={ :onerror Err {\r\ +> \n :global SendNotification2;\r\ +> \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ +> \_silent=\$4 });\r\ +> \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ +> \n}\r\ +> \n\r\ +> \n:set SendNotification2 do={\r\ +> \n :local Notification \$1;\r\ +> \n :global NotificationFunctions;\r\ +> \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ +> \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ +> ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set SymbolByUnicodeName do={\r\ +> \n :local Name [ :tostr \$1 ];\r\ +> \n :global EitherOr;\r\ +> \n :global SymbolsExtra;\r\ +> \n :local Symbols ({\r\ +> \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ +> \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ +> \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ +> \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ +> \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ +> \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ +> \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ +> \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ +> \n \"cloud\"=\"\\E2\\98\\81\";\r\ +> \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ +> \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ +> \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ +> \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ +> \n \"gear\"=\"\\E2\\9A\\99\";\r\ +> \n \"heart\"=\"\\E2\\99\\A5\";\r\ +> \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ +> \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ +> \n \"information\"=\"\\E2\\84\\B9\";\r\ +> \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ +> \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ +> \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ +> \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ +> \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ +> \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ +> \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ +> \n \"scissors\"=\"\\E2\\9C\\82\";\r\ +> \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ +> \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ +> \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ +> \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ +> \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ +> \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ +> \n \"star\"=\"\\E2\\AD\\90\";\r\ +> \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ +> \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ +> \n }, \$SymbolsExtra);\r\ +> \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ +> \n :local Special {\r\ +> \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ +> \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ +> \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ +> \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ +> \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ +> \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ +> '!\");\r\ +> \n :return \"\";\r\ +> \n }\r\ +> \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ +> me) ] . \"\\EF\\B8\\8F\");\r\ +> \n}\r\ +> \n\r\ +> \n:set SymbolForNotification do={\r\ +> \n :global NotificationsWithSymbols;\r\ +> \n :global SymbolByUnicodeName;\r\ +> \n :global IfThenElse;\r\ +> \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ +> \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ +> \n :local Return \"\";\r\ +> \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ +> mbolByUnicodeName \$Symbol ])}\r\ +> \n :return (\$Return . \" \");\r\ +> \n}\r\ +> \n\r\ +> \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ +> \n:set UrlEncode do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ +> \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ +> %24\"; \"%25\"; \"%26\"; \"%27\";\r\ +> \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ +> \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ +> \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ +> \"%7C\"; \"%7D\"; \"%7E\" };\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +> \n :local Replace [ :find \$Chars \$Char ];\r\ +> \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ +> ce)}\r\ +> \n :set Return (\$Return . \$Char);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsDNSResolving do={\r\ +> \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsFullyConnected do={\r\ +> \n :global IsDNSResolving;\r\ +> \n :global IsTimeSync;\r\ +> \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ +> \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsTimeSync do={\r\ +> \n :global IsTimeSyncCached;\r\ +> \n :global IsTimeSyncResetNtp;\r\ +> \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ +> \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ +> \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ +> \n :set IsTimeSyncCached true;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :local Uptime [ /system/resource/get uptime ];\r\ +> \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ +> \n :set IsTimeSyncResetNtp \$Uptime;\r\ +> \n }\r\ +> \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ +> \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ +> ;\r\ +> \n :set IsTimeSyncResetNtp \$Uptime;\r\ +> \n /system/ntp/client/set enabled=no;\r\ +> \n :delay 20ms;\r\ +> \n /system/ntp/client/set enabled=yes;\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ +> \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ +> \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ +> ee license and x86.\";\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ +> \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ +> \n :set IsTimeSyncCached true;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ +> \r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set FetchHugeFiles do={\r\ +> \n :local ScriptName [ :tostr \$1 ];\r\ +> \n :local Url [ :tostr \$2 ];\r\ +> \n :local CheckCert [ :tostr \$3 ];\r\ +> \n\r\ +> \n :global CleanName;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global GetRandom20CharAlNum;\r\ +> \n :global IfThenElse;\r\ +> \n :global LogPrint;\r\ +> \n :global MkDir;\r\ +> \n :global RmDir;\r\ +> \n :global RmFile;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +> \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ +> ithout-crl\" ];\r\ +> \n\r\ +> \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ +> \n :if ([ \$MkDir \$DirName ] = false) do={\r\ +> \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ +> \$GetRandom20CharAlNum ]);\r\ +> \n :onerror Err {\r\ +> \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ +> \\\r\ +> \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ +> lue;\r\ +> \n } do={\r\ +> \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ +> \n \$RmFile \$FileName;\r\ +> \n }\r\ +> \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ +> \_. \$Err);\r\ +> \n \$RmDir \$DirName;\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ +> \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ +> \_not show up.\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :local FileSize [ /file/get \$FileName size ];\r\ +> \n :local Return \"\";\r\ +> \n :local VarSize 0;\r\ +> \n :while (\$VarSize != \$FileSize) do={\r\ +> \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ +> 768 file=\$FileName as-value ]->\"data\"));\r\ +> \n :set FileSize [ /file/get \$FileName size ];\r\ +> \n :set VarSize [ :len \$Return ];\r\ +> \n :if (\$VarSize > \$FileSize) do={\r\ +> \n :delay 100ms;\r\ +> \n }\r\ +> \n }\r\ +> \n \$RmDir \$DirName;\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set FetchUserAgentStr do={\r\ +> \n :local Caller [ :tostr \$1 ];\r\ +> \n :global GlobalScriptsUrl;\r\ +> \n :global CommitBrief;\r\ +> \n :global IfThenElse;\r\ +> \n :local Resource [ /system/resource/get ];\r\ +> \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ +> \_\$Resource->\"architecture-name\" . \\\r\ +> \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ +> CommitBrief ] . \")\");\r\ +> \n}\r\ +> \n\r\ +> \n:set ScriptInstallUpdate do={ :onerror Err {\r\ +> \n :local Scripts [ :toarray \$1 ];\r\ +> \n :local NewComment [ :tostr \$2 ];\r\ +> \n :global InitSetup;\r\ +> \n\r\ +> \n :global CommitId;\r\ +> \n :global ScriptUpdatesCRLF;\r\ +> \n :global GlobalConfVersion;\r\ +> \n :global Identity;\r\ +> \n :global CertificateAvailable;\r\ +> \n :global CheckSumsVerify;\r\ +> \n :global GlobalScriptsUrl;\r\ +> \n :global SumsDirAndFileName;\r\ +> \n :global GlobalScriptsUrlSuffix;\r\ +> \n :global EitherOr;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global Grep;\r\ +> \n :global IfThenElse;\r\ +> \n :global LogPrint;\r\ +> \n :global ParseKeyValueStore;\r\ +> \n :global RequiredRouterOS;\r\ +> \n :global SendNotification2;\r\ +> \n :global SymbolForNotification;\r\ +> \n :global ValidateSyntax;\r\ +> \n :global CommentsInScripts;\r\ +> \n\r\ +> \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ +> \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ +> hout.\");\r\ +> \n }\r\ +> \n\r\ +> \n :foreach Script in=\$Scripts do={\r\ +> \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ +> \r\ +> \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ +> \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ +> Vados\\n\" comment=\$NewComment;\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +> \n :local CommitIdBefore \$CommitId;\r\ +> \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ +> \n :local ReloadGlobal false;\r\ +> \n :local DeviceMode [ /system/device-mode/get ];\r\ +> \n\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +> \n :local CheckSums ({});\r\ +> \n :do {\r\ +> \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ +> iptsUrlSuffix);\r\ +> \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ +> \r\ +> \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ +> ficate=yes-without-crl \\\r\ +> \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ +> =user as-value ]->\"data\") ];\r\ +> \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ +> \n }\r\ +> \n\r\ +> \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ +> s\" ] do={\r\ +> \n :local ScriptVal [ /system/script/get \$Script ];\r\ +> \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ +> ];\r\ +> \n :local SourceNew;\r\ +> \n\r\ +> \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ +> \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ +> \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ +> \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ +> \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ +> iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ +> \"'!\");\r\ +> \n }\r\ +> \n }\r\ +> \n :do {\r\ +> \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ +> \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ +> e\" . \"', as requested.\");\r\ +> \n :error true;\r\ +> \n }\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +> \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ +> \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ +> ptInfo->\"url-suffix\") ] = 0 && \\\r\ +> \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ +> rce\") ] ] = \$CheckSum) do={\r\ +> \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ +> >\"name\" . \"' matches, ignoring.\");\r\ +> \n :error true;\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ +> \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ +> fetch\" ] = false) do={\r\ +> \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ +> ng without.\");\r\ +> \n }\r\ +> \n }\r\ +> \n :onerror Err {\r\ +> \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ +> lScriptsUrl ];\r\ +> \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ +> lobalScriptsUrlSuffix ];\r\ +> \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ +> Suffix);\r\ +> \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ +> name\") . \"' from url: \" . \$Url);\r\ +> \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ +> \r\ +> \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ +> ut=user as-value ];\r\ +> \n :if (\$Result->\"status\" = \"finished\") do={\r\ +> \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ +> \n } \r\ +> \n } do={\r\ +> \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ +> al->\"name\" . \"': \" . \$Err);\r\ +> \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ +> \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ +> \?\");\r\ +> \n /system/script/remove \$Script;\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +> \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ +> riptInfo->\"url-suffix\") ] = 0 && \\\r\ +> \n [ :len \$CheckSum ] = 0) do={\r\ +> \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ +> pdates with 'ignore=true' in comment.\");\r\ +> \n }\r\ +> \n }\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ :len \$SourceNew ] = 0) do={\r\ +> \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ +> >\"name\") . \"'.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ +> \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ +> lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ +> \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ +> \$ScriptVal->\"source\")) do={\r\ +> \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ +> . \"' source did not change. End of lines set to CRLF.\");\r\ +> \n if (\$ScriptUpdatesCRLF = false) do={\r\ +> \n :put [ :tolf \$SourceNew ];\r\ +> \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ +> ) . \"' source update end of lines to LF.\");\r\ +> \n }\r\ +> \n :error false;\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ +> \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ +> l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ +> );\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if (\$CommentsInScripts = true) do={\r\ +> \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ +> \_\") ];\r\ +> \n :if ([ :len \$CommentLine ] = 0) do={\r\ +> \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ +> iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ +> noring!\");\r\ +> \n :error false;\r\ +> \n } else={\r\ +> \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ +> ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ +> ] + 2) [ :len \$CommentLine] ]) do={\r\ +> \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ +> \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ +> ;\r\ +> \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ +> ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ +> \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ +> omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ +> ded!\");\r\ +> \n } else={\r\ +> \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ +> al->\"name\") . \"' did not change.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n } \r\ +> \n }\r\ +> \n\r\ +> \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ +> \"\\23 requires RouterOS, \") ] ]->version);\r\ +> \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ +> \_false ] = false) do={\r\ +> \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ +> \") . \"' requires RouterOS \" . \\\r\ +> \n \$RequiredROS . \", which is not met by your installation. I\ +> gnoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ +> \\23 requires device-mode, \") ] ];\r\ +> \n :local MissingDM ({});\r\ +> \n :foreach Feature,Value in=\$RequiredDM do={\r\ +> \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ +> ceMode->\$Feature) = false) do={\r\ +> \n :set MissingDM (\$MissingDM, \$Feature);\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :len \$MissingDM ] > 0) do={\r\ +> \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ +> \") . \"' requires disabled \" . \\\r\ +> \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ +> gnoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ +> \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ +> ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n \r\ +> \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ +> ript comment: \" . (\$ScriptVal->\"comment\"));\r\ +> \n\r\ +> \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ +> Val->\"comment\") \\\r\ +> \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ +> F \$SourceNew ] \$Script;\r\ +> \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ +> \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ +> \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ +> o={\r\ +> \n :set ReloadGlobal true;\r\ +> \n }\r\ +> \n } on-error={ }\r\ +> \n }\r\ +> \n :if (\$ReloadGlobal = true) do={\r\ +> \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ +> \");\r\ +> \n :onerror Err {\r\ +> \n :global InitSetup (a);\r\ +> \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ +> \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ +> ctions failed! \" . \$Err)}\r\ +> \n }\r\ +> \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ +> \n \$LogPrint warning \$0 (\"The configuration version decreased from \ +> \" . \\\r\ +> \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ +> \n \". Installed an older version\?\");\r\ +> \n }\r\ +> \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ +> \n :global GlobalConfChanges;\r\ +> \n :global GlobalConfMigration;\r\ +> \n :local ChangeLogCode;\r\ +> \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ +> \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ +> \n :onerror Err {\r\ +> \n [ :parse \$ChangeLogCode ];\r\ +> \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ +> . \$Err)}\r\ +> \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ +> dation!\")}\r\ +> \n }\r\ +> \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ +> \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ +> \_do={\r\ +> \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ +> \n :do {\r\ +> \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ +> \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ +> \_\" is not available.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ +> \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ +> \_. \" failed syntax validation!\");\r\ +> \n :error false}\r\ +> \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ +> . \": \" . \$Migration);\r\ +> \n :onerror Err {\r\ +> \n [ :parse \$Migration ];\r\ +> \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ +> \_\$I . \" failed to run: \" . \$Err)}\r\ +> \n } on-error={ }\r\ +> \n }\r\ +> \n }\r\ +> \n :local NotificationMessage (\"The configuration version on \" . \$Id\ +> entity . \" increased \" . \\\r\ +> \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ +> d modification. \" . \\\r\ +> \n \"Please review and update global-config-overlay, then re-run glo\ +> bal-config.\");\r\ +> \n \$LogPrint info \$0 (\$NotificationMessage);\r\ +> \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ +> \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ +> \");\r\ +> \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ +> \_do={\r\ +> \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ +> \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ +> \r\ +> \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ +> \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ +> \n }\r\ +> \n } else={\r\ +> \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ +> \_changes are not available.\");\r\ +> \n\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ +> } else={ :global GlobalConfChanges (a); }\r\ +> \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ +> on; } else={ :global GlobalConfMigration (a); }\r\ +> \n }\r\ +> \n} do={\r\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +> \n} }\r\ +> \n\r\ +> \n# load modules\r\ +> \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ +> ns\\\\.d|mod)/.\" ] do={\r\ +> \n :local ScriptVal [ /system/script/get \$Script ];\r\ +> \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ +> \n :onerror Err {\r\ +> \n /system/script/run \$Script;\r\ +> \n } do={\r\ +> \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ +> ailed to run: \" . \$Err);\r\ +> \n }\r\ +> \n } else={\r\ +> \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ +> led syntax validation, skipping.\");\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n# Add and fix global scheduler\r\ +> \n:put \"Add or/and fix Global scheduler...\";\r\ +> \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ +> ; }\";\r\ +> \n:local Comment \"Every Day Set Global Environment Variables\";\r\ +> \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ +> = 0) do={\r\ +> \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ +> ent=\$OnEvent start-time=startup;\r\ +> \n}\r\ +> \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ +> \_do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ +> \n}\r\ +> \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ +> ) do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ +> \n}\r\ +> \n# Add Update Script scheduler\r\ +> \n:put \"Add or/and fix Update Script scheduler\";\r\ +> \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ +> \r\ +> \n:set Comment \"Every Day Check For Update Scripts\";\r\ +> \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ +> \" ] ] = 0) do={\r\ +> \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ +> start-time=startup interval=1d on-event=\$OnEvent;\r\ +> \n}\r\ +> \n\r\ +> \n:onerror Err {\r\ +> \n :global GlobalConfReady;\r\ +> \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ +> \_not ready.\"); }; } delay=100ms max=5;\r\ +> \n\r\ +> \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ +> \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ +> \") ] . \\\r\ +> \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ +> \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ +> \n # signal we are ready\r\ +> \n:set GlobalFuncReady true;\r\ +> \n:set ExitOK true;\r\ +> \n\r\ +> \n:log info (\$0 . \"Global configs ready!\");\r\ +> \n} do={\r\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +> \n}\r\ +> \n" +> add comment=\ +> "Lookup IP addresses for RKN list and add them to firewall address-list" \ +> dont-require-permissions=no name=AM-RKN-dnsLookup owner=AM-RKN-dnsLookup \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> source="#!rsc by Vados\r\ +> \n# RouterOS script: AM-RKN-dnsLookup\r\ +> \n# Script comment: Lookup IP addresses for RKN list and add them to firew\ +> all address-list\r\ +> \n# Copyright (c) 2007-2026 Vados \r\ +> \n#\r\ +> \n#\r\ +> \n# requires RouterOS, version=7.19\r\ +> \n# requires device-mode, fetch\r\ +> \n#\r\ +> \n# Script description: This script is intended to be run periodically, e.\ +> g. once a day, to update the IP addresses in the firewall address-list bas\ +> ed on the RKN list.\r\ +> \n# It resolves the domain names in the RKN list and a\ +> dds the corresponding IP addresses to the specified firewall address-list.\ +> \r\ +> \n# The script also handles CNAME records by following\ +> \_them until it finds A records.\r\ +> \n# Usage:\r\ +> \n# /system/script { run AM-RKN-dnsLookup; }\r\ +> \n:local ScriptName [ :jobname ];\r\ +> \n\r\ +> \n:global dnsLookupReady false;\r\ +> \n:if ([:typeof \$dnsLookupReady] != \"boolean\") do={ :set dnsLookupReady\ +> \_true; }\r\ +> \nwhile (!\$dnsLookupReady) do={ :nothing; }\r\ +> \n:set dnsLookupReady false;\r\ +> \n\r\ +> \n:local arrRKN {\r\ +> \n \"telegra.ph\"\r\ +> \n \"grani.ru\"\r\ +> \n \"xhamster.com\"\r\ +> \n \"lostfilm.tv\"\r\ +> \n \"rutracker.org\"\r\ +> \n \"lurkmore.to\"\r\ +> \n \"dou.ua\"\r\ +> \n \"youporn.com\"\r\ +> \n \"pornolab.net\"\r\ +> \n \"crimerussia.com\"\r\ +> \n \"telegram.org\"\r\ +> \n \"api.telegram.org\"\r\ +> \n \"facebook.com\"\r\ +> \n \"instagram.com\"\r\ +> \n \"x.com\"\r\ +> \n \"twitter.com\"\r\ +> \n \"youtube.com\"\r\ +> \n \"googleapis.com\"\r\ +> \n \"youtu.be\"\r\ +> \n \"googlevideo.com\"\r\ +> \n \"gstatic.com\"\r\ +> \n \"googleusercontent.com\"\r\ +> \n \"nhacmp3youtube.com\"\r\ +> \n \"telegram.me\"\r\ +> \n \"t.me\";}\r\ +> \n\r\ +> \n:local ListRKN \"RKN-dnsLookup\";\r\ +> \n:local ListComment (\"ListRKN managed by \" . \$ScriptName);\r\ +> \n:foreach aListItem in=[/ip/firewall/address-list find list=\$ListRKN] do\ +> ={\r\ +> \n /ip firewall address-list remove \$aListItem;\r\ +> \n}\r\ +> \n:foreach aItem in=\$arrRKN do={\r\ +> \n# :do {\r\ +> \n :retry delay=500ms max=5 on-error={:log error \"dns resolve fail\ +> ure [ \$aItem - resolve ip ]\"} command={:resolve \$aItem}\r\ +> \n# } on-error={\r\ +> \n# :log error \"dns resolve failure [ \$arItem - resolve ip ]\";\r\ +> \n# }\r\ +> \n :foreach dnsRecord in=[/ip dns cache all find where (name=\$aItem)] \ +> do={\r\ +> \n :if ([/ip dns cache all get \$dnsRecord type]=\"A\") do={\r\ +> \n :local newAddress [/ip dns cache all get \$dnsRecord data];\ +> \r\ +> \n :do {\r\ +> \n /ip firewall address-list add list=\$ListRKN address=\$newA\ +> ddress comment=\$aItem;\r\ +> \n :log warning \"Successfully adding ip to list A record: \ +> \$dnsRecord, address: \$newAddress domain: \$aItem\";\r\ +> \n } on-error={\r\ +> \n :log error \"error when adding ip to list A record: \$dn\ +> sRecord, address: \$newAddress domain: \$aItem\";\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([/ip dns cache all get \$dnsRecord type]=\"CNAME\") do={\r\ +> \n :local cname;\r\ +> \n :local nextCname;\r\ +> \n :local cnameAddress;\r\ +> \n :set cname [/ip dns cache all find where (name=\$aItem && ty\ +> pe=\"CNAME\")];\r\ +> \n :set nextCname [/ip dns cache all find where (name=[/ip dns \ +> cache all get \$cname data] && type=\"CNAME\")];\r\ +> \n :while (\$nextCname != \"\") do={\r\ +> \n :set cname \$nextCname;\r\ +> \n :set nextCname [/ip dns cache all find where (name=[/ip \ +> dns cache all get \$cname data] && type=\"CNAME\")];\r\ +> \n }\r\ +> \n :foreach aRecord in=[/ip dns cache all find where (name=[/ip\ +> \_dns cache all get \$cname data] && type=\"A\")] do={\r\ +> \n :do {\r\ +> \n :set cnameAddress [/ip dns cache all get \$aRecord d\ +> ata];\r\ +> \n /ip firewall address-list add list=\$ListRKN address\ +> =\$cnameAddress comment=\$aItem;\r\ +> \n :log warning \"Succesfully adding ip to list CNAME r\ +> ecord: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \ +> \$aItem.\";\r\ +> \n# /ip firewall raw add action=add-dst-to-address-list\ +> \_address-list=\$ListRKN address-list-timeout=none-dynamic chain=preroutin\ +> g comment=\$aItem content=\$aItem;\r\ +> \n } on-error={\r\ +> \n :log error \"error when adding ip to list CNAME reco\ +> rd: \$cname, A record: \$aRecord, address: \$newAddress, from domain: \$aI\ +> tem.\";\r\ +> \n }\r\ +> \n }\r\ +> \n }\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ +> ={\r\ +> \n :log error (\$ScriptName . \"System Scheduler for script: \" . \$Scri\ +> ptName . \" is NOT SET! Fix It Now!\");\r\ +> \n /system/scheduler/add name=\$ScriptName on-event=\"/system/script { \ +> run \$ScriptName; }\" comment=\"Update RKN DNS Looup\" interval=00:30:00 p\ +> olicy=\"ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon\"\ +> \_start-time=startup;\r\ +> \n }\r\ +> \n:set dnsLookupReady true;\r\ +> \ndelay 2s; \r\ +> \n:global dnsLookupReady (a);\r\ +> \n" +> add dont-require-permissions=no name="renameLists " owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ +> local oldName \"Test\";\ +> \n:local newName \"Test-IP\";\ +> \n/ip firewall address-list\ +> \n:foreach i in=[find list=\$oldName] do={\ +> \nset \$i list=\$newName;\ +> \n}\ +> \n" +> add dont-require-permissions=no name=IPv6-Settings owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +> #############Script Settings##################\ +> \n\ +> \n:local \"IF-TUN\" \"6to4-tun\"\ +> \n:local \"IF-LOC\" \"Bridge-LAN\"\ +> \n:local \"POOL-6TO4\" \"poolV6-local\"\ +> \n:local \"force-update\" false\ +> \n############ use then static ip #######################\ +> \n:local \"lease-address\" [/ip address get [find interface=\$\"IF-LOC\"] \ +> address]\ +> \n#:local \"interface\" \"ext\"\ +> \n:local bound 0\ +> \n\ +> \n###############################################\ +> \n\ +> \n:local 6to4prefix do={\ +> \n :global dec2hex\ +> \n :local ipv4 \$1\ +> \n :local ipv6 \"2002:\"\ +> \n :for i from=0 to=2 step=1 do={ \ +> \n :if ( \$i = 2) do={\ +> \n :set ipv6 (\$ipv6.\":\")\ +> \n }\ +> \n :local fp [:find \$ipv4 \".\"]\ +> \n :if ( \$fp > 0 ) do={\ +> \n :set ipv6 (\$ipv6.[\$dec2hex [:pick \$ipv4 0 \$fp]])\ +> \n :set ipv4 [:pick \$ipv4 (\$fp + 1 ) [:len \$ipv4]]\ +> \n }\ +> \n }\ +> \n :return (\$ipv6.[\$dec2hex \$ipv4])\ +> \n}\ +> \n:local \"str_replace\" do={\ +> \n :local \"str-pos\" [:find \$1 \$2]\ +> \n :local \"str-len\" [:len \$2]\ +> \n :local str \"\"\ +> \n :local rest \$1\ +> \n :while (\$\"str-pos\" >= 0) do={\ +> \n :local t [:pick \$rest 0 \$\"str-pos\"]\ +> \n :if ( \$4 > 0 ) do={\ +> \n :for i from=1 to=(\$4 - [:len \$t]) step=1 do={\ +> \n :set str (\$str.\$5)\ +> \n }\ +> \n }\ +> \n :set str (\$str.\$t.\$3)\ +> \n :set rest [:pick \$rest (\$\"str-pos\"+\$\"str-len\") [:len \$re\ +> st]]\ +> \n :set \"str-pos\" [:find \$rest \$2]\ +> \n }\ +> \n :return (\$str.\$rest)\ +> \n}\ +> \n\ +> \n:if (\$bound=1) do={\ +> \n :local t [:find \$\"lease-address\" \"/\"]\ +> \n\ +> \n :if ( \$t >= 0 ) do={\ +> \n :set \"lease-address\" [:pick \$\"lease-address\" 0 \$t]\ +> \n }\ +> \n\ +> \n :if ( [/interface 6to4 print count-only where name=\$\"IF-TUN\"] = 0\ +> ) do={\ +> \n /interface 6to4 add !keepalive local-address=\$\"lease-address\"\ +> \_mtu=1280 name=\$\"IF-TUN\" remote-address=10.30.30.0\ +> \n :set \"force-update\" true\ +> \n }\ +> \n\ +> \n :local \"IPv4-TUN\" [/interface 6to4 get [find name=\$\"IF-TUN\"] lo\ +> cal-address];\ +> \n\ +> \n :if ( \$\"lease-address\" != \$\"IPv4-TUN\" || \$\"force-update\" = \ +> true) do={\ +> \n /interface 6to4 set [find name=\$\"IF-TUN\"] local-address=\$\"l\ +> ease-address\"\ +> \n /ipv6 address remove [find interface=\$\"IF-TUN\"]\ +> \n /ipv6 address remove [find interface=\$\"IF-LOC\"]\ +> \n /ipv6 route remove [find gateway ~ \$\"IF-TUN\" and dst-address=\ +> \"::/0\"]\ +> \n :local \"pool-prefix\" [\$6to4prefix \$\"lease-address\"]\ +> \n :if ( [/ipv6 pool print count-only where name=\$\"POOL-6TO4\"] =\ +> \_0) do={ \ +> \n /ipv6 pool add name=\$\"POOL-6TO4\" prefix=(\$\"pool-prefix\ +> \".\":1::/64\") prefix-length=64\ +> \n } else={\ +> \n /ipv6 pool set [/ipv6 pool find where name=\$\"POOL-6TO4\"] \ +> prefix=(\$\"pool-prefix\".\":1::/64\")\ +> \n }\ +> \n /ipv6 address add address=(\$\"pool-prefix\".\"::\".[\$MAC2EUI64\ +> \_[/interface get [find name=\$\"interface\"] mac-address]].\"/3\") interf\ +> ace=\$\"IF-TUN\" advertise=no\ +> \n /ipv6 address add eui-64=yes from-pool=\$\"POOL-6TO4\" interface\ +> =\$\"IF-LOC\" advertise=yes\ +> \n /ipv6 route add dst-address=::/0 gateway=(\"::10.30.30.81%\".\$\ +> \"IF-TUN\")\ +> \n :local t [/ipv6 address get [find interface=\$\"IF-LOC\"] addres\ +> s]\ +> \n :set t [:pick \$t 0 [:find \$t \"/\"]]\ +> \n :if ( [/ipv6 dhcp-server option print count-only where name=DNS]\ +> \_= 0) do={\ +> \n /ipv6 dhcp-server option add code=23 name=DNS value=(\"0x\".\ +> [\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ +> \n } else={\ +> \n /ipv6 dhcp-server option set [/ipv6 dhcp-server option find \ +> where name=DNS] value=(\"0x\".[\$\"str_replace\" \$t \":\" \"\" 4 \"0\"])\ +> \n }\ +> \n :if ( [/ipv6 dhcp-server print count-only where interface=\$\"IF\ +> -LOC\"] = 0) do={\ +> \n /ipv6 dhcp-server add address-pool=\$\"POOL-6TO4\" dhcp-opti\ +> on=DNS interface=\$\"IF-LOC\" lease-time=1d name=\$\"IF-LOC\"\ +> \n }\ +> \n :if ( [ipv6 nd print count-only where interface=\$\"IF-LOC\"] = \ +> 0) do={\ +> \n /ipv6 nd add advertise-dns=no interface=\$\"IF-LOC\" other-c\ +> onfiguration=yes\ +> \n }\ +> \n }\ +> \n}" +> add dont-require-permissions=no name=IPv6-GlobalFunc owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ +> global MAC2EUI64 do={\ +> \n :local EUI64 \"\"\ +> \n :local MAC \$1\ +> \n :local HEX2DEC \"0123456789ABCDEF\"\ +> \n :for i from=0 to=5 step=1 do={\ +> \n :if ( \$i = 0 ) do={\ +> \n :set EUI64 [:pick \$MAC 0]\ +> \n :set EUI64 (\$EUI64.[:tostr [:pick \$\"HEX2DEC\" ([:find \$\ +> \"HEX2DEC\" [:pick \$MAC 1]] ^ 2)]])\ +> \n }\ +> \n :if ( \$i = 1 || \$i = 3) do={\ +> \n :set EUI64 (\$EUI64.\":\")\ +> \n }\ +> \n :if ( \$i = 2 ) do={\ +> \n :set EUI64 (\$EUI64.\"FF:FE\")\ +> \n }\ +> \n :if ( [:find \$MAC \":\"] = 2 ) do={\ +> \n :set MAC [:pick \$MAC 3 [:len \$MAC]]\ +> \n :set EUI64 (\$EUI64.[:pick \$MAC 0 2])\ +> \n }\ +> \n }\ +> \n :return (\$EUI64)\ +> \n}\ +> \n\ +> \n:global dec2hex do={\ +> \n :local hex \"\"\ +> \n :local dec [:tonum \$1]\ +> \n :for i from=0 to=4 step=4 do={\ +> \n :set hex ([:pick \"0123456789ABCDEF\" ((\$dec>>\$i)&0xf) (((\$de\ +> c>>\$i)&0xf)+1)].\$hex)\ +> \n }\ +> \n :return ([:tostr \$hex])\ +> \n}" +> /user group +> add name=backup policy="ssh,read,write,policy,test,web,sniff,sensitive,api,res\ +> t-api,!local,!telnet,!ftp,!reboot,!winbox,!password,!romon" +> /ip smb +> set enabled=no interfaces=lo +> /interface bridge port +> add bridge=Bridge-LAN interface=ether5 +> add bridge=Bridge-LAN interface=ether2 +> add bridge=Bridge-LAN interface=ether4 trusted=yes +> add bridge=Bridge-LAN interface=ether3 +> add bridge=Bridge-LAN interface=wlan2 +> add bridge=Bridge-LAN interface=wlan1 +> /interface bridge settings +> set use-ip-firewall=yes +> /ip firewall connection tracking +> set udp-timeout=10s +> /ip neighbor discovery-settings +> set discover-interface-list=LAN lldp-med=no lldp-poe-power=no +> /ip settings +> set accept-redirects=yes ipv4-multipath-hash-policy=l4 max-neighbor-entries=\ +> 8192 +> /ipv6 settings +> set disable-ipv6=yes disable-link-local-address=yes forward=no \ +> max-neighbor-entries=8192 multipath-hash-policy=l4 +> /interface detect-internet +> set detect-interface-list=static internet-interface-list=Internet \ +> lan-interface-list=LAN request-interval=1m wan-interface-list=WAN +> /interface l2tp-server server +> set authentication=mschap2 use-ipsec=yes +> /interface list member +> add interface=ether4 list=WAN +> add interface="ether1 - Unet" list=Internet +> add interface=WG list=WAN +> add interface=Bridge-LAN list=LAN +> /interface wireguard peers +> add allowed-address=0.0.0.0/0 client-allowed-address=::/0 endpoint-address=\ +> 109.107.177.79 endpoint-port=29185 interface=WG name=VDSina \ +> persistent-keepalive=10s public-key=\ +> "zuRsO+dL/j6awaBWZ/NgnHR+bCNUjRWbaHFpdzkNnw4=" +> /interface wireless cap +> # +> set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ +> caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ +> CAP-488F5A8E1ABC discovery-interfaces=Bridge-LAN enabled=yes interfaces=\ +> wlan2,wlan1 lock-to-caps-man=yes +> /ip address +> add address=10.30.30.81/24 interface=Bridge-LAN network=10.30.30.0 +> add address=10.8.0.2/24 interface=WG network=10.8.0.0 +> /ip cloud +> set update-time=no +> /ip dhcp-client +> add add-default-route=special-classless default-route-distance=2 \ +> default-route-tables=main:1 dhcp-options=clientid,clientid_duid \ +> interface="ether1 - Unet" name=client1 use-peer-dns=no use-peer-ntp=no +> /ip dhcp-server config +> set accounting=no +> /ip dhcp-server lease +> add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ +> 48:8F:5A:8E:EE:A8 server=masterDHCP +> add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ +> F0:DE:F1:91:0D:1E server=masterDHCP +> add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ +> 00:80:77:EC:43:86 server=masterDHCP +> add address=10.30.30.70 dhcp-option=domain-search-list,HostName \ +> dhcp-option-set=HP1505n mac-address=00:1E:0B:1A:88:8D server=masterDHCP +> add address=10.30.30.50 client-id=1:4:7c:16:36:f5:37 mac-address=\ +> 04:7C:16:36:F5:37 server=masterDHCP +> add address=10.30.30.71 client-id=1:10:2d:41:2c:20:c2 mac-address=\ +> 10:2D:41:2C:20:C2 server=masterDHCP +> add address=10.30.30.61 client-id=1:10:8:c1:81:59:5f mac-address=\ +> 10:08:C1:81:59:5F server=masterDHCP +> add address=10.30.30.72 client-id=1:10:38:1f:d2:5f:13 mac-address=\ +> 10:38:1F:D2:5F:13 server=masterDHCP +> add address=10.30.30.99 client-id=1:10:b1:df:e9:d0:d5 mac-address=\ +> 10:B1:DF:E9:D0:D5 server=masterDHCP +> add address=10.30.30.111 client-id=1:fe:2:52:be:3f:16 mac-address=\ +> FE:02:52:BE:3F:16 server=masterDHCP +> add address=10.30.30.92 client-id=1:d4:6d:6d:fd:e5:49 mac-address=\ +> D4:6D:6D:FD:E5:49 server=masterDHCP +> add address=10.30.30.93 client-id=1:7e:8b:1e:cb:b8:cb mac-address=\ +> CC:42:10:12:46:94 server=masterDHCP +> add address=10.30.30.94 client-id=1:50:cc:f8:85:96:a mac-address=\ +> 50:CC:F8:85:96:0A server=masterDHCP +> add address=10.30.30.82 client-id=1:e4:18:6b:58:34:ab mac-address=\ +> E4:18:6B:58:34:AB server=masterDHCP +> add address=10.30.30.75 client-id=1:0:27:15:41:97:a9 mac-address=\ +> 00:27:15:41:97:A9 server=masterDHCP +> add address=10.30.30.77 dhcp-option=HostName dhcp-option-set=StartLife1 \ +> mac-address=C4:82:E1:03:49:10 server=masterDHCP +> add address=10.30.30.73 client-id=1:10:38:1f:82:81:f2 mac-address=\ +> 10:38:1F:82:81:F2 server=masterDHCP +> add address=10.30.30.95 client-id=1:88:ae:dd:60:39:54 dhcp-option=HostName \ +> dhcp-option-set=VADOS-NUC mac-address=88:AE:DD:60:39:54 server=masterDHCP +> add address=10.30.30.98 client-id=1:c8:5b:76:d8:cc:bf dhcp-option=HostName \ +> dhcp-option-set=VADOS-LEN mac-address=C8:5B:76:D8:CC:BF server=masterDHCP +> add address=10.30.30.96 client-id=iPhone mac-address=4A:91:ED:0E:1F:39 \ +> server=masterDHCP +> add address=10.30.30.74 client-id=MiTV dhcp-option=HostName dhcp-option-set=\ +> MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP +> add address=10.30.30.30 dhcp-option=HostName dhcp-option-set=miller \ +> mac-address=F0:75:5D:1E:5F:71 server=masterDHCP +> add address=10.30.30.100 client-id=iVados dhcp-option=HostName \ +> dhcp-option-set=iVados mac-address=DE:4D:72:F3:1A:9F server=masterDHCP +> add address=10.30.30.10 allow-dual-stack-queue=yes client-id=\ +> ff:0:0:0:df:0:3:0:1:f0:75:5d:1e:5f:85 dhcp-option=HostName \ +> dhcp-option-set=MikroNUC mac-address=F0:75:5D:1E:5F:85 server=masterDHCP \ +> use-src-mac=yes +> /ip dhcp-server network +> add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ +> domain-search-list dhcp-option-set=domain-search-set dns-server=\ +> 10.30.30.33,109.107.177.79 domain=WORKGROUP gateway=10.30.30.81 netmask=\ +> 24 ntp-server=10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +> /ip dns +> set allow-remote-requests=yes cache-max-ttl=1d doh-max-concurrent-queries=100 \ +> doh-max-server-connections=20 servers=10.30.30.33,8.8.8.8 \ +> verify-doh-cert=yes +> /ip dns static +> add address=109.107.177.79 comment="VDSina Server DNS" name=ns1.vados.ru \ +> type=A +> add address=109.107.177.79 name=vds.vados.ru type=A +> add comment="Local DNS server for vados.ru" disabled=yes ns=10.30.30.81 \ +> regexp=*.vados.ru type=NS +> add comment="*.vados.ru Regexp" disabled=yes forward-to=10.30.30.81 regexp=\ +> "\".*\\\\.vados\\\\.ru\"" type=FWD +> add comment="*.30.30.10.in-addr.arpa Regexp" disabled=yes forward-to=\ +> 10.30.30.81 regexp="\".*\\\\.30\\\\.30\\\\.10\\\\.in-addr\\\\.arpa" type=\ +> FWD +> add address=10.30.30.81 comment=NS.vados.ru.local disabled=yes name=\ +> ns.vados.ru.local type=A +> add comment="DNS ns.vados.ru.local" disabled=yes match-subdomain=yes name=\ +> vados.ru ns=ns.vados.ru.local type=NS +> add address=10.30.30.33 comment=reg.vados.ru name=reg.vados.ru type=A +> add address=8.8.8.8 comment="Google-dns IPv4 1" match-subdomain=yes name=\ +> dns.google type=A +> add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +> add address=10.30.30.33 comment=AMSTER name=amster.vados.ru type=A +> add address=10.30.30.33 name=ros.vados.ru type=A +> add address=10.30.30.95 name=vados-nuc type=A +> add address=10.30.30.33 name=amster-nuc type=A +> add address=10.30.30.33 name=amster type=A +> add address=10.30.30.33 name=amster-reg type=A +> add address=10.30.30.33 disabled=yes name=mng.vados.ru type=A +> add address=10.30.30.33 name=mgr.vados.ru type=A +> add address=10.30.30.33 name=prt.vados.ru type=A +> add address=10.30.30.33 disabled=yes match-subdomain=yes name=\ +> mikrots.vados.ru type=A +> add address=10.30.30.30 comment=MILLER name=miller.vados.ru type=A +> add address=10.30.30.30 name=MILLER-LEN type=A +> add address=10.30.30.30 name=miller type=A +> add address=1.0.0.1 comment="CloudFlare-doh IPv4 2" disabled=yes name=\ +> security.cloudflare-dns.com type=A +> add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" disabled=yes name=\ +> security.cloudflare-dns.com type=A +> add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ +> dns.quad9.net type=A +> add address=149.112.112.112 comment="Cuad9-dns IPv4 2" disabled=yes name=\ +> dns.quad9.net type=A +> add address=195.133.25.16 comment="DNS Comss" disabled=yes name=dns.comss.one \ +> type=A +> add address=10.30.30.81 comment=LocalNet name=MikroVados type=A +> add address=10.30.30.10 name=MikroNUC type=A +> add address=10.30.30.86 disabled=yes name=MikroYellow type=A +> add address=10.30.30.85 disabled=yes name=MikroMic type=A +> add address=10.30.30.95 name=VADOS-NUC type=A +> add address=10.30.30.98 name=VADOS-LEN type=A +> add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ +> A +> add address=10.30.30.20 disabled=yes name=garage type=A +> /ip firewall address-list +> add address=91.215.120.206 list=TRUSTED +> add address=185.71.70.78 disabled=yes list=TRUSTED +> add address=176.53.203.171 disabled=yes list=TRUSTED +> add address=176.53.203.170 disabled=yes list=TRUSTED +> add address=176.53.202.194 disabled=yes list=TRUSTED +> add address=8.8.4.0/24 list=YouTube +> add address=8.8.8.0/24 list=YouTube +> add address=8.34.208.0/20 list=YouTube +> add address=8.35.192.0/20 list=YouTube +> add address=23.236.48.0/20 list=YouTube +> add address=23.251.128.0/19 list=YouTube +> add address=34.0.0.0/15 list=YouTube +> add address=34.2.0.0/16 list=YouTube +> add address=34.3.0.0/23 list=YouTube +> add address=34.3.3.0/24 list=YouTube +> add address=34.3.4.0/24 list=YouTube +> add address=34.3.8.0/21 list=YouTube +> add address=34.3.16.0/20 list=YouTube +> add address=34.3.32.0/19 list=YouTube +> add address=34.3.64.0/18 list=YouTube +> add address=34.4.0.0/14 list=YouTube +> add address=34.8.0.0/13 list=YouTube +> add address=34.16.0.0/12 list=YouTube +> add address=34.32.0.0/11 list=YouTube +> add address=34.64.0.0/10 list=YouTube +> add address=34.128.0.0/10 list=YouTube +> add address=35.184.0.0/13 list=YouTube +> add address=35.192.0.0/14 list=YouTube +> add address=35.196.0.0/15 list=YouTube +> add address=35.198.0.0/16 list=YouTube +> add address=35.199.0.0/17 list=YouTube +> add address=35.199.128.0/18 list=YouTube +> add address=35.200.0.0/13 list=YouTube +> add address=35.208.0.0/12 list=YouTube +> add address=35.224.0.0/12 list=YouTube +> add address=35.240.0.0/13 list=YouTube +> add address=57.140.192.0/18 list=YouTube +> add address=64.15.112.0/20 list=YouTube +> add address=64.233.160.0/19 list=YouTube +> add address=66.22.228.0/23 list=YouTube +> add address=66.102.0.0/20 list=YouTube +> add address=66.249.64.0/19 list=YouTube +> add address=70.32.128.0/19 list=YouTube +> add address=72.14.192.0/18 list=YouTube +> add address=74.125.0.0/16 list=YouTube +> add address=104.154.0.0/15 list=YouTube +> add address=104.196.0.0/14 list=YouTube +> add address=104.237.160.0/19 list=YouTube +> add address=107.167.160.0/19 list=YouTube +> add address=107.178.192.0/18 list=YouTube +> add address=108.59.80.0/20 list=YouTube +> add address=108.170.192.0/18 list=YouTube +> add address=108.177.0.0/17 list=YouTube +> add address=130.211.0.0/16 list=YouTube +> add address=136.22.160.0/20 list=YouTube +> add address=136.22.176.0/21 list=YouTube +> add address=136.22.184.0/23 list=YouTube +> add address=136.22.186.0/24 list=YouTube +> add address=142.250.0.0/15 list=YouTube +> add address=146.148.0.0/17 list=YouTube +> add address=152.65.208.0/22 list=YouTube +> add address=152.65.214.0/23 list=YouTube +> add address=152.65.218.0/23 list=YouTube +> add address=152.65.222.0/23 list=YouTube +> add address=152.65.224.0/19 list=YouTube +> add address=162.120.128.0/17 list=YouTube +> add address=162.216.148.0/22 list=YouTube +> add address=162.222.176.0/21 list=YouTube +> add address=172.110.32.0/21 list=YouTube +> add address=172.217.0.0/16 list=YouTube +> add address=172.253.0.0/16 list=YouTube +> add address=173.194.0.0/16 list=YouTube +> add address=173.255.112.0/20 list=YouTube +> add address=192.158.28.0/22 list=YouTube +> add address=192.178.0.0/15 list=YouTube +> add address=193.186.4.0/24 list=YouTube +> add address=199.36.154.0/23 list=YouTube +> add address=199.36.156.0/24 list=YouTube +> add address=199.192.112.0/22 list=YouTube +> add address=199.223.232.0/21 list=YouTube +> add address=207.223.160.0/20 list=YouTube +> add address=208.65.152.0/22 list=YouTube +> add address=208.68.108.0/22 list=YouTube +> add address=208.81.188.0/22 list=YouTube +> add address=208.117.224.0/19 list=YouTube +> add address=209.85.128.0/17 list=YouTube +> add address=216.58.192.0/19 list=YouTube +> add address=216.73.80.0/20 list=YouTube +> add address=216.239.32.0/19 list=YouTube +> add address=2ip.ru list=Test-IP +> add address=wg.vados.ru comment=VDSIna list=TRUSTED +> add address=10.8.0.0/24 comment="WG VDSIna" disabled=yes list=TRUSTED +> add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +> add address=love.ru comment=love.ru list=NoVdsina +> add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +> add address=pochta.ru comment=pochta.ru list=NoVdsina +> add address=vdsina.com list=NoVdsina +> add address=vdsina.ru list=NoVdsina +> add address=youla.ru list=NoVdsina +> add address=kupiprodai.ru list=NoVdsina +> add address=myip.ru list=Test-IP +> add address=geoip.co list=NoVdsina +> add address=comp-lenta.ru list=NoVdsina +> add address=128.85.102.70 comment=update.microsoft.com list=\ +> windowsupdateslist +> add address=wu-b-net.trafficmanager.net. comment=\ +> ctldl.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +> add address=ctldl.windowsupdate.com.delivery.microsoft.com. comment=\ +> ctldl.windowsupdate.com list=windowsupdateslist +> add address=redir.update.msft.com.trafficmanager.net. comment=\ +> update.microsoft.com list=windowsupdateslist +> add address=geo.prod.do.dsp.trafficmanager.net. comment=\ +> geo.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=13.74.139.29 comment=array605.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=kv801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> kv801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=e12437.d.akamaiedge.net. comment=\ +> kv801.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +> add address=displaycatalog-rp.md.mp.microsoft.com.akadns.net. comment=\ +> displaycatalog.mp.microsoft.com list=windowsupdateslist +> add address=rp-consumer-prod-displaycatalog-geomap.trafficmanager.net. \ +> comment=displaycatalog-rp.md.mp.microsoft.com.akadns.net list=\ +> windowsupdateslist +> add address=sls.update.microsoft.com. comment=slscr.update.microsoft.com \ +> list=windowsupdateslist +> add address=glb.sls.prod.dcat.dsp.trafficmanager.net. comment=\ +> sls.update.microsoft.com list=windowsupdateslist +> add address=fe3.delivery.mp.microsoft.com. comment=\ +> fe3cr.delivery.mp.microsoft.com list=windowsupdateslist +> add address=glb.cws.prod.dcat.dsp.trafficmanager.net. comment=\ +> fe3.delivery.mp.microsoft.com list=windowsupdateslist +> add address=fe2cr.update.msft.com.trafficmanager.net. comment=\ +> fe2cr.update.microsoft.com list=windowsupdateslist +> add address=download.windowsupdate.com.delivery.microsoft.com. comment=\ +> download.windowsupdate.com list=windowsupdateslist +> add address=wu-f-net.trafficmanager.net. comment=\ +> download.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +> add address=tsfe.trafficmanager.net. comment=\ +> tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +> add address=edge.ds-c7110-microsoft.global.dns.qwilted-cds.cqloud.com. \ +> comment=9.au.download.windowsupdate.com list=windowsupdateslist +> add address=52.158.227.125 comment=array812.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=au.download.windowsupdate.com.delivery.microsoft.com. comment=\ +> au.download.windowsupdate.com list=windowsupdateslist +> add address=a767.dspw65.akamai.net. comment=\ +> download.windowsupdate.com.edgesuite.net list=windowsupdateslist +> add address=52.151.58.88 comment=array810.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net. \ +> comment=licensing.mp.microsoft.com list=windowsupdateslist +> add address=licensing-prod-frontdoor-geomap.trafficmanager.net. comment=\ +> consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net list=\ +> windowsupdateslist +> add address=star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedge.f.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=cdp-f-nlu-net.trafficmanager.net. comment=\ +> star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedge.b.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=cdp-f-tlu-net.trafficmanager.net. comment=\ +> star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=storeedgefd.xbetservices.akadns.net. comment=\ +> storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +> add address=\ +> storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net. \ +> comment=storeedgefd.dsx.mp.microsoft.com.edgekey.net list=\ +> windowsupdateslist +> add address=e16646.dscg.akamaiedge.net. comment=\ +> storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net list=\ +> windowsupdateslist +> add address=40.69.76.189 comment=array621.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=bg.microsoft.map.fastly.net. comment=\ +> 3.au.download.windowsupdate.com list=windowsupdateslist +> add list=windowsupdateslist +> add address=40.69.75.33 comment=array613.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com list=\ +> windowsupdateslist +> add address=cdp-f-ssl-tlu-net.trafficmanager.net. comment=\ +> star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=a2033.dscd.akamai.net. comment=\ +> star.sb.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ +> windowsupdateslist +> add address=13.74.138.242 comment=array602.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ +> dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=dcat-f-nlu-net.trafficmanager.net. comment=\ +> dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=1D.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=dcat-b-tlu-net.trafficmanager.net. comment=\ +> 1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=a122.dscg3.akamai.net. comment=\ +> tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=windowsupdateslist +> add address=geover.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> geover.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=e10370.d.akamaiedge.net. comment=\ +> geover.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +> add address=52.232.182.21 comment=array511.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.70.77.95 comment=array519.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=a1683.dscd.akamai.net. comment=\ +> dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +> add address=consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net. \ +> comment=collections.mp.microsoft.com list=windowsupdateslist +> add address=a1847.dscd.akamai.net. comment=\ +> wildcard.f.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ +> windowsupdateslist +> add address=13.74.142.6 comment=array607.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=au.download.windowsupdate.com.edgesuite.net. comment=\ +> 2.au.download.windowsupdate.com list=windowsupdateslist +> add address=a767.dscg3.akamai.net. comment=\ +> au.download.windowsupdate.com.edgesuite.net list=windowsupdateslist +> add address=52.156.123.84 comment=array818.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.69.78.254 comment=array610.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=4.au.download.windowsupdate.com.delivery.microsoft.com. comment=\ +> 4.au.download.windowsupdate.com list=windowsupdateslist +> add address=cl-glcb907925.gcdn.co. comment=\ +> 4.au.download.windowsupdate.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.167.111 comment=array510.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=40.69.70.43 comment=array623.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com. \ +> comment=tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +> add address=ts-frontend.trafficmanager.net. comment=\ +> tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=40.69.75.248 comment=array616.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.69.74.84 comment=array615.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=sds.trafficmanager.net. comment=software-download.microsoft.com \ +> list=windowsupdateslist +> add address=40.69.74.80 comment=array611.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.175.242.182 comment=array804.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=dlc-shim.trafficmanager.net. comment=download.microsoft.com list=\ +> windowsupdateslist +> add address=e12671.dscd.akamaiedge.net. comment=\ +> download.microsoft.com.edgekey.net list=windowsupdateslist +> add address=20.187.55.34 comment=array808.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.167.231 comment=array513.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=52.167.222.13 comment=array518.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=kv601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> kv601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=e12358.d.akamaiedge.net. comment=\ +> kv601.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +> add address=tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ +> tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=dcat-f-tlu-net.trafficmanager.net. comment=\ +> tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=a1856.dspw65.akamai.net. comment=\ +> tlu.dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +> add address=52.167.164.252 comment=array506.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=13.74.137.54 comment=array601.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=kv501.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> kv501.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=collections-prod-frontdoor-geomap.trafficmanager.net. comment=\ +> consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net list=\ +> windowsupdateslist +> add address=52.167.160.173 comment=array509.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=40.70.77.148 comment=array516.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.200.126 comment=array507.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=52.167.167.59 comment=array508.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.69.76.172 comment=array620.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +> add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ +> list=windowsupdateslist +> add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ +> purchase.mp.microsoft.com list=windowsupdateslist +> add address=e110219.a.akamaiedge.net. comment=\ +> purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +> add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.141 list=windowsupdateslist +> add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=storesdk.xbetservices.akadns.net. comment=\ +> storesdk.dsx.mp.microsoft.com list=windowsupdateslist +> add address=e16646.g.akamaiedge.net. comment=\ +> storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +> add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ +> software-download.microsoft.com list=windowsupdateslist +> add address=download.prss.microsoft.com.akamaized.net. comment=\ +> software-download.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ +> windowsupdateslist +> add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +> add address=87.250.250.50 comment=YandexDisk list=NoVdsina +> add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ +> displaycatalog.mp.microsoft.com list=windowsupdateslist +> add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ +> purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +> add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ +> purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +> add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ +> cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +> add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=a1996.dscd.akamai.net. comment=\ +> wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ +> windowsupdateslist +> add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ +> tas02.sls.update.microsoft.com list=windowsupdateslist +> add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ +> windowsupdateslist +> add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ +> comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +> add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ +> star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ +> windowsupdateslist +> add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ +> paymentinstruments.mp.microsoft.com list=windowsupdateslist +> add address=10.30.30.33 comment=amster disabled=yes list=NoWG +> add address=10.30.30.10 comment=MikroNUC disabled=yes list=NoWG +> add address=89.110.101.17 comment=!!!VDSINA!!!! disabled=yes list=NoWG +> add address=wg.vados.ru comment=VDSina-vpn list=VDSina +> add address=80.85.244.9 list=TRUSTED +> add address=disc801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ +> disc801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +> add address=185.71.70.78 disabled=yes list=TRUSTED +> add address=176.53.203.171 disabled=yes list=TRUSTED +> add address=176.53.203.170 disabled=yes list=TRUSTED +> add address=176.53.202.194 disabled=yes list=TRUSTED +> add address=89.110.101.17 comment="!!!VDSina Server!!!" list=NoVdsina +> add address=dns.quad9.net comment=Quad9-dns disabled=yes list=Trusted-DNS +> add address=dns.google comment=Google-dns list=Trusted-DNS +> add address=security.cloudflare-dns.com comment=CloudFlare-dns list=\ +> Trusted-DNS +> add address=time.google.com comment=Google-time list=Trusted-NTP +> add address=0.ru.pool.ntp.org comment=ru.pool.ntp.org disabled=yes list=\ +> Trusted-NTP +> add address=1.ru.pool.ntp.org disabled=yes list=Trusted-NTP +> add address=2.ru.pool.ntp.org comment=2.ru.pool.ntp.org disabled=yes list=\ +> Trusted-NTP +> add address=3.ru.pool.ntp.org comment=3.ru.pool.ntp.org disabled=yes list=\ +> Trusted-NTP +> add address=cp.vdsina.com comment=VDSina-vpn list=VDSina +> add address=vdsina.ru comment=VDSina-vpn list=VDSina +> add address=ns.vados.ru comment=VDSina-vpn list=VDSina +> add address=vdsina.com comment=VDSina-vpn list=VDSina +> add address=cp.vdsina.ru comment=VDSina-vpn list=VDSina +> add address=ns1.vdsina.ru comment=VDSina-vpn list=VDSina +> add address=10.30.30.0/24 comment="Local Network" list=Local-Net +> add address=10.8.0.0/24 comment="WireGuard Network" list=Local-Net +> add address=146.120.64.208/29 comment="External Net" list=Unet +> add address=esia.gosuslugi.ru comment=esia.gosuslugi.ru list=NoVdsina +> add address=lk.gosuslugi.ru comment=lk.gosuslugi.ru list=NoVdsina +> add address=trudvsem.ru comment=trudvsem.ru list=NoVdsina +> add address=10.30.30.30 comment=miller disabled=yes list=NoWG +> add address=10.30.30.33 comment="Direct connet to DNS servers" list=\ +> Direct-DNS +> add address=109.107.177.79 list=VPN-Server +> add address=10.30.30.10 list=AWG-Proxy +> /ip firewall filter +> add action=add-src-to-address-list address-list="Honeypot Hacker" \ +> address-list-timeout=12h chain=input comment="block honeypot DNS" \ +> connection-state=new dst-port=53 in-interface="ether1 - Unet" protocol=\ +> udp src-address-list=!Trusted-DNS +> add action=add-src-to-address-list address-list="Honeypot Hacker" \ +> address-list-timeout=4w2d chain=input connection-state=new dst-port=53 \ +> in-interface="ether1 - Unet" protocol=tcp src-address-list=!Trusted-DNS +> add action=add-src-to-address-list address-list="Honeypot Hacker" \ +> address-list-timeout=4w2d chain=input comment=\ +> "block honeypot ssh rdp winbox" connection-state=new dst-port=22,8291 \ +> in-interface="ether1 - Unet" protocol=tcp src-address-list=!TRUSTED +> add action=add-src-to-address-list address-list="Honeypot Hacker" \ +> address-list-timeout=4w2d chain=input comment="block honeypot asterisk" \ +> connection-state=new dst-port=5060 in-interface="ether1 - Unet" protocol=\ +> udp +> add action=add-src-to-address-list address-list="Honeypot Hacker" \ +> address-list-timeout=4w2d chain=input comment="block honeypot NTP" \ +> connection-state=new dst-port=123 in-interface="ether1 - Unet" protocol=\ +> udp +> add action=fasttrack-connection chain=forward comment=\ +> "FastTrack for non-VPN connections" connection-mark=!VPN_No_FastTrack \ +> connection-state=established,related,new disabled=yes +> add action=accept chain=input disabled=yes dst-port=29185 in-interface=\ +> "ether1 - Unet" protocol=tcp +> add action=accept chain=input disabled=yes dst-port=29185 in-interface=\ +> "ether1 - Unet" protocol=udp +> add action=accept chain=input comment="tcp Accept input DNS queries from LAN" \ +> dst-port=53 protocol=tcp src-address=10.30.30.0/24 +> add action=accept chain=input comment="udp Accept input DNS queries" \ +> dst-port=53 protocol=udp src-address=10.30.30.0/24 +> add action=accept chain=output comment="accept WireGuard" disabled=yes \ +> dst-address-list=VPN-Server out-interface="ether1 - Unet" protocol=udp \ +> src-port=13231 +> add action=accept chain=output disabled=yes dst-address-list=VPN-Server \ +> dst-port=29185 out-interface="ether1 - Unet" protocol=udp +> add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \ +> connection-state=established,related,new disabled=yes routing-mark=\ +> !To-VPN +> add action=accept chain=output disabled=yes protocol=tcp src-port=443 +> add action=accept chain=output disabled=yes src-address=127.0.0.1 +> add action=accept chain=forward comment="defconf: accept in ipsec policy" \ +> disabled=yes ipsec-policy=in,ipsec +> add action=accept chain=forward comment="defconf: accept out ipsec policy" \ +> disabled=yes ipsec-policy=out,ipsec +> add action=accept chain=forward comment=\ +> "defconf: accept established,related, untracked" connection-state=\ +> established,related,untracked +> add action=drop chain=forward comment="defconf: drop invalid" \ +> connection-state=invalid in-interface="ether1 - Unet" src-address=\ +> !10.30.30.0/24 +> add action=drop chain=forward comment=\ +> "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ +> connection-state=new in-interface="ether1 - Unet" src-address-list=\ +> !VDSina +> add action=drop chain=forward comment=\ +> "Filter Rule to block FB address LIST : )" disabled=yes dst-address-list=\ +> facebook +> add action=drop chain=forward comment=\ +> "Filter Rule to block YOUTUBE address LIST : )" disabled=yes \ +> dst-address-list=YouTube +> add action=accept chain=input in-interface="ether1 - Unet" protocol=icmp \ +> src-address-list=VDSina +> add action=accept chain=input connection-state=established disabled=yes +> add action=accept chain=input connection-state=related disabled=yes +> /ip firewall mangle +> add action=mark-routing chain=prerouting comment="Mark Routing main for NoWG" \ +> new-routing-mark=main src-address-list=NoWG +> add action=mark-routing chain=prerouting comment=\ +> "Mark Routing main for NoVdsina" dst-address-list=NoVdsina \ +> new-routing-mark=main src-address=10.30.30.0/24 +> add action=mark-routing chain=prerouting comment=\ +> "Mark Routing main for VDSina" dst-address-list=VPN-Server \ +> new-routing-mark=main src-address=10.30.30.0/24 +> add action=mark-routing chain=prerouting comment=\ +> "Mark Routing main for MikroNuc" disabled=yes dst-address-list=AWG-Proxy \ +> new-routing-mark=main src-address=10.30.30.0/24 +> add action=mark-routing chain=prerouting comment=\ +> "!!!ERROR Mark Routing main for Unet!!!" disabled=yes dst-address-list=\ +> Unet new-routing-mark=main passthrough=no +> add action=mark-routing chain=prerouting comment="Test-IP sites" disabled=yes \ +> dst-address=!10.30.30.0/24 dst-address-list=Test-IP new-routing-mark=\ +> To-VPN src-address=10.30.30.0/24 +> add action=mark-routing chain=prerouting comment=FuckRKN disabled=yes \ +> dst-address=!10.30.30.0/24 dst-address-list=RKN-dnsLookup \ +> new-routing-mark=To-VPN passthrough=no src-address=10.30.30.0/24 +> add action=mark-routing chain=prerouting comment="AWG for All sites" \ +> disabled=yes dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina \ +> new-routing-mark=*401 routing-mark=!main src-address=10.30.30.0/24 \ +> src-address-list=!NoWG +> add action=mark-routing chain=prerouting comment="VDSIna for All sites" \ +> dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina new-routing-mark=\ +> To-VPN routing-mark=!main src-address=10.30.30.0/24 src-address-list=\ +> !NoWG +> add action=mark-connection chain=prerouting comment=\ +> "Mark VPN connections to exclude from FastTrack" new-connection-mark=\ +> VPN_No_FastTrack routing-mark=To-VPN +> add action=change-mss chain=forward comment="MSS on WG" new-mss=1380 \ +> out-interface=WG protocol=tcp routing-mark=To-VPN tcp-flags=syn tcp-mss=\ +> 1381-65535 +> add action=mark-routing chain=prerouting comment="VPN Network" dst-address=\ +> 10.8.0.0/24 new-routing-mark=To-VPN src-address=10.30.30.0/24 +> /ip firewall nat +> add action=redirect chain=dstnat comment="udp Redirect DNS in NAT" disabled=\ +> yes dst-port=53 protocol=udp src-address=10.30.30.0/24 src-address-list=\ +> !NoWG to-addresses=10.30.30.33 to-ports=53 +> add action=redirect chain=dstnat comment="tcp Redirect DNS in NAT" disabled=\ +> yes dst-port=53 protocol=tcp src-address=10.30.30.0/24 src-address-list=\ +> !NoWG to-addresses=10.30.30.33 to-ports=53 +> add action=dst-nat chain=dstnat comment=\ +> "53/tcp dst-nat to amster.loc. From VDSina Server" dst-port=53 \ +> in-interface="ether1 - Unet" protocol=tcp src-address-list=VPN-Server \ +> to-addresses=10.30.30.33 to-ports=53 +> add action=dst-nat chain=dstnat comment=\ +> "53/udp dst-nat to amster.loc. From VDSina Server" dst-port=53 protocol=\ +> udp src-address-list=VPN-Server to-addresses=10.30.30.33 to-ports=53 +> add action=dst-nat chain=dstnat disabled=yes dst-port=44333 in-interface=\ +> "ether1 - Unet" protocol=udp src-address=!10.30.30.0/24 to-addresses=\ +> 10.30.30.33 to-ports=44333 +> add action=masquerade chain=srcnat comment="Default NAT" out-interface=\ +> "ether1 - Unet" routing-mark=!To-VPN src-address=10.30.30.0/24 +> add action=dst-nat chain=dstnat comment=amster.vados.ruhttps dst-port=443 \ +> fragment=no in-interface="ether1 - Unet" protocol=tcp routing-mark=main \ +> to-addresses=10.30.30.33 to-ports=443 +> add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ +> dst-port=80 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ +> 10.30.30.33 to-ports=80 +> add action=dst-nat chain=dstnat comment="amster.vados.ru 3x-ui" disabled=yes \ +> dst-port=2904 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ +> 10.30.30.33 to-ports=2904 +> add action=dst-nat chain=dstnat comment=reg.vados.ru disabled=yes dst-port=\ +> 5000 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ +> to-ports=5000 +> add action=dst-nat chain=dstnat comment="Docker swarm" disabled=yes dst-port=\ +> 2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ +> to-ports=2377 +> add action=dst-nat chain=dstnat comment=npm dst-port=81 in-interface=\ +> "ether1 - Unet" protocol=tcp routing-mark=To-VPN to-addresses=10.30.30.33 \ +> to-ports=81 +> add action=dst-nat chain=dstnat comment=SSH dst-port=22 in-interface=\ +> "ether1 - Unet" protocol=tcp src-address-list=TRUSTED to-addresses=\ +> 10.30.30.33 to-ports=22 +> add action=dst-nat chain=dstnat comment="portainer agent" disabled=yes \ +> dst-port=2377 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ +> 10.30.30.33 to-ports=2377 +> add action=dst-nat chain=dstnat disabled=yes dst-port=22 in-interface=\ +> "ether1 - Unet" protocol=tcp routing-mark=!To-VPN to-addresses=\ +> 10.30.30.33 to-ports=22 +> add action=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ +> out-interface=WG routing-mark=To-VPN src-address-list=!NoWG +> add action=dst-nat chain=dstnat comment="Yandex.DNS Family" disabled=yes \ +> dst-port=53 in-interface=Bridge-LAN protocol=udp src-address-list=KIDS \ +> time=6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +> add action=dst-nat chain=dstnat disabled=yes dst-port=53 in-interface=\ +> Bridge-LAN protocol=tcp src-address-list=KIDS time=\ +> 6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +> /ip firewall raw +> add action=drop chain=prerouting comment="Drop Honeypot Hackers" \ +> in-interface="ether1 - Unet" src-address-list="Honeypot Hacker" +> add action=accept chain=prerouting comment="Trusted DNS" disabled=yes \ +> in-interface-list=WAN src-address-list=Trusted-DNS +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> extras.getpagespeed.com content=extras.getpagespeed.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=linux.duke.edu \ +> content=linux.duke.edu disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=youtube.com \ +> disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=\ +> googleapis.com disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=ggpht.com \ +> disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=youtu.be \ +> disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=ytimg.com \ +> disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=\ +> googlevideo.com disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=gstatic.com \ +> disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=\ +> googleusercontent.com disabled=yes +> add action=add-dst-to-address-list address-list=FuckRKN address-list-timeout=\ +> none-dynamic chain=prerouting comment="YouTube raw" content=\ +> nhacmp3youtube.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ +> content=rutube.ru disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment="me.com raw" \ +> content=me.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> "icloud.com raw" content=icloud.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> "smtp.mail.me.com raw" content=smtp.mail.me.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> "smtp.mail.me.com.akadns.net raw" content=smtp.mail.me.com.akadns.net \ +> disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> "api.db-ip.com raw" content=api.db-ip.com disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=\ +> esia.gosuslugi.ru content=esia.gosuslugi.ru disabled=yes +> add action=add-dst-to-address-list address-list=NoVdsina \ +> address-list-timeout=none-dynamic chain=prerouting comment=gosuslugi.ru \ +> content=gosuslugi.ru disabled=yes +> /ip firewall service-port +> set ftp disabled=yes +> set tftp disabled=yes +> set irc disabled=no +> set sip disabled=yes +> set pptp disabled=yes +> set rtsp disabled=no +> /ip ipsec settings +> set accounting=no +> /ip ipsec policy +> set 0 disabled=yes dst-address=0.0.0.0/0 src-address=0.0.0.0/0 +> /ip ipsec profile +> set [ find default=yes ] dpd-interval=2m dpd-maximum-failures=5 +> /ip proxy +> set cache-administrator="" max-cache-size=none port=80,443 src-address=\ +> 0.0.0.0 +> /ip route +> add check-gateway=none disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\ +> WG routing-table=To-VPN scope=30 target-scope=10 +> /ip service +> set ftp disabled=yes +> set telnet disabled=yes +> set reverse-proxy disabled=yes +> set ssh address=10.30.30.0/24 port=2222 +> set winbox address=10.30.30.0/24 +> set api address=10.30.30.0/24 +> set api-ssl address=10.30.30.0/24 disabled=yes +> set www-ssl certificate=Root-YE port=18443 +> set www address=10.30.30.0/24 disabled=yes port=18880 +> /ip service webserver +> set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ +> no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ +> webfig-secure=no +> /ip ssh +> set forwarding-enabled=both publickey-authentication-options=verify-required +> /ip upnp +> set enabled=yes +> /ip upnp interfaces +> add interface=Bridge-LAN type=internal +> add forced-ip=146.120.64.211 interface="ether1 - Unet" type=external +> add forced-ip=109.107.177.79 interface=*E type=external +> add interface=lo type=internal +> add interface=wlan2 type=internal +> add interface=wlan1 type=internal +> /ipv6 dhcp-client +> add add-default-route=yes disabled=yes interface=*F rapid-commit=no request=\ +> info use-interface-duid=yes validate-server-duid=no +> /ipv6 dhcp-server option sets +> add name=domain-search-set options=domain-search-list +> add name="=\"Client ID\"" options=HostName +> /ipv6 firewall address-list +> add address=::/128 comment="defconf: unspecified address" list=bad_ipv6 +> add address=::1/128 comment="defconf: lo" list=bad_ipv6 +> add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6 +> add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6 +> add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6 +> add address=100::/64 comment="defconf: discard only " list=bad_ipv6 +> add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6 +> add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6 +> add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6 +> /ipv6 firewall filter +> add action=accept chain=input comment=\ +> "defconf: accept established,related,untracked" connection-state=\ +> established,related,untracked +> add action=drop chain=input comment="defconf: drop invalid" connection-state=\ +> invalid +> add action=accept chain=input comment="defconf: accept ICMPv6" protocol=\ +> icmpv6 +> add action=accept chain=input comment="defconf: accept UDP traceroute" \ +> dst-port=33434-33534 protocol=udp +> add action=accept chain=input comment=\ +> "defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\ +> udp src-address=fe80::/10 +> add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \ +> protocol=udp +> add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\ +> ipsec-ah +> add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\ +> ipsec-esp +> add action=accept chain=input comment=\ +> "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +> add action=drop chain=input comment=\ +> "defconf: drop everything else not coming from LAN" in-interface-list=\ +> !LAN +> add action=accept chain=forward comment=\ +> "defconf: accept established,related,untracked" connection-state=\ +> established,related,untracked +> add action=drop chain=forward comment="defconf: drop invalid" \ +> connection-state=invalid +> add action=drop chain=forward comment=\ +> "defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6 +> add action=drop chain=forward comment=\ +> "defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6 +> add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \ +> hop-limit=equal:1 protocol=icmpv6 +> add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\ +> icmpv6 +> add action=accept chain=forward comment="defconf: accept HIP" protocol=139 +> add action=accept chain=forward comment="defconf: accept IKE" dst-port=\ +> 500,4500 protocol=udp +> add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\ +> ipsec-ah +> add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\ +> ipsec-esp +> add action=accept chain=forward comment=\ +> "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec +> add action=drop chain=forward comment=\ +> "defconf: drop everything else not coming from LAN" in-interface-list=\ +> !LAN +> /ipv6 nd +> set [ find default=yes ] advertise-dns=yes disabled=yes interface=Bridge-LAN \ +> managed-address-configuration=yes other-configuration=yes pref64=::/64 +> /ipv6 nd prefix +> add autonomous=no disabled=yes interface=Bridge-LAN on-link=no prefix=none +> /ipv6 nd prefix default +> set dhcp6-pd-preferred=yes +> /ipv6 nd proxy +> add disabled=yes interface=lo +> /ipv6 nd settings +> set router-advertisement-route-distance=100 +> /routing settings +> set single-process=no +> /system clock +> set time-zone-name=Europe/Moscow +> /system clock manual +> set time-zone=+03:00 +> /system identity +> set name=MikroMaster +> /system logging +> add action=email disabled=yes regex="* added|changed|removed *" topics=\ +> system,info +> /system ntp client +> set enabled=yes +> /system ntp server +> set enabled=yes manycast=yes multicast=yes use-local-clock=yes +> /system ntp client servers +> add address=0.ru.pool.ntp.org +> add address=1.ru.pool.ntp.org +> add address=2.ru.pool.ntp.org +> add address=3.ru.pool.ntp.org +> add address=time.google.com disabled=yes +> /system package update +> set check-certificate=yes-without-crl ip-version=ipv4 +> /system scheduler +> add comment="Every Day Set Global Environment Variables" name=AM-SetGlobalEnv \ +> on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> start-time=startup +> add comment="Every Day Check For Update Scripts" interval=1d name=\ +> AM-ScriptInstallUpdate on-event=\ +> ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> start-time=startup +> add comment="Update RKN DNS Looup" disabled=yes interval=20m name=\ +> AM-RKN-dnsLookup on-event="/system/script { run AM-RKN-dnsLookup; }" \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> start-time=startup +> /system watchdog +> set watchdog-timer=no +> /tool e-mail +> set certificate-verification=no from=MikroVados port=587 \ +> server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +> /tool mac-server +> set allowed-interface-list=LAN +> /tool mac-server mac-winbox +> set allowed-interface-list=LAN +> /tool netwatch +> add certificate=DigiCert-Global-Root-CA check-certificate=no comment="doh, doh\ +> -url=https://security.cloudflare-dns.com/dns-query, notify, name=CloudFlar\ +> e-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 http-codes="" \ +> interval=10s name="CloudFlare-doh IPv4 1" port=443 test-script="" type=\ +> https-get up-script="" +> add check-certificate=no comment="doh-fallback, doh-url=https://security.cloud\ +> flare-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Cl\ +> oudFlare-doh IPv4" disabled=yes down-script="" host=1.0.0.1 http-codes="" \ +> name="CloudFlare-doh IPv4" port=443 test-script="" type=https-get \ +> up-script="" +> add comment="dns, notify, name=Google-DNS IPv4" disabled=yes dns-server=\ +> 8.8.8.8 down-script="" host=dns.google http-codes="" name=\ +> "Google-DNS IPv4" test-script="" type=dns up-script="" +> add certificate=GTS-Root-R4 check-certificate=yes comment="doh-fallback, doh-u\ +> rl=https://dns.google/dns-query, doh-cert=GTS Root R1, notify, name=Google\ +> -DOH IPv4" disabled=yes dns-server=8.8.4.4 down-script="" host=dns.google \ +> http-codes="" name="Google-DOH IPv4" port=443 record-type=NS src-address=\ +> "" test-script="" type=dns up-script="" +> add comment="dns-fallback, notify, name=Cuad9-DOH IPv4" disabled=yes \ +> dns-server=9.9.9.9 down-script="" host=dns9.quad9.net http-codes="" \ +> interval=10s name="Cuad9-DOH IPv4" src-address=146.120.64.211 \ +> test-script="" timeout=800ms type=dns up-script="" +> add certificate=DigiCert-Assured-ID-Root-CA comment="doh-fallback, doh-url=htt\ +> ps://dns.quad9.net/dns-query, name=Cuad9-DOH IPv4" disabled=yes \ +> down-script="" host=149.112.112.112 http-codes="" interval=10s name=\ +> "Cuad9-DOH IPv4" port=443 test-script="" type=https-get up-script="" +> add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ +> down-script="" host=91.192.189.2 http-codes="" interval=10s name=\ +> ns1.unet.ws test-script="" type=simple up-script="" +> add check-certificate=yes comment=\ +> "doh, doh-url=https://vds.vados.ru/vds-query, name=vds.vados.ru" \ +> disabled=yes down-script="" host=109.107.177.79 http-codes="" name=\ +> vds.vados.ru port=443 test-script="" type=https-get up-script="" +> /user aaa +> set accounting=no diff --git a/MikroNUC/20260703/20260703044001-Binary.backup b/MikroNUC/20260703/20260703044001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..a7966186f84a58ba9b7240153e3ad0a0b5208cde GIT binary patch literal 381538 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
b~s(U{!%{fxDzeK7~9jcHT=M=6NzfRUZ65> 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ν zW=Js;pLfm$^4xIzDh!`yx%2Q9%Q06N(J7g|2K*o7$wr~j0uQT*cW$=PUfqR=Q{H=Y z-X@e6Q!#WXB=?W8S*$3pawy?~s>SJd67lKz8W1m6q6m`(6=wi!iFt-I~O>F1mCNjt^BsYmpayf}Ofk^W|9#$642iX)-kI zcdg!|GR96By4?}F!omp}DeJQ7P>Fce-@h&oyJBz=+T;bnYocOQ{xK|2YA9!30%x8i zot79CC-Lg`l4avIuzzEU?d%K&c#*5GO?AM zP>uz*#rz*#f8c@>uTjB^gKJWbsIp%m zkGQT$$Y>A(ByZuOUv-g^!ph_zi+mg$Rrv()ON(X-)RPqx$kJO`f+a250X1rlPrB6$ zS*!|y{$uyBGvMtNyn1W-2l<#U#9YP3anPN^7}ZLxfGUWm4LjL!){$EiVqlf;YMG<4(!u6uYdZNy9vMJazZ5=OknlM9RW4)mGzMw)^!udhE zqyElnKhIs}4f0sI5^htkCShTNP17zSv+Et{w3q*GOHPPo|`C22f;js5$%C+}~jqr<aIsV3A5%)?!&-IUZSG}vxrMQjE&-oIK|d!g6W^i1IZ5GrLn6}} z%*BIsl`w3T3AY~oq>pM=-%f4~ma@OirJBdbu5+>GTs)@u& z7mK-vJX{(YU*%_KhNaxz7)_puZS8{^De8YCPKj3+$`?kpqc72ks4r65*yZ~hgqrkp zR#N|cvj!9T0N3UnDP=NNO!?y|G+(lp+NhqtQ;I|#H%@s$0%ofk8PS5!VZU)cQ4h>O z_+sj-1Ep9)c^c&P;gNXT=;00x$LL+>Kz+IAv{Nyu(?zjT`e~oqd1X<@7qJT=Uf={U zJh*WTZU`q=fyYe@gfhfe!ZscAjTe>fM0zGIyHOqQvY^C(C;E%T%~+}UBGEys^k?SX zkXr+SQ$;rF4Vf!G!FA=R>H^i; z#JL}xmJ~bDTox&E4@pmj`MQGkYbhyLe}zgfUq9EnnyL&aS|x2Mqcm9CD?0On&Kktj zatPQ>>bsjF6PuMRDisn=Q6M0HVVy(4K3lw@qU38~*JvWR1az$A@&uvD`?#WyE?>nA zZrJcCJ{H?{B=x4KOSGc@C4*It1S${H!YGy%LN>#O^{dD)CMUe(aG(3(s=E?Df-48M z%EmtTwIv)pI!{AcqK_${TWE!!=3l_5QE(h|1BM%VmFOYaC{juHlF!nugVoi9$Y3xc z=SY!!#zb1iFN~DHjZCs@uwpLK=~L0oh)jhmzChBy_FW$}p8!^B=8>JA<&FC6yiT5i zO}>k66Bcm8ew{(vEtr^Hobpw;Uhiq03u(*5pSAi;ttbP?!)5o>8_{GN1^<#_;=n*g zI%?F0T?p$m(0WbJ(z2!)o70#c14UvJA0f_K}6wCj7@^tTs-e=4r@aE=8EIBolHA0)9|j{ z4N8h%G7_Id)Y~tRAzj{i@}B%mJ=Qf@jN)bD1jMV(mg%7nk&m3oe*jkQ1#{COxdaP(*G^^B ze5Q581``k+!L+Swv$Bz3^z0d22m{KfX^FKmZ&Q;0S|$Jc18T(QdwT8f5JHaAenCoK z`*Vodkp+=6e<_NX)PwE&LGoGXw`kT+1~3vkphPqdDQ{k}pO9^?aHzU>( z0}&vFy9d68d4mzEdk0_}=By(nS@d_;*r*u^i3VQog9<)jFM9-H*3S?cO80VYb2$vN z{ln&G_2ElYcMpDU7ICDV>VTmxYk5T*GK1y0SXO!C7+w!fwvq&klfUz#A4Q!b`u1(f zt};5beI>Cf+;ZS(WPx&+nQwmHFr(onh`%YO?w?;~M|dVI-a>7Qop$zx;OWoIp2bGf ztyC*V)2A>R)mwIH_pcU#!YW^q^my6vFwg+on#HP}{Af=ZkkRTeF2ujPlBXid=O842 z5KjgQUGMfb$mjyt*2Cu`_NkPD>Ur1P&fYs5W%&;V29-2+braif*cVyzSWVxQMDyzC zQMH$8DLPdv?7)9{978=;g+>~Nz?V~(pdH+Mhl_jcD5eR7>K6fVo&D_@?3QjQC9zGv zm0Xpf*aU!kwajmM@+E6Lm1l|Mt`aNoa~k8>os;fL0C^3dOTf@H%TprKN%Ffp( zT}Tlekl5M{<8!qD$)mzN*avF%p$(s+G5m?O6|-BKjXfO^XZ*uEF#gd*44s<5t1%g| ze;Ej{=bgq3kn83H*4CwFZA2wBw3r=VmkN`6_gm6DH6jY6v;YymwBJa2+SxHtSIhn_ z9}~y+O*;$h`ZlM}K+Ee^h!hFN?uTt;r6|J`_5N!4kXjW5kVO_jMHN~@fsDkT^kWeK z!W>2ZAi@RiOz|F4H*t^bLQG{C^H(clwbBY&_%A3$ryZhERVF0u(>^vz;H%DWPtE6J zyevrn7|c+;MB5+(4`W7@#?TcnH0KDs=H=)r9Eq1ndL}!Yhb& z>LbUUBMI^BfkMbX8woK`Cyq`bc!i%#AwQ#Vrj;$eA!PDzeB=Pyju((X+#8-z0jFbX zq$R>6UT{F+3MAZ0Q6KtU`TA{us^@3a?0*xMnz=2`&2lxxp)$N?&{a6IT1qj;QKI> zaf)0Hapm54+1vsKTLjw0iO(rzHs;}voB`h|Oz)H?P zG=jGivn0E8R~xoYYl8OPhTh@)Rveb$kU}S;k5j$wP{%p!v}*dsQ1Hfow?R#l z-ed!RAe%(#&O4IesPRbInPlcbOrT<#bDu{~11eo(eZHHgFu=kspaz=GJwk!oK&Sla zL|F~g+UqGrp};ta&p3SZm1iu1NNejme@KomU3ST-gfc0?-})`WLHXh&UIW8wv)#?m1U0QUzXCzLPalS51%}88USbzX!G~EF5}^x2X2{b9E9jvS^aa zC7V}}`rJWB?N37+tlD+ys>E_EWa6A%v@)O&-}$>W_m=jK!*Q8@?BbsR!N0S>WT%Av zE=w${AFN8W2Bu5g9!{Gn6JvLrGw*7rllLR-}T=c{*ZvoNgeKjah;l zm*qj``i}!aMVOEiaiNF4?f~tr7;m4)RS6Y+iueZzGpe-sM_UPNp4DP{exbsdY1bC` z_cGL)&@PkB??j3gu4s9_TdMmp%)m2zXqV8LOn}9VZ&-J(CtUwZD_q#me)#!|bcAUI& zaH?NuG?Yf}y32kKh->Iz{M!ftpgI_q zs$I3!6eCfyfZ&@mNgu)uBp6+!EoLMR>#W;MMjfIstkAOlB&oEPYPW8#N(IjreozQu zHBtsat%3~&yeTD@kvK}YSz>2kohDk5{f-TeV?ZhIQLo1PcsHizafc%$ySRLxLG@tE z_Gg_7YBuDwt|hF{u3Y(Zq;bftCX(Q$eSobS5$~X^he03i0&C!(eh5kzOK7ol6vXa9u$UUx;8T9ZbWmmNXKfG*-+=08M%J}x=Nh7ftT%&-TTiCdu& zfQR|#0(mr_Js969yXLJ*(G`h2f0X7pMEUTo@}|;~D|3qxhB%2~NrCd@l8Mni6`y-R zFIls!GAv<{5*12sZz)}!&w@~WN{WZq85$QZW9`j#Crz=ND?L@$$Xs3OrEM9ByKqsb z?&nq8D=+>ijl)e=MZY((bS>idqpmalehjvKk>`C`T`tp7NGSvb z7b-lx#Xc52^ssFpHuCNaw3GJF(B|=92P_dZxHdaLz?A4c9T1rk#>9k9=fdyzNRhAT zW|CF(`>1V%Jqu&(^8S za<6odDvyy>W8;ALjvhjYR`e!7t;bye0V zVd)VYiHp~%n9D`)^{baZ(PK1Z@n+8HBFIVE^9yuRNhSU$Ld6Ll)WtfmmsT!D`_ZLoVFdj~D90`xhunZzj@y<1)YsWX#hoJWWfiq{cEyExv>ZbNuUuvSYQ?eUc5Ht3 z4`};yzea*|Q>=B<;Y>6M$(;cg6h`2mo>l0! zN}sdNq3t|me=#3C!UnA96Rw%$S6*5y$LQ^9HUn&|$`p{%2gN*zA(ujTv=Pl+yNSW^ z4s!WAr6eM&p*g$$a>{t{Vh(}L`Il=;aW#16<@G+k)^Rp{7obq>fhoFkI9q_W{?S5@ zRl`F-p&C(BTZKLtWkx|had7c}r>|OwPQaci&%RZkPIbB?l z4nA)cYQoF-1sol)Q2Z`GY%-i7B7E*bQ3f8c3jo z81J$uHI=ti_207t{8vR0&gpH#9HH*3w|^i=kpl1dmj}cnraZCb(Md6qjM&{I^6tFHl!4K3>@IQz#-G7^1iv~#Rl^k|>|I&0T8 z=suF6r$Lk+!L3)_g<-chSV^6U)R>ZHZmk;4n7lLhceIK=t15>qqJZh zi6c(Qc6I9GemtdIQ8+Nx@itYbq#=}4d?i76dHh@EE!`XbWIxYPyFm_#7ToEwD^CCC zdMJl^iw1`Hdb=WyReywSC6n!43ybqNnKq_|a0k@LSCjkp%E4NVXJbjXbu0{oCFzL^ zBh4NQ`AHI_u3i??F2UdyZ@D_@3*k9$H?`tVFLo$fis~9%rv(ZrWnt%*JE;ZwqK8}* zc^Cu5csK~BA$)6@ENeW<9kY(`owOS3E2mnt#JEpr2F92Mz!8E2_8P$$2Abe{4Apk{ z4@Ta4jw5tYmRoOhjE)s(9}em%?SP1Wxuqim%xr*+6k7j6VsaIqqN@u1sW4A>$WBih zn^Gv#J{CJQ*xuViv${#d;DF2ne`2GxU(u>Kp;wiB%Gff=L0Z5Zz47j)NU)~BH-@Qt zyquM92&@w2l>w}0L9>*-8H%uk?FcCeds-9~4>7wxHQD9cY0O|y$z61rmx z%(7sj?H|CnjNNY2AR%{rUa<9Y8@xgDd zOJrkp0h`_G-qkeo_)?5<>p+yWHRvOKY2069g@&&~YsxIhCe3nbOn=zwx}PkK!WG9-BnOUqfe{X03t36}2HO~g&T33^yC z1zbdRh?FMP`o|wM^r5&hy;LsU<&M5%{C^W45SC3DCm0x#{GyKqC$O<{+NJZEgBp6= zre>Md9CC4&mFM%C0GdjC$4V~qS%;}N=SwfiuV!S9qfg&q`_xqmh}p7U#qVxWlM``T z-_1V<4z6CF3R)B5OxWuPQDDSDZgW#hr@VbCo8yJo*89>-q%d1y7U|vGZqV~rB1ugg z2f4tT(9cvkVZ{^7!AQ?+u!Flh*v*~lp|agK8K-oze4b}AKd4QY+fS5dq?Ud5^O5Y3 z#TUq6LR(fBfjPCm%1Sh^`XB5+wdle{p`x|ajlHFm8-s}^N_2Mjz2X<2r$;_|E%wC; zbkaQB=n3;?JQUkkW^{BdE;x${QBfj3QsGwS)2kR7WAz~C4moeL`l(rNFx%=U{i+)Axz28 zU-3Wlwkhzs)W=jYl|2B4Z7!3-!RtOBxDqX*q`t(?5ePgtL_172szwvHc0l|s!et90 zynZCgDk&-|S58uK9QOdI$HOc+Qxkn;Nsc@o>C(brqe^N`x^tDH$&|6d-RsUnIHoi$ zB3j&hX{gF660wGhI%|#rZ!l~;u)YKr^yrTvh4%BN@q@Lq!f7!MOWVh1NIlPG1XlwQ zgN8m=9nr6pYY5oK?P6e47kvTjZhdbzliQEBU7PmnPjH$EQ3B` z<;Gs>7Ac79fcFpqs#Q*gvF`N;_<1?9u=i1j2%U3V1gH^?{_|oX5Yz^3^*0R}Bg}4| z!zG*d3QU{b2mVA}bRUwz`OOzpwO>_UW~-iuRm6s@t-0lY;N;NdRUBectgrM=GlkDb z=ZebFTY7;ua+$n_@uH`0Y$yZ=$U?bnn%-MSM%K7&o4jmhUsA>p5hae|La8iVhnQ~zzAM|`eb zBnubOBx~$jU$+FyLu(94#JUP(0(C{UM1(vk^lJn~NXPfke$K|557DonDnLy#UD~pD z>}{={@haDuzxWGrKT2)`T6tkD8nt#G-t1R}Q-Nz3hIzC|(IHH&-Z7 zbP<%M*;^RD3YpnA(NF#x9jnPbI#p@lT4bG!lc9%50D>uV4LQGGEI(SL=-~pLp56(l z!B~S*NbF7~1uzn|r-sa+VFd6!4^0<8?UmZkcS!^ST-)=9X==l`@=PmG{$B+}yAOQMOnKEvX}|HFgh^eq6Tr>E zKyw9xAs{ftVPAp(=O&IZL=TqM5kMpDZmp-K!EQ;^WImB3g7*Y~xP##t0f}01)CEzd zVIG${lAzwbH&#*s1m6$-sj!n34tX0}b!#(YjZL9R$+85s?zEz6(12O~ zag^=6QW9Vn^x!I(N5CBp?BKU>xhH}PQVN^3hE)vF4O zyQh>6f=?;37u5MfANTQU4P+YIu#_lVI*1C))`_R2QFJl)eR;QbWXl_As5jsB8URwx zfbRepCuN4Q7VRPv4zZBg-%$YpNt;-8(xe+dtxR@ zgTEgsw;S1H!BTJ*scT;jtQ)dEr59f;7N*x-y_cdmT?W0>BwI;;(9uI&;D%a)fn2j* z9Z}l1ey2N*bQQcOPDo?N(%~u;C=GY2((Rb07mV__w*0Ol?-2U7n@pL56vevothH?^ z$n1Ug6AhzVg8c}cDrW{WOMTn4n3~ycRzj9o^e(noRbl$Q(-LB#OM`;=@cxQIPbCL% zGVH4Gem|uC9(tA&AQW%P?$V)nE=ZD61=#{(!RP|+T~!l$z9v&X`$dP?(u9b9ST@P7 zYpt9Th!r&AYG2SUWI}2$0Q*4aR_f1i=#d!|;O^e!1O4}@mt8fzIP;|QBQogp5XIFL z9b@Prhcfr$TGLvw){UDfx$O=G!qn-Cyvq7= z3xO(913j&QW73D56g!8%{23D^(FkxEwVZI=A%8|j^z8kle5F?IvsA6t|J2%A zHcytw3rAx&5gEr`YUHOGB4~$}ezy@py3e`1%82|eF`Q~HOB3jl)xi}w>Ii6{HF?PV zG@Yiurz?yb7#abzxZzv?Rzz+472^Sb2(UJyRJ$VJ%ahP-D(Y)_GurYc{*S0QtMS3^ zKh>7!NGO;=VE|xsMk2idTlb>se{_?X!S5dyb6MXsDPh`8K`{;3@qE=2UmtX?OX@m* zaXM^*NHR4|o&p~_N>~f7+mfB<7{&RuwRuZM9JKRe*%GW$XL`oeo!&RVSQ!Ymm45f! zrTpg-3@9QNg}BCFA&UP_ce9|Md~cD62?MPxw0n-N2LbASsDqg)>@UOeNNih%6VUU~ zGF50)&a{|dK0b_+|HF4d6!)KC<&6K`06~ufP36?8)U!Vep+WV%!L|x0c-}`$(}vb^ zY2otN6!>9^*8}SSNUO20dH2io`&iJzc3?%-lw313$5Mnv%se-1e7UBO;~|Tun;>Sj znQY=lL<7HXu!OsxA`Alsg=#4DL$#OURREsNyI0w6rlcnSWX}3sN=1iMFAUF`erB_( zln>M$DrjYVyAH$w+6DX&GbQp+)<6Rz3RKP5@gMC*lnA3pMCNiY=}+>p7FHN?2DnLX zUur<2zcG5sEFN$Y9VN<;Ap~>Ya~%YAUJ@>}kc~ybmAJOJbEwQABM>OIEuzMkN zV-aPC)j;5AyuS(Gwimq)kzE8nMEuL9ad-$-zbZpv=oNyQoBhXf zTlC#AINmxQDXzw|GfuALPc%C5)RoLSle45K~mf(_^LSVV5T8+7-NZj ztEJ%kiKx{*jW$H)_%0cl)Hy-z0;Le`^}QluBx}i5bLCJBe_q z-qkdS#OTS94L-V<1jlr_-RZC4|db4_Xjtn{FPD z>25slV~r|yTgEJ3V-o4h4D7DEpIJw-wCt0n(_&U-RUWOlAlCOTVdG!YfQnmU5Hb{m zfNwxZQd^uZs_Y+y=?eVZTlT6$W-isQdm_c1`{{39#ykKDt;4FB!h{QXz2M5%h+-V= zQiiV-j6X|crBkS1HeMqb)vl30C8Raz)i5~(iyO$l|FE#hEL#7I{9LBt3CC z%yjf&z949kuP*=KxWu=Jfx+G%hN(A6EaBTBi*DlSocbq^jsjT?8+Ensi?u&*?*1`l z{;>J($0|lM$?)byFfs?#wu*V!L7(!R=pZ~rpZs!v zXr(i5E`b;u0@lzw+7HJTGuVU4Y>D*;LvPz#;34Ov)f6dOTWW(j%=uS69wh2h>5gkl z6%12Tp@HpCLEiGLwq#mo{M9A@RuYQ(<^JBNhj77ZHRW6i?|6EE5bG+EVpui(?*&ul zuTJPc3K1kPfCV3G#8N`RnEn03po zT(V)bufZnAc5q|=*|+G}t);UIGK0u=%UDn#D9t9Au3H_vl~`6?YmfFC4vam3e-x-& zL60^z#6|p)K^ZTk7=2(kII*GLEQy-(^-l#NE{<8}+VSocw;q^rg$?|Jk}VR|%19|129$_3v27Up0ZG6DPP{2>8r|JYddm$*0~t4F@D(bgKDACbh(j@1gMzDEcMrX z2++zW16SgfA`N99TR+ggL0%_OMc`&ef!_)c)Vh%%FwM%&Np8epq=hM978;t;gQLTX zoAY*4;JD1)1QryFVgB88JMy*rJ%$w%-40*KsyVmpNKUQquiFI2KOvHzw}M@R3y#8| z(}CjS>rav9`3ItCXpKQI4Fc}_LwU%i`b2%$KsIqBmdcu%`q~2>! zK7?#1uI-K%I%2k zyHT0GJ%xnU)vgUVppK4n?(H`l8SDrHIGT2P`zI%vc@z*8Z!;6lyGIqfJ{fK9>&h4C zhCTdBfdwnZI)2?N>c(c^yJ-wGRnrWB8;uoXe76TK^i@2#MYnN{dv2Fpno}mbWG6x8 zdAJPF(H7yNOmKl6Tp3?E@@Guy70Rkdv(=`h0nxqtFYEq5UCgCjA)obp)fPqW+m96J zEBe(JyIzB%W?*^qmO?9SQdv2TM#RoJ!A0kcPDISMw!?Yk~Y z5GSauFaMnWmzdezDMCdwoySf8#fKJF!1Ht>F#9d;1RsA9n89$*` zP=oIQFSGu*pphNgi0Q8!2cgDzBC&6~D+6kThi0_A=)p$)1{Z}Wmdbq-R*{JKhIDrC zz?B3LRVG`H7wm`(zUa)%HL7fNYJe@sky$P4HCMSdSFxQMrx>3>07Qp&2c-AGT-t%I zTEAgidH;c??&KO4JH3in@ptOPR1W zE&gjxCfJ~E8LIPq!5>;73c6JtfH zt2E-)Cs0^jfYDm(<(-IW2V(KyGN0KZ-YpfE-Fzq(bpadV&wgT=wp|HcHz_FedNsW+ zlm-?f)2czSpqF_myRX_l2X8-;`s`^Cd$i+U0C`_lRZutvQtezSvb$2mPg)3EO;Yx@ zE^{e0;9~fs!6($wG-K__2pL>NZ+=vWgOk)f($s$lqZISre<)eRSw`v9yN+$qy>rF(`P+ zmzepiNz>5QeQa&Idk%2|jd;DV|JJmw;mp7!AN`O2ZqIKR! zRJYM8-rU+3bMYy?_%zE_N`@xz4e8(*cwqh?9?UqgH*pBPL;u&`i&1Dsh*)9Z9fMzv zd-d-|Q1FF>>b}S*tHBZKHJ2>c)nISE>R;3pzGw~mwQ~El%hU4A1-nlx*iFd2fL3kw6W|4d$!XE!)J>^P@d_!P;R3Qp>P{LF#JvtPC@4ldE}29NPu@+ZbkG- zR@^he2TbgSPt);~hbfq%w@qd2fH#HZI%@wvAV`zpR*Sx>pn>jP#9=u>V#gAf4|7nI zi)Ewr-f1(? z9Td4%5M`(fF|>jn<@fVB$P}d3MVI(y8U*7)sW$p)b%Ppx2^bY}jJ$~k`5s|koD6%Z-q(-1?_2ZW()Vc>(K;zmelVi>X>t!Qbkp+*rbQqY69t&i z<|SB25$zfc-!xrphIA!S^o#4--nIz>OM|m)Qq6m?zjW7Bk)m`!_F@6nkp;XF=94&` z`Nje#RPW0NBe0OvQ7b~FvN3I51XDxBQ%v9@|HCo{!jq<4K%imL`GnR~=L|Qc127Z( zx!!gCC^zUZ!ksGFc!djbDJ>> znG*i`{CmErSpJFK15f_b|4PGVF8Sr*8$i^QBq@nZuq0p=Er_O>GhqZeJGxUPzFw; zdJ=m7yF3qEV|JK`)3sgFS(*EdHwcprl&@^YDTDIRM?=KdKz&{jZ583Pu;gVbhC`0a z1KX9u@w#kb+c(%tICl~l$7@ck%zFuM7TkN&QCR{+0Tgld=B4lQQ17@=yja%K>!eg( zX7YIn#N#K@Ka8}hr+mq)D!N$MToX+l=ulD{ibT|JTSIIgWgm;7B&bx2Z@1#eLMk5D zd<4O!AtRnF7g(pt0H3*_#LPi-^_0ZK&0#rms=b~M(QW`4X;8}7O zot`^YUzzB+dRPJBkA|5Dx_Oo-c=nWgQ)Gh@+6`EQwA{Sk?kFphgXHiyidn2JSuw%g ztrP|VK+tOr$}d_*%R5}YlmXZpU}%iex?~ z6$%)gKVRn~?4W%GmG2ACWYrCe_t6XoWY1H@gP%#GM7nK+=8&O|MXzmo|CoZd^WL;kH zt!YP#l#Jdt`&P-5;Q8k>X#o@#w^XN7*uY$=uqs|->(w9|i1Ft`Nbm<6<`NM*(n|E$ z<9f@gYUj0Q@ZkPA8ZOoG*qEk(amnh`xx0w*- z^OXo^_Fm3HGl-gTz1>TWl^!sDgT)T0B}YRPFbg|8-#T_TUKaP6b`6I-^(+`sL*T2V zf?Vf7&t#*PypJ+={fH5CY%Zzh3kfID(C*sIiHbMFtrp66V3xgEk8&MhCNx&LG1jJ$ zT_bSTLktP0{I}A(lCP{&uz24-OMWp#_2CN?8zjezowaD&OkpGC`sgVU3&5i)v%TnN zGW@v1k}0oEgg|Lrk#r_5(=4?&y~h!dz|&&riNXxh)uMGF+=ng|NV`Usbe?Xf{GAeE z3GfQ{P1k!p;_JMG8O6^Ss|!IzLSU`0>GU&Iy~#-@75)`eA-z>5qZSvTBg?^NT#buu z0Op{ItcfU-k?oB^!!(9;;ebM(eV$UKQ8dXl{wvamvj+~0JUKI)Rfq?I7pn93d(pSF z)}S^J@t_$(E_3OzfAW~8etwVog3J!$p$ZTih)S-2a3!<)Pj(v8QlHa;#3=O5{DiIi z&FK>@ODtMX_ar*SEX8zCYl;~e?1g978Be$40{_~aLG6`N7DX8RWTvNk{QmzF;{bn* z-FJ1De0BL0>zb8|$ZYTzzjAB@$+Yc)ogMbh%jZG;s7|DieTV-LCXIvbf;GF!0eBAP zI9$On_{!4ean15RD(PTFTDK)?e{gsa7q6v=I}EwjiT)BpT!x=7M;|Ghpvd;5&?}gb zrU;Xy?^gD6u$u4Wm2-p@fyQ5(4i?NYI-Z*%2N6|K-^u3oz8aG;IcO$Q?>$HW40po2 zl=4MRRFVyXxzfI%p5lLwu)68yN`cKF(Ks%F{Fr79amkwx^1H(eqB=6IJn&PvChvNq zQ!Kv*TEY9z@k|qKin=h+H@ldfjZR$eN1?+k_O8tp@q~ZDrmmT0V2MR*4Jf`$N9{S`|;*k4mRN zB(AiO76E)9DEBXFrQU0Wkr5afX3Sgl2hU^k*V~iMOICaBbj!CYV*gCAtR%YUcN?l1 ze=W1~t#3&Tz|L4jAB^a8)oq(?8gI=P;@WNCC(v9VGjGBBCi_lz(+ ztG2erVkWiw1Hy_fquzNqx<8O00&xq&SXsQJ(Y{!m zx77<&t}(a2Kr1X<&l1?Ptr&NX{|l>60f~9UG6*aQly6~`la&iv#)^O5R?S#UR6KbR zVST~ouJ-!>)T`pAn|@r@%VKL=tk(cx41weZYi0mPxMAN1=K~TOoTLn1hq}(c)Ck1+ z{7{@6*(RHqyF0*vAnXN@7E1w)e7~9J?(`qF>T_0eP+M@r=} zFZjyOyQ=6m8LCZ|+auWBFnjx*OdQP+tm&AQ#4m3`9cHX zv0Rb(J%~sHeyudW|0n-?j`}U*Kv1N)fG3;0uNA7FrzqD0GJ>>=(J}CwnQ$!3sH1z) z`KAW(D*tE2Kuo?Y@5g2ZutqMjgGK=c_wc7=EqZf7O*;EzwoAuO+hZsfB{0%D|h~l5cIuHSLdMKbrl`DDo00g26!SZ!A1cN>?{)Q z-nfVT{b%Op#1kR72!yADLh5aHB?)xG@Dv;VGfFATiLj9sPb6*U=q%`SdV z$e%5vYK6c5w}i}blR!d!_{{(wb(SeKL2|ks>%VV=&)0G-!wORK#Y$(Sg<9`>TkmQ% z8K_P&y{m;Du!S03Ax3Asjfc+Bw=(GM!J4En2_t1MrSsc8N1KHf6)3*3=RckPWoH%A zuI=y?;CQ9j`QNzh)<(q*do3`AlFDJn=J*YYZC8REpTtm3z_dtN1)b>_WQQsU6p= z$b`x;%nt`Nmy>wLvgl<%*}qvdUW9yR|*iAQ~J%7{>BHedMEL^V15H=1=Lj zQK<1Md9}tVUISXvjvc!jvRx2cP##W*GM}pwEZL71)S8G=DA5E8(+xxzz%xf^WwV{PI! zKR!s0557LZ+~WHK;zSrL-#BGf3AUbU)$;PG{0E(i^cmb=mBlxusKbL z?&@A^%w}3xbj0o1=>o&Kd_Qi>pDr6x$koJ6!r^ zzl1H^P<=uQGJ5Y1GIsvdGW37!B_^y*Bq3g;DjZvH$kPtEy3L#xVpXwM}#rW}x&$3tFP)UD}iWHh@x1Jv1v*aXEz7BKm{`&@M(qYAUh^M0BZ_42pvbzQ}z>D)IsiSBH)@6LU2GN{x=eRp=CIKKAO52 zO_4nG$hyLV1_p3z25-Ld3)T)bQ%$5e!XFxz@kYO105&zGV;}LUO?>9S7ZCFgo9CCb zC(IwF`jga2`fP}pP!H|!s~Pa50>hWvg|kxZ78vxhq?2*~81%Mm&{bc-EoEVi<(XZ| z2DgXOlr0f^acZ~jsm}_BgSRHIEBiq!t$auk82NFdniB{fq1+CdVx6!u*}RzV+cXOKtj5FVo3&L9+GKPK9M4Aow3XDW$dXX<-81QPyXbV z34*El71!eOClS$(0}wFa8UD79OcO>@}Zuq>!josJeOsF#x-Xm)~_Ixi`6 zZUEIt=r=xtA_k`|MHHIKv-A^H&~+@ZqE(Uk6{`dT9PQQT zBA#cpK5UUX4mx_gSoZmW27fMK)uPx#KLf}?s|KaG=GjrGWtQyIVXdSsyFxYJin@(j zQX!DedEcuol;O*q->O-^=qWQ?eBX#vJy6+(#PyNlQaWkNY; zILkaq)j>QH0PJZV$l13hYjL1=5BJeq&G zRi`y+qFG&=YG2^;8z9tHhM9IhrY@Zkr;>pazwtbvh!b9~|ER z>0zAy5We@tSwEwIqqYBcw*T1EIlOyLCHSK_gtge<6Slg`VY1^6gGzLe`xgTr8o89W z-Yk4Y6VEO`GGOmPw4E$ySMlUHi(uth&n@_U!7s|Y&F{?3vQwC-XI#+HAw;cDOC%2; z!BWjvt%i&>6SUf2yDE|kL?RLtLmzU2d1{rcr3@{^$1id}nbmHO%~U~>iKzAm8|pU7 zMr%)Vd%kHa4Y&py-tPI>_Bb)*L0ZEi4V?7)23?=qg)~1%AC38gdG7$A$};Vab(M4! zQeykf1@haZ(_vJiuz9&j9EoQh{ID_QU907lM|K4?w80JmAxV#EP{(mqip-sx<9N7Z z|G8|j{gBi+VQI$OvO(Kp!7K~hoKb#W$omlyNflok`PN-MWoFf|gCK+DO}4omu|f4^ zrL=2exMxI$BKmg)-%d2eD;yzrkg9Bny`ubc{;qcgB<;(849iixtF7e9Bi*8c8FTd)tnKmDw)v5XYJ8KrfUvMX`|psVhgIoDt?}m>ZWq zi7|4+{S5NZ%BL=COR@Ox+1rjuWFtiI!l|A4<{mWx$|-76nqpMI5ky|1PFEVK0T0Aw zCDG|XDMj-hnAQ!LD@En#CPb$PM79lGGB5zWBz~c|*8Os?IqKFzTHzjYQ-xfb^y7wd ze9PY3>bDhIusw!D1OaT1ze_9OTq4Z~{w!~7dw!u%sgjoG#Cq^)aYyQu zsHd%5Ow-12!qwj2znp{t2XI7Uvs5uLxX3?EN}Cb0 znVSNtL0XY;t_}8!56ll-9ECgd1sPmYtIaw{C@yaqgD-jajF15X2&|@M@GI{siB}Wq z2h2`*tg|Z+E>tSK)2YH1buJ#Y07t6t3OvMnym1!g!U3j373h;O*n;)^6hx79F${;Z za|Vt%g9?+!;*VyQ8~f9t;y3t`t5>@T-Q}mg(&HV8%&dXZ4U_V{6FdYQAk~|@ckb&R zrIXruG@t^HJ%OL1I}--1tzdWKO%FqLo!=u#0r^HQxV~$|4eSPpgU=AVloa}2#e04Ah4#nfk4E8;SRoPC+1g6zH)r!q&f41{$f239o{LyG$w3k)=y%#X-Q z*cK4Q_n)7Osbd(?#RQqJC-K~6t0cgSTaQqoUdK%K9`8VB1!U|tlH#Cqw)r$^cErmo zH+u|gu;U5*NjL0)1O{MzD*reUfO>HI-Eu+sGCE`ZZRksX;eIN*cS(&0^~7Wi@G3wAbicio=(lSF6DLPc;UGEI>~ssgd)8_GN(iF_ z!kKT|jT1GG1f&IM;uhBgG+Rq4L)jR0jt#UER$qJE8rWfr8UG+)p!bdbOr;c$USI#> z4@;}U=nEU)G>c@P#*(@FW=ePo)Z4GlD^r{7Z;wYFr{p#H4t?Yv%i;^@yEd)mmi^q< zdmCA1#ik4D5laXYN;|QSgmQ>}jpfsp0yPv4weVx+rmALb(w{%Pzxa_cf8$jAZa-iY zP6aN|JMO^24AZ~L2_FzQkZ3sLbn$!yV5vp%OM;noj`$|bqL~{i*6v1L zg3PHuXrc+gqevvvI6p$k!WjAaQNmFDfF6obh=#^Cx4=AT+}XsifHvifi&Gn+Hyd4E z{IJkL>BSbrri)!touK%&Nm5ev(@4o#G&{bhY(TDtqh>#xPgWJ`6$F?+@c)}83hsYu zbG-;&9_4XHn%{?Bn(r$K(#YgJYlwRAVk6!LzUOOSG z9k=vIAU)9ni3vQB)w=g2D=zLzTjuQF&B*#jhXP~K-?C@MOBSYhMa?%ob!i*|`7--> z9N#gRPvy)hG#7B#52PWUMOLT$CM2;l9R?+zKA5-sqQu*OCrVpmD%O|eUHsMGzMLnV zyZ?W*0Nl&x4%@oTh3!-Lk}I6!1?IZVaU80H!0Zhcah#EFFYoY!v?r#hpGs#T>k|;K zj;V6M*FOtLoDn!=#1y2V?=VyNmDyPhz1&U8X;af4;iR^~mzS*@{E`-9nrr1TMVnj} z4EH0dKyfMlIr(1@BZw{fFQg^r&r=}*%DE|vitbDATu2d76iY?CB}336H!~C!)Cg#V zWo-@m!|YA~U)vz~Q11lT#}?U4%D2C$GOIBy%-Oa|opb5@#TA_NC-6TIyB^7;-ps&# zi__3t+djVewggeK0w$EIHrp{!bzf;6n}@&msQd|)OJgtO=Dx)$C>&~lqPlBJZa~0+ zv-YO(wWP_hz9>6|B2a^nd$!bxp`xSnZ9ZuK%xz5)VVACLP zAO|lNUO|TD=Z)U=pRm****-VhmZUg4ZT0?Ln!4&fVGv!ZU1g_sEd014lcRu>uBKM2 z=2Y%%0&Kd5a}_vpx;aWyZQar2{{P7O;DW z-RIdH_OgJ5Evj*%`g!4%4Q-YGjV~|7x7VcDBriWR34mnk54ZKIkU)s{p$nD&tTZB{ zB7!3tqB#6>vkBYh(EnJ`;+^&e?>Yy ze>|lf0#wUgEwN;7LxFZ`<~>qw9q(fHKcveX-VS+fl~5oiP1?<%EluYw z&eD?7tbVdTPFq`w?y(trz<-=_X7{g&CL3MJ>HQ$MZ=)z>#np&fnmq>NET%_Ac6Mvb z8DYH`huqAAF8V9CZu~5KsiYuL{IFw38zqtQ$u=OBXSVKOzraIqhhHf~RqfcY1^YHK z-D3Bz`?Ch6t4m(k22%^AEKLW8;Th^H54kVWL=uN?yxKoFmDFbdZH@jA#5(G#R&%#O zYp{GuukuaU55mh7GHRRhB*eSY6rpdqJueCuXd)K?f73~XClTqLv#Zw+<9Wh?cFY?Q z7O;+X9!$hDih>S)0{Yno?08C*x?vX2yMt`J2;MhE~w2XeMgS(*_f+OO6X^Oq*U?9-snLgWy;H(E^>q}}}QeZG#2=gLe z-srbgnD1lXeEN*$EWQPGt?fT@4r*`u=3g5$oncYr`3UQv`2tjV6}ZKrkb=Pq}m~1*D-< zPmH0N3st{MoyGV6?ucmpQ3X=lSD3~o1{s^!L?nwwmx16?=qme4&_5>&MUAcsQEo|7%Bg z5~@TAM(v~ROS`G&^wAu{b`G!WMl`{MZF@B;azLHE&-hlu_hE9dR)AMm%j|@{RMTVk z_A*xrX{MKkNKP3PGvGw%MiHHblj0f9tIr=2VY(;7+xv68CJey*47BMu7HCLgwb9W5 zbad97W+IQy*&($wJ>?#?mU))&Ekd}FlTYR(=@64#Kz)o`9@(u!0eAW;#q6t?HDjF4cO6vwY} zK&a13a+%xj%f4R%97`86qZ%}U*T#v|!aGv@da~tJDrrs%r5{ThQ-n4wFh`J&THsOF z=9t(wf#UfHghq3wK2O>Pf1#j4{BJ}QyD$S!1fb%GDP5@QBP_6TK`(8t9QATZBNpcO zVp@>BtYvDradkG(#!}Luk_gUol!%4E(%861koYl2UVn{Ie| zfL}h2Jpufs`cnOZ1|Wp2U9o*qD(P3{f5B&5g2}xCP_@8&L1dbs*<(PgaEj;1>nIz| zR($UMq1ZTPRehKGR23>5%I}Iar}Ki`2m1m6ER8AM?X&!ns@c66ZtIyDzk*N!YwC67 z$d;ju#BZTCnToqUa^BuQ2n6fqHt}jYLRV~bOx#6daoEzjP7jCB5hhDzpwoj_$ZdEa zjet=!=mnojv%gCTCqucoF@?G8R{@W}^;#Y^NV+Bn>I%W!_lN-IV0cm3+a7XJrFQD7 zFCLviesol))%Q!GfFsXMGy=V$IYo8(d7Go2gLdZ!WlJoBX84_4b-Y_?Tf{y`-L?vS zJFfO--+ZD);w4Cpy%6%~bi@4V4_fN~MyR*E9`iY_moBbJ2+V`Wh@j96=;uERg;&X< z%^A5(Ss=LI`g~-lrc5FdEk1ccH~#|g5Hr?xLHzjeSGrszM#3#_fW>3qnDFZVy5)o$ zCPuG?GvWsGu(=M;+@YOr;G%HNB_0$nEB;Yeh&GVYQ{f#+Vz^t?jE*?o^Yg(8J|($6 zJ_->CM>5v+Vz>zp6`u)1-+X#cVEkIul5E3TY$^WHbkIh3-R&QLHl`G}tv#X-A{(Ct z*Ll5Nup~Xn5XH#-^|wmj(oL2&xQS_JW!4gJds1vPurzVFE`pq0A~t*a$`b$25Qc;$1&_hE%-7m_(z?0svP<=LdZxJBM zkOY|gEaAu-VS!X^%F28DrBIr-DM!_;) zXk0o{2E~se_0EwAi>2X8k@Sgc_H`BIzfLjh*<(woJa~l2H@#oX(xWIE#tX(>Y$?o& z3&m>z9#iV#eBG{>yGgtuIMg`&|HB1DEUu?p6U+une)9^|bz=@zL;|zcA3~YxPMill zKg~2e#`RAb%S2`l&v)axx=x9*^?0^EJ&DaU^RzKj!&w&ko3L@LWI%<*e+0kv#NF$v zmGSKpdN1|zjMdS;VN38#@xBHfm>Rrhpnn`AAt{*1|fq)a`) z(0Cyo9=db4Dr+*z(PnYKHI3Bkh9?jO0~@vWsxVVd7)pw5R~|V(zJn(xOa0pCF~3zl zmah(e`BfA6nL?8frqH$J^Uvus`P@BQn7l>{&2RHylGuyU9WY>~(!hyc&TPlV?0cpN zH`2c}3{-~x&OCL{-jGpWFVwO*1=<@+?DAL~#mHc*i0X=GR$FVz^(3%_#TE9E z^JvUB)O84vdV6a#=yNR!4fUwW-D&$Jj=cuavDY9Gj>=1qi3^NW_?IH+U(zbmIAo{2 zAc1twVU9kq-QLzvJJKDJ&W^PaU5dj5v%+`T9xDQM9vRgGC^+c3 zxYjJ+64K_=ntA6grgGvM8K>7?;f;76emV(i!#((llI;62uA(@oxV;GqY1ce+ncxHA zY=#4dMu`~yj#ViXph)@a#Y>$ItjLvqWv*-~G+RthY4ooET${RRTecyf@W#bRqSdQm zB8G3LhiVf!OWz@f*#V#c3J1P!{*VZSMe-?=s0qqT2=lxK_L|N> z_0oVH!+3ec%FR{$Tkw`^qdTYd*LM4#&qqwEhWrqa>w+MUwO-hx5u3rQBL^6U724%^ z1TiOdkGOhnyUiMaD|;=edJO|+$sP_^F$5?`%?=K~fcA%Bt|29K5GgcQR@N@iNOPRr zUELR?K<*!H#^bL%EuPfBe1HEQg;n>?!Cp>E`iriMb)Wdj@$4wFMUEcID+$ngRj*Ef z%R(I|bYJWXxq;e})76!sNkmaw&C{7mjsK8gA7@!U4H$!_F;pbeD`TQAbV5R`%r%== zah1nsy84IlyW~>*@6lKyT@$z%xyLf*rFLMPU}oxWCz@!?Pcb}-Cy55O$*O;DnrW#I zOgbs%uF1*80a?b-#TBNlIxvSJ;tI_-Yp}qD~GrM&+HYSiv_7qGb{8VeV zri`}_s1WPtxn#xRpiBdbw)NNn&ns0UkNM&M=tz5Qo3PQ^_sH1qHUe)f=e>)NB2JxN zs^FBaKIjSP%V=b0M9E|vTWEl3;Wmq-t9CP?Ff|m7!oBW**Vzp*eqxw)@O9RBkOvxJ^@CVs;+#LuleQs)nF7q#Bc&PRF9{T zz${$jkSVQEJxi2?45R1O_6kTdrt@|<@LsB8^wB{Z{>!#2a9ygB~ zLsdp_BQwxgr3lm!aOpCm6V@gv0fTiwQb9!}tRy zS?)yjYb9%45=OJn*E#G@Sx=^;0(%!gycC zzG>?Htpl2JXCEyAtN{iaEOAt@CYrEO`OSjCB(~x^qp*oHwt=*396dKh_w*j$$_NJ& zfoR_@e<_pNvCdToaXGX$J%ssBxeS{4&!mb^l_X$h>it+in+=4RuoI6JukV>jBR~l6 z;$dk1GXmphtb14I3nh?6A~}=u{6`(5S8kxb=Ds!0$9|bP(U>jk^QY^Jo1~rJt>&Y< z%N23E^1|0!hy1-^BeGst2A}9QnyFV+q*^!0EGYx_{<%ZU)`Rv>OwtzzS~q30xJHK} zcrcqY`8!BjBP3DtjP2~rb-)MOzQ#-oCP_=?dto=H3-f4siv1BQc}C^Wx8oS0Y}#x| z@)z@ls>O^(Xbe4FE`fF!Zu;IOlFMy>E$Vynte%_lBnmsJ(6O^qpkLX6fr5-AIhU4O z1Or;6<9wY1cw9`A=V#dQ&cZUGNx^3UngiHrH|RIbdxtm`+#~B1>-S(4I!Iu2*YTKf zUGLK_COF6R(#-)SXibOVHSJ(Z)f~(>K2imA6O2i^(O>~g1MqiVD83r?x{9x*7|051TEQf6My#h8Tv5=e1+@UCu!3I zqAo&Hfxbf^@`H+3)Y#XK%Z#Zu26T8Ro&PGf4-0yr&cv`(NVAJ}NnoaQ)kod;@&2mO_Wt=>8LXBVq=(pFKQSGP z%E#J7uD$DH#e~9dJ~jh~p5B-5QrB`V`Mm&nWLE84R;w@G8?tVXnhCTR<8y zsLik0($d3%$6s>mkD+0Z&wkEg`KW&Q4&E5i>s{Wn79)MF3%(7Rn90~SFvk{B;e!t( zLv@fpTx8*eRXi7WwsN5hhK>plJL_ba_20hMa;7KYL48vGe<`ysZ@y`y@twBhXO#I- zMz0w}MiM?bxe-j;45Nwp%LM4KR&0rv;w6=vJKmPN-8idtG|z!EJ+>Fu>%-@V$-2~$ z#rXd?L(8vdE`}Gkrv*Fg4iz0cXy;2MqNNWFD z9(**!Pw#FRdL{3_+VE2|$vM+$k{w!qF-a~=B;EVcasE>*^C}e8Dz29xN@qY`k4Or zgZ?t@b{#(dlW{OdW^Z9M3TO}+2E0sL=vM|7N1}iYKYM6}Fr0W22o&*Gq0qO1z&2z~ zMyPs3o=0U$uF#Cfhg%rFKKXxl<5>TB-Vx!@)R9$1Qz&K$7B+r`J<`P;Ho`U;t2XEbim6Pmj8g zWyn&rMMZj0Np3qA;$Ejf+T>JM_4azIANw`Mn}ZBgvB@W`s|e7aIR#B%S$G4{00*Pc zaLtCIyhDtJBz-<^%0wjq{|w_Ck9zHyTsQfvyZELw?SrS~4IjXRiFQCU1iPydl8yMC z^mP?t4T5C;Vi#GZNi*_&sjeN6N>U%5kKM*}TQ@qf+hg0*zRZd`2(gx+ab-!wu0Mw3 zUPjfxU6>HeR>NKLzn#eY?(hcDyJ2ncVRxXUbdO6o|Eii9Iw19=yt0r%8o82L8IE$T zkxTf|fU>4ozj|$4?z(th;3Rm$Kd3+c{G6G|RDH+Gik+97tC!0&MN6^et47=T*Qb!yT|^Tx?pY&Bssa)U3FRu&bYW$TPYyjV-xrO)4^L2tH;PW z&+~$u#v5%PA5w)G9kim!FHufYrBr{JTIbrs8T%3=B61O4%^qQCd+H1^69iU62_QnU zY1&ZkT1+b1yVD-eiz5K4Uk%ZBYB8y1LaaSa1OQ4eX4PvywbOmQox9oezy-sr%p*hd z>zok4d~&NKb@7o0qX5i}JsRYQjR9crKuOFU=B`$Vtr*2D+3iJ*x3#NvNNardx50hK zTf=a*Wl!-^4>9?*TEZYuK1aT~)y90Ds=eH^?oA->b#o0=n3BaU;e|z7m~P76VNt3H z*y)G?76C4af;^KK@JiuT*zUKEn~Hm2r)9J~X2FDYe-K9Z_Gg3BYQRm$+bN>}G88(k_{k^7l>_rm8d79E3*Aw!dv4 zNxGPq&b?luMYZ1$C3HsuHGzoga+NC=J~~W+ctz2N7#V?=qlS#%qT*NqFf~rD7==_o>?`%7 zb1lO^t&-*h7V1Xwg?uTd>q~vEY@Z{IG35a!HhGg94Y$XUhnm7vs+fH+O|omv{NVe+ zyK>vqa^uSRS0$iACfo>!wY70Mw^l^l6cr;=5qpX(T%H;w(6WE0kx>t&o&v9jiG_YlRGlZE=ucUDVNt>auWvt#_84+{t)pOt(R*b|FA;JDB}H5n4s@nCRxj1Ooji9b`e-xR zXx)LzWZFhS^EjA$*7NT%Y8lKj=Y*v6i1cc-0m%b0jL3edBm7*d*HBHV4fm6m^>yJ( z-m75eeoY_q>hDY+iZ$Qa79765sn^1|5y}eDUV4O`lAd}JYPLARZ5!^%8tq8hWAp0l zsNq%W^}u59fmZ1V?h3Q=b1ZUlprcJ|rz|lSd};@?IH~?OFm|hk#pwcjl)WMG6kW9f zF?MX~8O7WJQ}t>{I@k4%5rTz312?M4ctr`YF(h1Z2APo_AjY^psO3Ox{PW&`aAFR8 zF(kd?u4!9zgravf^NU~LTgQ0$qSIRPmN}g0ZxT6!LBLowU4C>;yKjn0@-dok3Li=% zH*JMD2)Nwt{^iWAS)%``&f$g{TW&Kj~&`&8~56YTYpk3saS_N`;uU-4Y#w>_sJcqqmpMCs3sfK~X$yJ<-vv zAlr9uQtXs$lY#`+n2u|~c?(M)^&2=2C1HGZY<{Um; z#dS(gI723cBUviB$zBx^Zn!N6^+6;esAYDJ+wqz7vh4{*942lDrK+QS=Y@!SJwc04!C zj#jAW!yKd*X=4~6VHM9a(n^MMh@3WzwPN>-H^T|V@aPC)#XyihO3v%VFEy$Ez`(cn z!;#Q(?0*5oAnm?D+bJ5o1M*GKz1wi1I+73*YUQmgE(7_svVDAgMF=g$l8%^c(}Zac zo_o8iBEfZ%nKwhr%k}Er@esdjm0o(_Z^;z+_-qp$1oJd#uac9?uhT-j&A{R>nYZc3 zaJ%6=)({s*hNtVRyxm7R!J2D@0$r2fHCve>gr3mb4aZb`{ARk&brr=FaKA&ew@=mK z1GNQ8#QKw30S5RNnuM|g|BWHABK>l3-F06|kCxy3nT{r&)y%N{nM1{VcGR&yjc6JgHPBI7wwFN+|4yW?} zMK**FRt%phn4pw-+L`RddGLJ1a*W!x56fQ#1>|Vd+}=LwQ17;4E5EE+7=UW-k!@*JR~j{dJ- zojH2-FbqhbY~N*SIiqI(9J&n_srgI|4Y_f?9A&v%>HTOt^}Kac_v^q^qw%5Pcf_qC zDU~n6hPrcYCai+r*u8pyjUD*+5Q2B9T2&=7@hOGJpQ(~_2ajs2?L&|`_yC@c(v4xQ z8kK}A&P`&{KTc5w&b5h?ID!I4nGJzcK<|d^$XP$Tn7H}-AFJ})k*@byj6L-u;5Pv_jWb(-RQsIN!-rrtsI&%3?JDo^5A5DXJ+C_ zEcadRuxeJ8^+*koJ9Nd(=aY_2nwv>`9DhrXhxSO&K|gxnH`jubnn{@JwenL26SYgD z-8VT3d5+*mWr#esHban@*Gcc=o2I-POG7guWR+)7o+bKpuj$+rkfcW+mom3Zb9S zhc5?Py!~9cVq_CJ9m?&W&ch2T=McxXEb3e%fz~ z;-)bz1M7L8!1=_PIk}dbO{GUv?`}-ytW>6vTb=A?;lYBC?!ZwUyYJ8U?yAojCM{w= z)NobVEYR_;Y^zt)Pe{oq0N9Y79Q*&G*73=ce6?OB>x;CK%|G@09Ba|K${#oxD>jPE z|ILT&B*rAr@vV4fkjhv}%JU}a`b5g@2ACuNojus$2=Ap)eP*zYEJ zu)NPP>F#h_hNpG47vRm?Aah>fRDYVo$bH0mzhno8UDo)zTL8jq?36OEk8@;+_CKEm zXxj5a|55jhGIUQwQ^NwM50lVzAqUdEW(7ie*!G&r$OQZH>_d`F+1V}hkRv&QB+|jW zTgIfW{yOqJ{G@LZu{m971{*I)(R@<*%53A#DKegqwEg>VaYMlQqc&=g(NB|?i$8I$ zk!hnt{RX}n_<+2-c)J6G6H)mrqH*?EIOqhf>^uaIu89QNxh%pE0x}OUZ}VGDw*c#w z>N@w-V1Ch;Aq?yqk)(r(wZt{8<3KXpBQplCgBqd7_E|vaL}cW+v&e%LIPE(n|2jfU zKP}x)L7jZQjsD=TN6%*!r*b$p!ah5^@UOK(Ed$%19q53t+AWmYx^YQZksG(DlO1g- z5A4WKCZWiL1}>EZt*U1juio#;B33}5#G>;n=9t8V%4l^BtsK(ahLxsYs{+IK+(sQn zN5-+?^<(HFkH7KM29cht1_k9gwFj+W{B$J>p)JCnlUQ*xtGi|`Ku?omO31e~1Yj`X z(i?JhUa2ZLqz^dvCxPSq*Y5ik78Qh z9r9BeL`lh=wzr30CH(=1MCmJ`we!8CgrUymezIqRk4)YAi6jzH*zE|b{vpAu0lv;P zLd5-KBccbA!mH%28`kWf^#C5;JRLFk2IGJ@!+Wtpf& zI)MIVvD0%qZ)k)TjSX=<3NiI|i z$hO@{i&$-|%tv8QoIJu)B=l6aFbkwA;Rq|`aO0;-IJmH>Bd{HNN%b)Z+g>^2L<8CD zstaTyxX^NndSwUvY>u0?l_zk13?L=Y|-~>my~-EHP-OAZ1hZ9we1Y~ffIQ)*mW_; zJBJ5zWqZijzV{hoFRZp>!aSw>t2`RwBC*j4Tz8y%8?NMFncxCxiMAb$9{xm|0D7Ee zx%+OV*G)M8=76<`>3tY7hQdLzX+cfcKTVYxi#&nH3okDG|r-*%(52!$~&14SOP(7xS3*uoI1uU5CHwNy%{~PEZ5b%~S zUmpA+RfBvDD6>fq+fvm#_3&RVuT?3={A>CSqCLJzWt;ADgKCC$1oVqk-Y)!?je}EO zt0(yi#|`5KPRt1BoPV)Fd|B#h3!emwYR2Ird)lU^&ss7?IBR?&J!kIPXhxTHfBxdK zX&=O(TwQ&WuOA^aKRNsp>V>F9en(%BO3z2~Kh)W{&}Z-X9?459`aFXfU2Na6pX(cc zAa7oiI2HwtPtxPE(1u3nG|?$^T14r|T_qf;b`IYwX7HQux7ijgaA0WG1J9z4bq++g zKL{XPMe7NBND;aqRZ1&Y<+W+lS&5a~_Y2w`t7qMRp*w1Lyy#(r1&_r1lk&<;f=vpT z#td0GdG(i+Dvfh9;3nC1=(Ga;LmiH&CRdaB;^DC;wvKIi=0r_K!qp&C9nr=3XJRT^+(wq0-CAg`E_v z{o!Mr5s=2WZnKo`=^Mr`EMga48+dU|Cn#~UzGjYNvBKH~@_PB;EwLDOq9Qt|F`6i< zB#ZUbu=^G-aY0L1wo>Q!u+7uKO1zS1ln9xiWR`Q8J|xY^wJgNUlJSW2J4b@zxT;qz}at+8*MgFUw>H(+^?#DO;XJYuX&*5jPYPjHu?q zpn5E4LKDp^FC#}T$Z&nk`8EnqOCArmSpdIwTrE(ZS6$ z1|?kBlc4<&>9)&y$Gpczz)r@d;cG1kecQ+e3pP;TDM>?egGs`^gJs98jiIiv(N0=9 zQPng+-F+3uy*hs@`)z=UiROs7*tU6KQ27a1kH%VMN3qj8gys({zW;+dcDMQ8B%_GxA<%NfFEkUba!*O1z1t zH@{+05dHn8JH8An15R`&Yoco_N0_!z266VFa8_!@tRa#f4_$mb8#>6vfM!C^JCEAk zF`o?RA#Da2KF<26W9I_*ykKIL^2`#8Fg(+*a^0O+oFA6wYv^d#MK<^XyypudT{YG^ zCKcy|T*riYxqUXYwbDA3%1j{5Am~x&AQvUfGF2(qQ)w+y)u8CnJv>O#OvwLJ;IvOW z9cJxo2C)=9@sz%c7p9mnm0otH8|_x}Rc`WiPGMHw;SRv&R1eB3&a|+DUqdCp#CW|x zZ3l_Lu@GBsAL=XsdLan~@|Wi>xfbL@W(+ocNyDBXp-Qea#z@gy>YLE@w+c zk6cg47~7Jct$MDr#QZ+U zKGnLISgXf%g?YX|4)+!T9 zi_%lc_^s9B4IbgiTse&Sb{9W&n&IhQ;drAyM!ri>9SKu|6!k+S9vdqkqjtZQ<*pT&4IPu%Id&8(3_JK9K+X~sF(Zov<-HttYyaVP8Vy5XZ9a7 zr4@Cx#TzV#BcIS~uCexzC^9&7gas8SzVj*;jsP}U9$_D;lV31UjpMP!iitG4fL4Jo zE{m<`GdEKbBRT5sa7bP?0DMmgqknuSLMNGc)z4@MOmD08jkSBs*B$T`Y=#)%kJco+ zO@pW{GxwHS!g>$K-aWV9dvl_E{9UUwZvNtG7P@HyYkq@~ReIzXBdr15v(*8~k;-eL9%CE|3al&`FBE>LSo>_DdK^1Y& zObZ=+!Grf4h;V(=HH+j(Y@M4-rsMswt{7Gyjr73Ck+p_oX)UbA-7-LAyrl&-W8LA? zuEEoNm~+u-^`A*Fo-(0$FHJ*{cCoC4`zAKX&^ z@;4AvxV1=6O0gs>vbM4y3P(YWc4yaWe3imEHN+?9oUniJHR39?0HIZ37&_Occ@GvO%d^6EDb%y2h72+>uwK%z&Ok|bj)Ubi4_E}Osn`8Mtaqq)+q@=!IgmLiF}dQAxT{;g=kgfa z94K7i1VePOE9vJ#-VIBXPx4Mwl*Ma6$*+s_7MA^4y~)(BA6#7|l|f8xO~WsVOj&uI zWc@NceS|sVfc_eZ1E5~K{xBw`$1o&3X*I!={1xGi^`a-%uZFA=x6%Uy;*TU&(Upw- z4f!h01aMBRo*&U9-&9n8D>9Wiqb1<<9Np%N3kN$mEliUvzU?t0OulyyMu%&yl*#r%kDpbN)P1i)OFCURx8kfxJ&A|_3U-hfvdS>rNe+%svDbC72rt{^sD`<0JWq5> zJoCNG1?W`HGlpVtVa-W#<1t;D`>(!d8l2VvXzdsHnp-^--lm}iezRGERR^iMg%0nQ zPNAkjjq32Fe^~u+xMSwKlYI`f`1oc)_G}%Uq&A&XqL#)sS-tf znS*u^efDd;thK@@g@lYSTC*`_hkIV@3#6wjS}4Gl^xE@9C2n zou2H;lPs1Dv|tntm~EadG}Ze4G4TNZKLEf!rg7;LG&64uCxmlI54_UqW59ovKG4;L zGF7y%0_1giUJVo2`SM7Vb8NUk$H(HN5SX}j8Af7HB4JZ|wqO)LQTS(AI_NdKD0xL0 zCX|)--}XQny*>uKJK0xa(dEyl9D@aRfMEGFe338{S3$jD*<;Y@4Yc;qTVMV(TtIRan$TrSMdO|+QqjE|iHCtbg1b9@9! zDbwm1Dg+c+f_-G0+3xPL(y>uoyuKbOHFuo-$1#>R0t@W(y=V9RLgS9*#-9b>s65Gl zgM(Y~DV|^jZW1q`KQ*Q-p+Yu6t|CMh`QwyF(gOZ+|ZBE7oD*r-gp{tWGW zVRUMPqMYm~i;tUva$VmsH>J~FBx$zAp7p~nV#DKZ@4<`@a)oY)GoJ-Ir}_{_5qzO( zKVb*#%HP80uB^DlSyA>GGj*8jQtq#@aekg-sq>PZ69JPX1uDlj8h|s%T0~e4np@eL zlcv<@28fGTH6`jyMJ8&#xY;oXW1lIV*HQ-lu8{=Rm_;FpLfH@lrYeI!!OBA(z&Qm> zzcm||`n)k1vLHIgv#i61NC|l3akV%7m>tLP(RwYJke-oRPBfAI1l&=kvG7}alnmyjqZ-b zd3?Sm(!=&~dY4#??CE{9x_}5L8M=l~T%dkA%|`Oqr`a>XxelM`a83FP6c_bckQXHwCx3n)Nl3Jo zOC5Zg|HI*H&UPK1l1uGjQQc}Efj*P9eCf+G=-jq7u@>vE*WBggP#VlGkgOtxV@Hcs zehgu1%?m8J>2-Tm-XZ_=Ff?xPk{c0XL)aRSG|ve;3Wtl=hUG`7=faR z+8nQLolbT?2|n$<1(X}MNz1#+6E-srk!P)%OJ;8U*Xv+->6pAw!ld|9u@*z!W ze9s7dabkCR_p6_}Glh->@vo@zX)&h$z=i%siD_60r58!7jW?b;ojsqa6-0fYN-lVU zI&R$!z4g!FwCHs%Xf-3Ib&o@aXt`FiN{>cL1;o%~>+>lN2Bw0}icXN;=TMl^PE^}rw zT2BDURJS*;->k)bqFwJZXCIp2fi+}Q-W}z`$Mx@b*Gn+ETEdx>4i$XQd|qEMlO-D< z#GP|cO`18Mc*HsG;Z**$hVtYHeiyD6=2J)Kz zJ|NUzJko5Fm7vj)_Y$=;34y*^U!qY>dM2X6Bq%<|B{}`(@JRV;S>w0;kePs`#eDF; z0h#xdF?-6=x+VTN*c$~?BM9B+qdC6M!Qo93K|>Wyc?;KITKTv^uT}3Ql;vrOr|b&a z{w!@lLd-5CXNcQp{daAW(TxXD8KR0f=oZJzy}Q2@h0 zwvTx}a2@boR&{Kk?kb1Gv-U~R64Q3Tr)d@ahT=?gVTz6e#KPAuFCCaWDxQ15yKKmg>2-qI{bE~H zc$3{DYap!4&|Oo6hD0n%{MwCU>vw`gK^UfG32%jSHDjZFhdR}RCk7-7G5(_TkOlF{ z|3LBFxedeDozS!wweUD*OhPn@{oF_l)b!9Hfer{%wcnIK$}+8QZ{-C@Cm@r@l#$dk z|0F*Urx}S{g0bX*(9ew@ruo5pJa|9s*RcfQcG>cThlSWti-(cq0kZul4J`aG)dm6w zD1r&dEm_l`PvNSoi&n4?GI_oE=RrAhbRs6-S2i z0e74t!%cq8yEglNaFysmEUmb$W5q4b(A&6P=^R6|FL-xV7CE$6-Nx5q$HoXd*&qoK zc(97q{!`uvFWui4E^T1s(DsbHr|S)mbWnJ0^kFAzas4OYfifvIvIMLmVTg4~Rvle_ zZm9@}_Wh^e;WLQ&q6$Rznems&UB&r9Gww$4GyhVB`ZXAc!b-$8zawXOKB>=IUq7Y_ zy5#-&ftNf0y7RtB7R>dSe_s`P?cLm6ru*g7B`)pcf0~$1ix-g}Z{OMuQ$&!OLP46% z_$+NGqH7>&yd%@H)ax-KZk{hI%EZl#%46;2M?`aoEO3DO7#@o`ta4&=ooN2e=(Q{O z@>lAeKJA_o^OenwY24lG)bW*WLsPCBIyMh14TVkgTkN+lwp}-nwd;?RSnd7%*UIj+~l1;{!&#spF|V#GIP4U#0RVJ{IrV zKfMK1i2(abkeq8P1s{xk5~+jdf$8Q9HhM7y+?eh?SifgGxJ92plq3nVre5A1RyIbd zkyWWk6t~5#W|KyTP3bMj-&^Fk1LA6Qc+t(&@;=u27)McL$2>9A0@#@*W4hb8!9mNI zHLSd*#{;rHmPg+uCx%T@0Uv6H&C-aK%t4Fdqk-3<)tAM{WIcmuiDB*Lk*zW$obdT4 z(V*HU5r?`lITE(b(eD|U-?zE|FmfBJKqXhBWdUq*pX#9KL}7)fNIidPj1k7JL-Z+K z$&MxPMKQi90Az=L}hY;G-xK%EF^!!uv-Y`DQYAtR4HMwvyWv{N&_rU(! zzt?AgJOBT-EY7rSENt29VUm~^1?k41@G!|0VABws_x$+j#F`ELtT&V;X5T1$YqXVT zkvo6tnA?MzwExRc2B)?R<@yL>ng5I-FOSrXYKD$Cwg92THSK-#x|SCq`(AfkWIjR3 zA%dscg-%^lbcM5u-;9Rme9KQi|27lz+vZ7)5oSteeL z%4tkP8CAO1IZqQK32zPqq}JY8|5ZUHDe8j=L_|0t?}80@x?jxw>+QAGMJs@KYSPXF z;(2%nATGrh47La87qx?xl2{f`EGONoIl^Hoe%T2}#E0^)bGvs9T2F&yx&w$GRA-<|4{%Lmt2L!L;|@*{!a$OioXl{r7`H| z20el*=im_d5WOsjccg)Fc>h7G7MvPvhG!{RI!9hC^X*{T46pg5>xxIO&ci_v31aq< zz+##V!thv37hj)E$9b<8t z2PTFcCr#e)oh|NCCP?>A0GS3$Q*zL#J(1v4HJAtu;`E zeYnQj_Cy|@zD8%BD>nJIeuS?ds84{8&CsTco>|YT&0DHk1!5l~Fqeb(oX`xDlp4zD3r#?}V5EpP>1$vFzv zb(cTb@g4FtKiN8vWkq7Fzdq(yRw!Wv{XUG?NmxZj#@#u4f!xN3pVw%rvl5*RWcUz9 zAWj~_1`^KoVD|)bUMaV4;%{WAG^X|*J z9DrcRZQ91vg(U69dk$9K`XN;uwC=Kf3|6on7rKN-e{7`gxx0B3$q})>9~)1X2hUcF za#=6Ua{I)!Vb36`r8><4afkLvbTOKQPZm0XuWYc1@rHic*}01EByQrOUjWZK9OF@$ z?J_tGDK)?$!OQN)F*9kR7m@pF5s-IGLG2Tv5;;g^X(DSpMEfZ>=Q5wye)lELl_)Ve zt2?a45jS~y*OMqzL73;?OY5Z(uGC5$jo?ua3Yl?3x1vl2xx9&pB8igP`3NG8Rg)*X;uJZ#Vf1!oUTT?71s~3D75o=9r z@9ZK~+!3nK`^vgBm6qROgcMRfcL@8}mZ3gjRdnaPy7t`Lg7VpdwJO@%=jhY)6?QKM z|9_(@qF7uX+2n+7{Tiw_Rgg_q~UyZjzAM7cnK7MTBlvA=4{=LJ84$BVHTk zLl$NuN<1YA2V!)W3N7!OKW2_@=-CAsq-66@9I zaSr0Krj;M}VLAa*Y+{w|S&Keblg^h^UI8jwjz)m z#5|W2X9$C9jW?eRBy>YIb5>G-d(%B0+&z^y2V8O{32TR^ZNWY|#^}X}#Zi#Ezou3M z2f(s?Lh8s~Y&>F#IY~l{oS+BW1eo*MQ02azwk-5xN1y;`w<&E5N##*0Oxy~0Jf0eu z&X#+oWt5271(F9KeZwC!D)&UQ4JU5^mdf~rD{x0#qNt_A03y6->d>5l^*}9_AJm$7 zLnOz56J78M_{oW$ujt8}R^pK@L$<|;epuVh#vS8PQmDHRy-NsBDpfhix_u;yu zy~FcAk^fO6fqjhXeqAUp2=es=9|N*g>RDM(iIxGMnkP&A#~F7;ZqfUrVE*y${ka!p zVYORv+|IEa!VtX$shhPX!Be0xfz-b%F0-6l0Nedvyg2@Ci97a+!)&@; zDo%k&0bx=la5u=Uc_Yw=11v@AZ58Tc<8mc~G3LM4!r7KVKPZKMR7GM5yD2Fz)F zr4A-sHhi(8xqCXK825|;(vjh^HChc*EG@+Ry?Oc0Zw~72jnmhX`xz}7_21ZY+W;5S z!GxC;*7Cz9f^VG9^&@XI#AALz8QOQ~J# zB2~TRPq9dxD|=Dm{N-16EP;21((Wa{#d)B+xj+!WvRu>**WWwlF;s#o0CAg;wxJr^ z&n_qPVE7#xcr;ElqumXfVO#W{+4dBiaT~=?(_JD6^y(LTjiBba9oA+1YxO03(zVT` zMe{M_m*eA*5ey$ogoWzzb!sag@3($kb-O)M6#so_(ns;;3E)dD`NR_2DpvMP0Y=+2 zt=uB+gN_Fv4k=nISpT(NcEMT<*AL?`qu`u=Qp?T-{iRn>W;xkxS!ca!p*e@?$Qp3E z4PNY6q_;oC2plbe-feoHMzgmQSv#34XLLuG^Hg}gEaFzqml{*5))WG2n2&1GS{=eH zS%I%_)&b4n@vyb}w>hlI@ZL?$b)xL6wjfQo#-jN8mX3imn^g#1G-d_l90C_>vyPU#YKteMeIkA4U8wQ3lLRo9xXnbg^8v*spI|m}JJhC$NN$|W84BxMz zaKCs4Ks;tmV!E#uKtfQ%Q<{!2E5({alsCKOmG8Ma{8YxOKi&rks3tC6Gd2lJA^)Zn zA(9T@K}BaIWGx)v)AL;c%Gd%0_QK~-t0anqRXM4vj{Ybo5HI}FqtQs^rCZyQ=*9*T z+7_Y7mf_kQ7{MU7uA~GuBm=q_NcFLhVQ=xFgCK<#lksvySUtmkcF&D0jsyU-te+A( zED!`tG# zc^~a+f$rht8#Fg(bDegKd+Qq}Om@i0EIg246&5A4&7ybK29xwI97WI1yv2@y02B*K z+)Ji5JOw^?2QDXXc5)|*ovLza>AU7;l7Og2Fn8W!-P#{zdLJAT5_=_uEU#q^D-r(+ z*LU#o``k8mw6Q5lWI^Np!^U7cuXL;YUO?$Ty$M|s5`5L#7l=pd4SjAG~ ztpm0U4-QjGFfM?7JmZHTYHQGhpRyVJUV-`Kv`WzRBs9S0*y6LzcSH6E-DBB@tF2Qd#nxdU=nq}W6dX6H|La{ z#dpq{+K>DT*QqiO`g+>4?YfzgdV6s9Wo|#_5H%XH>w>2%H^b8uRiG!@K(jAG9ZXa? zeA0TDontQKmYu#BxtY1m{`EqDcuFW{tmS{@3=1_$&_XpdVpm&474t%$*+^&K)~?2Y z$>S3Yz;D1#?0ZE0UzsfP=(gqi&>D>{&+GO|lc-CnN_}SHjW9}|WqN_=R?B%0f23Qa zx#sAPS8v@vmyz=HTJX+PlI+Xz5K|+z$f-J>C!ylhAHP(b0gE8n?2bQg&4KHo!srIh zh&@{*aV-C>jjJi|Ei&Hrw|OtJ%RVsxdvgd8T7T_>>vl_T;RbPIp)UG-m%1d%T&F@p ze{eun#s+0d&fv`;Vp+4{ofq-#4tguwrjsivsxb|IDFaS=&C#EjPXnj55ZGa!KKDF08?2XT6($2Yl9b1Jf=)q^#>M$kp9=c z6bE*s6!@788qDU^iyH~=b>u7P>AcFrIbsa?Yb9gj{k~2Si{(~iBhA}gAe)%Z8%7#B zPpt|hqk)w&%*iC@qSbx&nObPnU8AnopNNL%nY1%iO7n;%?3$pisdk?=K#Q_p|54Wg zAO3;F33m_$+_FIWum&HvQQZx~#J&tLoo{${{!OxWAdurf!`LmQk5KgUS}pABr~RGe z6NVbUD=Yv!32MtW)K|`2hxSfzxO++f`&8Q_Vn)Mu1L!LWj45s>4%igJS@ayNin$<1 zYsaWhQWo-Xd>P08wXv|}MyFa*Yb(B{2t-$6lonwjaG@@bXHU{7YI@6hBi4=$RL$Ce zkV>FEA3V;I0V)ec+mKP3z0qa3y;0G@#ia93EW=OqzG&lQ^teI>mP>P%UK+9A;8+DW zvvFS!-c2WU4I_vF-Zycnn649zT%V#-nYh9u>qrXpS;k(!NjsiLEgr zQ6BtvBFrUKa#bD089r|pedM{{lJGq zycRT``;%3?{Dm~V0vJwa#f4VeFBZ8QTOkDGqiZI4XYg+}UGY@0FksIg%H?ZQ1<7m5 zj$p6<+pw-$_ljDZ!1$`rUXHoPf#aJnWP`|q!uG9mI@>ol%&_6zXz8RMiwm%UPMs#4 zO4FfzYZu;o!zNR+5M9V$i>_u;&TS<7=GWe{!mAw3cN-}^5@7$Q=7b2s}W3W7LU851kH~hqdI66&v%}fnD>2?o@ zjMR<86-`ojEG+Yf9{Un&0En>tV>xm9xGYR}*PZ2JR)@wep5I2#Bj^0C}Zs?YsLs4V~Fh-JEbnmw83 z;Z9RC;qg&5sX~FQtdsBhP6%c!zQ(5x#k=4cuO|yU^2DIC!S;a`#1l+3$>9c9B;cn! z`NqgDra(UZrt9r~gPJn8^=C6bVK>e7qPvBgR3@-nf$tx8Lq#PFQ>=unlMj{mD176t zHzCU-YK>ctZ_w4->Gyv~z&^m<@U()rFV{a-X+yz-zCLMF-cGzaF%?1-5?#+JCor~3 zr<;Ei*tv9{zCTPMdaSZC#6PW!jwS%~02GCm`WU&iqV%Z;ZPGu_$$OVT&o?vphC*Aq zM0IlmwV)_l7ZTW+)u$;gaiQtK(Xc!#^33DF;ql1^(P3l8mqHsM87fOqx>jjvNH`I& zC25m=r5Yj7WR zDRrC{YjNs{|7KcS=$M5?@`(99cX7qw{>Po2w38YM_f%+vUuN(l-30DSm z49*YJTiSd~NZpOWG7cY&U@pToIhW680;Jg311o&?jbmB+rW~g%?Pkp_zb%b@j3K5q z65?BZ8drlsMW$D>qmF73sQ~k5IrL~=L_lqapeDY7RMUlp&LOvqJ@e3NK+d#_9n~ZA zH~}O*F2&-44U&%RD+i^d8awF@Zp**2by5JzS;lt>hY0KYT=M8mY^wwqBW%Ve?TXU+ zV-MEqS_z|Hndhu~1fHNg&(F@?jf$3uHW`T432|Ki*gpIbwWRV=y*VX}j_p#O_}Xge zs(N0u#a{Xr+v8)>?uGDAHBiPPMLp9KLtqT3w9m*S4gAzO(LPqW0nL$dwJ zGCsMA>p=<1YX14-t)zCh5}-APrktV_v zNX;%rvp%OOfKe7)B?F?Tk@A&*e?dud*3e_dZ`UXd9mYi74ljb9jg|NQ?Ofzrk97;r zZzh~L2wrhq;JD2ul1|}^`DG~A=pz?3a$?!jW_pWTxuPkI132BWB$xAu5hMrs-lj+M z@1HmEIT*wYJxi+uw$O~g_+(5aHH!PZ-deUNX#LSD2esev#&=xk)YXCTJ9$2iPX@@s zK9=UyyA&Mzz|N_vRGil*l0JheJNZ|tI=C83D?^13l%*UZ{JtD0!JJMLBohNuoiju3coVfU06i7EB?;ue&SQ#5haZpsMKFsG;<$6SM z>$&sxo!k`rpBkvt(M@5wlHK`G>WM`ds8pNgJ|+QZE+(gUaxxZHiaOXJO^3D8;Kr*} zs*9t-$>}VM3d3ny;Aj113wG3{O@9UVJ@x#9#{zl`nmMKD@NC~zA}{&jW}sBXFKO|h zc50IAy##u`p*2l{iwlC>p2ms&fF0z){qe8dJYg>8H;}v7Jdqj<187wtR+JSptR>PbhAlt*fc}8`o`KPMhb2r-ZwKYsVsWL#%4A0t7AUFCuI} zLJOyPq0N(9j-k>u`wg?de)pqN<*7~P?9Gs~zA*b71WvtPqm947UQ8sH>1*UVdj{d; z=5pU~PrZB9-UjD8%0HCSowggg^Aq|T83GpcymmL4n;W4zC@oq~!Syko@W5Mn_98LV zep{ac;{=(`?1MUw+M#4N>L+U<$ug(CA63XOJq)kAaIZAgal*YrmB#v5|&0}4$z z6Pii)4NeVH!i6U|iyrGiGO9LG<0CA~29al=0+Z-5@SGk~df+#E zX@{{B=Y39c{Y)Nz;32EdRmlPT;viUJL@})7$1vjA^WXcT864ePdMvE_psmwZQFX71 zXr}R7$G2I1PH-;Q6@|oel+eGY4Xz<|$Vf3Me||Ai@HVGel=8cyiTb zrsfJOZCcaj6WKd~ekeM#V2l6#C=}avpC%58+wQ=S;+;easD5R zoz!{YQhT|8#S&7r=mCd2{OsZRPOAXgjq&{UtiscPmZ}G8fTL=|=uS9~WYKl(Y_mWz zAY&IA9-V7v$wjuT?3RgiUw@hiqC4ga?_&WXF^+5hwQeZ6zOpW<_cIGG-^MV!=tkCS zWoyd&zm(*juY@$>1)|hd=IlyVdc9Fy z%uJb}kR(Lq)x;|U)#`rHp?=jC`{Q*$hwfTbAU^)GQ9OX z-z|ATz*Yi^ZFkd(zZilg=noccF_B0KsNa8$d$1>ho8^1c0#00Q^DB7wz6Tgrt%g6N zr($c!Xi}Fpu+M-ECe3+xSuiPfu*|7=TlUEryXuMQ|Sp(qX2*;O!AFSkiy@*A8tp-fx5 zKEhw#F|+Yyu7doh*P{`>foD)9*>B>Ws4&{4x<{7a+VjoD#j)N?;j z6F1ntHsI!(65_v~TP)s%-+0>!$17jnG*c0%$0@pvWl5N9eW=y=)&r9H82hzXB)y-p zLh5oj&Lef0XNfQuH-m@=Z2^GUy3^U^u#92k0@{f#5?_s}Aeg?35VzC>8J*MayV5di zQE3i*qsWm$U>&=2U(l5e`iFRbi$dJfKk?UuTl@i2QQ$NoOSm4^R-9|cJg5*>KlVYx ztL*@{qJs%%)}vY$Of)vevXyCR1e3<}7}zPx8@Yp`b=f0-O&~eL@ z9;h~B#rd>W!q*PTymo5`ARyJ?n;kRP7GuwrnoS9O)`gF5z4~`TDfcmQ~ezB}(EskIlMD72H5`6Y`3k#I{YyunS?5>KDVD52jtmLmyYwEX% zK$N2%n(EHXtZ!gn!XwmKL5 zU#mUfj9P#TAWZqEdz7X9D(7V#me}eK7ZpyaVVS56&(Prqa$M@Q`H-PgPKOlrV6pyI zU~Rw1+7n@@o*_R7H)u$M&yxZF)-P@RAUT3&v@{E9wTg_Z>6rsWeZ( zUZe#fDZmKaHsx%SME2-)^E#$s$_X+wyk(55ha2(Jxiabt`dJj`>M#7G!L%z-`;>gdyjAMZsd#U9{j z*9+Yzy`qjWqP!!*ShbQ~4PVTuvj!MyFAIh_7N66!gZLD}atccfskvLaPb9~YOOyH7 zop>Re-z2Gs| z#+M24&{9^J9W5_jNTq9xt@QkWS0|nhuZX>&lP$<;?A(I17GA1DH{6-MQhnAv$i!^a z_4!>Zr6#tzlk(uC4I^zq=5r?3fxC-aYqI4>3eTZEh^W~ko|rMIhuX)+@kOm=8rGn> z_%}?6;c*P>GreoapBi&yW{6tX+;=WnGPkb{igbM{6{mcm@uzq}jhfj}v78w6$cXkH z)z&o~iG|+nx8CXWMU?NK)Y>0BQ?!Z|b&!nzd>Uc5RogFp$9MqzrN^60T#g=b8<(## z>k)~$9LTUAWfOMLJ;_530Jg=n$zlyQZim@Dhm>{!inVgCzW?0J&U-@#z)1d(9nVc*vr*^A?nLMDY4%z z1nB;Qg_-=->%fa0?b;u=A==Rbi)Q=a-0d1jhZ1&^qx2S!p5Ru&>v6J~sh5Hr4eI|B z!EeToB+tp2Aky%m0ua7y5+^rV7*yztYxWcvp~%HWA;bxP740c3sb)r%A}UyppVz9C zp)9U4FiZ)p-;)7K$kj4`4-Z!xa0O(gM2!IM8mOF#0`E$-(^U^B7-Sp#o;)bU!!^b?Dj93R=2+dZ!) z6e?R~%QN;|h&Y~xdoW5?wAtplxj!WNj;#PZu*;lD5&iMYxJ_()6`P8HiN@(wc5LRl zAheK3mR)ECMIEIo;VTG(V}&$fd+2Fh9%F8d1|QNDIN8<9(BOx4@Tld#WI}xMt{%`X zp^#)Mt40B!$U`F`N%qIOW4x|U8a?r5#%2XE+*5O!>Hds8eMa)5e@m)x&%=HugCAW$ zEIoSFGGkFn%$qvasVRNBk1Uc_;jP2MZ&<3BXy(%zy@-fqDF!MjFG0D*&S)t((U{?) zJpA`agC>><8*~59>WW#6`xpmS88DC~`=sk?;J5@g2l`%-3`ATo#7{3pp!qzNls@hU z!K#KC^xEZ>uaz zhWZqcmWQ?G)ikdtd4dJ*GW-}Q6Viy2iVnnGC(tDWKqptwqwsgZc~=aJ!NQl(_d&K5 zdza|lFG&&ag++#P zTRkv3$S{=PSuupJN~nwd>owa&Ry*`1L+1G{%u0m7=|zB=FAs_oPQ;_!4OCy@}M31pFV)RC=` zDr_OiyHQEVevQ0g@UnN|hv-}g=h5}Zo>G$Ms)T4C1tLm<&laIiyg_~LiM%wBPWAQ& zkQ!!s12LGXXELD!Wfc%~?|eD}r}N3gHv9%HX|DfOj&t`s9O-~{Dt-zYE!F=&jiwAzr zR)IJf)9Sy&ch z9w@oCcQQvN%282@t9FJ$OE))nlRLl%Ns36dQC`@=A3o_B9B0KIv9^%AUd)E zjs9X^rO-vm)2Hb?kyj22Hw@>^kw-7AjvMi*HR2+EccAy7*Or63b`HJ)gz6rvKQr$nT$2+y1?>A>uYgEi+)T+X15gcEZ zN>*C%_2R@cmPHJW)bW_KHr@O1efOcK@8tILk=l4(JEn4?i^RCw^dr1zuQR>~wD$`# zpRw!S{;Mlc(4_UK98B*D_mln1KYgACZ!|BQo{AA;@B_NeOu38924)js3X zpFc4~6l4IJSzHNqnd^gJ1tOFW;lgjge@JL0v>@IAr_OfdniW6{fnnF03KpafSr_~6 z&v%im6ePgUFh4DyA}@b0ymYm#a^xPk+PJI`qal8jJyd1IAu7k zZuZ;}0zX!?m$&#*&a{B1JN-u~{Em$Ab=d>Kj+slZ_K9+s>5%~FOAuV)4K?k6XyPOA zV_7%PxaB5iCGh43l6qayxJxr+ZUj6I>YxxpyV zs4FjC{2|!qNR}>!F?rE60j;gQysQA&>I!fP%slb};LuJl@(N%fP86RN2-JFipWEiq zQ1dK9JJ*CBc3KE#3QVPZ;bkzl+M&iQpRlxgN-7{r1Jh+A^s!2p>j?|7tS=1D<2+N! z;>}?wNEZS@grG-XR1GA|Uxi*GtX09RWogE~{6Mr;oH1ewnL;vYn(AMx`#EIbE2+4} zRC_x+$A^Z(BI_&&rY4$8sp@IigOKYoINdvTL-xkzYkOnbLcWI8H-K<&AyWKYb*E7) zEOm4XHyWC8B>sG*)d=*v>q^W{9m)oMeJc4$raNtv|AR87zY&rKIftSrV3ETTf`Mng zYUCc~;NZi^(Tn5R8By&hm?)v@EXy^7^Z#i7$Uf5r^LT4axZl{*nZ770CF|wMVqR{d z{QXOMK!Vf(lvs@MAMhx^oILk}hRKiPm@Z!;MSd5i>QCb+Xs;mj=QU8cL({(gq5C~h z2Nj;|-D<7?e-2RzDQ-rvO3JBY=$*3thWd+2=%YW$CK(BBB1S=NUU?t_G=bBMiJGGH znng|#57lVZ)pHDDO2?~KQ|FkDI)KJm%57l>J_$VTZ7b(*kGw`gIZWSl#-ixRyB*b)gS=mGm|ACwEG(`RtY`8v`v%~j`gD)kpZfM z)1^%K>Gz)MGDN7%aDM)YrUUBBZfZ$!Ui+mz|AI>IR~mT?DOb#zn7o$HX!nx04Az=y zgirSr({4*L$R-JIuy+4>Q>IDs3neBH!bgo{);vkl#L|p5LzHuWblrw?i~6_S8F;#Z zb|AMxN!G~+40@P37GrhVq9WIBG@$LhSh5~;xDgIJ4TNw6erFxFth0JCwIKlVq1O;B zqIy2$H^ec_OZf%9y=UKKQ^q|;*nU&~vjH&Kw}0V6J{WK$+==^}dM>~>!XwC9Q9PqT zMJsj@ZD1Nqcq+}bH19K7^zw-)Y;(hqnyMV|VrchBluYJ12c}5E?C}*y&)Dqg^H|*p ztoEGZl3#Rdta`e1M0^~FlFN#OHvDcjW3W$KCR)?W4Fw4{_)riZX}ja;e5(*YLn2{D zK4l{88bU=yUP$_=C>9_;{L~slpdDON46a@_2+8?fEk4)?UqaDGkhcCg$qm?_;F|D8 z8yF=G0PWVk6LUfK+{bUm$>}xf?F>FeKeXQ9RF&@`r{$eq%!f+X+&`#spVIcF!KbH3 z=|~o8W!Xx>z`EuaEb$T%RoTU?)W~ykQEaEp)Ru~=pTMYW(kgPuf%dFiI{{-zUKDB@ zQp<>yY!F`Vq#Gf*xyb)nK(HqyWhCw>%7LOS;_mdH*&<(<)bWUJouTll1Anz3FhFln z)zo8hcA@1)dC?pTfnPkd>~0ro%UL+X?Y*8iGNIL3qmJSO8^{W{@060}KHAJUTAX%E zWG7^NT_fNU`%|Yu)0xLntwnMzr9?2PIjKUhHaht}RU^Aw?BH{})A~j&mtDDiR$gAW zmWS9@%wo+UOj&x&7Pit3O^#uYr~l^BKkvG8DcYJ|p|7Vl#N5grbno2PjJeiOb)C%6 zN?>7k-f?n9KwS(rE)fQ?Jgdt|1E}TZa;u->M%d}+(&8BUP3txYjP%$q`|rxD1z1uu z#?$>l1duNo{FsbUfGnw<-y5}sSe;rHvI-$IiDPDzgw6i&T!$a~CD&cExkuLx$dx1B zYH&H>G)Hdhlmdaa=G`S<|6WUZ>y5ilVF~4EC*;K%ZC(?t|$^Mt2{o(Evy~MtykzUrWG6~n_*SsVq{0>gc z{K~2NZ=7?!;CR*J#f3D_G&6g*|F<5uwTG~|9mV~r>{xIJct&E}P03Q8*y&(}m^%CA zdEkhsd9JYALb{h^nIRaoetNh`nmwqA^PvEEVcRMEAbF`G22EM-i)KC?#!b`Go?F(E zdx~xuquqw!w+v>_8BFMej^Xu?b+i&Jv+>6aGs;W=amhnn zZ(Yi)(=Kk5V`g8y@^IDu_MEtvzgORslgS0lps7Y|jTvwuWE98qebF<)S!Y2?zhwn1 z@@CG|9W5WpAku8-b6>cQ3cO7Bl!B}f(pwo?R?0mE7Wp%#waX6>gT|vSq?dxYjkjEg z%gM?}>U$tq4$!f@*iZJkGYNr{2?yoI{;LP^XyWC_vI7p#4u{E7+KEeH7|ezJKfoHj zsv(f3gV41G3MzNiZoDO2TJ7OZU7;it^wei1>(2Dkd2~5VVl}}}kZ*M#v89k8TOQ_m zjoW#&-V8Xgy1lX_`W^v3_k$QwZ(`inr>|}z-`@kH6$ReYJJTw$1H)B?;K-GBc^tqg zf}C+~A@MEoS8p;i<$GzFyKy0eH8Ni;yKIOruLIul@eR;}Ni@R>!af(T8y%K|eQ16) zcA7&eep*PbVVC=U0A;Zn;uhy!(jXJQUuB6W3!=jzN3EL7N_9MUSwdb5%uxk%7fjxe zEFe{s8A$|e!{Mp2$#|Yt_tKG!y)ol*$`Jq7DojNPZyekA?p6~#TL;=loNLL$@d6!#DZs6ySSV$kHQ86 z?9c$j8nV+N-h}{P88{uB=ICYwb%@b__L+wULXiOfKLEgp&&RuiLc6`8TdC_(ggfUoA}^FAuTdKH3^nroQkl&KirVjapU>p%>WJf_x}3iaXIHVLt@g`; ziu{vvum6eu5_0HpR-Nl#xXPkam87P>y})#*5%uK5xcxYmG$v`z?#@$4%7 zQ0;!$h_HvjYjq>IN9I2wvVL+VRmwlMFcK4#^wV#z%p0$FcRzR*Bk-P=8U4i zV4N+as;Kr5`28g|wTI=~w#T;v;Y9_d6DhKy%UF4%YfuWn+%S9<=cG9td}n^Z!e!yt z!1>htk9HqFszrK)>uT+6ohiuPA-#08fTdQ&ZdMi`<@}Y7^z@b7V!J$7JO0g04V%e)aPfl_|GS!_P*1nxLdTnVM2B$lTmlc$RmCQ1kQz8@qh zSeX;rSmg89wS?koqu3?mw=d|y8=Qet!c2|r>ZL&jq~rY&&JOJ3iQXF=TDvbhgT>V1 zhe24Y)`#HkoHq8dl_{8p%m8Y%$d6E~1ToJAy?>Q@z6-x)LS{wgZt}+^R|uWL9|meX z>dsk19%5S)m>c^1lNT9*;7Kw0yhlQw>91Ec6b7N^Um)ClA!XvfLOLCd@_7p}J4_1$D0eUrub znP4FtF`M%BRCBcw$;NCor1QFO47S~ORJT0Rzv@9 z!cXalPKY;#vQvF7Ts9E9NNKvY3I*ZU)3x-RjxiwKPgkHRtV&hM5J`OnyG*n{?qfI5 zDooVdfIAenGgW9(qcVPl#cAJYYY#pOA^cC0N54%L*4C@Cbdon&2{d=I%e~J>gTXE> zfYR$#z_B*kC!7_%HAK#B45lPsgdhUNlYo*?)37K;r!TVZuA^MZ*ZldX_CPOlE9pY@ zUHC_uGKd^-c7EHTt~#^M;Re&ZVn<_8E8N!uOsTNoX^J5+kf@PY=OCOyu^7g@lvKD( zMJ7E>!3-u7s=mju{fk~tr75}maK6dXPn~2;vej5E*~-|G=~fO1y3m0dl&Q(UyN3hF zOUm1wuMs(SM^H1=vspg8C`UEU)Sp#$*}rEum-W1UGqfs9Q|RjQ$gK93W!~gNOZHN7 z#uO+dY>XR0`-)rzswgXZ5u#Sb!Fn?SZVQJHv%`R~BQv$H?yJQ#)vrojNOslruQ|(1 ze>c1~{CB9J4m(_}b!giAFW&2#q zVF-Z_8cMq1lpZJqMgERYbE}n^pi#w#&DAC$aMf-Z!|YZ^!Jc#_gF0V-wUi92)wD5Q ze1H1mEOU&SLd2!P>Fuop>RPl7`5<+cZ3lpb-`VWt|i1y_OvU7c9) zIZ1TYX0zQ*7v=^Qy8VGSyTcai{i+*6hIBl7Pd7Q~B7{6<+~2+>=klfk7sppmL`A!W z0OT0T9GY7b((v~v{XG)DJ=7#SXnw;&>G;Gsq46YdiRPU6dZeK)fClK~R3wrw>**R2 zp3KX%c;EgfW%WRuo#xIVwz;BEH8A{=NATwyVr9J(0XdG0Q^>z(bp}`EhnvTvI_wz@ z<^fl?+?uIE#&PsUtz$pDw5#N(OR7{S0%OnZM8Oo+aS-1acTR%X(!rrompXZ-L?ogr zlEsbfUNW10kuM(;uxhD0)N{Vm33-2Ut=U%WRlaAG(%bs>I4m-#jtG4F zy(-3dTnq>q#8@lmi$1(TtW4KSQ@uGV>k;`g#U^@$eRYX>#8Vy5f;ZRY>pKXkKL2KI z%77%seLJzl(qqvHr@D=H+e8JA!s<>ok)uZ2OT_BD@_!K{jcB|9y1C%mc6Pu_m`w#! z>9LBJewo@A0vKa1fMFXVg_w^q;mBVg`UU6-dVCMAQ|u0(WQJwpk!Mhv1R`R2UiFEZ znZug6D;qL{XxM^id-$@(V^T6~*SY>|;nKCKGpA|sh-n&B>(xJIT@BbS3Ga4jNrUs0 zPOJbU^2YQ*M+v)?MQod^tUy^!TS#CA*4a`zvT6s=LL4kLLojKhC;wDXN1i^{N@{XQ z?N)Jk35oi=QBZ`D0CFKKUH(n<*PkbSt%U8`O=DZ!t$|s8xoNjT`*}j2va~HgL)4nW z@dQF#V1H$MtyN`#^FIf0h%2o2(CT*hjI}Dt13(?;&gN$47~+xOqj`PO5Qduw@hK<= zUgTMlg_1!q6ATMZ1cf0O`!P=7J;jXgz;7#u-Zhprj(s4A_+E#DYRu*pAaN&N!0GDO?COt zGh(4BBy>fepN%c_QlH$8eSc2fXtPj(vdXMWiPD8tI=;=bEMFnkeQT16p4~CwN(s%Da zYp*;8d%6DA#c;iViKtw|<{8}Cr`g@dWnm#>jiQpyVR zv;}Z+z4a(epKI7TbbbrJP^5$l;43dPH}x(CKb3KLN;npwsmdv59@S*!gcScn*2}uf zB_2s_EBs5jBPo{O$*%I7WHe>Jxny$&<@Z57Nvr2sWFOdu6K7L1$*4+c>tI+9u9X7Y zvlfy^>abL!s9rs=X{^h+UdO6tO-d7SE-HOP9i;c!IzP#Y;{+Su_x+H;j344&+j!K93)EHoz*s^t+06}RVS5?r9F zt`%%5|JnG;;2%0SFLvqOyMe3P(F{g&Y$K?j9VI8tVxbV5S5Zk<;DKyDRuYL zBdT%3lExbOk5Y9e18kba<^Ua09W2{QIbC96b}uI*gtt-xaS)fV!HD$?ejl{y6S+6i zyXo{sd-k@q`)VKWr76rFh%)HRG91-le4Th`#|k?G@U_qN-x<{4K89ahTrihWcf3&q z%Vx-_@7&+}vyCn7nU;p zctnV;Mv|*R>CY@uoJ&_>sJP}B+>>==QTeasak{$!oVC_8BWc+Z_Jl|Wg)m~FB{Z(0 zYAAq!oFnT~yIq_J_ag9$xVbG;6G6GWO@MiHm%WyU{I1}h`Z`vIbTf;%8(;p7^KSn! z6!XN1o8NTkMz?gZ{BYoc+^Mv!hW&yC@5So}apRWBL=YC&%u14XU|4v--=^QVE%#>P zAYQr67ttgNUjn-Ee(?Uq<+6oXHu?nRqo(R_>&g})#I{=nY!DPP3DKdiK4p$UyP>Ld4nv+#xV5 z1`#lOXmW+c{giUPzSBJL;^%S%w0~y3Pg4{;nJg=$>ak6dX6|E64S?_|&ki&z2&?nW z(n9qTf$IAE2@1Vnqp>BZzsV+4ziZbd@pWmChK@b5C4U@4?R9o&Rw~`8984wbD7wQp z_k_Os7FNhb;FxNie2$16HW5S@DXSL5o7i-bq@aM^D0irOcP`0bOT zZ4L3mid@q8RQ;_f)JLl*-_!;j8|0$G?pyq8HboVqYUCvMx2^?OH1$&c+1!*Zd!(i1 zWOgpn)RX~Wc?!OcN?0_`4Wh8}&MYcG=^dRw6~ykR!Q z4^2-zQZYCH{V$HR zyWKp@uBwiPs>^|n4FR;QOMij^{bC>5)G>9HFibg^eC~y*L(2$z z-KcBrwl&9IlL*7kqpda2@5B#mq6FkJbY?r$f9n2*oaOCwglme-Qo3g)gMEUBR2bF-n209@=#fkTo%ZU zo`m&#c*Z@^835nCoT(X%XYbWRY?PLwstxX{XbqV?EOyP7n3x!bu(fwSNwjoj@WIr(~n=!&B?MR9J1Hy zN}9$Yn$ftM)4{6U`4z}Iy#eydwsnx3iUx->D@lBIB@C)vIXL=yu+k*ukT&*wJ>t<+ zl`9e#gPkx#ni(aboZ(EsrZ;BYFgh-}rFwWT0Y?Y6ip~zH$txfH zK6^fbXyW`1`Qr}RBotUAJ3$K(99Y{=B>_@er!{nH3L`}wzpoO%`lHMhVjE@m&+)Xe z;WTnT2#yS)$)Xf6b@MSQ0-@McK%Lsa+4+4_FD>~47NDo$H zG6~9gvAwuu;!kY_>pWoi0|Tx17;v)~e63R2<@0yHO^S5@{A?{+vk1?yl%p=HaVX54 zx&0MT56}OO@8TTaJEZZr8%T~GdHLn@R?nN9x*}}7aG5@b9vo|yFXZVaJN=}XVpq^u=lyn!Ygyk*YnQuAG5j- z9$SaH0-t7+pJ8DqpGb?6LdsJJ2&(LJ>p)X-g58^ zz7~m(d<;?LP|?_dj{G;!Mfc{wcz41iGVB?lw7d9NuA@eGK|kUm@1}+lC2{4NOdL9^ zeMAN{Vw=BP?{>O1s_w_gx94ECPqE(h(a(CqThhs>xH)Hvb{Z%V?dS-e}+ zVg$+Jc2$b@L1|7yfjMACxztYme|LK!Jm#B==uvalhadq*xxTOgM-H4LL8O*YB4zCV zfkJNowc*jPtk5OzIpGKC=NFt@Cgy6kNN0(0>WB(pmERu}0`6BC5oIxIFmuYAz_TuD zj6`^O8O9ae9ov)NpC|t8G)H_Cn*90LYB_xL^CC_DmwN06SCLdd8S(x|oV@nD6KHmw z7`Qtd9j9(I2WS6~C$^~zdj!oMV~D0>ehVIm_r5vMKwPT^wUE7m;JE9aHSvz#UNloQ zd@k@LZFELnJ^8nfG0%@SJj6Oie%~s0xBh8Z39=HH_J%;jwXFOx=}&|N-*yZr7f)yf zZF>kc3A3=8LPeMPV5$!2ElVW>i^|J#o1k*BojC}Fk$RD> ze^aA0b38wI!#fAIVw0J1Vm0F*ZVx00n`l)GGyG#0C5fZ%o_Y+!TW%bdJg8FTqJ=<| zYUIp3*pBdMMOwtt9>AjNV-lfz^9KJHeh+Q8X81sbiu#GzLd1!+9H7m&4iUFfC)f|& zMPP%@aG8MGqMoruL_$jr67tBVd?e^!)X~wE{dokJ?LK*^3#`)BR;M z$`?qA0svr~=G3v{ECX5Kf=*-Gw|cw%{`G*G6u!bNi6IvAkF(-PS-2-5k!+x3cFn(j z`~^*3Q8P91OS+H!q4zV;(?cy!8ap9zd0k`&R2B?~PCLD|pv}fRhzVa^w8#|$A`iBH zskv=VDb*t`+XyxMHli(yVHr!CmalVi*HTq!`u&P9aJM=EEVyfmk8G}I6*w3u4F zM5rItW4hgnky>ymUi%?5Nynkn1!*)z(*;PQd6vt~i#1TEyqV<7aX}HqLfK%fPPiJN zNO9b%+tbR42@tDt2&c5RZcN#;-XdYM<^`f%1^%N&uEf;jUmqTwxaD0>U zO>Vb_w@3_&QyMUV_M>v#=fOS2*G5*+4aK6BIpndS`R|v%O9}{^$f6De)G7`q5#F*U z4>AL~_c}Df<9$5cToUF({PUv9=+E|6m(g#|kjmmhkv;bh`>Us5GmfHJ;H|F|bC8hbXrm@>73th$ z3zfnIxr{xR2xzudM#^ZDkuIBeuNYj+0XcDnE6&LMjfz8@G#k)hiE8Q};Y8_|BvsOE zjK9JFb=ItR^sru#Qb|%^)D!2gHn}D+zWC8O;lY3PMr@vcS)2zXsP{{uON(rrmqTBt zO=_`3y-(?18a_?8sLF8Arh&o>Lxu5mXlLy3P6if`o{=s6cN$(SRp+*2c2ICW?MeaY ze4P%yWsJ}G>??(~)V~C*j0+{HmXgxKgJ zIp*s1MMX6H6I5q7w=_800=E;lv2SLsLhF}uUnv92_51r zMmuvp3MF!pQeV1k1;4PlS$uA4jeByOIyOl6cU`>~0iCCw=9v2in1vYqEV`Wb>;)AdlfMO%w)or$D z#A!le8I9p!5aWzo9zn{59J}KI@7>#=59iiIBkv1O+jS*6cf&bO;$nV7M^tC)+22%& z$$=f626!F=%~y0I=*TSgBeB!xMRX}K9c>HggeIlF3cZnhn1{|EacE}g&Y>=?qhRgq zc{XXjDFuXC@0!H^c;v2g-`~hVB@k<35+A$Pz*Y)0;m!7t`?T-Ev)XK!2{EVYOkv26 zHa1r25M%r1D*Mm1(0VmfENQe-X7nd=$=D19JS&VkuQ#K^$83=RIb`U)EKRdgKL;KB zEi(vkzM*xs)`m4fsz)P{F&|7$riRRamEKOhAvF=20nJE%*s3^o@@ck;P`QhX-u z=s-y3^i>Q{Bgcs!bYb#SLEoCg^3}3^igXg#GUML3v+FFCZOZ1ba3=&;v}o`%!w7^o zA>51v3o<~b87%erfgL0>2UF7C4%ev?Igw8xklWWN>yTzJGY-@` zLh6`;gWW;KR7%Yl9dbw8cXYOFylkOz#^j+TM~~0WTwl}NH#BLIyk*V(KUjT>x7NAhnL}yFt@#DY{c#VR zWh`xQq&f@VOdSn_NOzMe8*8D2=*-bWKI{q)gMig-Z7m%xJ>>gX_d+!Kd&P&26B2p* zOM+b+?(&+K(CC+hum2}O5!47piRWFX-f;?_A|CS^74|tl5DZqk!oSU<;lhXkiny<9 zJR4K|*}%2|68{2Zds;YiFt=n2ev^a_P1#XV3c0N3d;#LS>|4_Nn=A+pQgK?eBTUM* zD&lg6Ueo9X&F-^VUt#zCIPN^Xt;@=)mbDj=1Err9C#A=%1X?uI0^7)zA{?q_1!F+u zBuk}=qRs?({b5bHfl9^KQR|}_ww=#*Jwcbe@kWqvGppEn6adOlzV@4<^qtuZ)@xFi zFn`R-3QYM1iq6aKPLM*NJ>uc67`coez5A`NUm)Q>>I_q`hXZ|1eW z@0w~Rcm@A^ziq+RH5`+MzO)LnAyZq$^QfHqsc#t)WZE{$X>B)(IK_&gi?{M#={j*~ zAa@DbYD5B`MW8{TDsfX~pvW($Tu3x0HoFQ4R`I#^Uj#vfsho}nPK90jlxdmQ{|1l3 zOx*9jHoGYa@_H|d5X&Eqd9ydkM($X3;IsG}?uFW@L3FSs<9%0oZgp3hfVrs_9becR z=DbsSgoNj2$B68+|1-E_SQaL(EG8=ZZOZ#9! zq;|aZoRJ%y^;dg#S4{I@AaJ6zED~Qur?>G|V})r;8>(|FC-5c3(y-|~#}J%dPV}Ni zb+xrCOtb1U(8FGXcyrg_I&_ljz0T@j*R2h`%Ym*;Cyc+~q6pcGLCC!x(BJM^Y2yJ; zD3>TBs7Lc>OAH{_4o$L|a~F3>>(F3#A(5SO{h@Ff%y8S!?F?l#S%yzu1_@|ETHu2%juB=r4^pvXAqwbA1z2xMl=R9k@n%_J{QBe}@nDh-rK>mjWwrn>}^R8^$bnWYys-TM; z7K-}`2H+?qGM06-DBeDJ`AFEgF4xyDTb@;(xI16gDG*uJu#vzYZ)aY3TbaR6Reezr zlKnNJ0vNKlGvzX7zDGR0bpEtiK|{tF$a}Sb@q#f}mqzN+@(kxxq2C+I_p4TDs$>#I zR5_N5-O*gV;?mGa!5eV;cKnY(Jj)zh$X3N!RW(;zk=`|eKnR>7jyN9C_GHAkYF~y1 zZ?R*OXqd0ez2PT<&m7C$QSB0dfVAu3eEX@vDMSb&6c&Se8zdEQs0h-TI0D$_Qq$b2ul9H2Zca81dj! zjW#UM-gYD~G^VTJro<(GfTCQD>Uj!Cf;aYft1<)a!JZVj!MvH~Bxso%oaRmU=d($O z{W7iX3%QVWa~I|MTAU9dDJ=Rh2(&F3X2=1rRz`<( zx}+IJZJ8gUhsDme7Bt)anVa397^%qd=BN2^W*Advhv5DaV^y0?#TZT+{&^AMm%I_2 zpmsvlD4hH7VftKVp#AjLep1!cqDhK3zwz=vI8VM7vYq-U2J6Nb`53?2yEjFpub;1f z1-oQzbx^u0tE65;Yn+u&zgcalHkKRBf3a1%mzfm)Q>!;J8YoJ8x8h(Rtgc4nWkCMt zLDtwTAqXQkpc;-vYeZETpUZutbM5_$jaRn&qDS8sj7b8=0b63zFZwO2a-5NUsj{Y> zU&#FD1FtLr1kSwXdmeqLdEAg!|702IAiK&ZH39pMb4M~aK%e}6{o1EL)b^pa(Mq=j zKxALHAy%a%U6DQo{4!4j9}9`bCbG=~TR)idFb@6gG)nf#tme;irCk*d{eohU8D${% zU1?)d!M$zgkAWb|7ok44^M?UJZ7o^Q5|t2-8Wh~iOFDjbU9qaKw@?OhFg=Vz@e;*L zVU9}hY1*fXlzbYoetsqXm7?oLEG)+xT3~J@VcyslF!$Q=-8F*#^F1Zf8`=PJ!yu*l zm_?R5;-!!m>f+%>MSTl7)Yrzvp`ipTw7qnUV_ye&{GRBUEZ66+K5}g56d{0ub=};$ zKP(I{phowTkib65s0&ML9N`ZEGjRa^grAPo5{!UM`NIq$=wES@V)O`3^brevSUMs&I6`Xajv~k;M=7 zHH!)Ub1$9%9E7t<+2j=8!B(FxWO;<>J_=wg@Pre(;G-5gZO+$iIW;8lLj=dqw;N(HQ-V-h*!Md#= zEht`_1+SM}eUUUPD?1&Z*ARiPLoQYC!`MBOdkA+WMnFtxIkTxoADhp&)y*WWr@(aW zWi$CNB@~sEa)ms9Sl#5}{9cx=jBegPyPbN=EWAm)Uf!~z$-^v{i;gyx7_zwY94L8O z-Wdkwss9`C>Bg*$C+9|~7QkK7&U$e)0MwMuBqr`)ssEoW!fR%0DsNY*SYv?$2%qg! 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 jxOjC1t)pv72n literal 0 HcmV?d00001 diff --git a/MikroNUC/20260703/20260703044001-Config.rsc b/MikroNUC/20260703/20260703044001-Config.rsc new file mode 100644 index 0000000..eb147b8 --- /dev/null +++ b/MikroNUC/20260703/20260703044001-Config.rsc @@ -0,0 +1,5424 @@ +# 2026-07-03 04:40:02 by RouterOS 7.23.1 +# system id = NmJcEM+8XAP +# +/caps-man channel +add band=2ghz-g/n extension-channel=disabled frequency=2422 name=2G-3 \ + reselect-interval=20m save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXX frequency=5660 name=5G-5660 \ + save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXXXXXX frequency=5160,5200,5280 \ + name=5G-5160-5280 reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5180 name=5G-36 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5200 name=5G-40 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5220 name=5G-44 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5240 name=5G-48 \ + reselect-interval=30m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2442 name=2G-7 \ + reselect-interval=20m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2462 name=2G-11 \ + reselect-interval=20m save-selected=yes +/interface bridge +add name=BridgeLAN +add name=bridge1 +/interface ethernet +set [ find default-name=ether1 ] disable-running-check=no +/interface veth +add address=172.18.0.2/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ + gateway=172.18.0.1 gateway6="" name=vetch-wg2awg +/interface wireguard +add comment="Interface for Master Connection" listen-port=22022 mtu=1360 \ + name=MASTER +/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 +/container +# download/extract error: no manifest.json in archive +add envlists=wg2awg-env file=sata1/dst/wg2awg-amd64-oci.tar.gz hostname=\ + wg2awg interface=vetch-wg2awg layer-dir=/sata1/docker/layers logging=yes \ + mountlists=wg2awg-env name=wg2awg-amd64-oci root-dir=/sata1wg2awg \ + start-on-boot=yes +/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" +add comment=Generator dont-require-permissions=no name=awg-VDSina owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# ============================================================\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\ + \n# 2026-06-30 22:08:12\ + \n# ============================================================\ + \n\ + \n# 0. Check prerequisites\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\ + \n :error \"Usage: /system/device-mode/update container=yes\"\ + \n}\ + \n\ + \n# Auto-detect storage\ + \n:global awgDisk \"disk1\"\ + \n{\ + \n :local usbFree 0\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \n } else={\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\ + \n :put \"USB found but not mounted. Format as ext4\?\"\ + \n :put \"Press 'y' to confirm:\"\ + \n :local key [/terminal/inkey timeout=30]\ + \n :if (\$key = 121 || \$key = 89) do={\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\ + \n :delay 3s\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\ + \n :if (\$usbFree > 0) do={\ + \n :set awgDisk \"usb1\"\ + \n } else={ :put \"Format failed, using disk1\" }\ + \n } else={ :put \"Using disk1\" }\ + \n } else={ :put \"No USB, using disk1\" }\ + \n }\ + \n}\ + \n\ + \n# 1. Uninstall script\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \n :put \"Uninstallimg AmneziaWG...\"\ + \n :log info \"Uninstallimg AmneziaWG...\"\ + \n :local prevDNS \"\"\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\ + \n :local storageDisk \"disk1\"\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\ + \n :local prevTmpdir \"\"\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ + \n }\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\ + \n /container/stop [find where interface=veth-awg-VDSina]\ + \n :delay 7s\ + \n /container/remove [find where interface=veth-awg-VDSina]\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\ + \n :if (\$prevDNS != \"\") do={\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ + \n :put (\"DNS restored to: \$prevDNS\")\ + \n }\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n /container/config set tmpdir=\$prevTmpdir\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ + \n }\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\ + \n :if (\$storageDisk != \"disk1\") do={\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\ + \n }\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\ + \n}\ + \n\ + \n# 2. Network infrastructure\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\ + \n\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ + yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ + QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\ + \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\ + \n\ + \n# 4. Container environment variables\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\ + \n\ + \n# 5. DNS\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\ + \n# NOTE: replaces existing DNS configuration\ + \n/ip/dns/set servers=109.107.177.79\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\ + \n\ + \n# 6. Download, create and start container\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \n:if (\$awgDisk != \"disk1\") do={\ + \n :local tmpPath (\$awgDisk . \"/pull\")\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\ + \n}\ + \n{\ + \n :local arch [/system/resource/get architecture-name]\ + \n :local ver [/system/resource/get version]\ + \n :local dotPos [:find \$ver \".\"]\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\ + \n :local endPos [:find \$rest \".\"]\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\ + \n :local suffix \"\"\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\ + \n :local file \"\"\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\ + \n :local filePath \$file\ + \n :if (\$awgDisk != \"disk1\") do={\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\ + \n }\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\ + \n :local freeStorage 0\ + \n :if (\$awgDisk = \"disk1\") do={\ + \n :set freeStorage [/system/resource/get free-hdd-space]\ + \n } else={\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\ + \n }\ + \n :if (\$freeStorage < 262144) do={\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\ + \n :error \"Insufficient disk space\"\ + \n }\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \n } else={\ + \n :put (\"File already exists: \" . \$filePath)\ + \n }\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\ + \n /file/remove \$filePath\ + \n :local freeMem [/system/resource/get free-memory]\ + \n :if (\$freeMem < 16777216) do={\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\ + \n }\ + \n /container/start [find where interface=veth-awg-VDSina]\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\ + \n :put \"Waiting for container to start...\"\ + \n :delay 5s\ + \n /interface/wireguard/enable wg-awg-VDSina\ + \n :put \"WireGuard interface enabled\"\ + \n :put \"Installation complete!\"\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\ + \n /ping 109.107.177.79 count=10 interval=1\ + \n :put \"\"\ + \n :put \"======= NEXT STEPS =======\"\ + \n :put \"\"\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\ + \n :put \"\"\ + \n :put \" Route a single host:\"\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Route a subnet:\"\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Remove a route:\"\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\ + \n :put \"\"\ + \n :put \" Show all tunnel routes:\"\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\ + \n :put \"\"\ + \n :put \" Uninstall:\"\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\ + \n :put \"=========================\"\ + \n}\ + \n\ + \n# 7. Verification\ + \n# /container/print\ + \n# /interface/wireguard/print\ + \n# /interface/wireguard/peers/print\ + \n" +add comment="wg2awg GH repo in client mode" dont-require-permissions=no name=\ + "wg2awg client" owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \n:local Arch \"amd64\";\ + \n:local Version \"0.4.0\";\ + \n:local WorkDisk \"sata1\";\ + \n:local Name wg2awg;\ + \n:local Bridge (\"Bridge-\" . \$Name);\ + \n:local Vetch (\"vetch-\" . \$Name);\ + \n:local Env (\$Name . \"-env\");\ + \n:local ConfDir (\"/etc/\" . \$Name . \"/\");\ + \n:local ConfFile (\$Name . \".conf\");\ + \n:local Mounts (\$WorkDisk . \"/mounts/\" . \$Name . \"/\");\ + \n:local RootDir (\$WorkDisk . \$Name);\ + \n:local Registry \"https://registry-1.docker.io\";\ + \n:local FetchFile (\$Name . \"-\" . \$Arch . \"-oci.tar.gz\");\ + \n:local FetchUrl (\"https://github.com/WoozyMasta/wg2awg/releases/downloa\ + d/\" . \$Version . \"/\" . \$FetchFile);\ + \n:local FetchDir (\$WorkDisk . \"/dst/\");\ + \n\ + \n#:put \"\"\ + \n#put \"Add ram disk tmpfs\"\ + \n#/disk add type=tmpfs tmpfs-max-size=100M slot=ram\ + \n\ + \n\ + \n:log warning \"[::::::::::::::: START :::::::::::::::]\"\ + \n:log warning \"Add veth and nat...\";\ + \n:do {\ + \n/interface/veth/add name=\$Vetch address=172.18.0.2/30 gateway=172.18.0.\ + 1;\ + \n/ip/address/add address=172.18.0.1/30 interface=\$Vetch;\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.18.0\ + .0/30;\ + \n} on-error={}\ + \n\ + \n#:do {\ + \n#/file add type=directory name=\$Mounts\ + \n#} on-error={}\ + \n\ + \n:log warning (\"Remove config file \" . \$Mounts . \$ConfFile . \"...\")\ + ;\ + \n/file remove [find name=(\$Mounts . \$ConfFile)];\ + \n\ + \n:do {\ + \n:log warning (\"Add config file \" . \$Mounts . \$ConfFile . \"...\");\ + \n/file add type=file name=(\$Mounts . \$ConfFile) contents=\"[Interface]\ + \nPrivateKey = 4CHyNhbOs923/EyNDguMXJXdghL2I3UyzXPwrANVgHs=\ + \nAddress = 10.9.0.3/32\ + \nMTU = 1280\ + \nDNS = 109.107.177.79\ + \nPreUp = ip route add 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nPostDown = ip route del 109.107.177.79/32 via 172.18.20.1 dev \$Vetch\ + \nJc = 9\ + \nJmin = 105\ + \nJmax = 920\ + \nS1 = 90\ + \nS2 = 136\ + \nS3 = 45\ + \nS4 = 27\ + \nH1 = 472437748-472438637\ + \nH2 = 707808381-707809250\ + \nH3 = 1609078552-1609079495\ + \nH4 = 1012329484-1012329741\ + \nI1 = <\ + r 4>\ + \nI2 = \ + \nI3 = \ + \nI4 = \ + \nI5 = \ + \n\ + \n[Peer]\ + \nPublicKey = o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\ + \nAllowedIPs = 0.0.0.0/0\ + \nEndpoint = 109.107.177.79:55055\ + \nPersistentKeepalive = 10\ + \nPresharedKey = RNvF7T1cg5tyXcYQnD9N5BEp6e20vVJQTv0GMjyvHU0=\";\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Remove mounts list \$Env...\");\ + \n/container/mounts/remove [find list=\$Env];\ + \n:log warning (\"Add mounts list \$Env...\");\ + \n/container/mounts/add src=(\$Mounts . \$ConfFile) dst=(\$ConfDir . \$Con\ + fFile) list=\$Env mode=ro;\ + \n:log warning (\"Add mounts Environment key AWG_CONFIG.\");\ + \n/container/envs/add list=\$Env key=AWG_CONFIG value=(\$ConfDir . \$ConfF\ + ile);\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Remove \" . \$WorkDisk . \"/tmp\");\ + \n/file remove [find name=(\$WorkDisk . \"/tmp\")];\ + \n:log warning (\"Add \" . \$WorkDisk . \"/tmp\");\ + \n/file add type=directory name=(\$WorkDisk . \"/tmp\");\ + \n:log warning (\"Container add tmpdir \" . \$WorkDisk . \"/tmp\");\ + \n/container config set tmpdir=(\$WorkDisk . \"/tmp\");\ + \n} on-error={}\ + \n\ + \n:do {\ + \n:log warning (\"Remove \" . \$FetchDir . \$FetchFile . \".\");\ + \n/file remove [find name=(\$FetchDir . \$FetchFile)];\ + \n:log warning (\"Download image from \" . \$FetchUrl . \" and save him to\ + \_\" . \$FetchDir . \$FetchFile . \".\");\ + \n/tool/fetch url=\$FetchUrl dst-path=(\$FetchDir . \$FetchFile);\ + \n} on-error={}\ + \n\ + \n#:log warning (\"Container set registry \" . \$Registry . \" tmpdir= \" \ + . \$WorkDisk . \"/tmp\");\ + \n#/container/config/set registry-url=\$Registry tmpdir=(\$WorkDisk . \"/t\ + mp\");\ + \n\ + \n:do {\ + \n:log warning (\"Container add width: hostname=\" . \$Name . \", mountlis\ + ts=\" . \$Env . \", file=\" . \$FetchDir . \$FetchFile . \", envlist=\" .\ + \_\$Env . \", root-dir=\" . \$RootDir . \", logging=yes, start-on-boot=yes\ + \");\ + \n/container/add hostname=\$Name mountlists=\$Env file=(\$FetchDir . \$Fet\ + chFile) interface=\$Vetch envlist=\$Env root-dir=\$RootDir logging=yes sta\ + rt-on-boot=yes;\ + \n} on-error={}\ + \n\ + \n\ + \n#/container/start [find where interface=\$Vetch];\ + \n\ + \n#/interface/bridge add name=\$Bridge port-cost-mode=short;\ + \n#/ip/address/add address=192.168.100.1/24 interface=\$Bridge;\ + \n\ + \n#/interface/veth add address=192.168.100.3/24 gateway=192.168.100.1 name\ + =awg-proxy-go-client\ + \n#/interface/bridge/port add bridge=docker interface=awg-proxy-go-client\ + \n\ + \n#:put \"add config-client.json\"\ + \n#/file/add name=sata1/mounts/awg-proxy-go/config-client.json\ + \n#/container/mounts/add src=sata1/mounts/awg-proxy-go/config-client.json \ + dst=/app/config.json list=awgcfg-client\ + \n\ + \n#:put \"Download image, and save him to sata1/tmp/awgproxy-0.0.1-0034-am\ + d64.tar.gz\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/amneziawg/img/awgproxy-0.0.1-003\ + 4-amd64.tar.gz\" dst-#path=\"tmp/awgproxy-0.0.1-0034-amd64.tar.gz\"\ + \n\ + \n#:put \"Add container\"\ + \n#/container/add file=\"usb1/dst/awgproxy-0.0.1-0036-amd64.tar\" interfac\ + e=awg-proxy-go-client hostname=awg-proxy-go-client root-dir=sata1/awg-prox\ + y-client logging=yes start-on-boot=yes workdir=sata1/docker/ name=\"awg-pr\ + oxy-go-client\" mountlists=awgcfg-client\ + \n\ + \n#:put \"Start container\"\ + \n#/container/start awg-proxy-go-client\ + \n\ + \n#:put \"Add user:\"\ + \n#/user/add address=192.168.100.2 group=write name=awg-proxy-go password=\ + peskar55\ + \n\ + \n#:put \"Add forwarding port web-ui\"\ + \n#/ip firewall nat add action=dst-nat chain=dstnat dst-port=8089 in-inter\ + face=ether1 protocol=tcp to-addresses=192.168.100.3 to-port=8088\ + \n\ + \n#:put \"Add native WireGuard-server wg-awg, add address.\"\ + \n#/interface/wireguard/add name=wg-awg-client\ + \n#/ip/address/add address=172.17.0.1/24 interface=wg-awg-client\ + \n\ + \n:put \"\"\ + \n:put \"[::::::::::::::: END :::::::::::::::]\"\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +add name=manager policy="local,ssh,ftp,read,write,policy,api,rest-api,!telnet,\ + !reboot,!test,!winbox,!password,!web,!sniff,!sensitive,!romon" +/app +set cinny firewall-redirects=8094:80:tcp:web +set goaway container-command-lines=goaway:none:docker.io/pommee/goaway:latest +set home-assistant container-command-lines=\ + home-assistant:none:lscr.io/linuxserver/homeassistant +set n8n firewall-redirects=5678:5678:tcp:web +set nextcloud container-command-lines="db:none:docker.io/postgres:17,redis:non\ + e:docker.io/valkey/valkey:/bin/sh -c 'valkey-server --port 6379 --appendon\ + ly yes --requirepass \$VALKEY_PASSWORD',server:none:docker.io/nextcloud:ap\ + ache" +set pihole environment="pihole:FTLCONF_dns_listeningMode=all,pihole:FTLCONF_we\ + bserver_api_password=password" +set redlib firewall-redirects=8087:8080:tcp:web +set solr container-command-lines=solr:none:docker.io/solr:latest +set uptime-kuma container-command-lines=\ + uptime-kuma:none:docker.io/louislam/uptime-kuma:1 +/app settings +set auto-update=yes disk=*7 lan-bridge=*3 registry-mirrors="https://reg.vados.\ + ru:5000/:https://reg.vados.ru/,https://registry-1.docker.io" +/caps-man aaa +set called-format=ssid +/caps-man access-list +add action=reject allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-120..-80 ssid-regexp="" +add action=accept allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-79..120 ssid-regexp="" +/caps-man configuration +add channel.band=2ghz-b/g/n country=no_country_set datapath=xs-DataPath mode=\ + ap name=xs-2G rx-chains=0,1,2,3 security=xs-Sec ssid=vados tx-chains=\ + 0,1,2,3 +add channel.band=5ghz-a/n/ac country=no_country_set datapath=xs-DataPath \ + installation=any mode=ap name=xs-5G rx-chains=0,1,2,3 security=xs-Sec \ + ssid=vados5g tx-chains=0,1,2,3 +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX .frequency=2422,2442,2462 .reselect-interval=20m country=belarus \ + datapath=DataPath datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes hw-protection-mode=rts-cts installation=any name=2G \ + rx-chains=0,1,2,3 security=WPA2 ssid=vados tx-chains=0,1,2,3 +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX .frequency=5180,5200,5220,5240,5260 .reselect-interval=20m \ + .skip-dfs-channels=yes country=belarus datapath=DataPath \ + datapath.client-to-client-forwarding=yes .local-forwarding=yes \ + hw-protection-mode=rts-cts installation=any name=5G security=WPA2 ssid=\ + vados5g +/caps-man datapath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + xs-DataPath +add bridge=*3 client-to-client-forwarding=yes local-forwarding=yes name=\ + DataPath +/caps-man manager +set ca-certificate=CAPsMAN-CA-51B25E507D07 certificate=CAPsMAN-51B25E507D07 \ + enabled=yes require-peer-certificate=yes +/caps-man manager interface +set [ find default=yes ] forbid=yes +add disabled=no interface=BridgeLAN +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=g,gn,b \ + master-configuration=2G name-format=prefix-identity name-prefix=2G +add action=create-dynamic-enabled hw-supported-modes=an,ac,a \ + master-configuration=5G name-format=prefix-identity name-prefix=5G +add action=create-dynamic-enabled disabled=yes hw-supported-modes=ac,an,a \ + master-configuration=2G name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled disabled=yes hw-supported-modes=an \ + master-configuration=5G name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set crl-store=system +/container config +set layer-dir=/sata1/docker/layers memory-high=200.0MiB memory-max=4096.0MiB \ + registry-url=https://registry-1.docker.io tmpdir=/sata1/tmp username=\ + amsternl +/container envs +add key=AWG_CONFIG list=wg2awg-env value=/etc/wg2awg/wg2awg.conf +/container mounts +add dst=/etc/wg2awg/wg2awg.conf list=wg2awg-env mode=ro src=\ + /sata1/mounts/wg2awg/wg2awg.conf +/ip smb +set enabled=no +/interface bridge port +add bridge=BridgeLAN interface=*136 +add bridge=BridgeLAN interface=*137 +add bridge=bridge1 interface=ether1 +/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 +add interface=BridgeLAN list=LAN +/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 client-allowed-address=::/0 comment=\ + "Peer for MikroMaster connection" endpoint-address=10.30.30.81 \ + endpoint-port=33033 interface=MASTER name=MASTER persistent-keepalive=10s \ + public-key="zuRsO+dL/j6awaBWZ/NgnHR+bCNUjRWbaHFpdzkNnw4=" +/ip address +add address=10.30.30.10/24 interface=ether1 network=10.30.30.0 +add address=10.10.0.2 interface=MASTER network=10.10.0.0 +/ip dhcp-client +add disabled=yes interface=ether1 name=client1 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set disabled=yes interface=*3 lease-script=\ + lease-script lease-time=10m name=nucDHCP server-address=10.30.30.10 +/ip dns +set allow-remote-requests=yes doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=10.30.30.33,109.107.177.79 \ + verify-doh-cert=yes +/ip firewall 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 +/ip service +set ftp disabled=yes +set reverse-proxy disabled=yes +set ssh port=2222 +set www-ssl port=4443 +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-secure=no scep-plain=no webfig-plain=no \ + webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=*3 type=external +add interface=*B5 type=internal +/ipv6 firewall address-list +add address=2400:cb00::/32 list=CLOUDFLARE-IP-Address +add address=2606:4700::/32 list=CLOUDFLARE-IP-Address +add address=2803:f800::/32 list=CLOUDFLARE-IP-Address +add address=2405:b500::/32 list=CLOUDFLARE-IP-Address +add address=2405:8100::/32 list=CLOUDFLARE-IP-Address +add address=2a06:98c0::/29 list=CLOUDFLARE-IP-Address +add address=2c0f:f248::/32 list=CLOUDFLARE-IP-Address +/special-login +add port=serial0 +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system gps +set set-system-time=yes +/system identity +set name=MikroNUC +/system note +set show-at-login=no +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes +/system ntp client servers +add address=10.30.30.81 +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +/system scheduler +add comment="Every Day Set Global Environment Variables" disabled=yes name=\ + AM-SetGlobalEnv on-event=\ + "/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" disabled=yes interval=1d \ + name=AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Fake Bridges" disabled=yes interval=1d name=\ + mod/AM-IPbridge on-event="/system/script/run mod/AM-IPbridge;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Telegram Chat Bot" disabled=yes interval=30s name=mod/AM-TG-Bot \ + on-event="/system/script/run mod/AM-TG-Bot;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment=\ + "Every 7 Day Check For Update and Backup send notification to EMail." \ + disabled=yes interval=1w name=AM-Backup-UpdateEmail on-event=\ + "/system/script { run AM-Backup-UpdateEmail; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-06-25 start-time=03:41:27 +/tool e-mail +set certificate-verification=no from=MikroNUC port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260703/20260703044001-Diff-Config.rsc b/MikroNUC/history/20260703/20260703044001-Diff-Config.rsc new file mode 100644 index 0000000..222f5a8 --- /dev/null +++ b/MikroNUC/history/20260703/20260703044001-Diff-Config.rsc @@ -0,0 +1,60 @@ +25d24 +< add name=bridge1 +31,33d29 +< /interface wireguard +< add comment="Interface for Master Connection" listen-port=22022 mtu=1360 \ +< name=MASTER +39,44d34 +< /container +< # download/extract error: no manifest.json in archive +< add envlists=wg2awg-env file=sata1/dst/wg2awg-amd64-oci.tar.gz hostname=\ +< wg2awg interface=vetch-wg2awg layer-dir=/sata1/docker/layers logging=yes \ +< mountlists=wg2awg-env name=wg2awg-amd64-oci root-dir=/sata1wg2awg \ +< start-on-boot=yes +5157,5159d5146 +< \n:do {\ +< \n:log warning (\"Remove \" . \$FetchDir . \$FetchFile . \".\");\ +< \n/file remove [find name=(\$FetchDir . \$FetchFile)];\ +5163d5149 +< \n} on-error={}\ +5170,5179c5156,5157 +< \n:do {\ +< \n:log warning (\"Container add width: hostname=\" . \$Name . \", mountlis\ +< ts=\" . \$Env . \", file=\" . \$FetchDir . \$FetchFile . \", envlist=\" .\ +< \_\$Env . \", root-dir=\" . \$RootDir . \", logging=yes, start-on-boot=yes\ +< \");\ +< \n/container/add hostname=\$Name mountlists=\$Env file=(\$FetchDir . \$Fet\ +< chFile) interface=\$Vetch envlist=\$Env root-dir=\$RootDir logging=yes sta\ +< rt-on-boot=yes;\ +< \n} on-error={}\ +< \n\ +--- +> \n#/container/add file=wg2awg-arm-oci.tar.gz interface=\$Vetch envlist=\$E\ +> nv root-dir=\$RootDir logging=yes;\ +5307,5309c5285,5289 +< add bridge=BridgeLAN interface=*136 +< add bridge=BridgeLAN interface=*137 +< add bridge=bridge1 interface=ether1 +--- +> add bridge=BridgeLAN interface=ether1 +> add bridge=BridgeLAN interface=2G-MikroGig-1 +> add bridge=BridgeLAN interface=2G-MikroMaster-1 +> add bridge=BridgeLAN interface=5G-MikroGig-1 +> add bridge=BridgeLAN interface=5G-MikroMaster-1 +5317d5296 +< add interface=BridgeLAN list=LAN +5322,5326d5300 +< /interface wireguard peers +< add allowed-address=0.0.0.0/0 client-allowed-address=::/0 comment=\ +< "Peer for MikroMaster connection" endpoint-address=10.30.30.81 \ +< endpoint-port=33033 interface=MASTER name=MASTER persistent-keepalive=10s \ +< public-key="zuRsO+dL/j6awaBWZ/NgnHR+bCNUjRWbaHFpdzkNnw4=" +5328,5329c5302 +< add address=10.30.30.10/24 interface=ether1 network=10.30.30.0 +< add address=10.10.0.2 interface=MASTER network=10.10.0.0 +--- +> add address=10.30.30.10/24 interface=BridgeLAN network=10.30.30.0 +5348c5321 +< 10.30.30.81 routing-table=main scope=30 target-scope=10 +--- +> BridgeLAN routing-table=main scope=30 target-scope=10 -- 2.52.0