From 0b4a12a1f4c8d8c4a9aa020753947083bf672700 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Thu, 30 Apr 2026 13:20:08 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at Apr 30 13:20:08. --- .../20260430/20260430132002-Binary.backup | Bin 0 -> 351690 bytes .../20260430/20260430132002-Config.rsc | 5523 +++++++++++++++++ .../20260430/20260430132002-Diff-Config.rsc | 1112 ++++ 3 files changed, 6635 insertions(+) create mode 100644 MikroMaster/20260430/20260430132002-Binary.backup create mode 100644 MikroMaster/20260430/20260430132002-Config.rsc create mode 100644 MikroMaster/history/20260430/20260430132002-Diff-Config.rsc diff --git a/MikroMaster/20260430/20260430132002-Binary.backup b/MikroMaster/20260430/20260430132002-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..52f791f495be6d0e2d7890661d21eefe4fa13e71 GIT binary patch literal 351690 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⪙7%B?NDzujE&u?g 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

oMR;emi8Iq05f^T8YsFs+vf;l$dYy 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 ZipssT?jJ?p+kXsh5 literal 0 HcmV?d00001 diff --git a/MikroMaster/20260430/20260430132002-Config.rsc b/MikroMaster/20260430/20260430132002-Config.rsc new file mode 100644 index 0000000..9a22960 --- /dev/null +++ b/MikroMaster/20260430/20260430132002-Config.rsc @@ -0,0 +1,5523 @@ +# 2026-04-30 13:20:02 by RouterOS 7.22 +# software id = 2961-C4ZZ +# +# model = RBD52G-5HacD2HnD +# serial number = HCX084RAVFA +/interface bridge +add admin-mac=48:8F:5A:60:A1:0B auto-mac=no name=Bridge-LAN port-cost-mode=\ + short +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" mac-address=\ + F6:BE:9D:85:53:F5 name="ether1 - Unet" +set [ find default-name=ether3 ] comment=LEN +set [ find default-name=ether4 ] comment=NUC +/interface l2tp-server +add comment=Server disabled=yes name=l2tp-in1 user=vados +/interface l2tp-client +add comment="Starless 2 MikroSPb" connect-to=176.53.203.171 name=l2tp-EoIP \ + user=vados +add allow=mschap2 allow-fast-path=yes comment=Starless connect-to=\ + vpn.starless.ru max-mru=1280 name=l2tp-vpn use-ipsec=yes use-peer-dns=yes \ + user=vados +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(17dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + station-roaming=enabled wds-default-bridge=Bridge-LAN wds-mode=\ + dynamic-mesh wireless-protocol=802.11 wmm-support=enabled wps-mode=\ + disabled +# managed by CAPsMAN +# channel: 5260/20-Ceee/ac/DP(17dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g station-roaming=enabled \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +/interface wireguard +add listen-port=13231 mtu=1280 name=WG +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(17dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5260/20-Ceee/ac/DP(17dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/caps-man security +add authentication-types=wpa-psk,wpa2-psk encryption=aes-ccm \ + group-encryption=aes-ccm name=security +/caps-man configuration +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-2ghz security=security ssid=vados +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-5ghz-ac security=security ssid=vados5g +add channel.band=5ghz-a/n .control-channel-width=20mhz .extension-channel=XX \ + country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-5ghz-an security=security ssid=vados5g +/disk +add media-interface=lo slot=tmpfs tmpfs-max-size=44739242 type=tmpfs +/interface list +add comment=defconf name=WAN +add comment=defconf name=LAN +/interface lte apn +set [ find default=yes ] ip-type=ipv4 use-network-apn=no +/interface wifi channel +add band=5ghz-ax disabled=no frequency=5180,5200,5220,5240 name=5G-AX +add band=5ghz-ac disabled=no frequency=5180,5200,5220,5240 name=5G-AC +add band=2ghz-n disabled=no frequency=2422,2442,2462 name=2G-N +add band=2ghz-ax disabled=no frequency=2422,2442,2462 name=2G-AX +add band=2ghz-g disabled=no frequency=2422,2442,2462 name=2G-G +add band=5ghz-n disabled=no frequency=5180,5200,5220,5240 name=5G-AN +/interface wifi datapath +add bridge=Bridge-LAN disabled=no interface-list=all name=xs-DataPath +/interface wifi security +add authentication-types=wpa2-psk,wpa3-psk disabled=no group-encryption=ccmp \ + group-key-update=1h management-protection=allowed name=sec2g +add authentication-types=wpa3-psk disable-pmkid=yes disabled=no \ + group-encryption=ccmp group-key-update=5m management-encryption=cmac \ + management-protection=required name=sec5G +/interface wifi configuration +add channel=2G-AX datapath=xs-DataPath disabled=no mode=ap name=2G-AX \ + security=sec2g security.ft=yes .ft-over-ds=yes ssid=vados +add channel=2G-N datapath=xs-DataPath disabled=no mode=ap name=2G-N security=\ + sec2g security.ft=yes .ft-over-ds=yes ssid=vados +add channel=5G-AX disabled=no mode=ap name=5G-AX security=sec5G security.ft=\ + yes .ft-over-ds=yes ssid=vados +add channel=5G-AC datapath=xs-DataPath disabled=no mode=ap name=5G-AC \ + security=sec5G security.authentication-types="" .ft=yes .ft-over-ds=yes \ + ssid=vados +add channel=2G-G datapath=xs-DataPath disabled=no mode=ap name=2G-G security=\ + sec2g security.authentication-types="" .ft=yes .ft-over-ds=yes ssid=vados +add channel=5G-AN disabled=no mode=ap name=5G-AN security=sec5G ssid=vados +/interface wireless security-profiles +set [ find default=yes ] authentication-types=wpa-psk,wpa2-psk mode=\ + dynamic-keys supplicant-identity=MikroTik +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +add name=mVados options=HostName +/ip dns forwarders +add dns-servers=1.1.1.1,1.0.0.1 name=blsp.at verify-doh-cert=no +add comment=Kra dns-servers=1.0.0.1,1.1.1.1 name=slon2.to verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=m.blsp.at verify-doh-cert=no +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.150-10.30.30.200 +/ip dhcp-server +add add-arp=yes address-pool=dhcp dhcp-option-set=domain-search-set \ + dynamic-lease-identifiers=client-mac,client-id,opt-82 interface=\ + Bridge-LAN lease-time=10m name=masterDHCP server-address=10.30.30.81 \ + use-reconfigure=yes +/ip hotspot user profile +set [ find default=yes ] address-pool=dhcp +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ppp profile +set *FFFFFFFE use-upnp=no +/routing bgp template +set default disabled=no output.network=bgp-networks +/routing table +add disabled=no fib name=To-VPN +/snmp community +set [ find default=yes ] addresses=10.30.30.0/24 read-access=no security=\ + private +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add comment="Example add WU servers to AddrList" dont-require-permissions=no \ + name=WU-add-to-list owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_Script to add target web sites DNS IP addresses into address list\r\ + \n# Tested with Mikrotik 6.4x\r\ + \n# Syed Jahanzaib / aacable@hotmail.com\r\ + \n# List name\r\ + \n:local LISTNAME \"windowsupdateslist\"\r\ + \n# Web site names which will be added in address list\r\ + \n:local TARGET1 \"update.microsoft.com\"\r\ + \n:local TARGET2 \"download.windowsupdate.com\"\r\ + \n:local TARGET3 \"download.microsoft.com\"\r\ + \n:local TARGET4 \"windowsupdate.com\"\r\ + \n:local TARGET5 \"ntservicepack.microsoft.com\"\r\ + \n:local TARGET6 \"wustat.windows.com\"\r\ + \n:local TARGET7 \"stats.microsoft.com\"\r\ + \n:local TARGET8 \"mp.microsoft.com\"\r\ + \n:local TARGET9 \"ws.microsoft.com\"\r\ + \n:local TARGET10 \"sls.update.microsoft.com.akadns.net\"\r\ + \n:local TARGET11 \"vortex.data.microsoft.com\"\r\ + \n:local TARGET12 \"vortex-win.data.microsoft.com\"\r\ + \n:local TARGET13 \"fe2.update.microsoft.com.akadns.net\"\r\ + \n:local TARGET14 \"statsfe2.update.microsoft.com.akadns.net\"\r\ + \n \r\ + \n# 1st time runner, check if address list is not created previously and a\ + dd entries in it for 1st time usage\r\ + \n:if ( [/ip firewall address-list find where list=\$LISTNAME] = \"\") do=\ + {\r\ + \n:log warning \"No address list for \$TARGET1 found ! creating and adding\ + \_resolved entry for 1st time usage ... zaib\"\r\ + \n \r\ + \n:local FirstAddr [resolve \$TARGET1];\r\ + \n\r\ + \n/ip firewall address-list add address=\$FirstAddr list=\$LISTNAME commen\ + t=\$TARGET1;\r\ + \n} else={\r\ + \n:log warning \"Previous List for \$LISTNAME found ! moving forward and c\ + hecking if DNS entries can be added in it ...\"\r\ + \n}\r\ + \n \r\ + \n# Check DNS entries and collect matching names\r\ + \n:foreach i in=[/ip dns cache find name~\"(\$TARGET1|\$TARGET2|\$TARGET3|\ + \$TARGET4|\$TARGET5|\$TARGET6|\$TARGET7|\$TARGET8|\$TARGET9|\$TARGET10|\$T\ + ARGET11|\$TARGET12|\$TARGET13|\$TARGET14)\" && \$type ~ \"^(A|CNAME)\\\$\"\ + \_] do={\r\ + \n \r\ + \n# Get IP Address from the names and hold it in temporary buffer\r\ + \n:local Buffer [/ip dns cache get \$i data];\r\ + \ndelay delay-time=10ms\r\ + \n \r\ + \n# Check if entry is already not exists, then OK, otherwise ignore duplic\ + ation\r\ + \n:if ( [/ip firewall address-list find where address=\$Buffer] = \"\") do\ + ={\r\ + \n \r\ + \n# Fetch DNS names for the entries\r\ + \n:local sitednsname [/ip dns cache get \$i name] ;\r\ + \n \r\ + \n# Print name in LOG window\r\ + \n:log info (\"added entry: \$sitednsname \$Buffer\");\r\ + \n \r\ + \n# Add IP addresses and there names to the address list\r\ + \n/ip firewall address-list add address=\$Buffer list=\$LISTNAME comment=\ + \$sitednsname;\r\ + \n}\r\ + \n}" +add comment="Add Hosts DNS names to NoWG addres list" \ + dont-require-permissions=no name=Add2vdsina owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_Script to add target web sites DNS IP addresses into address list\r\ + \n# Tested with Mikrotik 6.4x\r\ + \n# \r\ + \n# List name\r\ + \n:local LISTNAME \"NoWG\"\r\ + \n#\r\ + \n# Web site names which will be added in address list\r\ + \n:local TARGET1 \"comp-lenta.ru\"\r\ + \n:local TARGET2 \"ok.ru\"\r\ + \n:local TARGET3 \"vk.com\"\r\ + \n#:local TARGET4 \"smtp.mail.me.com\"\r\ + \n#:local TARGET4 \"windowsupdate.com\"\r\ + \n#:local TARGET5 \"ntservicepack.microsoft.com\"\r\ + \n#:local TARGET6 \"wustat.windows.com\"\r\ + \n#:local TARGET7 \"stats.microsoft.com\"\r\ + \n#:local TARGET8 \"mp.microsoft.com\"\r\ + \n#:local TARGET9 \"ws.microsoft.com\"\r\ + \n#:local TARGET10 \"sls.update.microsoft.com.akadns.net\"\r\ + \n#:local TARGET11 \"vortex.data.microsoft.com\"\r\ + \n#:local TARGET12 \"vortex-win.data.microsoft.com\"\r\ + \n#:local TARGET13 \"fe2.update.microsoft.com.akadns.net\"\r\ + \n#:local TARGET14 \"statsfe2.update.microsoft.com.akadns.net\"\r\ + \n \r\ + \n# 1st time runner, check if address list is not created previously and a\ + dd entries in it for 1st time usage\r\ + \n:if ( [/ip firewall address-list find where list=\$LISTNAME] = \"\") do=\ + {\r\ + \n:log warning \"No address list for \$TARGET1 found ! creating and adding\ + \_resolved entry for 1st time usage ... zaib\"\r\ + \n\r\ + \n:local FirstAddr [resolve \$TARGET1];\r\ + \n\r\ + \n/ip firewall address-list add address=\$FirstAddr list=\$LISTNAME commen\ + t=\$TARGET1;\r\ + \n\r\ + \n} else={\r\ + \n:log warning \"Previous List for \$LISTNAME found ! moving forward and c\ + hecking if DNS entries can be added in it ...\"\r\ + \n}\r\ + \n\r\ + \n# Check DNS entries and collect matching names\r\ + \n:foreach i in=[/ip dns cache find name~\"(\$TARGET1|\$TARGET2|\$TARGET3|\ + \$TARGET4)\" && \$type ~ \"^(A|CNAME)\\\$\" ] do={\r\ + \n\r\ + \n:log info (\"start entry: \$c \$sitednsname \$Buffer\");\r\ + \n\r\ + \n# Get IP Address from the names and hold it in temporary buffer\r\ + \n:local Buffer [/ip dns cache get \$i data];\r\ + \ndelay delay-time=10ms\r\ + \n:log info (\"1: \$Buffer\"); \r\ + \n\r\ + \n# Check if entry is already not exists, then OK, otherwise ignore duplic\ + ation\r\ + \n:if ( [/ip firewall address-list find where address=\$Buffer] = \"\") do\ + ={\r\ + \n\r\ + \n:log info (\"2: \$Buffer\"); \r\ + \n \r\ + \n# Fetch DNS names for the entries\r\ + \n:local sitednsname [/ip dns cache get \$i name] ;\r\ + \n \r\ + \n# Print name in LOG window\r\ + \n:log info (\"added entry: \$i \$sitednsname \$Buffer\");\r\ + \n \r\ + \n# Add IP addresses and there names to the address list\r\ + \n/ip firewall address-list add address=\$Buffer list=\$LISTNAME comment=\ + \$sitednsname;\r\ + \n}\r\ + \n}" +add comment="Flush DNS Cache" dont-require-permissions=no name=\ + DNS_Flush_Cache owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\ + "/ip dns cache flush" +add dont-require-permissions=no name=create_mkdir_function owner=vados \ + policy=read,write source="# Written by Phillip Stromberg in 2019\r\ + \n# Distributed under the MIT license\r\ + \n# \r\ + \n# \r\ + \n# this creates a function called \$mkdir\r\ + \n# from the command line you will be able to just type \"\$mkdir some/new\ + /folder\"\r\ + \n# and all the folders that need to be created will be\r\ + \n# if the folder already existed, it is ignored\r\ + \n\r\ + \n:log info \"Creating \\\$mkdir function...\"\r\ + \n\r\ + \n:global mkdir do={\r\ + \n # \$1 refers to the input variable the user passed in to us\r\ + \n :local newFolder \$1;\r\ + \n\r\ + \n # we'll use this variable to report error messages that may arise\r\ + \n :local errorMsg;\r\ + \n\r\ + \n # if the user put a slash on the end of the new folder name, remove \ + it\r\ + \n # i.e. \"some/test/\" becomes \"some/test\"\r\ + \n :while (([:pick \$newFolder ([:len \$newFolder] - 1)]) = \"/\") do={\ + \r\ + \n :set newFolder [:pick \$newFolder 0 ([:len \$newFolder] - 1)]\r\ + \n }\r\ + \n\r\ + \n # if the user put a slash at the beginning of the new folder name, r\ + emove it\r\ + \n # i.e. \"/some/test\" becomes \"some/test\"\r\ + \n :while ([:pick \$newFolder 0] = \"/\") do={\r\ + \n :set newFolder [:pick \$newFolder 1 [:len \$newFolder]]\r\ + \n }\r\ + \n\r\ + \n :if ([/file find name=\$newFolder] != \"\") do={\r\ + \n :set errorMsg \"'\$newFolder' already exists.\";\r\ + \n :log debug \"mkdir: \$errorMsg\";\r\ + \n :return \$newFolder;\r\ + \n }\r\ + \n\r\ + \n # the name of the temp file to create\r\ + \n :local tempfile \"mkdir_temp_file.txt\";\r\ + \n\r\ + \n # port 0 is unlikely to be open to HTTP requests...\r\ + \n :local fakeURL \"http://127.0.0.1:0/should-not-exist.txt\";\r\ + \n\r\ + \n :local fullTempPath (\$newFolder . \"/\" . \$tempfile);\r\ + \n\r\ + \n # this is where the folder creation happens\r\ + \n # `as-value` prevents status messages from printing\r\ + \n # wrapping in a `:do {...} on-error` prevents error messages from pr\ + inting.\r\ + \n :do {\r\ + \n /tool fetch dst-path=\"\$fullTempPath\" url=\"\$fakeURL\" durati\ + on=0.001s as-value;\r\ + \n } on-error={}\r\ + \n\r\ + \n # this waits for the temporary dir to show up so there isn't a race \ + \r\ + \n # condition where you call mkdir and then try to do something before\ + \_the \r\ + \n # folder is actually created\r\ + \n :local count 0;\r\ + \n :while ([/file find name=\"\$newFolder\"] = \"\") do={\r\ + \n :if (\$count >= 50) do={\r\ + \n # after 50 * 0.1s delays, it's been 5 seconds, which should \ + be long enough\r\ + \n :set errorMsg \"New folder could not be created at \$newFold\ + er\";\r\ + \n :log error \"mkdir: \$errorMsg\"\r\ + \n :error \$errorMsg\r\ + \n }\r\ + \n :delay 0.1s;\r\ + \n :set count (\$count + 1);\r\ + \n }\r\ + \n\r\ + \n :return \$newFolder;\r\ + \n}\r\ + \n\r\ + \n:log info \"Created function \\\$mkdir\"\r\ + \n" +add comment="Certificates CloudFlare, Quad9 " dont-require-permissions=no \ + name=CustomUpdate-Certificates owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_CloudFlare\r\ + \n/tool/fetch mode=https url=https://developers.cloudflare.com/ssl/static/\ + origin_ca_ecc_root.pem;\r\ + \n/tool/fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalRo\ + otCA.crt.pem;\r\ + \n/certificate/import file-name=DigiCertGlobalRootCA.crt.pem passphrase=\"\ + \";\r\ + \n/tool/ fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalG\ + 2TLSRSASHA2562020CA1-1.crt.pem;\r\ + \n/certificate/import file-name=DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt.\ + pem passphrase=\"\";\r\ + \n# Quad9\r\ + \n/tool/fetch mode=https url=\"https://cacerts.digicert.com/DigiCertGlobal\ + G3TLSECCSHA3842020CA1-1.crt.pem\"\r\ + \n/certificate/import file-name=DigiCertGlobalG3TLSECCSHA3842020CA1-1.crt.\ + pem passphrase=\"\";\r\ + \n\r\ + \n#:global AmScriptsUrl;\r\ + \n#google\r\ + \n#:local CertName \"GTS-Root-R1.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"GTS-Root-R4.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"GTS-Root-RX.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#internet\r\ + \n#:set CertName \"ISRG-Root-X1.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"ISRG-Root-X2.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"Starfield-Root-Certificate-Authority-G2.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n\r\ + \n#/ip/dns/set allow-remote-requests=yes doh-max-concurrent-queries=100 do\ + h-max-server-connections=20 use-doh-server=https://security.cloudflare-dns\ + .com/dns-query verify-doh-cert=yes;\r\ + \n#/ip/dns/static remove [find where address=1.1.1.1];\r\ + \n#/ip/dns/static add address=1.1.1.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 1\";\r\ + \n#/ip/dns/static remove [find where address=1.0.0.1];\r\ + \n#/ip/dns/static add address=1.0.0.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 2\"\r\ + \n#/ip dns static add address=2606:4700:4700::1111 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip dns static add address=2606:4700:4700::1001 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip/dns set servers=\"1.0.0.1, 8.8.4.4\";\r\ + \n#/ip/dns set servers=\"\";" +add dont-require-permissions=no name=script1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + tool/netwatch/add comment=\"doh-fallback, doh-url=https://security.cloudfl\ + are-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Clou\ + dFlare-doh IPv4 1\" host=1.1.1.1;\r\ + \n/tool/netwatch/add comment=\"doh, doh-url=https://security.cloudflare-dn\ + s.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=CloudFlare\ + -doh IPv4 2\" host=1.0.0.1;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.google/dns-query, doh-cert=DigiCert Global Root G2, notify, name=Goog\ + le-doh IPv4 1\" host=8.8.8.8;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.google/dns-query, doh-cert=DigiCert Global Root G2, notify, name=Goog\ + le-doh IPv4 2\" host=8.8.4.4;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.quad9.net/dns-query, doh-cert=DigiCert Global Root G3, notify, name=C\ + uad9-doh IPv4 1\" host=9.9.9.9;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.quad9.net/dns-query, doh-cert=DigiCert Global Root G3, notify, name=C\ + uad9-doh IPv4 2\" host=149.112.112.112;\r\ + \n\r\ + \n/tool/netwatch/add comment=\"dns, notify, name=ns1.unet.ws\" host=91.192\ + .189.2;" +add dont-require-permissions=no name=script2 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n\r\ + \n:global InspectVar;\r\ + \n#:global RouterBoard;\r\ + \n#:do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on-erro\ + r={}\r\ + \n#:global Resources;\r\ + \n#:do {:set Resources [[ :parse \"/system/resource/get\" ]]} on-error={}\ + \r\ + \n\r\ + \n#:global Updates;\r\ + \n#:do {:set Updates [[ :parse \"/system/package/update/get\" ]]} on-error\ + ={}\r\ + \n\r\ + \n#:global PkgUpdStatus \"undefined\";\r\ + \n#:local Update [/system/package/update/get];\r\ + \n#:retry command={:set PkgUpdStatus (\$Update->\"status\")} delay=200ms m\ + ax=5 on-error={};\r\ + \n\r\ + \n#:log warning [\$InspectVar \$RouterBoard];\r\ + \n#:put [\$InspectVar \$RouterBoard];\r\ + \n\r\ + \n#:retry command={/system/package/update check-for-updates without-paging\ + \_as-value} delay=300ms max=5 on-error={};\r\ + \n\r\ + \n#:global arrDeviceInfo ({});\r\ + \n#:local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};});\ + \r\ + \n#:set (\$arrDeviceInfo->\"RouterBoard\") [[ :parse \"/system/routerboard\ + /get\" ]];\r\ + \n#:retry command={:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system\ + /package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"Error\ + \")};\r\ + \n# [:toarray {\"section\"={\"key\"=\"\"; \"value\"=\"\";} }];\r\ + \n# [:toarray \"\"];\r\ + \n:local arrDeviceInfo ({});\r\ + \n\r\ + \n:set (\$arrDeviceInfo->\"devUpdates\") {\"channel\"; \"stable\";};\r\ + \n#:do {:set (arrDeviceInfo->\"Updates\") [[ :parse \"/system/package/upda\ + te/get\" ]]} on-error={:log error (\$error)}\r\ + \n\$InspectVar \$arrDeviceInfo;\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 SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global RunOnce;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\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 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 :local CertSettings [ /certificate/settings/get ];\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 \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\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 :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 dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n#root.mnuc.backuper\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \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\";\r\ + \n#:local Script AM-GlobalConfig;\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#/usb1/mikro_bak_rsa.pub\r\ + \n:local FetchFile AM-DOHCert.rsc\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \"[usb1]/scripts/\" . \$FetchFile);\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/272/ec61099b\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 12:00:02 30.04.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\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 GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\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 ExitError;\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 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 WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\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 FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\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 LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n \$LogPrint debug \$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 \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n\r\ + \n\r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$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 \$LogPrint debug \$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 \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$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\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\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\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\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\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: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: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# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$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={\$LogPrint error [ :jobname ] (\"Fail\ + ed to detect public IP using default service: \" . \$Url . \".\")}\r\ + \n #:error \"Failed to detect public IP using default service: \$Url\ + .\"};\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$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={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :if (\$PubIpAddr = false) do={\r\ + \n :set PubIpAddr \"not-detected\";\r\ + \n } else={\r\ + \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ + \n }\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 :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\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 \$LogPrint 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 \$LogPrint 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 \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint 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 \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\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 GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$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 \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' 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 :global LogPrint;\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 \$LogPrint 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 FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\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 (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\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 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 GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \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: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 :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint 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 MiniDateTimeStamp do={\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 :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\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={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {: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 :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \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 :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\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 :global LogPrint;\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 \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint 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 \$LogPrint 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 \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint 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 \$LogPrint 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 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 [ :len\ + \_\$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 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 LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint 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 \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 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: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: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 LogPrint;\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 \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\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 \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', 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: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: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:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\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 \$LogPrint 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: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: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: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:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\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: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# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\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 #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\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 :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\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 \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\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 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={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\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 \"Setup Global Environment for scripts\";\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#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\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# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\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} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +add comment="Import ssh keys for public key authentication" \ + dont-require-permissions=no name=AM-SshKeysImport owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-SshKeysImport\r\ + \n# Script comment: Import ssh keys for public key authentication\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n#\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 configs or functions not ready.\"); }; } del\ + ay=500ms max=50;\r\ + \n :local ScriptName [ :jobname ];\r\ + \n\r\ + \n:global SSHKeysImport;\r\ + \n:global SSHKeysImportFile;\r\ + \n\r\ + \n# import single key passed as string\r\ + \n:set SSHKeysImport do={ :onerror Err {\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local User [ :tostr \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :if ([ :len \$Key ] = 0 || [ :len \$User ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Missing argument(s), please pass key and u\ + ser!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ :len [ /user/find where name=\$User ] ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"User '\" . \$User . \"' does not exist.\")\ + ;\r\ + \n :return false;\r\ + \n }\r\ + \n :local KeyVal ([ :deserialize \$Key delimiter=\" \" from=dsv options=d\ + sv.plain ]->0);\r\ + \n :if (!(\$KeyVal->0 = \"ssh-ed25519\" || \$KeyVal->0 = \"ssh-rsa\")) do\ + ={\r\ + \n \$LogPrint warning \$0 (\"SSH key of type '\" . \$KeyVal->0 . \"' is\ + \_not supported.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex (\$K\ + eyVal->1) ];\r\ + \n :local RegEx (\"\\\\bmd5=\" . \$FingerPrintMD5 . \"\\\\b\");\r\ + \n :if ([ :len [ /user/ssh-keys/find where user=\$User \\\r\ + \n (key-owner~\$RegEx or info~\$RegEx) ] ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The ssh public key (MD5:\" . \$FingerPrint\ + MD5 . \\\r\ + \n \") is already available for user '\" . \$User . \"'.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$MkDir \"tmpfs/ssh-keys-import\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Creating directory 'tmpfs/ssh-keys-import'\ + \_failed!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\"tmpfs/ssh-keys-import/key-\" . [ \$GetRandom20CharA\ + lNum 6 ] . \".pub\");\r\ + \n /file/add name=\$FileName contents=(\$Key . \", md5=\" . \$FingerPrint\ + MD5);\r\ + \n \$WaitForFile \$FileName;\r\ + \n :onerror Err {\r\ + \n /user/ssh-keys/import public-key-file=\$FileName user=\$User;\r\ + \n \$LogPrint info \$0 (\"Imported ssh public key (\" . \$KeyVal->2 . \ + \", \" . \$KeyVal->0 . \", \" . \\\r\ + \n \"MD5:\" . \$FingerPrintMD5 . \") for user '\" . \$User . \"'.\");\ + \r\ + \n \$RmDir \"tmpfs/ssh-keys-import\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed importing key: \" . \$Err);\r\ + \n \$RmDir \"tmpfs/ssh-keys-import\";\r\ + \n :return false;\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# import keys from a file\r\ + \n:set SSHKeysImportFile do={ :onerror Err {\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local User [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global FileExists;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global SSHKeysImport;\r\ + \n :if ([ :len \$FileName ] = 0 || [ :len \$User ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Missing argument(s), please pass file name\ + \_and user!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$FileExists \$FileName ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"File '\" . \$FileName . \"' does not exist\ + .\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local Keys [ :tolf [ /file/get \$FileName contents ] ];\r\ + \n :foreach KeyVal in=[ :deserialize \$Keys delimiter=\" \" from=dsv opti\ + ons=dsv.plain ] do={\r\ + \n :local Continue false;\r\ + \n :if (\$KeyVal->0 = \"ssh-ed25519\" || \$KeyVal->0 = \"ssh-rsa\") do=\ + {\r\ + \n :if ([ \$SSHKeysImport (\$KeyVal->0 . \" \" . \$KeyVal->1 . \" \" \ + . \$KeyVal->2) \$User ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Failed importing key for user '\" . \$\ + User . \"'.\");\r\ + \n }\r\ + \n :set Continue true;\r\ + \n }\r\ + \n :if (\$Continue = false && \$KeyVal->0 = \"#\") do={\r\ + \n :set User [ \$EitherOr ([ \$ParseKeyValueStore (\$KeyVal->1) ]->\"\ + user\") \$User ];\r\ + \n :set Continue true;\r\ + \n }\r\ + \n :if (\$Continue = false && [ :len (\$KeyVal->0) ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"SSH key of type '\" . \$KeyVal->0 . \"' \ + is not supported.\");\r\ + \n }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n" +add comment="Enable or disable ip addresses based on bridge port state" \ + dont-require-permissions=no name=mod/AM-IPbridge owner=vados 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="Check for certificates validity" dont-require-permissions=no \ + name=AM-CheckCerts owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-CheckCerts\r\ + \n# Script comment: Check for certificates validity\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 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 CertRenewTime;\r\ + \n :global CertRenewUrl;\r\ + \n :global CertWarnTime;\r\ + \n :global Identity;\r\ + \n\r\ + \n :global CertificateAvailable;\r\ + \n :global EscapeForRegEx;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global ScriptLock;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global UrlEncode;\r\ + \n# :global WaitFullyConnected;\r\ + \n\r\ + \n# Add this Script scheduler\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n:log warning (\"System Scheduler for script: \" . \$ScriptName . \" is N\ + OT SET! Fix It Now!\");\r\ + \n:local OnEvent \"/system/script/run \$ScriptName;\";\r\ + \n:local Comment \"Every Day Check For Renew Certificates\";\r\ + \n/system/scheduler/add name=\$ScriptName comment=\$Comment start-time=sta\ + rtup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n\r\ + \n :local CheckCertificatesDownloadImport do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local CertName [ :tostr \$2 ];\r\ + \n :local FetchName [ :tostr \$3 ];\r\ + \n\r\ + \n :global CertRenewUrl;\r\ + \n :global CertRenewPass;\r\ + \n\r\ + \n :global CertificateNameByCN;\r\ + \n :global EscapeForRegEx;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global UrlEncode;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :foreach Type in={ \"p12\"; \"pem\" } do={\r\ + \n :local CertFileName ([ \$UrlEncode \$FetchName ] . \".\" . \$Type)\ + ;\r\ + \n \$LogPrint debug \$ScriptName (\"Trying type '\" . \$Type . \"' fo\ + r '\" . \$CertName . \\\r\ + \n \"' (file '\" . \$CertFileName . \"')...\");\r\ + \n\r\ + \n :do {\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] \ + }) \\\r\ + \n (\$CertRenewUrl . \$CertFileName) dst-path=\$CertFileName \ + as-value;\r\ + \n } do={\r\ + \n :if (!(\$Err ~ \"[Ss]tatus 404\")) do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching certificate: \" . \ + \$Err);\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n \$WaitForFile \$CertFileName; \r\ + \n\r\ + \n :local DecryptionFailed true;\r\ + \n :foreach I,PassPhrase in=\$CertRenewPass do={\r\ + \n :do {\r\ + \n \$LogPrint debug \$ScriptName (\"Trying \" . \$I . \". passp\ + hrase... \");\r\ + \n :local Result [ /certificate/import file-name=\$CertFileName\ + \_passphrase=\$PassPhrase as-value ];\r\ + \n :if (\$Result->\"decryption-failures\" = 0) do={\r\ + \n \$LogPrint debug \$ScriptName (\"Success!\");\r\ + \n :set DecryptionFailed false;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n \$RmFile \$CertFileName;\r\ + \n\r\ + \n :if (\$DecryptionFailed = true) do={\r\ + \n \$LogPrint warning \$ScriptName (\"Decryption failed for certi\ + ficate file '\" . \$CertFileName . \"'.\");\r\ + \n }\r\ + \n\r\ + \n :foreach CertInChain in=[ /certificate/find where common-name!=\ + \$CertName !private-key \\\r\ + \n name~(\"^\" . [ \$EscapeForRegEx \$CertFileName ] . \"_[0-9]\ + +\\\$\") \\\r\ + \n !(subject-alt-name~(\"(^|\\\\W)(DNS|IP):\" . [ \$EscapeForRe\ + gEx \$CertName ] . \"(\\\\W|\\\$)\")) \\\r\ + \n !(common-name=[]) ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$CertInChain common-\ + name ];\r\ + \n }\r\ + \n\r\ + \n :return true;\r\ + \n } on-error={\r\ + \n \$LogPrint debug \$ScriptName (\"Could not download certificate \ + file '\" . \$CertFileName . \"'.\");\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FormatInfo do={\r\ + \n :local Cert \$1;\r\ + \n\r\ + \n :global FormatLine;\r\ + \n :global FormatMultiLines;\r\ + \n :global IfThenElse;\r\ + \n\r\ + \n :local FormatExpire do={\r\ + \n :global CharacterReplace;\r\ + \n :return [ \$CharacterReplace [ \$CharacterReplace [ :tostr \$1 ] \ + \"w\" \"w \" ] \"d\" \"d \" ];\r\ + \n }\r\ + \n\r\ + \n :local FormatCertChain do={\r\ + \n :local Cert \$1;\r\ + \n\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :local CertVal [ /certificate/get \$Cert ];\r\ + \n\r\ + \n :if ([ :typeof (\$CertVal->\"issuer\") ] = \"nothing\") do={\r\ + \n :return \"self-signed\";\r\ + \n }\r\ + \n\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=5 do={\r\ + \n :set Return (\$Return . [ \$ParseKeyValueStore (\$CertVal->\"iss\ + uer\") ]->\"CN\");\r\ + \n :if ([ :len [ /certificate/builtin/find where skid=(\$CertVal->\ + \"akid\") ] ] > 0) do={\r\ + \n :return \$Return;\r\ + \n }\r\ + \n :do {\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\ + \"akid\") ] ];\r\ + \n } on-error={\r\ + \n :return (\$Return . \" (possibly incomplete!)\");\r\ + \n }\r\ + \n :if ((\$CertVal->\"akid\") = \"\" || (\$CertVal->\"akid\") = (\$\ + CertVal->\"skid\")) do={\r\ + \n :return \$Return;\r\ + \n }\r\ + \n :set Return (\$Return . \" -> \");\r\ + \n }\r\ + \n :return (\$Return . \"...\");\r\ + \n }\r\ + \n\r\ + \n :local CertVal [ /certificate/get \$Cert ];\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Name\" (\$CertVal->\"name\") ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$CertVal->\"common-name\") ] > 0) ([ \$Fo\ + rmatLine \"CommonName\" (\$CertVal->\"common-name\") ] . \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$CertVal->\"subject-alt-name\") ] > 0) ([\ + \_\$FormatMultiLines \"SubjectAltNames\" (\$CertVal->\"subject-alt-name\")\ + \_] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \"Private key\" [ \$IfThenElse ((\$CertVal->\"priva\ + te-key\") = true) \"available\" \"missing\" ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \"Fingerprint\" (\$CertVal->\"fingerprint\") ] . \"\ + \\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$CertVal->\"ca\") ] > 0) [ \$FormatLine \ + \"Issuer\" (\$CertVal->\"ca\") ] [ \$FormatLine \"Issuer chain\" [ \$Forma\ + tCertChain \$Cert ] ] ] . \"\\n\" . \\\r\ + \n \"Validity:\\n\" . \\\r\ + \n [ \$FormatLine \" days\" (\$CertVal->\"days-valid\") ] . \"\\n\ + \" . \\\r\ + \n [ \$FormatLine \" from\" (\$CertVal->\"invalid-before\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" to\" (\$CertVal->\"invalid-after\") ] . \"\\n\ + \" . \\\r\ + \n [ \$FormatLine \" time left\" [ \$IfThenElse ((\$CertVal->\"exp\ + ired\") = true) \"expired\" [ \$FormatExpire (\$CertVal->\"expires-after\"\ + ) ] ] ]);\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ScriptLock \$ScriptName ] = false) do={\r\ + \n :set ExitOK true;\r\ + \n :error false;\r\ + \n }\r\ + \n# \$WaitFullyConnected;\r\ + \n\r\ + \n :foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expi\ + res-after<\$CertRenewTime ] do={\r\ + \n :local CertVal [ /certificate/get \$Cert ];\r\ + \n :local LastName;\r\ + \n :local FetchName;\r\ + \n\r\ + \n :do {\r\ + \n :if ([ :len \$CertRenewUrl ] = 0) do={\r\ + \n \$LogPrint info \$ScriptName (\"No CertRenewUrl given.\");\r\ + \n :error false;\r\ + \n }\r\ + \n \$LogPrint info \$ScriptName (\"Attempting to renew certificate '\ + \" . (\$CertVal->\"name\") . \"'.\");\r\ + \n\r\ + \n :local ImportSuccess false;\r\ + \n :if ([ :len (\$CertVal->\"common-name\") ] > 0) do={\r\ + \n :set LastName (\$CertVal->\"common-name\");\r\ + \n :set FetchName \$LastName;\r\ + \n :set ImportSuccess [ \$CheckCertificatesDownloadImport \$ScriptN\ + ame \$LastName \$FetchName ];\r\ + \n }\r\ + \n :foreach SAN in=(\$CertVal->\"subject-alt-name\") do={\r\ + \n :if (\$ImportSuccess = false) do={\r\ + \n :set LastName [ :pick \$SAN ([ :find \$SAN \":\" ] + 1) [ :len\ + \_\$SAN ] ];\r\ + \n :set FetchName \$LastName;\r\ + \n :set ImportSuccess [ \$CheckCertificatesDownloadImport \$Scrip\ + tName \$LastName \$FetchName ];\r\ + \n :if (\$ImportSuccess = false && [ :pick \$LastName 0 2 ] = \"*\ + .\") do={\r\ + \n :set FetchName (\"star.\" . [ :pick \$LastName 2 [ :len \$La\ + stName ] ]);\r\ + \n :set ImportSuccess [ \$CheckCertificatesDownloadImport \$Scr\ + iptName \$LastName \$FetchName ];\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :if (\$ImportSuccess = false) do={ :error false; }\r\ + \n\r\ + \n :if ([ :len (\$CertVal->\"fingerprint\") ] > 0 && \$CertVal->\"fin\ + gerprint\" != [ /certificate/get \$Cert fingerprint ]) do={\r\ + \n \$LogPrint debug \$ScriptName (\"Certificate '\" . \$CertVal->\"\ + name\" . \"' was updated in place.\");\r\ + \n :set CertVal [ /certificate/get \$Cert ];\r\ + \n } else={\r\ + \n \$LogPrint debug \$ScriptName (\"Certificate '\" . \$CertVal->\"\ + name\" . \"' was not updated, but replaced.\");\r\ + \n\r\ + \n :local CertNew [ /certificate/find where name~(\"^\" . [ \$Escap\ + eForRegEx [ \$UrlEncode \$FetchName ] ] . \"\\\\.(p12|pem)_[0-9]+\\\$\") \ + \\\r\ + \n (common-name=(\$CertVal->\"common-name\") or subject-alt-name~\ + (\"(^|\\\\W)(DNS|IP):\" . [ \$EscapeForRegEx \$LastName ] . \"(\\\\W|\\\$)\ + \")) \\\r\ + \n fingerprint!=[ :tostr (\$CertVal->\"fingerprint\") ] ];\r\ + \n :local CertNewVal [ /certificate/get \$CertNew ];\r\ + \n\r\ + \n :if ((\$CertVal->\"expires-after\") > (\$CertNewVal->\"expires-a\ + fter\")) do={\r\ + \n /certificate/remove \$CertNew;\r\ + \n \$LogPrint warning \$ScriptName (\"Old certificate is newer th\ + an the new one. Aborting renew.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ((\$CertVal->\"private-key\") = true && (\$CertVal->\"privat\ + e-key\") != (\$CertNewVal->\"private-key\")) do={\r\ + \n /certificate/remove \$CertNew;\r\ + \n \$LogPrint warning \$ScriptName (\"Old certificate '\" . (\$Ce\ + rtVal->\"name\") . \"' has a private key, new certificate does not. Aborti\ + ng renew.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$CertificateAvailable ([ \$ParseKeyValueStore (\$CertNew\ + Val->\"issuer\") ]->\"CN\") \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$ScriptName (\"The certificate chain is no\ + t available!\");\r\ + \n }\r\ + \n\r\ + \n /ip/service/set certificate=(\$CertNewVal->\"name\") [ find wher\ + e certificate=(\$CertVal->\"name\") ];\r\ + \n\r\ + \n /ip/ipsec/identity/set certificate=(\$CertNewVal->\"name\") [ fi\ + nd where certificate=(\$CertVal->\"name\") ];\r\ + \n /ip/ipsec/identity/set remote-certificate=(\$CertNewVal->\"name\ + \") [ find where remote-certificate=(\$CertVal->\"name\") ];\r\ + \n\r\ + \n /ip/hotspot/profile/set ssl-certificate=(\$CertNewVal->\"name\")\ + \_[ find where ssl-certificate=(\$CertVal->\"name\") ];\r\ + \n\r\ + \n /certificate/remove \$Cert;\r\ + \n /certificate/set \$CertNew name=(\$CertVal->\"name\");\r\ + \n :set Cert \$CertNew;\r\ + \n :set CertVal [ /certificate/get \$CertNew ];\r\ + \n }\r\ + \n\r\ + \n \$SendNotification2 ({ origin=\$ScriptName; silent=true; \\\r\ + \n subject=([ \$SymbolForNotification \"lock-with-ink-pen\" ] . \"C\ + ertificate renewed: \" . (\$CertVal->\"name\")); \\\r\ + \n message=(\"A certificate on \" . \$Identity . \" has been renewe\ + d.\\n\\n\" . [ \$FormatInfo \$Cert ]) });\r\ + \n \$LogPrint info \$ScriptName (\"The certificate '\" . (\$CertVal->\ + \"name\") . \"' has been renewed.\");\r\ + \n } on-error={\r\ + \n \$LogPrint debug \$ScriptName (\"Could not renew certificate '\" .\ + \_(\$CertVal->\"name\") . \"'.\");\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :foreach Cert in=[ /certificate/find where !revoked !scep-url !(expire\ + s-after=[]) \\\r\ + \n expires-after<\$CertWarnTime !(fingerprint=[]) ] do\ + ={\r\ + \n :local CertVal [ /certificate/get \$Cert ];\r\ + \n\r\ + \n :if ([ :len [ /certificate/scep-server/find where ca-cert=(\$CertVal\ + ->\"ca\") ] ] > 0) do={\r\ + \n \$LogPrint debug \$ScriptName (\"Certificate '\" . (\$CertVal->\"n\ + ame\") . \"' is handled by SCEP, skipping.\");\r\ + \n } else={\r\ + \n :local State [ \$IfThenElse ((\$CertVal->\"expired\") = true) \"ex\ + pired\" \"is about to expire\" ];\r\ + \n\r\ + \n \$SendNotification2 ({ origin=\$ScriptName; \\\r\ + \n subject=([ \$SymbolForNotification \"lock-with-ink-pen,warning-s\ + ign\" ] . \"Certificate warning: \" . (\$CertVal->\"name\")); \\\r\ + \n message=(\"A certificate on \" . \$Identity . \" \" . \$State . \ + \".\\n\\n\" . [ \$FormatInfo \$Cert ]) });\r\ + \n \$LogPrint info \$ScriptName (\"The certificate '\" . (\$CertVal->\ + \"name\") . \"' \" . \$State . \\\r\ + \n \", it is invalid after \" . (\$CertVal->\"invalid-after\") . \ + \".\");\r\ + \n }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\ + \n# RouterOS script: AM-GlobalConfig\ + \n# Script comment: Global Config Script\ + \n# Copyright (c) 2007-2026 Vados \ + \n#\ + \n#\ + \n# Warning: Dont touch this line!\ + \n:global GlobalConfReady false;\ + \n#\ + \n#\ + \n# Global Url For Amster scripts to fetch\ + \n# most be defined in AM-Init-Script or AM-setup scripts\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ + \n:global ScriptsUrlSuffix \"\";\ + \n:global CheckSumsVerify true;\ + \n\ + \n:global ScriptUpdatesCRLF true;\ + \n:global CommentsInScripts true;\ + \n\ + \n# Debug output:\ + \n:global PrintDebug true; #false;\ + \n\ + \n# Debug output for specific script:\ + \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\ + \n\ + \n# Debug logs\ + \n# Other actions (disk, email, remote or support) can be used as well.\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\ + \n#/system/logging/add topics=script,debug action=memory;\ + \n\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\ + \n:global Domain \"WORKGROUP\";\ + \n\ + \n:global EmailGeneralTo \"vados@vados.ru\";\ + \n#:global EmailGeneralCc \"\";\ + \n\ + \n# \$ScriptInstallUpdate mod/notification-telegram\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\ + \n# Use this to send notifications to a specific topic in group.\ + \n#:global TelegramThreadId \"30\";\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\ + \n# or user names. Groups allow to chat with devices simultaneously.\ + \n:global TelegramChatIdsTrusted {\ + \n \"454403445\"\ + \n \"-1003631309063\"\ + \n \"-5124482807\"\ + \n \"1087968824\";\ + \n};\ + \n# \"-5294757340\";\ + \n\ + \n:global TelegramChatGroups \"(all)\";\ + \n#:global TelegramChatGroups \"(all|home|office)\";\ + \n\ + \n:global NotificationFunctions {\ + \n \"email\"\ + \n \"telegram\";\ + \n};\ + \n# Toggle this to disable symbols in notifications.\ + \n:global NotificationsWithSymbols true;\ + \n:global TerminalColorOutput true;\ + \n\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\ + \n\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\ + \n:global updateChannel \"stable\";\ + \n\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\");\ + \n:global CertRenewTime 2w;\ + \n:global CertRenewPass {\ + \n \"\";\ + \n# \"v3ry-s3cr3t\";\ + \n# \"4n0th3r-s3cr3t\";\ + \n};\ + \n:global CertWarnTime 1w;\ + \n:global CertIssuedExportPass {\ + \n \"\";\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\ + \n};\ + \n\ + \n# Script BackupAndUpdate mode, possible values: backup,\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\ + \n# osnotify - Set `forceBackup` to always create backups on every run\ + \n:global DevInfoIncludeIP true;\ + \n:global BackupAndUpdateMode \"osnotify\"\ + \n\ + \n:global forceBackup true;\ + \n:global BackupPassword \"Peskar55\";\ + \n\ + \n# SFTP Backup Variables\ + \n:global BackupRandomDelay 0;\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\ + \n:global BackupUploadUser \$Identity;\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\ + \n\ + \n:global BackupSendBinary true;\ + \n:global BackupSendExport true;\ + \n:global BackupSendGlobalConfig true;\ + \n:global BackupSendScripts true;\ + \n\ + \n# Remove local file after uploading if no errors\ + \n:global BackupRmLocal true;\ + \n\ + \n# Local Backups Root Directory \ + \n:global BackupLocalRoot \"tmpfs\";\ + \n\ + \n# Encrypt Backup\ + \n:global BackupEncrypt true;\ + \n\ + \n# Sensitive information in Backups\ + \n:global BackupSens true;\ + \n\ + \n# User Export\ + \n:global BackupUser true;\ + \n\ + \n# License Export (not for CHR, will silently skip)\ + \n:global BackupLicense false;\ + \n\ + \n# SSH Keys\ + \n:global BackupSshKeys true;\ + \n\ + \n# Certificate Export\ + \n:global BackupCerts true;\ + \n\ + \n# Certificate Password\ + \n:global BackupCertsPasswd \"\";\ + \n\ + \n# User-Manager Export\ + \n:global BackupUserMan false;\ + \n\ + \n# The Dude Export\ + \n:global BackupDude false;\ + \n\ + \n# User Files to export, comma-separated string or array of strings\ + \n# User Files are not removed on backup\ + \n# Any directory paths will be removed (/ -> _) on remote file\ + \n# Nonpresent files are silently skipped\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\ + \n\ + \n# load functions and any custom scripts\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\ + \n#\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \n# :onerror Err {\ + \n# /system/script/run \$Script;\ + \n# } do={\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\ + \n# }\ + \n#}\ + \n#:log info \"\\ndevMode = \$devMode\";\ + \n#:log info \"\\ndevRunning = \$devRunning\";\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\ + \n :onerror Err {\ + \n /system/script/run \$Script;\ + \n } do={\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\ + \n }\ + \n}\ + \n\ + \n# signal we are ready\ + \n:set GlobalConfReady true;\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\ + \n" +add comment="Renew locally issued certificates" dont-require-permissions=no \ + name=AM-CertsRenew owner=AM-CertsRenew policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-CertsRenew\r\ + \n# Script comment: Renew locally issued certificates\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n#\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 CertIssuedExportPass;\r\ + \n\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global ScriptLock;\r\ + \n\r\ + \n# Add this Script scheduler\r\ + \n:if ([ :len [ /system/scheduler/find where name=\$ScriptName ] ] = 0) do\ + ={\r\ + \n:log warning (\"System Scheduler for script: \" . \$ScriptName . \" is N\ + OT SET! Fix It Now!\");\r\ + \n:local OnEvent \"/system/script/run \$ScriptName;\";\r\ + \n:local Comment \"Every Day Check For Update Local Issued Certificates.\"\ + ;\r\ + \n#/system/scheduler/add name=\$ScriptName comment=\$Comment start-time=st\ + artup interval=1d on-event=\$OnEvent;\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 :foreach Cert in=[ /certificate/find where issued expires-after<3w ] d\ + o={\r\ + \n :local CertVal [ /certificate/get \$Cert ];\r\ + \n /certificate/issued-revoke \$Cert;\r\ + \n /certificate/set name=(\$CertVal->\"name\" . \"-revoked-\" . [ /syst\ + em/clock/get date ]) \$Cert;\r\ + \n /certificate/add name=(\$CertVal->\"name\") common-name=(\$CertVal->\ + \"common-name\") \\\r\ + \n key-usage=(\$CertVal->\"key-usage\") subject-alt-name=(\$CertVal\ + ->\"subject-alt-name\");\r\ + \n /certificate/sign (\$CertVal->\"name\") ca=(\$CertVal->\"ca\");\r\ + \n :if ([ :typeof (\$CertIssuedExportPass->(\$CertVal->\"common-name\")\ + ) ] = \"str\") do={\r\ + \n :if ([ \$MkDir \"cert-issued\" ] = true) do={\r\ + \n /certificate/export-certificate (\$CertVal->\"name\") type=pkcs1\ + 2 \\\r\ + \n file-name=(\"cert-issued/\" . \$CertVal->\"common-name\") \\\ + \r\ + \n export-passphrase=(\$CertIssuedExportPass->(\$CertVal->\"com\ + mon-name\"));\r\ + \n \$LogPrint info \$ScriptName (\"Issued a new certificate for '\"\ + \_. \$CertVal->\"common-name\" . \\\r\ + \n \"', exported to 'cert-issued/\" . \$CertVal->\"common-name\" \ + . \".p12'.\");\r\ + \n } else={\r\ + \n \$LogPrint warning \$ScriptName (\"Failed creating directory, no\ + t exporting certificate.\");\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint info \$ScriptName (\"Issued a new certificate for '\" .\ + \_\$CertVal->\"common-name\" . \"'.\");\r\ + \n }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err;\r\ + \n}\r\ + \n" +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# 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:global LogPrint;\r\ + \n:global EditSchedulers;\r\ + \n:global OSUpdateMode;\r\ + \n\r\ + \n:local SchedComment \"Every 7 Day Check For Update and Backup send notif\ + ication to EMail.\";\r\ + \n:local SchedInterval \"7d 00:00:00\";\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 - Comment (optional, default: \"Scheduler for script: \")\ + \_[**]\r\ + \n# 3. \$3 - Interval (e.g. \"1d 00:00:00\" (default is \"1d\")) [**]\r\ + \n# 4. \$4 - On Event command (e.g. \"/system/script { run ; }\" (de\ + fault is \"/system/script { run \$SchedName; }\")) [**]\r\ + \n# 5. \$5 - Policy (e.g. \"ftp,reboot,read,write,policy,test,password,sni\ + ff,sensitive,romon\" (default is the same)) [**]\r\ + \n# 6. \$6 - Start Date (e.g. \"jan/01/1970\", default is current date) [*\ + *]\r\ + \n# 7. \$7 - Start Time (e.g. \"03:41:27\", default is current time) [**]\ + \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={ \$LogPrint error\ + \_\$ScriptName (\"Failed to add/modify shceduler for \" . \$ScriptName . \ + \"!\") }\r\ + \n# :if ([ \$EditSchedulers \"my-script\" \"My custom comment\" \"2d 00:00\ + :00\" \"/system/script { run my-script; }\" \"ftp,reboot,read,write,policy\ + ,test,password,sniff,sensitive,romon\" \"jan/01/2025\" \"03:41:27\" ] = fa\ + lse) do={ \$LogPrint error \$ScriptName (\"Failed to add/modify shceduler \ + for \" . \$ScriptName . \"!\") }\r\ + \n\r\ + \n:set EditSchedulers do={\r\ + \n :global LogPrint;\r\ + \n :local SchedName [ :tostr \$1 ];\r\ + \n :local Comment [ :tostr \$2 ];\r\ + \n :if ([ :len \$Comment ] = 0) do={:set Comment \"Scheduler for script: \ + \$SchedName\"};\r\ + \n :local Interval [ :tostr \$3 ];\r\ + \n :if ([ :len \$Interval ] = 0) do={:set Interval \"1d\"};\r\ + \n :local OnEvent [ :tostr \$4 ];\r\ + \n :if ([ :len \$OnEvent ] > 0) do={:set OnEvent \"/system/script { run \ + \$SchedName; }\"};\r\ + \n :local Policy [ :tostr \$5 ];\r\ + \n :if ([ :len \$Policy ] = 0) do={:set Policy \"ftp,reboot,read,write,po\ + licy,test,password,sniff,sensitive,romon\"};\r\ + \n :local StartDate [ :tostr \$6 ];\r\ + \n :if ([ :len \$StartDate ] = 0) do={:set StartDate [get date]};\r\ + \n :local StartTime [ :tostr \$7 ];\r\ + \n :if ([ :len \$StartTime ] = 0) do={:set StartTime [get time]};\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 \$LogPrint 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={\$LogPrint error \$0 (\"Removing directory '\" . \$DirName . \"'\ + \_failed: \" . \$Err); :return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:if ([ \$EditSchedulers \$ScriptName \$SchedComment \$SchedInterval ] = \ + false) do={\r\ + \n \$LogPrint error \$ScriptName (\"Failed to add/modify shceduler for \"\ + \_. \$ScriptName . \"!\");\r\ + \n :set ExitOK false;\r\ + \n :error true;\r\ + \n}\r\ + \n\r\ + \n\r\ + \n# Add global Function OSUpdateMode\r\ + \n:if ([ :len \$OSUpdateMode ] = 0 || ![\$OSUpdateMode]) do={\r\ + \n :set OSUpdateMode do={\r\ + \n :local NewMode [ :tostr \$1 ];\r\ + \n :global BackupAndUpdateMode;\r\ + \n :global LogPrint;\r\ + \n :global OldMode [ :tostr \$BackupAndUpdateMode ];\r\ + \n :if ([ \$NewMode ] != false && \$NewMode != \$OldMode && \$NewMode =\ + \_\"updateOnce\") do={\r\ + \n :set BackupAndUpdateMode \$NewMode;\r\ + \n \$LogPrint warning \$0 (\"/nOk. /\$OsUpdateMode = \" . \$NewMode .\ + \_\".\\nYou're a good boy! ))\\nI'm launching the update in 5 seconds.\");\ + \r\ + \n :delay 5;\r\ + \n /system/script { run AM-Backup-UpdateEmail; };\r\ + \n } else={\r\ + \n \$LogPrint warning \$0 (\"/nFunction /\$OsUpdateMode is \" . \$NewMo\ + de . \" but is may be only \\\"updateOnce\\\" value!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :error false;\r\ + \n };\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.02.12\"\r\ + \n\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) \\nhttps://github.com/beeyev/Mikrotik-RouterOS-auto\ + matic-backup-and-update\";\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: \$R\ + OsVerAvail\");\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\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## IP address detection\r\ + \n :global DevInfoIncludeIP;\r\ + \n :if ([\$DevInfoIncludeIP] = true) do={\r\ + \n :global GetPubIp;\r\ + \n :local PublicIpAddress \$GetPubIp;\r\ + \n :set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nPublic IP addre\ + ss: \" . \$PublicIpAddress . \".\");\r\ + \n :log info (\"\$SMP Public IP address detected: \" . \$PublicIpAddres\ + s);\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 # 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# /system/script/environment remove [find name=\"buGlobalVarTar\ + getOsVersion\"];\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# #/system/script/environment remove [find name=\"OldMode\"];\ + \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" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=gn master-configuration=\ + cfg-2ghz name-format=prefix-identity name-prefix=2ghz +add action=create-dynamic-enabled hw-supported-modes=ac master-configuration=\ + cfg-5ghz-ac name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled hw-supported-modes=an master-configuration=\ + cfg-5ghz-an name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set builtin-trust-store=fetch +/disk settings +set auto-media-interface=lo default-mount-point-template=usb1 +/ip smb +set comment=MikroVados domain=WORKGROUP enabled=yes interfaces=Bridge-LAN +/interface bridge port +add bridge=Bridge-LAN ingress-filtering=no interface=ether2 \ + internal-path-cost=10 path-cost=10 +add bridge=Bridge-LAN comment=LEN ingress-filtering=no interface=ether3 \ + internal-path-cost=10 path-cost=10 +add bridge=Bridge-LAN comment=NUC ingress-filtering=no interface=ether4 \ + internal-path-cost=10 path-cost=10 +add bridge=Bridge-LAN ingress-filtering=no interface=ether5 \ + internal-path-cost=10 path-cost=10 +/ip firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN +/ip settings +set max-neighbor-entries=8192 secure-redirects=no +/ipv6 settings +set disable-ipv6=yes max-neighbor-entries=8192 +/interface detect-internet +set detect-interface-list=WAN internet-interface-list=WAN lan-interface-list=\ + LAN wan-interface-list=WAN +/interface l2tp-server server +set authentication=mschap2 use-ipsec=yes +/interface list member +add comment=WAN interface="ether1 - Unet" list=WAN +add interface=Bridge-LAN list=LAN +/interface ovpn-server server +add auth=sha1,md5 mac-address=FE:82:A5:78:8E:84 name=ovpn-server1 +/interface wifi cap +set caps-man-addresses=10.30.30.10 certificate=request discovery-interfaces=\ + wlan1,wlan2 lock-to-caps-man=no slaves-static=no +/interface wifi capsman +set package-path="" require-peer-certificate=no upgrade-policy=none +/interface wifi provisioning +add action=create-dynamic-enabled disabled=no master-configuration=2G-N \ + name-format=2G-%I slave-configurations=2G-G supported-bands=\ + 2ghz-n,2ghz-g,2ghz-g +add action=create-dynamic-enabled disabled=no master-configuration=5G-AC \ + name-format=5G-%I supported-bands=5ghz-ac,5ghz-ac +/interface wireguard peers +add allowed-address=10.8.0.2/32,0.0.0.0/0 client-allowed-address=0.0.0.0/0 \ + endpoint-address=89.110.101.17 endpoint-port=29185 interface=WG name=\ + MikroVados persistent-keepalive=10s public-key=\ + "64Y25EUZQQt8EIeAJYD8qWt+te8qvGEepnswdBgmzlY=" +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-18FD746E5814 discovery-interfaces=Bridge-LAN enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/interface wireless sniffer +set file-name=24g +/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 dhcp-client +add add-default-route=special-classless default-route-distance=2 \ + default-route-tables=main interface="ether1 - Unet" name="ether1 - Unet" \ + use-peer-dns=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.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.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=1:20:72:a9:d3:34:36 dhcp-option=HostName \ + dhcp-option-set=MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP \ + use-src-mac=yes +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="=\"Client ID\"" mac-address=DE:4D:72:F3:1A:9F server=\ + masterDHCP +add address=10.30.30.86 dhcp-option=HostName dhcp-option-set=MikroYellow \ + mac-address=48:8F:5A:8E:1A:C2 server=masterDHCP +/ip dhcp-server network +add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ + domain-search-list dhcp-option-set=domain-search-set dns-server=\ + 10.30.30.81 domain=WORKGROUP gateway=10.30.30.81 netmask=24 ntp-server=\ + 10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +/ip dns +set allow-remote-requests=yes cache-max-ttl=1d doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=8.8.8.8,8.8.4.4 verify-doh-cert=yes +/ip dns static +add address=10.30.30.33 name=amster-nuc type=A +add address=10.30.30.33 comment=AMSTER name=amster.vados.ru 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 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 name=git.vados.ru type=A +add address=10.30.30.33 name=reg.vados.ru type=A +add address=10.30.30.33 match-subdomain=yes name=ros.vados.ru type=A +add address=10.30.30.33 match-subdomain=yes name=mikrots.vados.ru type=A +add address=10.30.30.33 name=oxidized.vados.ru type=A +add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +add address=8.8.8.8 comment="Google-dns IPv4 1" name=dns.google 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.1.1.1 comment="CloudFlare-doh IPv4 1" name=\ + security.cloudflare-dns.com type=A +add address=1.0.0.1 comment="CloudFlare-doh IPv4 2" 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=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws 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 name=MikroYellow type=A +add address=10.30.30.85 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=10.30.30.20 name=garage type=A +add address=2606:4700:4700::1111 disabled=yes name=\ + security.cloudflare-dns.com type=AAAA +add address=2606:4700:4700::1001 disabled=yes name=\ + security.cloudflare-dns.com type=AAAA +/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=10.30.30.100-255 list=KIDS +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 +add address=157.240.247.174 list=Instagram +add address=46.53.178.107 list=Instagram +add address=179.60.195.174 list=Instagram +add address=157.240.205.174 list=Instagram +add address=31.13.24.0/21 list=Instagram +add address=31.13.64.0/18 list=Instagram +add address=45.64.40.0/22 list=Instagram +add address=66.220.144.0/20 list=Instagram +add address=69.63.176.0/20 list=Instagram +add address=69.171.224.0/19 list=Instagram +add address=74.119.76.0/22 list=Instagram +add address=103.4.96.0/22 list=Instagram +add address=129.134.0.0/16 list=Instagram +add address=157.240.0.0/16 list=Instagram +add address=173.252.64.0/18 list=Instagram +add address=179.60.192.0/22 list=Instagram +add address=185.60.216.0/22 list=Instagram +add address=204.15.20.0/22 list=Instagram +add address=157.240.200.63 list=Instagram +add address=185.60.219.63 list=Instagram +add address=129.134.31.12 list=Instagram +add address=66.81.203.132 list=Instagram +add address=185.89.218.12 list=Instagram +add address=31.13.66.63 list=Instagram +add address=84.15.65.162 list=Instagram +add address=68.66.224.28 list=Instagram +add address=157.240.253.63 list=Instagram +add address=83.174.11.224 list=Instagram +add address=157.240.9.52 list=Instagram +add address=157.240.252.174 list=Instagram +add address=157.240.195.63 list=Instagram +add address=31.13.71.52 list=Instagram +add address=57.144.110.192 list=Instagram +add address=157.240.252.17 list=Instagram +add address=84.15.66.97 list=Instagram +add address=217.168.6.33 list=Instagram +add address=31.13.83.52 list=Instagram +add address=157.240.241.63 list=Instagram +add address=129.134.30.12 list=Instagram +add address=185.89.219.12 list=Instagram +add address=157.240.252.10 list=Instagram +add address=157.240.201.63 list=Instagram +add address=66.81.203.197 list=Instagram +add address=179.60.195.52 list=Instagram +add address=66.81.203.7 list=Instagram +add address=216.40.34.41 list=Instagram +add address=157.240.202.63 list=Instagram +add address=157.240.229.63 list=Instagram +add address=157.240.252.63 list=Instagram +add address=31.13.72.53 list=Instagram +add address=124.108.16.224 list=Instagram +add address=157.240.205.63 list=Instagram +add address=92.46.37.96 list=Instagram +add address=157.240.247.63 list=Instagram +add address=157.240.234.63 list=Instagram +add address=157.240.235.63 list=Instagram +add address=87.245.208.97 list=Instagram +add address=216.58.192.0/19 list=Instagram +add address=209.85.128.0/17 list=Instagram +add address=198.105.240.0/20 list=Instagram +add address=173.194.0.0/16 list=Instagram +add address=172.217.0.0/16 list=Instagram +add address=142.250.0.0/15 list=Instagram +add address=108.177.0.0/17 list=Instagram +add address=87.245.197.140 list=Instagram +add address=74.125.0.0/16 list=Instagram +add address=64.233.160.0/19 list=Instagram +add address=157.240.0.1 list=Instagram +add address=157.240.238.63 list=Instagram +add address=157.240.238.174 list=Instagram +add address=157.240.0.63 list=Instagram +add address=157.240.224.63 list=Instagram +add address=157.240.224.174 list=Instagram +add address=157.240.251.36 list=Instagram +add address=157.240.253.12 list=Instagram +add address=157.240.253.35 list=Instagram +add address=157.240.238.13 list=Instagram +add address=157.240.238.56 list=Instagram +add address=157.240.238.175 list=Instagram +add address=57.144.112.141 list=Instagram +add address=157.240.251.60 list=Instagram +add address=157.240.251.128 list=Instagram +add address=157.240.238.5 list=Instagram +add address=157.240.253.13 list=Instagram +add address=157.240.253.5 list=Instagram +add address=157.240.238.2 list=Instagram +add address=157.240.238.37 list=Instagram +add address=157.240.251.5 list=Instagram +add address=157.240.251.34 list=Instagram +add address=57.144.112.1 list=Instagram +add address=157.240.238.54 list=Instagram +add address=129.134.26.123 list=Instagram +add address=157.240.252.3 list=Instagram +add address=31.13.84.4 list=Instagram +add address=157.240.224.12 list=Instagram +add address=157.240.238.4 list=Instagram +add address=157.240.0.13 list=Instagram +add address=3.33.139.32 list=Instagram +add address=157.240.0.35 list=Instagram +add address=157.240.238.14 list=Instagram +add address=157.240.238.60 list=Instagram +add address=57.144.112.145 list=Instagram +add address=157.240.251.35 list=Instagram +add address=151.101.84.159 list=Twitter +add address=pbs.twimg.com list=Twitter +add address=89.110.101.17 comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" list=TRUSTED +add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +add address=love.ru comment=love.ru list=NoVdsina +add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +add address=pochta.ru comment=pochta.ru list=NoVdsina +add address=vdsina.com 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 +add address=geoip.co list=NoVdsina +add address=x.com list=Twitter +add address=facebook.com list=facebook +add address=fbcd.net list=facebook +add address=comp-lenta.ru list=NoVdsina +add address=128.85.102.70 comment=update.microsoft.com list=\ + windowsupdateslist +add address=wu-b-net.trafficmanager.net. comment=\ + ctldl.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=ctldl.windowsupdate.com.delivery.microsoft.com. comment=\ + ctldl.windowsupdate.com list=windowsupdateslist +add address=redir.update.msft.com.trafficmanager.net. comment=\ + update.microsoft.com list=windowsupdateslist +add address=geo.prod.do.dsp.trafficmanager.net. comment=\ + geo.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=13.74.139.29 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12437.d.akamaiedge.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=displaycatalog-rp.md.mp.microsoft.com.akadns.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=rp-consumer-prod-displaycatalog-geomap.trafficmanager.net. \ + comment=displaycatalog-rp.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=sls.update.microsoft.com. comment=slscr.update.microsoft.com \ + list=windowsupdateslist +add address=glb.sls.prod.dcat.dsp.trafficmanager.net. comment=\ + sls.update.microsoft.com list=windowsupdateslist +add address=fe3.delivery.mp.microsoft.com. comment=\ + fe3cr.delivery.mp.microsoft.com list=windowsupdateslist +add address=glb.cws.prod.dcat.dsp.trafficmanager.net. comment=\ + fe3.delivery.mp.microsoft.com list=windowsupdateslist +add address=fe2cr.update.msft.com.trafficmanager.net. comment=\ + fe2cr.update.microsoft.com list=windowsupdateslist +add address=download.windowsupdate.com.delivery.microsoft.com. comment=\ + download.windowsupdate.com list=windowsupdateslist +add address=wu-f-net.trafficmanager.net. comment=\ + download.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=tsfe.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=edge.ds-c7110-microsoft.global.dns.qwilted-cds.cqloud.com. \ + comment=9.au.download.windowsupdate.com list=windowsupdateslist +add address=52.158.227.125 comment=array812.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dspw65.akamai.net. comment=\ + download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.151.58.88 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net. \ + comment=licensing.mp.microsoft.com list=windowsupdateslist +add address=licensing-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-nlu-net.trafficmanager.net. comment=\ + star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.b.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-tlu-net.trafficmanager.net. comment=\ + star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=storeedgefd.xbetservices.akadns.net. comment=\ + storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net. \ + comment=storeedgefd.dsx.mp.microsoft.com.edgekey.net list=\ + windowsupdateslist +add address=e16646.dscg.akamaiedge.net. comment=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net list=\ + windowsupdateslist +add address=40.69.76.189 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=bg.microsoft.map.fastly.net. comment=\ + 3.au.download.windowsupdate.com list=windowsupdateslist +add list=windowsupdateslist +add address=40.69.75.33 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=cdp-f-ssl-tlu-net.trafficmanager.net. comment=\ + star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a2033.dscd.akamai.net. comment=\ + star.sb.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.138.242 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-nlu-net.trafficmanager.net. comment=\ + dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=1D.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-b-tlu-net.trafficmanager.net. comment=\ + 1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a122.dscg3.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=windowsupdateslist +add address=geover.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e10370.d.akamaiedge.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=52.232.182.21 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.95 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=a1683.dscd.akamai.net. comment=\ + dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net. \ + comment=collections.mp.microsoft.com list=windowsupdateslist +add address=a1847.dscd.akamai.net. comment=\ + wildcard.f.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.142.6 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=au.download.windowsupdate.com.edgesuite.net. comment=\ + 2.au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dscg3.akamai.net. comment=\ + au.download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.156.123.84 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.78.254 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=4.au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + 4.au.download.windowsupdate.com list=windowsupdateslist +add address=cl-glcb907925.gcdn.co. comment=\ + 4.au.download.windowsupdate.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.111 comment=array510.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.69.70.43 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com. \ + comment=tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=ts-frontend.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=40.69.75.248 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.74.84 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=sds.trafficmanager.net. comment=software-download.microsoft.com \ + list=windowsupdateslist +add address=40.69.74.80 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.175.242.182 comment=array804.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=dlc-shim.trafficmanager.net. comment=download.microsoft.com list=\ + windowsupdateslist +add address=e12671.dscd.akamaiedge.net. comment=\ + download.microsoft.com.edgekey.net list=windowsupdateslist +add address=20.187.55.34 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.231 comment=array513.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.222.13 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12358.d.akamaiedge.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-tlu-net.trafficmanager.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a1856.dspw65.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=52.167.164.252 comment=array506.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=13.74.137.54 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv501.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv501.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=collections-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=52.167.160.173 comment=array509.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.77.148 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.200.126 comment=array507.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.167.59 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.172 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=82.202.162.184 comment=comp-lenta.ru list=NoWG +add address=smtp.mail.me.com.akadns.net. comment=smtp.mail.me.com list=NoWG +add address=17.57.155.37 comment=smtp.mail.me.com.akadns.net list=NoWG +add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ + purchase.mp.microsoft.com list=windowsupdateslist +add address=e110219.a.akamaiedge.net. comment=\ + purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.141 list=windowsupdateslist +add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=storesdk.xbetservices.akadns.net. comment=\ + storesdk.dsx.mp.microsoft.com list=windowsupdateslist +add address=e16646.g.akamaiedge.net. comment=\ + storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ + software-download.microsoft.com list=windowsupdateslist +add address=download.prss.microsoft.com.akamaized.net. comment=\ + software-download.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +add address=87.250.250.50 comment=YandexDisk list=NoVdsina +add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ + purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ + purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ + cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=a1996.dscd.akamai.net. comment=\ + wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.sls.update.microsoft.com list=windowsupdateslist +add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ + star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ + paymentinstruments.mp.microsoft.com list=windowsupdateslist +add address=10.30.30.33 comment=amster-nuc disabled=yes list=NoWG +add address=10.30.30.11 comment=MikroNUC list=NoWG +add address=89.110.101.17 comment=!!!VDSINA!!!! list=NoWG +add address=89.110.101.17 list=VPN-Server +add address=80.85.244.9 list=TRUSTED +add address=8.8.8.8 list=TRUSTED +add address=8.8.4.4 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=10.30.30.95 comment=NUC list=NoWG +add address=glb.tas02.cws-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.cws.update.microsoft.com list=windowsupdateslist +add address=glb.cwsapp.prod.dcat.dsp.trafficmanager.net. comment=\ + glb.tas01.cwsapp-prod.dcat.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas01.cwsapp-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas01.cwsapp.update.microsoft.com list=windowsupdateslist +add address=disc601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + disc601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +/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 +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 +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,2222 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=5d chain=input comment="block honeypot NTP" \ + connection-state=new dst-port=123 in-interface="ether1 - Unet" protocol=\ + udp src-address=!10.30.30.0/24 +add action=accept chain=input comment=\ + "accept NTP clients on local area network" dst-port=123 in-interface=\ + Bridge-LAN in-interface-list=LAN protocol=udp +add action=accept chain=input comment="accept WireGuard" dst-port=13231 \ + in-interface="ether1 - Unet" protocol=udp src-address-list=VPN-Server +add action=accept chain=input disabled=yes dst-port=443 in-interface=\ + "ether1 - Unet" protocol=tcp +add action=accept chain=output disabled=yes protocol=tcp src-port=443 +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=fasttrack-connection chain=forward comment="defconf: fasttrack" \ + connection-state=established,related,new disabled=yes routing-mark=\ + !To-VPN +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid +add action=accept chain=input comment="defconf: accept ICMP" disabled=yes \ + protocol=icmp +add action=accept chain=input comment=\ + "defconf: accept to local loopback (for CAPsMAN)" disabled=yes \ + dst-address=127.0.0.1 +add action=accept chain=output disabled=yes src-address=127.0.0.1 +add action=accept chain=forward comment="defconf: accept in ipsec policy" \ + ipsec-policy=in,ipsec +add action=accept chain=forward comment="defconf: accept out ipsec policy" \ + 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 disabled=yes +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + connection-state=new in-interface="ether1 - Unet" +add action=accept chain=input connection-state=established disabled=yes +add action=accept chain=input connection-state=related disabled=yes +add action=drop chain=input disabled=yes in-interface-list=!LAN +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=fasttrack-connection chain=forward comment=\ + "FastTrack main traffic" connection-state=established,related disabled=\ + yes +/ip firewall mangle +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" in-interface=WG \ + log-prefix=Mark-VPN-FT new-connection-mark=VPN_No_FastTrack +add action=mark-routing chain=prerouting comment="Test sites" disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=Test new-routing-mark=To-VPN \ + passthrough=no src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=Instagram dst-address=\ + !10.30.30.0/24 dst-address-list=Instagram new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=Twitter dst-address=\ + !10.30.30.0/24 dst-address-list=Twitter new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=YouTube dst-address=\ + !10.30.30.0/24 dst-address-list=YouTube new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=facebook dst-address=\ + !10.30.30.0/24 dst-address-list=facebook new-routing-mark=To-VPN \ + 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 log-prefix=VPN-all \ + new-routing-mark=To-VPN src-address=10.30.30.0/24 src-address-list=!NoWG +add action=change-mss chain=forward comment="MSS on WG" new-mss=1380 \ + out-interface=WG protocol=tcp tcp-flags=syn tcp-mss=1381-65535 +add action=mark-routing chain=prerouting comment="VPN Network" dst-address=\ + 10.8.0.0/24 dst-address-list=!NoVdsina log=yes log-prefix=VPN-Net \ + new-routing-mark=To-VPN src-address=10.30.30.0/24 src-address-list=!NoWG +/ip firewall nat +add action=redirect chain=dstnat comment=\ + "FORCE DNS TO LOCAL MIKROTIK DNS SERVER" dst-port=53 protocol=tcp \ + src-address=10.30.30.0/24 to-ports=53 +add action=redirect chain=dstnat dst-port=53 protocol=udp src-address=\ + 10.30.30.0/24 to-ports=53 +add action=masquerade chain=srcnat comment="masquerade Default" ipsec-policy=\ + out,none out-interface="ether1 - Unet" routing-mark=!To-VPN +add action=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ + in-interface=Bridge-LAN log-prefix=WG-nat out-interface=WG routing-mark=\ + To-VPN +add action=dst-nat chain=dstnat comment=npm disabled=yes dst-port=81 \ + in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 \ + to-ports=81 +add action=dst-nat chain=dstnat comment=amster.vados.ruhttps disabled=yes \ + dst-port=443 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=443 +add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ + disabled=yes dst-port=80 in-interface="ether1 - Unet" protocol=tcp \ + to-addresses=10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat disabled=yes 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="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 +add action=dst-nat chain=dstnat dst-address=146.120.64.211 dst-port=32000 \ + in-interface="ether1 - Unet" protocol=tcp to-addresses=10.30.30.95 \ + to-ports=32000 +add action=dst-nat chain=dstnat dst-address=146.120.64.211 dst-port=32000 \ + in-interface="ether1 - Unet" protocol=udp to-addresses=10.30.30.95 \ + to-ports=32000 +add action=dst-nat chain=dstnat dst-port=32000 protocol=tcp routing-mark=\ + To-VPN to-addresses=10.30.30.95 to-ports=32000 +add action=dst-nat chain=dstnat dst-port=32000 protocol=udp routing-mark=\ + To-VPN to-addresses=10.30.30.95 to-ports=32000 +/ip firewall raw +add action=drop chain=prerouting comment="Drop Honeypot Hackers" \ + in-interface="ether1 - Unet" src-address-list="Honeypot Hacker" +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=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=vk.com \ + content=vk.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=ok.ru content=\ + ok.ru +add action=add-dst-to-address-list address-list=Instagram \ + address-list-timeout=none-dynamic chain=prerouting comment=Instagram \ + content=instagram.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting comment=Twitter content=twimg.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting content=x.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting content=twitter.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment=YouTube content=youtube.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googleapis.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=ggpht.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=youtu.be +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=ytimg.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googlevideo.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=gstatic.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googleusercontent.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=nhacmp3youtube.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ + content=rutube.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=me.com \ + content=me.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=icloud.com \ + content=icloud.com +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting comment=facebook \ + content=fbcd.net +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting content=facebook.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=comp-lenta.ru \ + content=comp-lenta.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + smtp.mail.me.com content=smtp.mail.me.com log=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=gov.ru \ + content=gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + r78.fssp.gov.ru content=r78.fssp.gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=api.db-ip.com \ + content=api.db-ip.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + api.telegram.org content=api.telegram.org +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set irc disabled=no +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip hotspot walled-garden +add server=*1 +/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 disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=WG routing-table=\ + To-VPN scope=30 target-scope=10 +add disabled=yes distance=2 dst-address=0.0.0.0/0 gateway=146.120.64.209 \ + routing-table=main scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api address=10.30.30.0/24 disabled=yes +set api-ssl address=10.30.30.0/24 +set www-ssl port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=Bridge-LAN type=internal +add interface="ether1 - Unet" type=external +/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=add-src-to-address-list address-list=bad_ipv6 \ + address-list-timeout=none-dynamic chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked in-interface=WG in-interface-list=WAN \ + src-address-list="" +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 +/ppp secret +add local-address=192.168.60.1 name=vados remote-address=192.168.60.2 \ + service=l2tp +/routing bfd configuration +add disabled=no +/snmp +set contact=@AmsterNL enabled=yes engine-id-suffix=MikroMaster location=NL \ + src-address=10.30.30.81 trap-interfaces=Bridge-LAN,WG trap-target=\ + 10.30.30.10 +/system clock +set time-zone-autodetect=no 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 scheduler +add comment="Windows Update script" interval=2d5m name=WU-script-run-schedule \ + on-event=WU-add-to-list policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2014-02-11 start-time=00:00:00 +add comment="Backup Every Week" disabled=yes interval=1w name=BackupEveryWeek \ + on-event=BackupAndUpdate policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2025-07-07 start-time=03:41:27 +add comment="DoH Cache Flush" interval=1d name="DNS Cache Flush" on-event=\ + DNS_Flush_Cache policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2019-12-06 start-time=05:30:00 +add comment="Create mkdir function on startup" name=\ + create_mkdir_function_on_startup on-event=\ + "/system script run create_mkdir_function;" policy=read,write,policy,test \ + start-time=startup +add comment="Scheduler for Update Certificates CloudFlare Quad9" interval=1w \ + name="Update Certificates CloudFlare Quad9" on-event=\ + "/system/script { run Update-Certificates; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2025-11-28 start-time=05:45:40 +add comment="Setup Global Environment for scripts" 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="Every Day Check For Fake Bridges" 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="Every Day Check For Renew Certificates" interval=1d name=\ + AM-CheckCerts on-event="/system/script/run AM-CheckCerts;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Auto-update Cloudflare Root CA for DoH" interval=2w name=\ + AM-DOHCert on-event="/import AM-DOHCert.rsc" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-04-15 start-time=03:00:00 +/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 comment="doh, doh-url=https://security.cloudflare-dns.com/dns-query, notif\ + y, name=CloudFlare-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 \ + http-codes="" test-script="" type=simple 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="" \ + port=443 test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=Google-DNS IPv4" disabled=yes \ + down-script="" host=8.8.8.8 http-codes="" test-script="" type=simple \ + up-script="" +add comment="doh-fallback, doh-url=https://dns.google/dns-query, doh-cert=GTS \ + Root R1, notify, name=Google-DOH IPv4" disabled=yes down-script="" host=\ + 8.8.4.4 http-codes="" test-script="" type=simple up-script="" +add comment="dns, notify, name=Cuad9-DOH IPv4" disabled=yes down-script="" \ + host=9.9.9.9 http-codes="" test-script="" type=simple up-script="" +add comment="doh-fallback, doh-url=https://dns.quad9.net/dns-query, name=Cuad9\ + -DOH IPv4" disabled=yes down-script="" host=149.112.112.112 http-codes="" \ + test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ + down-script="" host=91.192.189.2 http-codes="" test-script="" type=simple \ + up-script="" +/tool sniffer +set filter-interface=Bridge-LAN filter-src-ip-address=10.30.30.50/32 +/user aaa +set accounting=no diff --git a/MikroMaster/history/20260430/20260430132002-Diff-Config.rsc b/MikroMaster/history/20260430/20260430132002-Diff-Config.rsc new file mode 100644 index 0000000..7f2bc4d --- /dev/null +++ b/MikroMaster/history/20260430/20260430132002-Diff-Config.rsc @@ -0,0 +1,1112 @@ +512,513c512 +< add comment="Script for setup routeros script system" \ +< dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +--- +> add dont-require-permissions=no name=AM-setup owner=vados policy=\ +515,517c514,515 +< !rsc by Vados\r\ +< \n# RouterOS script: AM-setup\r\ +< \n# Script comment: Script for setup routeros script system\r\ +--- +> \_RouterOS Setup Script: AM-setup\r\ +> \n# \r\ +523,525c521,522 +< \n#\r\ +< \n# :local ScriptName [ :jobname ];\r\ +< \n# Additional commands:\r\ +--- +> \n\r\ +> \n## Additional commands:\r\ +528,535c525,532 +< \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#:if ([ :len [ /system/script/find where name=\$ScriptName ]] = 0 ) do={\ +> \r\ +> \n# :local ScriptName [ :jobname ];\r\ +> \n# :global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +> \n# /system/script/add name=\$ScriptName owner=\$ScriptName source=([ /too\ +> l/fetch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptNa\ +> me . \".rsc\") output=user as-value ]->\"data\");\r\ +> \n#}\r\ +537,539c534,536 +< \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# /system/script/add name=AM-setup owner=AM-Setup source=([ /tool/fetch \ +> check-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" ou\ +> tput=user as-value ]->\"data\");\r\ +540a538,540 +> \n# /system/script/set source=[ :tocrlf [ get \$ScriptName source ] ] \$Sc\ +> riptName;\r\ +> \n:local ScriptName [ :jobname ];\r\ +542,554c542 +< \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:local RemoveThisScript false;\r\ +556,561c544 +< \n# /import verbose=no \$ScriptName\r\ +< \n:global SetupScript [ :jobname ];\r\ +< \n:global RemoveMe;\r\ +< \n:global RunOnce;\r\ +< \n:global InitSetup true;\r\ +< \n:global tmpfs true;\r\ +--- +> \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +564,565c547,548 +< \n :local RmMe [:tobool \$1];\r\ +< \n\r\ +--- +> \n :local ScriptName;\r\ +> \n :local RemoveThisScript;\r\ +567,571c550 +< \n :global SetupScript;\r\ +< \n :global RemoveMe;\r\ +< \n :global InitSetup;\r\ +< \n :global tmpfs;\r\ +< \n \r\ +--- +> \n :local AllDone;\r\ +577,585d555 +< \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\ +594c564 +< \n \r\ +--- +> \n:log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ +605,671d574 +< \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\ +683,685d585 +< \n \r\ +< \n /system/script run \$Script;\r\ +< \n :delay 2s;\r\ +695,713c595,649 +< \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.\";\ +--- +> \n :put \"Add Schedulers...\";\r\ +> \n :delay 1;\r\ +> \n :put \"Add Global scheduler...\";\r\ +> \n :local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFu\ +> nc; }\";\r\ +> \n :local Comment \"Setup Global Environment for scripts\";\r\ +> \n :if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] \ +> ] = 0) do={\r\ +> \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-\ +> event=\$OnEvent start-time=startup;\r\ +> \n }\r\ +> \n :if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Commen\ +> t) do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ +> \n }\r\ +> \n :if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEve\ +> nt) do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ +> \n }\r\ +> \n :delay 1;\r\ +> \n :put \"Add 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-ScriptInstallUpda\ +> te\" ] ] = 0) do={\r\ +> \n /system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Commen\ +> t start-time=startup interval=1d on-event=\$OnEvent;\r\ +> \n }\r\ +> \n\r\ +> \n :delay 1;\r\ +> \n :put \"Loading configuration and functions...\";\r\ +> \n :do { \r\ +> \n /system/script { run AM-GlobalConfig; run AM-GlobalFunc; };\r\ +> \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ +> \n :set AllDone true;\r\ +> \n } on-error={\r\ +> \n :set AllDone false;\r\ +> \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ +> \n :log error (\$ScriptName . \$ErrorMsg . :error);\r\ +> \n :error \$ErrorMsg;\r\ +> \n }\r\ +> \n\r\ +> \n :delay 5s;\r\ +> \n :if (\$AllDone = true && \$RemoveThisScript = true) do={\r\ +> \n :put \"Add Scheduler for remove this script...\";\r\ +> \n :set OnEvent \":delay 30s; /system/script/remove [ find where name=\$S\ +> criptName ]; :delay5s; /system/scheduler/remove [ find where name=\\\"_Rem\ +> oveSetup\\\" ];\";\r\ +> \n :set Comment \"_RemoveSetup tmp scheduler for remove setup script.\";\ +> \r\ +> \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-ti\ +> me=startup interval=30s on-event=\$OnEvent;\r\ +> \n :log warning (\$ScriptName . \"\\nI've done everything, and now I'm ti\ +> red... I'm leaving. ))\\nThere will be an error below, this is normal.\");\ +715,723c651,652 +< \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 }\r\ +> \n};\r\ +3458,3459c3387 +< add comment="Update and Backup send notification to EMail" \ +< dont-require-permissions=no name=AM-Backup-UpdateEmail owner=\ +--- +> add dont-require-permissions=no name=AM-Backup-UpdateEmail owner=\ +3461,4300c3389,3390 +< 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# 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:global LogPrint;\r\ +< \n:global EditSchedulers;\r\ +< \n:global OSUpdateMode;\r\ +< \n\r\ +< \n:local SchedComment \"Every 7 Day Check For Update and Backup send notif\ +< ication to EMail.\";\r\ +< \n:local SchedInterval \"7d 00:00:00\";\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 - Comment (optional, default: \"Scheduler for script: \")\ +< \_[**]\r\ +< \n# 3. \$3 - Interval (e.g. \"1d 00:00:00\" (default is \"1d\")) [**]\r\ +< \n# 4. \$4 - On Event command (e.g. \"/system/script { run ; }\" (de\ +< fault is \"/system/script { run \$SchedName; }\")) [**]\r\ +< \n# 5. \$5 - Policy (e.g. \"ftp,reboot,read,write,policy,test,password,sni\ +< ff,sensitive,romon\" (default is the same)) [**]\r\ +< \n# 6. \$6 - Start Date (e.g. \"jan/01/1970\", default is current date) [*\ +< *]\r\ +< \n# 7. \$7 - Start Time (e.g. \"03:41:27\", default is current time) [**]\ +< \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={ \$LogPrint error\ +< \_\$ScriptName (\"Failed to add/modify shceduler for \" . \$ScriptName . \ +< \"!\") }\r\ +< \n# :if ([ \$EditSchedulers \"my-script\" \"My custom comment\" \"2d 00:00\ +< :00\" \"/system/script { run my-script; }\" \"ftp,reboot,read,write,policy\ +< ,test,password,sniff,sensitive,romon\" \"jan/01/2025\" \"03:41:27\" ] = fa\ +< lse) do={ \$LogPrint error \$ScriptName (\"Failed to add/modify shceduler \ +< for \" . \$ScriptName . \"!\") }\r\ +< \n\r\ +< \n:set EditSchedulers do={\r\ +< \n :global LogPrint;\r\ +< \n :local SchedName [ :tostr \$1 ];\r\ +< \n :local Comment [ :tostr \$2 ];\r\ +< \n :if ([ :len \$Comment ] = 0) do={:set Comment \"Scheduler for script: \ +< \$SchedName\"};\r\ +< \n :local Interval [ :tostr \$3 ];\r\ +< \n :if ([ :len \$Interval ] = 0) do={:set Interval \"1d\"};\r\ +< \n :local OnEvent [ :tostr \$4 ];\r\ +< \n :if ([ :len \$OnEvent ] > 0) do={:set OnEvent \"/system/script { run \ +< \$SchedName; }\"};\r\ +< \n :local Policy [ :tostr \$5 ];\r\ +< \n :if ([ :len \$Policy ] = 0) do={:set Policy \"ftp,reboot,read,write,po\ +< licy,test,password,sniff,sensitive,romon\"};\r\ +< \n :local StartDate [ :tostr \$6 ];\r\ +< \n :if ([ :len \$StartDate ] = 0) do={:set StartDate [get date]};\r\ +< \n :local StartTime [ :tostr \$7 ];\r\ +< \n :if ([ :len \$StartTime ] = 0) do={:set StartTime [get time]};\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 \$LogPrint 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={\$LogPrint error \$0 (\"Removing directory '\" . \$DirName . \"'\ +< \_failed: \" . \$Err); :return false};\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:if ([ \$EditSchedulers \$ScriptName \$SchedComment \$SchedInterval ] = \ +< false) do={\r\ +< \n \$LogPrint error \$ScriptName (\"Failed to add/modify shceduler for \"\ +< \_. \$ScriptName . \"!\");\r\ +< \n :set ExitOK false;\r\ +< \n :error true;\r\ +< \n}\r\ +< \n\r\ +< \n\r\ +< \n# Add global Function OSUpdateMode\r\ +< \n:if ([ :len \$OSUpdateMode ] = 0 || ![\$OSUpdateMode]) do={\r\ +< \n :set OSUpdateMode do={\r\ +< \n :local NewMode [ :tostr \$1 ];\r\ +< \n :global BackupAndUpdateMode;\r\ +< \n :global LogPrint;\r\ +< \n :global OldMode [ :tostr \$BackupAndUpdateMode ];\r\ +< \n :if ([ \$NewMode ] != false && \$NewMode != \$OldMode && \$NewMode =\ +< \_\"updateOnce\") do={\r\ +< \n :set BackupAndUpdateMode \$NewMode;\r\ +< \n \$LogPrint warning \$0 (\"/nOk. /\$OsUpdateMode = \" . \$NewMode .\ +< \_\".\\nYou're a good boy! ))\\nI'm launching the update in 5 seconds.\");\ +< \r\ +< \n :delay 5;\r\ +< \n /system/script { run AM-Backup-UpdateEmail; };\r\ +< \n } else={\r\ +< \n \$LogPrint warning \$0 (\"/nFunction /\$OsUpdateMode is \" . \$NewMo\ +< de . \" but is may be only \\\"updateOnce\\\" value!\");\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :error false;\r\ +< \n };\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.02.12\"\r\ +< \n\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) \\nhttps://github.com/beeyev/Mikrotik-RouterOS-auto\ +< matic-backup-and-update\";\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: \$R\ +< OsVerAvail\");\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\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## IP address detection\r\ +< \n :global DevInfoIncludeIP;\r\ +< \n :if ([\$DevInfoIncludeIP] = true) do={\r\ +< \n :global GetPubIp;\r\ +< \n :local PublicIpAddress \$GetPubIp;\r\ +< \n :set mailBodyDeviceInfo (\$mailBodyDeviceInfo . \"\\nPublic IP addre\ +< ss: \" . \$PublicIpAddress . \".\");\r\ +< \n :log info (\"\$SMP Public IP address detected: \" . \$PublicIpAddres\ +< s);\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 # 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# /system/script/environment remove [find name=\"buGlobalVarTar\ +< getOsVersion\"];\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# #/system/script/environment remove [find name=\"OldMode\"];\ +< \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\ +--- +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\ +> "#!rsc by Vados\ -- 2.52.0

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