From 15c67ed0da24244e37f4741c5653f963761e6e6c Mon Sep 17 00:00:00 2001 From: vados-dev Date: Mon, 4 May 2026 08:40:27 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at May 04 08:40:27. --- .../20260504/20260504084001-Binary.backup | Bin 0 -> 253465 bytes .../20260504/20260504084001-Config.rsc | 4044 +++++++++++++++++ .../20260504/20260504084001-Diff-Config.rsc | 2433 ++++++++++ 3 files changed, 6477 insertions(+) create mode 100644 MikroMaster/20260504/20260504084001-Binary.backup create mode 100644 MikroMaster/20260504/20260504084001-Config.rsc create mode 100644 MikroMaster/history/20260504/20260504084001-Diff-Config.rsc diff --git a/MikroMaster/20260504/20260504084001-Binary.backup b/MikroMaster/20260504/20260504084001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..90c1170b01f1395a1bc95eaefd6eabd6d99386d6 GIT binary patch literal 253465 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

|#}P{uWml4SB4e0b90O~8 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≥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 @8K1`NQa4N|pc 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�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 literal 0 HcmV?d00001 diff --git a/MikroMaster/20260504/20260504084001-Config.rsc b/MikroMaster/20260504/20260504084001-Config.rsc new file mode 100644 index 0000000..55411cc --- /dev/null +++ b/MikroMaster/20260504/20260504084001-Config.rsc @@ -0,0 +1,4044 @@ +# 2026-05-04 08:40:02 by RouterOS 7.22.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/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 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 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 ssid=vados5g +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" mac-address=\ + 48:8F:5A:8E:1A:C2 name="ether1 - Unet" +set [ find default-name=ether3 ] comment=LEN +set [ find default-name=ether4 ] comment=NUC +set [ find default-name=ether5 ] poe-out=off +/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 wireguard +add listen-port=13231 mtu=1280 name=WG +/disk +add slot=tmpfs tmpfs-max-size=22369621 type=tmpfs +/interface list +add name=WAN +add 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 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=5G-AX disabled=no mode=ap name=5G-AX security=sec5G security.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 ] supplicant-identity=MikroTik +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +/ip dns forwarders +add 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 +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/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 +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + /tool/fetch mode=https url=(\$GlobalScriptsUrl . #\".bak/mikro_bak_rsa@10.\ + 30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n#:local Script AM-setup\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n#\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n#\ + \n#root.mnuc.backuper\ + \n\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\ + \n#:local Script AM-GlobalConfig;\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n:global MkDir;\ + \n\ + \n:local FetchFile Binary.backup\ + \n:local localDir \"\";\ + \n\ + \n#\$MkDir \$localDir;\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);" +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 comment="Certificates CloudFlare, Quad9 " dont-require-permissions=no \ + name=Update-Certificates owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_CloudFlare\r\ + \n#/tool/fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalR\ + ootCA.crt.pem;\r\ + \n#/certificate/import file-name=DigiCertGlobalRootCA.crt.pem passphrase=\ + \"\";\r\ + \n#/tool/ fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobal\ + G2TLSRSASHA2562020CA1-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/DigiCertGloba\ + lG3TLSECCSHA3842020CA1-1.crt.pem\"\r\ + \n#/certificate/import file-name=DigiCertGlobalG3TLSECCSHA3842020CA1-1.crt\ + .pem passphrase=\"\";\r\ + \n\r\ + \n:global GlobalScriptsUrl;\r\ + \n#google\r\ + \n:local CertName \"DigiCert-Global-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-CA\" [ find where common-na\ + me=\"DigiCert Global Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-CA\" [ find where commo\ + n-name=\"DigiCert Assured ID Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G2\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G3\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G2 TLS RSA SHA256 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G3 TLS ECC SHA384 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G2\" [ find where common-na\ + me=\"DigiCert Global Root G2\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G3\" [ find where common-na\ + me=\"DigiCert Global Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-ECC-P384-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-ECC-P384-Root-G5\" [ find where com\ + mon-name=\"DigiCert TLS ECC P384 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-RSA4096-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-RSA4096-Root-G5\" [ find where comm\ + on-name=\"DigiCert TLS RSA4096 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Trusted-Root-G4.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Trusted-Root-G4\" [ find where common-n\ + ame=\"DigiCert Trusted Root G4\" ];\r\ + \n\r\ + \n:set CertName \"GTS-Root-R4.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"GTS-Root-R4\" [ find where common-name=\"GTS Roo\ + t R4\" ];\r\ + \n\r\ + \n:set CertName \"Go-Daddy-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Go-Daddy-Root-Certificate-Authority-G2\" [ find \ + where common-name=\"Go Daddy Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"ISRG-Root-X1.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"ISRG-Root-X1\" [ find where common-name=\"ISRG R\ + oot X1\" ];\r\ + \n\r\ + \n:set CertName \"Root-YE.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Root-YE\" [ find where common-name=\"Root YE\" ]\ + ;\r\ + \n\r\ + \n:set CertName \"Starfield-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Starfield-Root-Certificate-Authority-G2\" [ find\ + \_where common-name=\"Starfield Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"USERTrust-RSA-Certification-Authority.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"USERTrust-RSA-Certification-Authority\" [ find w\ + here common-name=\"USERTrust RSA Certification Authority\" ];\r\ + \n\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\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#/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\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 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 false;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local 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 ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n } else={\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ + \_\\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/ipall/\" . \$CertFileN\ + ame) dst-path=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :delay 1s;\r\ + \n };\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=AM-GlobalConfig owner=AM-GlobalConfig \ + 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 Identity [ /system identity get name ];\ + \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/\" . \$Identity . \"/\ + \");\ + \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 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\ + \n# RouterOS script: AM-GglobalFunc\ + \n# Script comment: Global functions\ + \n# Copyright (c) 2005-2026 Vados \ + \n#\ + \n#\ + \n# requires RouterOS, version=7.19\ + \n# requires device-mode, fetch, scheduler\ + \n:local ExitOK false;\ + \n:local ScriptName [ :jobname ];\ + \n#:global checkRunJob \$SriptName;\ + \n#:global fixCRLF;\ + \n#:if (\$fixCRLF != false) do={\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\ + \n#}\ + \n:global GlobalFuncReady false;\ + \n\ + \n# Git commit id & info, expected configuration version\ + \n:global CommitId \"main/528/a6273d14\";\ + \n:global CommitTAG \"unknown\";\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 08:20:02 04.05.2026.\";\ + \n\ + \n# The variables are received right here.\ + \n:global GlobalConfVersion 138;\ + \n\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\ + \n\ + \n:global Identity [/system/identity/get name];\ + \n:global IdentityShort [:pick \$Identity 0 18];\ + \n\ + \n:global devBoardName [/system/resource/get board-name];\ + \n:global devMode [/system/device-mode/get mode];\ + \n:global devCurArch [/system/resource/get architecture-name];\ + \n:global devCurVersion [/system/resource/get version];\ + \n\ + \n# Variables defined in AM-GlobalConfig.rsc\ + \n:global TerminalColorOutput;\ + \n:global CommentsInScripts;\ + \n:global DetectIpAddrDefault;\ + \n:global DetectIpAddrFallback;\ + \n:global updateChannel;\ + \n:global Domain;\ + \n:global EmailGeneralTo;\ + \n:global BackupAndUpdateMode;\ + \n\ + \n# Single functions, without nested functions.\ + \n:global GlobalEnvRemove;\ + \n:global MiniDateTimeStamp;\ + \n\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\ + \n:global LogPrint;\ + \n\ + \n# DeviceInfo and Updates\ + \n:global IsCheckUpdates;\ + \n:global WaitCheckUpdates;\ + \n:global GetPubIp;\ + \n\ + \n:global GetArrDeviceInfo;\ + \n:global WaitArrDeviceInfo;\ + \n\ + \n:global devModel;\ + \n:global devRunningMode;\ + \n\ + \n:global devRbRevision;\ + \n:global devRbSerialNumber;\ + \n:global devRbVerAvail;\ + \n\ + \n:global runningChannelVersion;\ + \n:global runningChannel;\ + \n:global runningVersion;\ + \n\ + \n:global devBuildTime;\ + \n:global ROsVerAvail;\ + \n:global PkgUpdStatus;\ + \n:global currentUpdateChannel;\ + \n\ + \n:global ScriptInstallUpdate;\ + \n\ + \n:global DeviceInfo;\ + \n\ + \n:global OldMode;\ + \n\ + \n:global ParseKeyValueStore;\ + \n:global RandomDelay;\ + \n:global GetRandomNumber;\ + \n:global EscapeForRegEx;\ + \n:global ExitError;\ + \n:global ExitOnError;\ + \n:global CharacterMultiply;\ + \n:global CharacterReplace;\ + \n:global CleanFilePath;\ + \n:global CleanName;\ + \n\ + \n:global CommitBrief;\ + \n\ + \n:global EitherOr;\ + \n:global FormatLine;\ + \n:global GetRandom20CharAlNum;\ + \n:global Grep;\ + \n:global IfThenElse;\ + \n:global MAX;\ + \n:global MIN;\ + \n:global HumanReadableNum;\ + \n\ + \n:global IsFullyConnected;\ + \n:global IsDNSResolving;\ + \n:global IsTimeSync;\ + \n:global IsTimeSyncCached;\ + \n:global IsTimeSyncResetNtp;\ + \n\ + \n:global WaitDNSResolving;\ + \n:global WaitFullyConnected;\ + \n:global WaitTimeSync;\ + \n:global MkDir;\ + \n:global RmDir;\ + \n:global RmFile;\ + \n:global FileGet;\ + \n:global Unix2Dos;\ + \n:global UrlEncode;\ + \n:global WaitForFile;\ + \n:global ScriptLock;\ + \n:global SendTelegram;\ + \n:global NotificationFunctions;\ + \n:global SendNotification;\ + \n:global SendNotification2;\ + \n:global SymbolForNotification;\ + \n:global SymbolByUnicodeName;\ + \n:global ValidateSyntax;\ + \n:global CheckSumsVerify;\ + \n:global GlobalConfChanges;\ + \n:global GlobalConfMigration;\ + \n:global VersionToNum;\ + \n:global RequiredRouterOS;\ + \n:global FetchLargeFiles;\ + \n:global FetchHuge;\ + \n:global FetchUserAgentStr;\ + \n:global CertificateAvailable;\ + \n:global CertificateDownload;\ + \n:global CertificateNameByCN;\ + \n:global CharacterMultiply;\ + \n\ + \n:global InspectVar;\ + \n:global InspectVarRet;\ + \n:global ParseCustom;\ + \n\ + \n:set IsCheckUpdates do={\ + \n :local isInfo [:tobool \$1];\ + \n :global LogPrint;\ + \n :global updateChannel;\ + \n :global PkgUpdStatus;\ + \n :global currentUpdateChannel;\ + \n :global ROsVerAvail;\ + \n :global arrDeviceInfo;\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \ + \n :local CurrentChannel [ /system/package/update/get channel ];\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \n }\ + \n\ + \n :local Update [ /system/package/update/get ];\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\ + \n :set currentUpdateChannel \$Channel;\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\ + \n\ + \n\ + \n :local StatusPkg \"undefined\";\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\ + \n delay=300ms max=5 on-error={};\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ + \n }\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\ + \n :return true;\ + \n } else={\ + \n :return \$PkgUpdStatus;\ + \n }\ + \n}\ + \n\ + \n:set WaitCheckUpdates do={\ + \n :global IsCheckUpdates;\ + \n :global PkgUpdStatus;\ + \n :global currentUpdateChannel;\ + \n :global ROsVerAvail;\ + \n :global arrDeviceInfo;\ + \n\ + \n :local Status \"\";\ + \n :local Update;\ + \n :local WaitCount 0;\ + \n\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\ + \n :return false;\ + \n }\ + \n\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\ + \n :delay 1s;\ + \n :set WaitCount (\$WaitCount + 1);\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\ + \n }\ + \n\ + \n :set Update [ /system/package/update/get ];\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\ + \n :set PkgUpdStatus true;\ + \n } else={\ + \n :set PkgUpdStatus false;\ + \n }\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ + \n }\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\ + \n\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\ + \n :return false;\ + \n }\ + \n :return true;\ + \n}\ + \n\ + \n:set WaitArrDeviceInfo do={\ + \n :global GetArrDeviceInfo;\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\ + \n :delay 1s;\ + \n }\ + \n}\ + \n\ + \n:set GetArrDeviceInfo do={\ + \n :global LogPrint;\ + \n :global arrDeviceInfo;\ + \n\ + \n :global devBoardName;\ + \n :global devModel;\ + \n :global devRunning;\ + \n :global devCurArch;\ + \n :global devRbRevision;\ + \n :global devRbSerialNumber;\ + \n :global devBuildTime;\ + \n :global runningChannelVersion;\ + \n :global runningChannel;\ + \n :global runningVersion;\ + \n :global currentUpdateChannel;\ + \n :global ROsVerAvail;\ + \n\ + \n :local DeviceInfo;\ + \n :local Resource [/system/resource/get];\ + \n :local Update [ /system/package/update/get ];\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\ + \n :local RouterBoard;\ + \n :local IsRouterBoard false;\ + \n :local RunningMode \"\";\ + \n\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\ + \n :set runningChannelVersion \$VersionString;\ + \n :set runningVersion \$VersionString;\ + \n :set runningChannel \"\";\ + \n\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\ + \n }\ + \n }\ + \n\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\ + \n :do {\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\ + \n# :set RouterBoard [ /system/routerboard/get ];\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\ + \n :set IsRouterBoard true;\ + \n }\ + \n } on-error={}\ + \n }\ + \n\ + \n :do {\ + \n :set RunningMode [ /system/device-mode/get mode ];\ + \n } on-error={\ + \n :do {\ + \n :set RunningMode [ /system/device-mode/get running ];\ + \n } on-error={\ + \n :set RunningMode \"\";\ + \n }\ + \n }\ + \n :set devRunning \$RunningMode;\ + \n\ + \n :if (\$IsRouterBoard = true) do={\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\ + \n } else={\ + \n :set devModel \$devBoardName;\ + \n :set devRbRevision \"\";\ + \n :set devRbSerialNumber \"\";\ + \n }\ + \n\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ + \n\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\ + \n\ + \n :set arrDeviceInfo \$DeviceInfo;\ + \n :return \$DeviceInfo;\ + \n}\ + \n\ + \n:set DeviceInfo do={\ + \n :global GetArrDeviceInfo;\ + \n :global GlobalConfVersion;\ + \n :global Identity;\ + \n :global IfThenElse;\ + \n :global FormatLine;\ + \n :global CommitBrief;\ + \n\ + \n :local License [/system/license/get];\ + \n :local Snmp [ /snmp/get ];\ + \n :local Info [ \$GetArrDeviceInfo ];\ + \n\ + \n :if ([ :typeof \$Info ] != \"array\") do={\ + \n :return false;\ + \n }\ + \n\ + \n :return ( \\\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\ + \n \"Hardware:\\n\" . \\\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\ + \n \"RouterOS:\\n\" . \\\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\ + \n \"RouterOS-Scripts:\\n\" . \\\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\ + \n}\ + \n\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\ + \n:set GetRandom20CharAlNum do={\ + \n :global EitherOr;\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ + \n}\ + \n\ + \n:global checkRunJob;\ + \n:set checkRunJob do={\ + \n :local Script [ :tostr \$1 ];\ + \n :global ScriptLock; \ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \ + \n}\ + \n\ + \n:set InspectVar do={\ + \n :global InspectVarRet;\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\ + \n}\ + \n\ + \n:set CommitBrief do={\ + \n :global CommitId;\ + \n :global CommitInfo;\ + \n :if (\$CommitId = \"unknown\") do={\ + \n :return \"unknown\";\ + \n }\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\ + \n}\ + \n\ + \n:set InspectVarRet do={\ + \n :local Input \$1;\ + \n :local Level (0 + [ :tonum \$2 ]);\ + \n :global CharacterReplace;\ + \n :global IfThenElse;\ + \n :global InspectVarRet;\ + \n :local IndentReturn do={\ + \n :local Prefix [ :tostr \$1 ];\ + \n :local Value [ :tostr \$2 ];\ + \n :local Level [ :tonum \$3 ];\ + \n :global CharacterMultiply;\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\ + \n }\ + \n :local TypeOf [ :typeof \$Input ];\ + \n :local Len [ :len \$Input ];\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\ + \n :if (\$TypeOf = \"array\") do={\ + \n :foreach Key,Value in=\$Input do={\ + \n :set \$Return (\$Return . \"\\n\" . \\\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\ + \n }\ + \n } else={\ + \n :if (\$TypeOf = \"str\") do={\ + \n :set \$Return (\$Return . \"\\n\" . \\\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\ + \n }\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\ + \n }\ + \n }\ + \n :if (\$TypeOf != \"nothing\") do={\ + \n :set \$Return (\$Return . \"\\n\" . \\\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\ + \n }\ + \n }\ + \n :return \$Return;\ + \n}\ + \n\ + \n# !!! The function is not ready !!!\ + \n:global FetchHttpInfo do={\ + \n :local Mac [ :tostr \$1 ];\ + \n :global CertificateAvailable;\ + \n :global IsMacLocallyAdministered;\ + \n :global LogPrint;\ + \n :local Url \"https://api.macvendors.com/\";\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\ + \n :do {\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\ + \n :error false;\ + \n }\ + \n :local Vendor ([ /tool/fetch \ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\ + \n :return \$Vendor;\ + \n } on-error={\ + \n :onerror Err {\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\ + \n :return \"unknown vendor\";\ + \n }\ + \n}\ + \n\ + \n:set GetPubIp do={\ + \n :global DetectIpAddrDefault;\ + \n :global DetectIpAddrFallback;\ + \n\ + \n :local PubIpAddr false;\ + \n :local Url \$DetectIpAddrDefault;\ + \n :local JobName [ :jobname ];\ + \n\ + \n :do {\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\ + \n } on-error={\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\ + \n :set Url \$DetectIpAddrFallBack;\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\ + \n };\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\ + \n :return \$PubIpAddr;\ + \n}\ + \n\ + \n:set FormatLine do={\ + \n :local Key [ :tostr \$1 ];\ + \n :local Value [ :tostr \$2 ];\ + \n :local Indent [ :tonum \$3 ];\ + \n :local Spaces;\ + \n :local Return \"\";\ + \n :global CharacterMultiply;\ + \n :global EitherOr;\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set ParseCustom do={\ + \n :local Str [ :tostr \$1 ];\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\ + \n :local End [ :tostr \$3 ];\ + \n :local Num [ :tonum \$4 ];\ + \n :local Return;\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\ + \n :set End [:find \$rest \$End];\ + \n :set Return [:pick \$rest 0 \$End];\ + \n }\ + \n:return \$Return;\ + \n}\ + \n\ + \n:set LogPrint do={\ + \n :local Severity [ :tostr \$1 ];\ + \n :local Name [ :tostr \$2 ];\ + \n :local Message [ :tostr \$3 ];\ + \n :global PrintDebug;\ + \n :global PrintDebugOverride;\ + \n :global EitherOr;\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\ + \n :local PrintSeverity do={\ + \n :global TerminalColorOutput;\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\ + \n}\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\ + \n}\ + \n\ + \n# check and download required certificate\ + \n# Description: This function checks if a certificate with given Common N\ + ame is available in the system or not.\ + \n# If not, it tries to download it from repository. It also \ + checks the certificate chain and downloads missing intermediate certificat\ + es if needed.\ + \n# Arguments: \"Common Name\" - the common name of the certificate to che\ + ck\ + \n# \"fetch\" - if the intended use for certificate is \"fetch\ + \", it will check if the certificate is available for fetch option and ret\ + urn true if it is, otherwise it will check other options as well and retur\ + n true if the certificate is available for at least one of the options.\ + \n# \"tls\" - if the intended use for certificate is \"tls\", i\ + t will check if the certificate is available for tls option and return tru\ + e if it is, otherwise it will check other options as well and return true \ + if the certificate is available for at least one of the options.\ + \n# \"all\" - if the intended use is \"all\", it will check all\ + \_options and return true if the certificate is available for at least one\ + \_of the options.\ + \n# \"undefined\" - if the intended use for certificate is not \ + defined, it will check all options and log a warning as well.\ + \n# Usage: \$CertificateAvailable \"Common Name\" \"intended use for certi\ + ficate (e.g. \"fetch\", \"tls\", \"all\", \"undefined\")\"\ + \n:set CertificateAvailable do={\ + \n :local CommonName [ :tostr \$1 ];\ + \n :local UseFor [ :tostr \$2 ];\ + \n\ + \n :global CertificateDownload;\ + \n :global ParseKeyValueStore;\ + \n\ + \n :if ([ :len \$UseFor ] = 0) do={\ + \n :log warning (\$0 . \"The intended use is undefined!\");\ + \n :set UseFor \"undefined\";\ + \n }\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\ + \n [ /certificate/settings/get crl-download ] = true && \\\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\ + \n \"is configured to download certificate CRLs to system!\");\ + \n }\ + \n :if ([ :len \$CommonName ] = 0) do={\ + \n :log warning (\$0 . \"No CommonName given!\");\ + \n :return false;\ + \n }\ + \n :local CertSettings [ /certificate/settings/get ];\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\ + \n :return true;\ + \n }\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\ + \n :return false;\ + \n }\ + \n }\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\ + \n :return true;\ + \n }\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\ + \n :return false;\ + \n }\ + \n }\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\ + \n }\ + \n :return true;\ + \n}\ + \n\ + \n# download and import certificate\ + \n# Description: This function downloads a certificate with given Common N\ + ame from repository and imports it to the system.\ + \n# It also checks the certificate chain and downloads missin\ + g intermediate certificates if needed from repository.\ + \n# If the certificate is already available, it does nothing.\ + \n# If the certificate is not available in repository, it att\ + empts to download it from mkcert.org.\ + \n# If it is also not available there, it logs a warning and \ + returns false.\ + \n# If the certificate is downloaded but still not available \ + after import, it removes all certificates with the same Common Name and lo\ + gs a warning, assuming the certificate was imported but not named properly\ + .\ + \n# Or if there are multiple certificates with the same Commo\ + n Name, it does nothing as well, assuming the certificate is already impor\ + ted but not named properly.\ + \n# Usage: \$CertificateDownload \"Common Name\"\ + \n:set CertificateDownload do={\ + \n :local CommonName [ :tostr \$1 ];\ + \n :global ScriptUpdatesBaseUrl;\ + \n :global ScriptUpdatesUrlSuffix;\ + \n :global CertificateNameByCN;\ + \n :global CleanName;\ + \n :global FetchUserAgentStr;\ + \n :global RmFile;\ + \n :global WaitForFile;\ + \n\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \n \"CommonName '\" . \$CommonName . \"'.\");\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\ + \n :do {\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\ + \n dst-path=\$FileName as-value;\ + \n \$WaitForFile \$FileName;\ + \n } on-error={\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\ + \n \"' from repository! Trying fallback to mkcert.org...\");\ + \n :do {\ + \n :local CertSettings [ /certificate/settings/get ];\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \n :return false;\ + \n }\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\ + \n dst-path=\$FileName as-value;\ + \n \$WaitForFile \$FileName;\ + \n :if ([ /file/get \$FileName size ] = 0) do={\ + \n \$RmFile \$FileName;\ + \n :error false;\ + \n }\ + \n } on-error={\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\ + \n :return false;\ + \n }\ + \n }\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\ + \n :delay 1s;\ + \n \$RmFile \$FileName;\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\ + \n :return false;\ + \n }\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\ + \n }\ + \n :return true;\ + \n}\ + \n\ + \n# name a certificate by its common-name\ + \n# Description: Some RouterOS functions require certificate name instead \ + of common-name or fingerprint.\ + \n# This function finds a certificate by common-name, fingerp\ + rint or name and sets its name to a clean version of common-name\ + \n# (only letters, numbers and dashes, other chars are replac\ + ed with dash).\ + \n# If there are multiple certificates with the same common-n\ + ame, it will rename the first one found and log a warning.\ + \n# Usage: \$CertificateNameByCN \"Common Name\"\ + \n:set CertificateNameByCN do={\ + \n :local Match [ :tostr \$1 ];\ + \n :global CleanName;\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\ + \n :if ([ :len \$Cert ] = 0) do={\ + \n :log warning (\$0 .\" No matching certificate found.\");\ + \n :return false;\ + \n }\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\ + \n :return true;\ + \n}\ + \n\ + \n:set CharacterMultiply do={\ + \n :local Str [ :tostr \$1 ];\ + \n :local Num [ :tonum \$2 ];\ + \n :if (\$Num = 0) do={:return \"\"}\ + \n :local Return \"\";\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ + \n :return \$Return;\ + \n}\ + \n\ + \n# fetch huge data to file, read in chunks\ + \n:set FetchHuge do={\ + \n :local FetchScript [ :tostr \$1 ];\ + \n :local Url [ :tostr \$2 ];\ + \n :local CheckCert [ :tostr \$3 ];\ + \n\ + \n :global CleanName;\ + \n :global FetchUserAgentStr;\ + \n :global GetRandom20CharAlNum;\ + \n :global IfThenElse;\ + \n :global LogPrint;\ + \n :global MkDir;\ + \n :global RmDir;\ + \n :global RmFile;\ + \n :global WaitForFile;\ + \n\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\ + \n\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$FetchScript ]);\ + \n :if ([ \$MkDir \$DirName ] = false) do={\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\ + \n :return false;\ + \n }\ + \n\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\ + \n :onerror Err {\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\ + \n http-header-field=({ [ \$FetchUserAgentStr \$FetchScript ] }) as-v\ + alue;\ + \n } do={\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ + \n \$RmFile \$FileName;\ + \n }\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\ + \n \$RmDir \$DirName;\ + \n :return false;\ + \n }\ + \n\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\ + \n :return false;\ + \n }\ + \n\ + \n :local FileSize [ /file/get \$FileName size ];\ + \n :local Return \"\";\ + \n :local VarSize 0;\ + \n :while (\$VarSize != \$FileSize) do={\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\ + \n :set FileSize [ /file/get \$FileName size ];\ + \n :set VarSize [ :len \$Return ];\ + \n :if (\$VarSize > \$FileSize) do={\ + \n :delay 100ms;\ + \n }\ + \n }\ + \n \$RmDir \$DirName;\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set FetchUserAgentStr do={\ + \n :local Caller [ :tostr \$1 ];\ + \n\ + \n :global GlobalScriptsUrl;\ + \n :global CommitBrief;\ + \n :global IfThenElse;\ + \n :local Resource [ /system/resource/get ];\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\ + \n}\ + \n\ + \n:set Grep do={\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\ + \n :local Pattern [ :tostr \$2 ];\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\ + \n :do {\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\ + \n } while=([ :len \$Input ] > 0);\ + \n :return [];\ + \n}\ + \n\ + \n:set HumanReadableNum do={\ + \n :local Input [ :tonum \$1 ];\ + \n :local Base [ :tonum \$2 ];\ + \n :global EitherOr;\ + \n :global IfThenElse;\ + \n :local Prefix \"kMGTPE\";\ + \n :local Pow 1;\ + \n :set Base [ \$EitherOr \$Base 1024 ];\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\ + \n :if (\$Input < \$Base) do={:return \$Input}\ + \n :for I from=0 to=[ :len \$Prefix ] do={\ + \n :set Pow (\$Pow * \$Base);\ + \n :if (\$Input / \$Base < \$Pow) do={\ + \n :set Prefix [ :pick \$Prefix \$I ];\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\ + \n :local Tmp2 (\$Tmp1 / 100);\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\ + \n :return (\$Tmp2 . \".\" . \\\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\ + \n \$Prefix . \$Bin);\ + \n }\ + \n }\ + \n}\ + \n\ + \n:set CleanName do={\ + \n :local Input [ :tostr \$1 ];\ + \n :local Return \"\";\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\ + \n :local Char [ :pick \$Input \$I ];\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \ + \n };\ + \n :set Return (\$Return . \$Char)};\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set GetRandomNumber do={\ + \n :global EitherOr;\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \n}\ + \n\ + \n:set RandomDelay do={\ + \n :local Time [ :tonum \$1 ];\ + \n :local Unit [ :tostr \$2 ];\ + \n :global EitherOr;\ + \n :global GetRandomNumber;\ + \n :global MAX;\ + \n :if (\$Time = 0) do={:return false}\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\ + \n}\ + \n\ + \n:set EscapeForRegEx do={\ + \n :local Input [ :tostr \$1 ];\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ + \n :local Return \"\";\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\ + \n :local Char [ :pick \$Input \$I ];\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\ + \n :set Return (\$Return . \$Char);\ + \n }\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set ExitError do={\ + \n :local ExitOK [ :tostr \$1 ];\ + \n :local Name [ :tostr \$2 ];\ + \n :local Error [ :tostr \$3 ];\ + \n :global IfThenElse;\ + \n :if (\$ExitOK = \"false\") do={\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\ + \n }\ + \n}\ + \n\ + \n:set ExitOnError do={\ + \n :local Name [ :tostr \$1 ];\ + \n :local Error [ :tostr \$2 ];\ + \n :global IfThenElse;\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\ + \n}\ + \n\ + \n:set MiniDateTimeStamp do={\ + \n /system/clock;\ + \n :local vdate [get date];\ + \n :local vtime [get time];\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\ + \n :local M [:tonum \$MM];\ + \n :if (\$vdate ~ \".../../....\") do={\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\ + \n :if (\$M>12) do={:set M (\$M - 12)}\ + \n :set MM [:pick (100 + \$M) 1 3];\ + \n }\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\ + \n :local HH [:pick \$vtime 0 2];\ + \n :local mm [:pick \$vtime 3 5];\ + \n :local ss [:pick \$vtime 6 8];\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \n}\ + \n\ + \n:set WaitForFile do={\ + \n :local FileName [ :tostr \$1 ];\ + \n :local WaitTime [ :totime \$2 ];\ + \n :global CleanFilePath;\ + \n :global EitherOr;\ + \n :global MAX;\ + \n :set FileName [ \$CleanFilePath \$FileName ];\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\ + \n :do {\ + \n :retry {\ + \n /file/get \$FileName;\ + \n :return true;\ + \n } delay=\$Delay max=10;\ + \n } on-error={ }\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\ + \n :do {\ + \n /file/get \$FileName;\ + \n :return true;\ + \n } on-error={ }\ + \n :delay \$Delay;\ + \n :set Delay (\$Delay * 3 / 2);\ + \n }\ + \n :return false;\ + \n}\ + \n\ + \n:set FileGet do={\ + \n :local FileName [ :tostr \$1 ];\ + \n :global WaitForFile;\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\ + \n :local FileVal false;\ + \n :do {:set FileVal [ /file/get \$FileName ];\ + \n } on-error={ }\ + \n :return \$FileVal;\ + \n}\ + \n\ + \n:set RmDir do={\ + \n :local DirName [ :tostr \$1 ];\ + \n :global FileGet;\ + \n :global LogPrint;\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\ + \n :local DirVal [ \$FileGet \$DirName ];\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \n :return true;\ + \n}\ + \n\ + \n:set RmFile do={\ + \n :local FileName [ :tostr \$1 ];\ + \n :global FileGet;\ + \n :global LogPrint;\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\ + \n :local FileVal [ \$FileGet \$FileName ];\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\ + \n :onerror Err {\ + \n /file/remove \$FileName;\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\ + \n :return true;\ + \n}\ + \n\ + \n:set MkDir do={\ + \n :local Path [ :tostr \$1 ];\ + \n :global CleanFilePath;\ + \n :global FileGet;\ + \n :global RmDir;\ + \n :global WaitForFile;\ + \n :global LogPrint;\ + \n :local MkTmpfs do={\ + \n :global WaitForFile;\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\ + \n :if ([ :len \$TmpFs ] = 1) do={\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\ + \n /disk/enable \$TmpFs;\ + \n }\ + \n :return true;\ + \n }\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\ + \n \$RmDir \"tmpfs\";\ + \n :onerror Err {\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\ + \n \$WaitForFile \"tmpfs\";\ + \n } do={\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\ + \n :return false;\ + \n }\ + \n :return true;\ + \n }\ + \n :set Path [ \$CleanFilePath \$Path ];\ + \n :if (\$Path = \"\") do={\ + \n :return true;\ + \n }\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\ + \n :local PathVal [ \$FileGet \$Path ];\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\ + \n :return true;\ + \n }\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\ + \n :if ([ \$MkTmpfs ] = false) do={\ + \n :return false;\ + \n }\ + \n }\ + \n :onerror Err {\ + \n /file/add type=\"directory\" name=\$Path;\ + \n \$WaitForFile \$Path;\ + \n } do={\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\ + \n :return false;\ + \n }\ + \n :return true;\ + \n}\ + \n\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\ + \n :return \$2;\ + \n}\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\ + \n :return \$2;\ + \n}\ + \n\ + \n:set CharacterMultiply do={\ + \n :local Str [ :tostr \$1 ];\ + \n :local Num [ :tonum \$2 ];\ + \n :if (\$Num = 0) do={:return \"\"}\ + \n :local Return \"\";\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set CharacterReplace do={\ + \n :local String [ :tostr \$1 ];\ + \n :local ReplaceFrom [ :tostr \$2 ];\ + \n :local ReplaceWith [ :tostr \$3 ];\ + \n :local Return \"\";\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\ + \n }\ + \n :return (\$Return . \$String);\ + \n}\ + \n\ + \n:set CleanFilePath do={\ + \n :local Path [ :tostr \$1 ];\ + \n :global CharacterReplace;\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\ + \n :return \$Path;\ + \n}\ + \n\ + \n:set IfThenElse do={\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\ + \n :return \$3;\ + \n}\ + \n\ + \n:set EitherOr do={\ + \n :global IfThenElse;\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\ + \n# this works for boolean values, literal ones with parentheses\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\ + \n}\ + \n\ + \n:set ParseKeyValueStore do={\ + \n :local Source \$1;\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\ + \n :do {\ + \n :return [ :deserialize from=json \$Source ];\ + \n } on-error={ }\ + \n } \ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\ + \n :local Result ({});\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\ + \n :if (\$Value=\"true\") do={:set Value true}\ + \n :if (\$Value=\"false\") do={:set Value false}\ + \n :set (\$Result->\$Key) \$Value;\ + \n } else={:set (\$Result->\$KeyValue) true}\ + \n }\ + \n :return \$Result;\ + \n}\ + \n:set RequiredRouterOS do={\ + \n :local Caller [ :tostr \$1 ];\ + \n :local Required [ :tostr \$2 ];\ + \n :local Warn [ :tostr \$3 ];\ + \n :global IfThenElse;\ + \n :global LogPrint;\ + \n :global VersionToNum;\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \n :return false;\ + \n }\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\ + \n :if (\$Warn = \"true\") do={\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\ + \n }\ + \n :return false;\ + \n }\ + \n :return true;\ + \n}\ + \n:set VersionToNum do={\ + \n :local Input [ :tostr \$1 ];\ + \n :local Multi 0x1000000;\ + \n :local Return 0;\ + \n :global CharacterReplace;\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \n }\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\ + \n :local Num [ :tonum \$Value ];\ + \n :if (\$Multi = 0x100) do={\ + \n :if ([ :typeof \$Num ] = \"num\") do={\ + \n :set Return (\$Return + 0xff00);\ + \n :set Multi (\$Multi / 0x100);\ + \n } else={\ + \n :if (\$Value = \"zero\") do={ }\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\ + \n }\ + \n }\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\ + \n :set Multi (\$Multi / 0x100);\ + \n }\ + \n :return \$Return;\ + \n}\ + \n:set ScriptLock do={\ + \n :local Script [ :tostr \$1 ];\ + \n :local WaitMax [ :totime \$2 ];\ + \n :global GetRandom20CharAlNum;\ + \n :global IfThenElse;\ + \n :global LogPrint;\ + \n :global ScriptLockOrder;\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\ + \n :set ScriptLockOrder ({});\ + \n }\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\ + \n :set (\$ScriptLockOrder->\$Script) ({});\ + \n }\ + \n :local JobCount do={\ + \n :local Script [ :tostr \$1 ];\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \n }\ + \n :local TicketCount do={\ + \n :local Script [ :tostr \$1 ];\ + \n :global ScriptLockOrder;\ + \n :local Count 0;\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\ + \n }\ + \n :return \$Count;\ + \n }\ + \n :local IsFirstTicket do={\ + \n :local Script [ :tostr \$1 ];\ + \n :local Check [ :tostr \$2 ];\ + \n :global ScriptLockOrder;\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ + \n :if (\$Ticket = \$Check) do={:return true}\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\ + \n }\ + \n :return false;\ + \n }\ + \n :local AddTicket do={\ + \n :local Script [ :tostr \$1 ];\ + \n :local Add [ :tostr \$2 ];\ + \n :global ScriptLockOrder;\ + \n :while (true) do={\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\ + \n :delay 10ms;\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\ + \n }\ + \n }\ + \n :local RemoveTicket do={\ + \n :local Script [ :tostr \$1 ];\ + \n :local Remove [ :tostr \$2 ];\ + \n :global ScriptLockOrder;\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\ + \n :delay 10ms;\ + \n }\ + \n }\ + \n }\ + \n :local CleanupTickets do={\ + \n :local Script [ :tostr \$1 ];\ + \n :global ScriptLockOrder;\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\ + \n }\ + \n :set (\$ScriptLockOrder->\$Script) ({});\ + \n }\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\ + \n :error false;\ + \n }\ + \n :if ([ \$JobCount \$Script ] = 0) do={\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\ + \n :error false;\ + \n }\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\ + \n :set (\$ScriptLockOrder->\$Script) ({});\ + \n /system/script/job/remove [ find where script=\$Script ];\ + \n }\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\ + \n \$AddTicket \$Script \$MyTicket;\ + \n :local WaitInterval (\$WaitMax / 20);\ + \n :local WaitTime \$WaitMax;\ + \n :while (\$WaitTime > 0 && \\\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\ + \n :delay \$WaitInterval;\ + \n }\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\ + \n \$RemoveTicket \$Script \$MyTicket;\ + \n \$CleanupTickets \$Script;\ + \n :return true;\ + \n }\ + \n \$RemoveTicket \$Script \$MyTicket;\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\ + \n :return false;\ + \n}\ + \n:set SendNotification do={ :onerror Err {\ + \n :global SendNotification2;\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ + \n}\ + \n:set SendNotification2 do={\ + \n :local Notification \$1;\ + \n :global NotificationFunctions;\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\ + \n }\ + \n}\ + \n:set SymbolByUnicodeName do={\ + \n :local Name [ :tostr \$1 ];\ + \n :global EitherOr;\ + \n :global LogPrint;\ + \n :global SymbolsExtra;\ + \n :local Symbols ({\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\ + \n \"cloud\"=\"\\E2\\98\\81\";\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\ + \n \"gear\"=\"\\E2\\9A\\99\";\ + \n \"heart\"=\"\\E2\\99\\A5\";\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\ + \n \"information\"=\"\\E2\\84\\B9\";\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\ + \n \"scissors\"=\"\\E2\\9C\\82\";\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\ + \n \"star\"=\"\\E2\\AD\\90\";\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\ + \n }, \$SymbolsExtra);\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\ + \n :local Special {\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\ + \n :return \"\";\ + \n }\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\ + \n}\ + \n:set SymbolForNotification do={\ + \n :global NotificationsWithSymbols;\ + \n :global SymbolByUnicodeName;\ + \n :global IfThenElse;\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\ + \n :local Return \"\";\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\ + \n :return (\$Return . \" \");\ + \n}\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\ + \n:set UrlEncode do={\ + \n :local Input [ :tostr \$1 ];\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ + \n :local Return \"\";\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\ + \n :local Char [ :pick \$Input \$I ];\ + \n :local Replace [ :find \$Chars \$Char ];\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\ + \n :set Return (\$Return . \$Char);\ + \n }\ + \n :return \$Return;\ + \n}\ + \n:set ValidateSyntax do={\ + \n :local Code [ :tostr \$1 ];\ + \n :global LogPrint;\ + \n :onerror Err {\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\ + \n } do={\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\ + \n :return false;\ + \n }\ + \n :return true;\ + \n}\ + \n:set IsDNSResolving do={\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ + \n :return true;\ + \n}\ + \n:set IsFullyConnected do={\ + \n :global IsDNSResolving;\ + \n :global IsTimeSync;\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\ + \n :return true;\ + \n}\ + \n:set IsTimeSync do={\ + \n :global IsTimeSyncCached;\ + \n :global IsTimeSyncResetNtp;\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\ + \n :set IsTimeSyncCached true;\ + \n :return true;\ + \n }\ + \n :local Uptime [ /system/resource/get uptime ];\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\ + \n :set IsTimeSyncResetNtp \$Uptime;\ + \n }\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\ + \n :set IsTimeSyncResetNtp \$Uptime;\ + \n /system/ntp/client/set enabled=no;\ + \n :delay 20ms;\ + \n /system/ntp/client/set enabled=yes;\ + \n :return false;\ + \n }\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\ + \n :return true;\ + \n }\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\ + \n :set IsTimeSyncCached true;\ + \n :return true;\ + \n }\ + \n :return false;\ + \n }\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \n :return true;\ + \n}\ + \n\ + \n# read parts of a large file\ + \n:set FetchLargeFiles do={\ + \n :local FetchLargeScript [:tostr \$1];\ + \n :local fetchUrl [:tostr \$2];\ + \n :local CheckCert [:tostr \$3];\ + \n :local fetchMode [:tostr \$4];\ + \n :local fetchMethod [:tostr \$5];\ + \n :local FetchString \"undefined\";\ + \n \ + \n :global CleanName;\ + \n :global FetchUserAgentStr;\ + \n :global GetRandom20CharAlNum;\ + \n :global IfThenElse;\ + \n :global LogPrint;\ + \n :global MkDir;\ + \n :global RmDir;\ + \n :global RmFile;\ + \n :global WaitForFile;\ + \n\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\ + \n \ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$FetchLargeScript ]);\ + \n :if ([ \$MkDir \$DirName ] = false) do={\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\ + \n :return false;\ + \n }\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$FetchLargeScript ] }) as-value\ + ;\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\ + \n :onerror Err {\ + \n :set FetchString (\"/tool/fetch \" . \\\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\ + \n http-header-field=({ [ \$FetchUserAgentStr \$FetchLargeScript ] })\ + \_as-value);\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\ + \n :put [\$FetchString];\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$FetchLargeScript ] }) as-value];\ + \n } do={\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ + \n \$RmFile \$FileName;\ + \n }\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\ + \n \$RmDir \$DirName;\ + \n :return false;\ + \n }\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\ + \n :return false;\ + \n }\ + \n :local FileSize [ /file/get \$FileName size ];\ + \n :local Return \"\";\ + \n :local VarSize 0;\ + \n :while (\$VarSize != \$FileSize) do={\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\ + \n :set FileSize [ /file/get \$FileName size ];\ + \n :set VarSize [ :len \$Return ];\ + \n :if (\$VarSize > \$FileSize) do={\ + \n :delay 100ms;\ + \n }\ + \n }\ + \n \$RmDir \$DirName;\ + \n :return \$Return;\ + \n}\ + \n\ + \n:set ScriptInstallUpdate do={ :onerror Err {\ + \n :local Scripts [ :toarray \$1 ];\ + \n :local NewComment [ :tostr \$2 ];\ + \n :global InitSetup;\ + \n\ + \n :global CommitId;\ + \n :global ScriptUpdatesCRLF;\ + \n :global GlobalConfVersion;\ + \n :global Identity;\ + \n :global CertificateAvailable;\ + \n :global CheckSumsVerify;\ + \n :global GlobalScriptsUrl;\ + \n :global SumsDirAndFileName;\ + \n :global GlobalScriptsUrlSuffix;\ + \n :global EitherOr;\ + \n :global FetchUserAgentStr;\ + \n :global Grep;\ + \n :global IfThenElse;\ + \n :global LogPrint;\ + \n :global ParseKeyValueStore;\ + \n :global RequiredRouterOS;\ + \n :global SendNotification2;\ + \n :global SymbolForNotification;\ + \n :global ValidateSyntax;\ + \n :global CommentsInScripts;\ + \n\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\ + \n }\ + \n\ + \n :foreach Script in=\$Scripts do={\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\ + \n }\ + \n }\ + \n\ + \n :local CommitIdBefore \$CommitId;\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\ + \n :local ReloadGlobal false;\ + \n :local DeviceMode [ /system/device-mode/get ];\ + \n\ + \n :if (\$CheckSumsVerify = true) do={\ + \n :local CheckSums ({});\ + \n :do {\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\ + \n }\ + \n\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\ + \n :local ScriptVal [ /system/script/get \$Script ];\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\ + \n :local SourceNew;\ + \n\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\ + \n }\ + \n }\ + \n :do {\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\ + \n :error true;\ + \n }\ + \n :if (\$CheckSumsVerify = true) do={\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\ + \n :error true;\ + \n }\ + \n }\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\ + \n }\ + \n }\ + \n :onerror Err {\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\ + \n :if (\$Result->\"status\" = \"finished\") do={\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\ + \n } \ + \n } do={\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\ + \n :error false;\ + \n }\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\ + \n /system/script/remove \$Script;\ + \n :error false;\ + \n }\ + \n :if (\$CheckSumsVerify = true) do={\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\ + \n [ :len \$CheckSum ] = 0) do={\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\ + \n }\ + \n }\ + \n :error false;\ + \n }\ + \n\ + \n :if ([ :len \$SourceNew ] = 0) do={\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\ + \n :error false;\ + \n }\ + \n\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\ + \n if (\$ScriptUpdatesCRLF = false) do={\ + \n :put [ :tolf \$SourceNew ];\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\ + \n }\ + \n :error false;\ + \n }\ + \n }\ + \n\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\ + \n :error false;\ + \n }\ + \n\ + \n :if (\$CommentsInScripts = true) do={\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\ + \n :if ([ :len \$CommentLine ] = 0) do={\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\ + \n :error false;\ + \n } else={\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\ + \n } else={\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\ + \n :error false;\ + \n }\ + \n } \ + \n }\ + \n\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\ + \n :error false;\ + \n }\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\ + \n :local MissingDM ({});\ + \n :foreach Feature,Value in=\$RequiredDM do={\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\ + \n :set MissingDM (\$MissingDM, \$Feature);\ + \n }\ + \n }\ + \n :if ([ :len \$MissingDM ] > 0) do={\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\ + \n :error false;\ + \n }\ + \n\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\ + \n :error false;\ + \n }\ + \n \ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\ + \n\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\ + \n :set ReloadGlobal true;\ + \n }\ + \n } on-error={ }\ + \n }\ + \n :if (\$ReloadGlobal = true) do={\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\ + \n :onerror Err {\ + \n :global InitSetup (a);\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\ + \n }\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\ + \n \". Installed an older version\?\");\ + \n }\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\ + \n :global GlobalConfChanges;\ + \n :global GlobalConfMigration;\ + \n :local ChangeLogCode;\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\ + \n :onerror Err {\ + \n [ :parse \$ChangeLogCode ];\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\ + \n }\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\ + \n :do {\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\ + \n :error false;\ + \n }\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\ + \n :error false}\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\ + \n :onerror Err {\ + \n [ :parse \$Migration ];\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\ + \n } on-error={ }\ + \n }\ + \n }\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\ + \n \$LogPrint info \$0 (\$NotificationMessage);\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\ + \n }\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\ + \n\ + \n :set GlobalConfChanges;\ + \n :set GlobalConfMigration;\ + \n }\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ + \n}\ + \n\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\ + \n:set GlobalEnvRemove do={\ + \n :local doRmEnv [ :tostr \$1 ];\ + \n :global GlobalScriptsUrl;\ + \n :local ScriptsUrl;\ + \n :global LogPrint;\ + \n :if (\$doRmEnv != \"True\") do={\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\ + \n :return [];\ + \n :error true; \ + \n } else={\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\ + \n :delay 5;\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\ + \n :delay 5;\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\ + \n :return [];\ + \n :error false;\ + \n }\ + \n}\ + \n\ + \n# Add and fix global scheduler\ + \n:put \"Add or/and fix Global scheduler...\";\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\ + \n:local Comment \"Setup Global Environment for " +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BC auto-mac=no mlag-peer-port="ether1 - Unet" \ + name=Bridge-LAN port-cost-mode=short +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), 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 \ + 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(18dBm), 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 wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/caps-man manager +set enabled=yes +/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="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,dns,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN disabled=yes interface="ether1 - Unet" +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/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 allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no 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 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 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-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 +/interface wifi datapath +add bridge=Bridge-LAN disabled=no interface-list=all name=xs-DataPath +/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-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.81/24 interface=Bridge-LAN network=10.30.30.0 +add address=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=client1 \ + use-peer-dns=no +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip dhcp-server config +set accounting=no +/ip dhcp-server lease +add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ + 48:8F:5A:8E:EE:A8 server=masterDHCP +add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ + F0:DE:F1:91:0D:1E server=masterDHCP +add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ + 00:80:77:EC:43:86 server=masterDHCP +add address=10.30.30.70 dhcp-option=domain-search-list,HostName \ + dhcp-option-set=HP1505n mac-address=00:1E:0B:1A:88:8D server=masterDHCP +add address=10.30.30.50 client-id=1:4:7c:16:36:f5:37 mac-address=\ + 04:7C:16:36:F5:37 server=masterDHCP +add address=10.30.30.71 client-id=1:10:2d:41:2c:20:c2 mac-address=\ + 10:2D:41:2C:20:C2 server=masterDHCP +add address=10.30.30.61 client-id=1:10:8:c1:81:59:5f mac-address=\ + 10:08:C1:81:59:5F server=masterDHCP +add address=10.30.30.72 client-id=1:10:38:1f:d2:5f:13 mac-address=\ + 10:38:1F:D2:5F:13 server=masterDHCP +add address=10.30.30.99 client-id=1:10:b1:df:e9:d0:d5 mac-address=\ + 10:B1:DF:E9:D0:D5 server=masterDHCP +add address=10.30.30.111 client-id=1:fe:2:52:be:3f:16 mac-address=\ + FE:02:52:BE:3F:16 server=masterDHCP +add address=10.30.30.92 client-id=1:d4:6d:6d:fd:e5:49 mac-address=\ + D4:6D:6D:FD:E5:49 server=masterDHCP +add address=10.30.30.93 client-id=1:7e:8b:1e:cb:b8:cb mac-address=\ + CC:42:10:12:46:94 server=masterDHCP +add address=10.30.30.94 client-id=1:50:cc:f8:85:96:a mac-address=\ + 50:CC:F8:85:96:0A server=masterDHCP +add address=10.30.30.82 client-id=1:e4:18:6b:58:34:ab mac-address=\ + E4:18:6B:58:34:AB server=masterDHCP +add address=10.30.30.75 client-id=1:0:27:15:41:97:a9 mac-address=\ + 00:27:15:41:97:A9 server=masterDHCP +add address=10.30.30.77 dhcp-option=HostName dhcp-option-set=StartLife1 \ + mac-address=C4:82:E1:03:49:10 server=masterDHCP +add address=10.30.30.73 client-id=1:10:38:1f:82:81:f2 mac-address=\ + 10:38:1F:82:81:F2 server=masterDHCP +add address=10.30.30.95 client-id=1:88:ae:dd:60:39:54 dhcp-option=HostName \ + dhcp-option-set=VADOS-NUC mac-address=88:AE:DD:60:39:54 server=masterDHCP +add address=10.30.30.98 client-id=1:c8:5b:76:d8:cc:bf dhcp-option=HostName \ + dhcp-option-set=VADOS-LEN mac-address=C8:5B:76:D8:CC:BF server=masterDHCP +add address=10.30.30.96 client-id=iPhone mac-address=4A:91:ED:0E:1F:39 \ + server=masterDHCP +add address=10.30.30.74 client-id=MiTV dhcp-option=HostName dhcp-option-set=\ + MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP +add address=10.30.30.30 dhcp-option=HostName dhcp-option-set=miller \ + mac-address=F0:75:5D:1E:5F:71 server=masterDHCP +add address=10.30.30.100 client-id=iVados dhcp-option=HostName \ + dhcp-option-set="=\"Client ID\"" mac-address=DE:4D:72:F3:1A:9F 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=ros.vados.ru type=A +add address=10.30.30.95 name=vados-nuc type=A +add address=10.30.30.33 name=amster-nuc type=A +add address=10.30.30.33 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=reg.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.0.0.1 comment="CloudFlare-doh IPv4 2" name=\ + security.cloudflare-dns.com type=A +add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" 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" 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=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +/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=NUC disabled=yes list=NoWG +add address=10.30.30.10 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=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=89.110.101.17 comment="!!!VDSina Server!!!" disabled=yes list=\ + NoVdsina +/ip firewall filter +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=12h chain=input comment="block honeypot DNS" \ + 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 +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 +/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=WG dst-address-list=!NoVdsina \ + in-interface=Bridge-LAN log-prefix=WG-nat out-interface=WG routing-mark=\ + To-VPN +add action=masquerade chain=srcnat comment="masquerade Default" ipsec-policy=\ + out,none out-interface="ether1 - Unet" routing-mark=!To-VPN +add action=dst-nat chain=dstnat comment=npm 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" \ + dst-port=80 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat 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 +/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 user profile +set [ find default=yes ] address-pool=dhcp +/ip hotspot walled-garden +add server=*1 +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 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api address=10.30.30.0/24 disabled=yes +set api-ssl address=10.30.30.0/24 disabled=yes +set www-ssl port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set graphs-plain=no rest-plain=no webfig-plain=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 +/snmp community +set [ find default=yes ] addresses=10.30.30.0/24 read-access=no security=\ + private +/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="Scheduler for Update Certificates CloudFlare Quad9" disabled=yes \ + 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 +/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/20260504/20260504084001-Diff-Config.rsc b/MikroMaster/history/20260504/20260504084001-Diff-Config.rsc new file mode 100644 index 0000000..3bc1e0a --- /dev/null +++ b/MikroMaster/history/20260504/20260504084001-Diff-Config.rsc @@ -0,0 +1,2433 @@ +512,2911d511 +< add 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 false;\r\ +< \n\r\ +< \n{\r\ +< \n :local RmMe [:tobool \$1];\r\ +< \n\r\ +< \n :global GlobalScriptsUrl;\r\ +< \n :global SetupScript;\r\ +< \n :global RemoveMe;\r\ +< \n :global InitSetup;\r\ +< \n :global tmpfs;\r\ +< \n \r\ +< \n :local 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 ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ +< ] != 1) do={\r\ +< \n :error \"Something is wrong with your certificates!\";\r\ +< \n } else={\r\ +< \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ +< \_\\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ +< \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ +< onName ] ] > 0)) do={\r\ +< \n :put \"Importing certificate...\";\r\ +< \n /tool/fetch (\$GlobalScriptsUrl . \"certs/ipall/\" . \$CertFileN\ +< ame) dst-path=\$CertFileName as-value;\r\ +< \n :delay 1s;\r\ +< \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ +< \n :delay 1s;\r\ +< \n };\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=AM-GlobalConfig owner=AM-GlobalConfig \ +< 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 Identity [ /system identity get name ];\ +< \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/\" . \$Identity . \"/\ +< \");\ +< \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 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\ +< \n# RouterOS script: AM-GglobalFunc\ +< \n# Script comment: Global functions\ +< \n# Copyright (c) 2005-2026 Vados \ +< \n#\ +< \n#\ +< \n# requires RouterOS, version=7.19\ +< \n# requires device-mode, fetch, scheduler\ +< \n:local ExitOK false;\ +< \n:local ScriptName [ :jobname ];\ +< \n#:global checkRunJob \$SriptName;\ +< \n#:global fixCRLF;\ +< \n#:if (\$fixCRLF != false) do={\ +< \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ +< ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ +< }\ +< \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ +< et \$fixScript source ] ] \$fixScript};};\ +< \n#}\ +< \n:global GlobalFuncReady false;\ +< \n\ +< \n# Git commit id & info, expected configuration version\ +< \n:global CommitId \"main/528/a6273d14\";\ +< \n:global CommitTAG \"unknown\";\ +< \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ +< r: root, in 08:20:02 04.05.2026.\";\ +< \n\ +< \n# The variables are received right here.\ +< \n:global GlobalConfVersion 138;\ +< \n\ +< \n:global SumsDirAndFileName \"tmp/checksums.json\";\ +< \n\ +< \n:global Identity [/system/identity/get name];\ +< \n:global IdentityShort [:pick \$Identity 0 18];\ +< \n\ +< \n:global devBoardName [/system/resource/get board-name];\ +< \n:global devMode [/system/device-mode/get mode];\ +< \n:global devCurArch [/system/resource/get architecture-name];\ +< \n:global devCurVersion [/system/resource/get version];\ +< \n\ +< \n# Variables defined in AM-GlobalConfig.rsc\ +< \n:global TerminalColorOutput;\ +< \n:global CommentsInScripts;\ +< \n:global DetectIpAddrDefault;\ +< \n:global DetectIpAddrFallback;\ +< \n:global updateChannel;\ +< \n:global Domain;\ +< \n:global EmailGeneralTo;\ +< \n:global BackupAndUpdateMode;\ +< \n\ +< \n# Single functions, without nested functions.\ +< \n:global GlobalEnvRemove;\ +< \n:global MiniDateTimeStamp;\ +< \n\ +< \n# Include globals \$PrintDebug and \$PrintDebugOverride\ +< \n:global LogPrint;\ +< \n\ +< \n# DeviceInfo and Updates\ +< \n:global IsCheckUpdates;\ +< \n:global WaitCheckUpdates;\ +< \n:global GetPubIp;\ +< \n\ +< \n:global GetArrDeviceInfo;\ +< \n:global WaitArrDeviceInfo;\ +< \n\ +< \n:global devModel;\ +< \n:global devRunningMode;\ +< \n\ +< \n:global devRbRevision;\ +< \n:global devRbSerialNumber;\ +< \n:global devRbVerAvail;\ +< \n\ +< \n:global runningChannelVersion;\ +< \n:global runningChannel;\ +< \n:global runningVersion;\ +< \n\ +< \n:global devBuildTime;\ +< \n:global ROsVerAvail;\ +< \n:global PkgUpdStatus;\ +< \n:global currentUpdateChannel;\ +< \n\ +< \n:global ScriptInstallUpdate;\ +< \n\ +< \n:global DeviceInfo;\ +< \n\ +< \n:global OldMode;\ +< \n\ +< \n:global ParseKeyValueStore;\ +< \n:global RandomDelay;\ +< \n:global GetRandomNumber;\ +< \n:global EscapeForRegEx;\ +< \n:global ExitError;\ +< \n:global ExitOnError;\ +< \n:global CharacterMultiply;\ +< \n:global CharacterReplace;\ +< \n:global CleanFilePath;\ +< \n:global CleanName;\ +< \n\ +< \n:global CommitBrief;\ +< \n\ +< \n:global EitherOr;\ +< \n:global FormatLine;\ +< \n:global GetRandom20CharAlNum;\ +< \n:global Grep;\ +< \n:global IfThenElse;\ +< \n:global MAX;\ +< \n:global MIN;\ +< \n:global HumanReadableNum;\ +< \n\ +< \n:global IsFullyConnected;\ +< \n:global IsDNSResolving;\ +< \n:global IsTimeSync;\ +< \n:global IsTimeSyncCached;\ +< \n:global IsTimeSyncResetNtp;\ +< \n\ +< \n:global WaitDNSResolving;\ +< \n:global WaitFullyConnected;\ +< \n:global WaitTimeSync;\ +< \n:global MkDir;\ +< \n:global RmDir;\ +< \n:global RmFile;\ +< \n:global FileGet;\ +< \n:global Unix2Dos;\ +< \n:global UrlEncode;\ +< \n:global WaitForFile;\ +< \n:global ScriptLock;\ +< \n:global SendTelegram;\ +< \n:global NotificationFunctions;\ +< \n:global SendNotification;\ +< \n:global SendNotification2;\ +< \n:global SymbolForNotification;\ +< \n:global SymbolByUnicodeName;\ +< \n:global ValidateSyntax;\ +< \n:global CheckSumsVerify;\ +< \n:global GlobalConfChanges;\ +< \n:global GlobalConfMigration;\ +< \n:global VersionToNum;\ +< \n:global RequiredRouterOS;\ +< \n:global FetchLargeFiles;\ +< \n:global FetchHuge;\ +< \n:global FetchUserAgentStr;\ +< \n:global CertificateAvailable;\ +< \n:global CertificateDownload;\ +< \n:global CertificateNameByCN;\ +< \n:global CharacterMultiply;\ +< \n\ +< \n:global InspectVar;\ +< \n:global InspectVarRet;\ +< \n:global ParseCustom;\ +< \n\ +< \n:set IsCheckUpdates do={\ +< \n :local isInfo [:tobool \$1];\ +< \n :global LogPrint;\ +< \n :global updateChannel;\ +< \n :global PkgUpdStatus;\ +< \n :global currentUpdateChannel;\ +< \n :global ROsVerAvail;\ +< \n :global arrDeviceInfo;\ +< \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \ +< \n :local CurrentChannel [ /system/package/update/get channel ];\ +< \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ +< el) do={\ +< \n :retry command={/system/package/update set channel=\$updateChannel} \ +< \_delay=300ms max=5 on-error={};\ +< \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ +< \n }\ +< \n\ +< \n :local Update [ /system/package/update/get ];\ +< \n :local Channel [ :tostr (\$Update->\"channel\") ];\ +< \n :set currentUpdateChannel \$Channel;\ +< \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\ +< \n\ +< \n\ +< \n :local StatusPkg \"undefined\";\ +< \n \$LogPrint debug \$0 (\"Checking for updates...\");\ +< \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ +< dates without-paging as-value]->\"status\")} \\\ +< \n delay=300ms max=5 on-error={};\ +< \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\ +< \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ +< s true; } else={ :set PkgUpdStatus false; }\ +< \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ +< ] ];\ +< \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +< \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ +< \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +< \n }\ +< \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ +< kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\ +< \n :return true;\ +< \n } else={\ +< \n :return \$PkgUpdStatus;\ +< \n }\ +< \n}\ +< \n\ +< \n:set WaitCheckUpdates do={\ +< \n :global IsCheckUpdates;\ +< \n :global PkgUpdStatus;\ +< \n :global currentUpdateChannel;\ +< \n :global ROsVerAvail;\ +< \n :global arrDeviceInfo;\ +< \n\ +< \n :local Status \"\";\ +< \n :local Update;\ +< \n :local WaitCount 0;\ +< \n\ +< \n :if ([ \$IsCheckUpdates true ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +< \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ +< \") && \$WaitCount < 60) do={\ +< \n :delay 1s;\ +< \n :set WaitCount (\$WaitCount + 1);\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +< \n }\ +< \n\ +< \n :set Update [ /system/package/update/get ];\ +< \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +< \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +< \n :if ((\$Update->\"status\") = \"New version is available\") do={\ +< \n :set PkgUpdStatus true;\ +< \n } else={\ +< \n :set PkgUpdStatus false;\ +< \n }\ +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +< \n }\ +< \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\ +< \n\ +< \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ +< do={\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set WaitArrDeviceInfo do={\ +< \n :global GetArrDeviceInfo;\ +< \n :while ([ \$GetArrDeviceInfo ] = false) do={\ +< \n :delay 1s;\ +< \n }\ +< \n}\ +< \n\ +< \n:set GetArrDeviceInfo do={\ +< \n :global LogPrint;\ +< \n :global arrDeviceInfo;\ +< \n\ +< \n :global devBoardName;\ +< \n :global devModel;\ +< \n :global devRunning;\ +< \n :global devCurArch;\ +< \n :global devRbRevision;\ +< \n :global devRbSerialNumber;\ +< \n :global devBuildTime;\ +< \n :global runningChannelVersion;\ +< \n :global runningChannel;\ +< \n :global runningVersion;\ +< \n :global currentUpdateChannel;\ +< \n :global ROsVerAvail;\ +< \n\ +< \n :local DeviceInfo;\ +< \n :local Resource [/system/resource/get];\ +< \n :local Update [ /system/package/update/get ];\ +< \n :local VersionString [ :tostr (\$Resource->\"version\") ];\ +< \n :local ChannelStart [ :find \$VersionString \" (\" ];\ +< \n :local RouterBoard;\ +< \n :local IsRouterBoard false;\ +< \n :local RunningMode \"\";\ +< \n\ +< \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\ +< \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\ +< \n :set runningChannelVersion \$VersionString;\ +< \n :set runningVersion \$VersionString;\ +< \n :set runningChannel \"\";\ +< \n\ +< \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ +< {\ +< \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\ +< \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ +< len \$VersionString ] ];\ +< \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\ +< \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ +< \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\ +< \n }\ +< \n }\ +< \n\ +< \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ +< \_3] != \"x86\") do={\ +< \n :do {\ +< \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\ +< \n# :set RouterBoard [ /system/routerboard/get ];\ +< \n :if ((\$RouterBoard->\"routerboard\") = true) do={\ +< \n :set IsRouterBoard true;\ +< \n }\ +< \n } on-error={}\ +< \n }\ +< \n\ +< \n :do {\ +< \n :set RunningMode [ /system/device-mode/get mode ];\ +< \n } on-error={\ +< \n :do {\ +< \n :set RunningMode [ /system/device-mode/get running ];\ +< \n } on-error={\ +< \n :set RunningMode \"\";\ +< \n }\ +< \n }\ +< \n :set devRunning \$RunningMode;\ +< \n\ +< \n :if (\$IsRouterBoard = true) do={\ +< \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\ +< \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\ +< \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ +< ];\ +< \n } else={\ +< \n :set devModel \$devBoardName;\ +< \n :set devRbRevision \"\";\ +< \n :set devRbSerialNumber \"\";\ +< \n }\ +< \n\ +< \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +< \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +< \n\ +< \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\ +< \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\ +< \n :set (\$DeviceInfo->\"model\") \$devModel;\ +< \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\ +< \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\ +< \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\ +< \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\ +< \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ +< ion;\ +< \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\ +< \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\ +< \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\ +< \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ +< current-firmware\") ];\ +< \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ +< upgrade-firmware\") ];\ +< \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\ +< \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ +< alled-version\") ];\ +< \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\ +< \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ +< ) ];\ +< \n\ +< \n :set arrDeviceInfo \$DeviceInfo;\ +< \n :return \$DeviceInfo;\ +< \n}\ +< \n\ +< \n:set DeviceInfo do={\ +< \n :global GetArrDeviceInfo;\ +< \n :global GlobalConfVersion;\ +< \n :global Identity;\ +< \n :global IfThenElse;\ +< \n :global FormatLine;\ +< \n :global CommitBrief;\ +< \n\ +< \n :local License [/system/license/get];\ +< \n :local Snmp [ /snmp/get ];\ +< \n :local Info [ \$GetArrDeviceInfo ];\ +< \n\ +< \n :if ([ :typeof \$Info ] != \"array\") do={\ +< \n :return false;\ +< \n }\ +< \n\ +< \n :return ( \\\ +< \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\ +< \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ +< \_. \\\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\ +< \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ +< \_\\\ +< \n \"Hardware:\\n\" . \\\ +< \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ +< \\\ +< \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ +< n\" . \\\ +< \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\ +< \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\ +< \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ +< \\n\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\ +< \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ +< \")) ] . \"\\n\") ] . \\\ +< \n \"RouterOS:\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\ +< \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ +< \")) ] . \"\\n\") ] . \\\ +< \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ +< \\n\" . \\\ +< \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ +< \_\"\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\ +< \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ +< \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\ +< \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ +< \"\\n\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\ +< \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ +< \_\\\ +< \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ +< \_\"\\n\") ] . \\\ +< \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\ +< \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ +< ) \\\ +< \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ +< \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\ +< \n \"RouterOS-Scripts:\\n\" . \\\ +< \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\ +< \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\ +< \n}\ +< \n\ +< \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ +< tionFunctions ({})}\ +< \n:set GetRandom20CharAlNum do={\ +< \n :global EitherOr;\ +< \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ +< FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ +< \n}\ +< \n\ +< \n:global checkRunJob;\ +< \n:set checkRunJob do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :global ScriptLock; \ +< \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\ +< \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ +< :set Job [ /system/script/job/get \$Job ];\ +< \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ +< stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\ +< \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ +< lse; \ +< \n}\ +< \n\ +< \n:set InspectVar do={\ +< \n :global InspectVarRet;\ +< \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\ +< \n}\ +< \n\ +< \n:set CommitBrief do={\ +< \n :global CommitId;\ +< \n :global CommitInfo;\ +< \n :if (\$CommitId = \"unknown\") do={\ +< \n :return \"unknown\";\ +< \n }\ +< \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\ +< \n}\ +< \n\ +< \n:set InspectVarRet do={\ +< \n :local Input \$1;\ +< \n :local Level (0 + [ :tonum \$2 ]);\ +< \n :global CharacterReplace;\ +< \n :global IfThenElse;\ +< \n :global InspectVarRet;\ +< \n :local IndentReturn do={\ +< \n :local Prefix [ :tostr \$1 ];\ +< \n :local Value [ :tostr \$2 ];\ +< \n :local Level [ :tonum \$3 ];\ +< \n :global CharacterMultiply;\ +< \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ +< fix . \"-> \" . \$Value);\ +< \n }\ +< \n :local TypeOf [ :typeof \$Input ];\ +< \n :local Len [ :len \$Input ];\ +< \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\ +< \n :if (\$TypeOf = \"array\") do={\ +< \n :foreach Key,Value in=\$Input do={\ +< \n :set \$Return (\$Return . \"\\n\" . \\\ +< \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\ +< \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\ +< \n }\ +< \n } else={\ +< \n :if (\$TypeOf = \"str\") do={\ +< \n :set \$Return (\$Return . \"\\n\" . \\\ +< \n [ \$IndentReturn \"len\" \$Len \$Level ]);\ +< \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\ +< \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\ +< \n }\ +< \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\ +< \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\ +< \n }\ +< \n }\ +< \n :if (\$TypeOf != \"nothing\") do={\ +< \n :set \$Return (\$Return . \"\\n\" . \\\ +< \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ +< \_\\\ +< \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\ +< \n }\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n# !!! The function is not ready !!!\ +< \n:global FetchHttpInfo do={\ +< \n :local Mac [ :tostr \$1 ];\ +< \n :global CertificateAvailable;\ +< \n :global IsMacLocallyAdministered;\ +< \n :global LogPrint;\ +< \n :local Url \"https://api.macvendors.com/\";\ +< \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ +< y administered\";}\ +< \n :do {\ +< \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ +< o={\ +< \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ +< \");\ +< \n :error false;\ +< \n }\ +< \n :local Vendor ([ /tool/fetch \ +< \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\ +< \n :return \$Vendor;\ +< \n } on-error={\ +< \n :onerror Err {\ +< \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ +< as-value;\ +< \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ +< );\ +< \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ +< rr); }\ +< \n :return \"unknown vendor\";\ +< \n }\ +< \n}\ +< \n\ +< \n:set GetPubIp do={\ +< \n :global DetectIpAddrDefault;\ +< \n :global DetectIpAddrFallback;\ +< \n\ +< \n :local PubIpAddr false;\ +< \n :local Url \$DetectIpAddrDefault;\ +< \n :local JobName [ :jobname ];\ +< \n\ +< \n :do {\ +< \n :log debug (\$0 . \" Trying to detect public IP using default serv\ +< ice: \" . \$Url . \"...\");\ +< \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ +< \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ +< )} \\\ +< \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ +< detect public IP using default service: \" . \$Url . \".\")}\ +< \n } on-error={\ +< \n :log error (\$0 . \" Failed to detect public IP using default serv\ +< ice: \" . \$Url . \".\");\ +< \n :set Url \$DetectIpAddrFallBack;\ +< \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ +< vice: \" . \$Url . \"...\");\ +< \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ +< \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ +< )} \\\ +< \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ +< \_detect public IP using fallback service: \" . \$Url . \".\")}\ +< \n };\ +< \n :local IpLen ([ :len \$PubIpAddr ] -1);\ +< \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ +< {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\ +< \n :return \$PubIpAddr;\ +< \n}\ +< \n\ +< \n:set FormatLine do={\ +< \n :local Key [ :tostr \$1 ];\ +< \n :local Value [ :tostr \$2 ];\ +< \n :local Indent [ :tonum \$3 ];\ +< \n :local Spaces;\ +< \n :local Return \"\";\ +< \n :global CharacterMultiply;\ +< \n :global EitherOr;\ +< \n :set Indent [ \$EitherOr \$Indent 16 ];\ +< \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\ +< \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\ +< \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ +< n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\ +< \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ +< \$Return ]) ] . \$Value)}\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set ParseCustom do={\ +< \n :local Str [ :tostr \$1 ];\ +< \n :local Start [:find [ \$Str ] [:tostr \$2]];\ +< \n :local End [ :tostr \$3 ];\ +< \n :local Num [ :tonum \$4 ];\ +< \n :local Return;\ +< \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\ +< \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \ +< \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ +< lse={\ +< \n :set End [:find \$rest \$End];\ +< \n :set Return [:pick \$rest 0 \$End];\ +< \n }\ +< \n:return \$Return;\ +< \n}\ +< \n\ +< \n:set LogPrint do={\ +< \n :local Severity [ :tostr \$1 ];\ +< \n :local Name [ :tostr \$2 ];\ +< \n :local Message [ :tostr \$3 ];\ +< \n :global PrintDebug;\ +< \n :global PrintDebugOverride;\ +< \n :global EitherOr;\ +< \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ +< ];\ +< \n :local PrintSeverity do={\ +< \n :global TerminalColorOutput;\ +< \n :if (\$TerminalColorOutput != true) do={:return \$1}\ +< \n :local Color { debug=96; info=97; warning=93; error=91 };\ +< \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\ +< \n}\ +< \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ +< \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\ +< \n :if (\$Severity = \"debug\") do={:log debug \$Log}\ +< \n :if (\$Severity = \"error\") do={:log error \$Log}\ +< \n :if (\$Severity = \"info\" ) do={:log info \$Log}\ +< \n } else={:log warning \$Log; :set Severity \"warning\"}\ +< \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ +< erity \$Severity ] . \": \" . \$Message)}\ +< \n}\ +< \n\ +< \n# check and download required certificate\ +< \n# Description: This function checks if a certificate with given Common N\ +< ame is available in the system or not.\ +< \n# If not, it tries to download it from repository. It also \ +< checks the certificate chain and downloads missing intermediate certificat\ +< es if needed.\ +< \n# Arguments: \"Common Name\" - the common name of the certificate to che\ +< ck\ +< \n# \"fetch\" - if the intended use for certificate is \"fetch\ +< \", it will check if the certificate is available for fetch option and ret\ +< urn true if it is, otherwise it will check other options as well and retur\ +< n true if the certificate is available for at least one of the options.\ +< \n# \"tls\" - if the intended use for certificate is \"tls\", i\ +< t will check if the certificate is available for tls option and return tru\ +< e if it is, otherwise it will check other options as well and return true \ +< if the certificate is available for at least one of the options.\ +< \n# \"all\" - if the intended use is \"all\", it will check all\ +< \_options and return true if the certificate is available for at least one\ +< \_of the options.\ +< \n# \"undefined\" - if the intended use for certificate is not \ +< defined, it will check all options and log a warning as well.\ +< \n# Usage: \$CertificateAvailable \"Common Name\" \"intended use for certi\ +< ficate (e.g. \"fetch\", \"tls\", \"all\", \"undefined\")\"\ +< \n:set CertificateAvailable do={\ +< \n :local CommonName [ :tostr \$1 ];\ +< \n :local UseFor [ :tostr \$2 ];\ +< \n\ +< \n :global CertificateDownload;\ +< \n :global ParseKeyValueStore;\ +< \n\ +< \n :if ([ :len \$UseFor ] = 0) do={\ +< \n :log warning (\$0 . \"The intended use is undefined!\");\ +< \n :set UseFor \"undefined\";\ +< \n }\ +< \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\ +< \n [ /certificate/settings/get crl-download ] = true && \\\ +< \n [ /certificate/settings/get crl-store ] = \"system\") do={\ +< \n :log warning (\$0 . \"This system has low free flash space but \" . \ +< \\\ +< \n \"is configured to download certificate CRLs to system!\");\ +< \n }\ +< \n :if ([ :len \$CommonName ] = 0) do={\ +< \n :log warning (\$0 . \"No CommonName given!\");\ +< \n :return false;\ +< \n }\ +< \n :local CertSettings [ /certificate/settings/get ];\ +< \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +< \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ +< \_] ] > 0) do={\ +< \n :return true;\ +< \n }\ +< \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ +< ) do={\ +< \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ +< \"' not available.\");\ +< \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n }\ +< \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ +< ) do={\ +< \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ +< \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\ +< \n :return true;\ +< \n }\ +< \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ +< e ] ];\ +< \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ +< ertVal->\"skid\")) do={\ +< \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ +< \_= 0) do={\ +< \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ +< >\"CN\");\ +< \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ +< is incomplete, missing '\" . \$IssuerCN . \"'.\");\ +< \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n }\ +< \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ +< \") ] ];\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \n# download and import certificate\ +< \n# Description: This function downloads a certificate with given Common N\ +< ame from repository and imports it to the system.\ +< \n# It also checks the certificate chain and downloads missin\ +< g intermediate certificates if needed from repository.\ +< \n# If the certificate is already available, it does nothing.\ +< \n# If the certificate is not available in repository, it att\ +< empts to download it from mkcert.org.\ +< \n# If it is also not available there, it logs a warning and \ +< returns false.\ +< \n# If the certificate is downloaded but still not available \ +< after import, it removes all certificates with the same Common Name and lo\ +< gs a warning, assuming the certificate was imported but not named properly\ +< .\ +< \n# Or if there are multiple certificates with the same Commo\ +< n Name, it does nothing as well, assuming the certificate is already impor\ +< ted but not named properly.\ +< \n# Usage: \$CertificateDownload \"Common Name\"\ +< \n:set CertificateDownload do={\ +< \n :local CommonName [ :tostr \$1 ];\ +< \n :global ScriptUpdatesBaseUrl;\ +< \n :global ScriptUpdatesUrlSuffix;\ +< \n :global CertificateNameByCN;\ +< \n :global CleanName;\ +< \n :global FetchUserAgentStr;\ +< \n :global RmFile;\ +< \n :global WaitForFile;\ +< \n\ +< \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ +< \n \"CommonName '\" . \$CommonName . \"'.\");\ +< \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\ +< \n :do {\ +< \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ +< -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +< \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ +< sUrlSuffix) \\\ +< \n dst-path=\$FileName as-value;\ +< \n \$WaitForFile \$FileName;\ +< \n } on-error={\ +< \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ +< e '\" . \$CommonName . \\\ +< \n \"' from repository! Trying fallback to mkcert.org...\");\ +< \n :do {\ +< \n :local CertSettings [ /certificate/settings/get ];\ +< \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ +< \_] ] = 0 && \\\ +< \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ +< || \\\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ +< \\\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +< \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ +< \_Root X1\" ] ] > 0)) do={\ +< \n :log error (\$0 . \" Required certificate is not available.\");\ +< \n :return false;\ +< \n }\ +< \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ +< er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +< \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ +< n ({ \$CommonName }) ] \\\ +< \n dst-path=\$FileName as-value;\ +< \n \$WaitForFile \$FileName;\ +< \n :if ([ /file/get \$FileName size ] = 0) do={\ +< \n \$RmFile \$FileName;\ +< \n :error false;\ +< \n }\ +< \n } on-error={\ +< \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ +< e '\" . \$CommonName . \"'!\");\ +< \n :return false;\ +< \n }\ +< \n }\ +< \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\ +< \n :delay 1s;\ +< \n \$RmFile \$FileName;\ +< \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ +< ) do={\ +< \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ +< +\\\$\") ];\ +< \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ +< e . \"' still unavailable!\");\ +< \n :return false;\ +< \n }\ +< \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ +< \"_[0-9]+\\\$\") ] do={\ +< \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \n# name a certificate by its common-name\ +< \n# Description: Some RouterOS functions require certificate name instead \ +< of common-name or fingerprint.\ +< \n# This function finds a certificate by common-name, fingerp\ +< rint or name and sets its name to a clean version of common-name\ +< \n# (only letters, numbers and dashes, other chars are replac\ +< ed with dash).\ +< \n# If there are multiple certificates with the same common-n\ +< ame, it will rename the first one found and log a warning.\ +< \n# Usage: \$CertificateNameByCN \"Common Name\"\ +< \n:set CertificateNameByCN do={\ +< \n :local Match [ :tostr \$1 ];\ +< \n :global CleanName;\ +< \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ +< rint=\$Match or name=\$Match) ]->0);\ +< \n :if ([ :len \$Cert ] = 0) do={\ +< \n :log warning (\$0 .\" No matching certificate found.\");\ +< \n :return false;\ +< \n }\ +< \n :local CommonName [ /certificate/get \$Cert common-name ];\ +< \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set CharacterMultiply do={\ +< \n :local Str [ :tostr \$1 ];\ +< \n :local Num [ :tonum \$2 ];\ +< \n :if (\$Num = 0) do={:return \"\"}\ +< \n :local Return \"\";\ +< \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n# fetch huge data to file, read in chunks\ +< \n:set FetchHuge do={\ +< \n :local FetchScript [ :tostr \$1 ];\ +< \n :local Url [ :tostr \$2 ];\ +< \n :local CheckCert [ :tostr \$3 ];\ +< \n\ +< \n :global CleanName;\ +< \n :global FetchUserAgentStr;\ +< \n :global GetRandom20CharAlNum;\ +< \n :global IfThenElse;\ +< \n :global LogPrint;\ +< \n :global MkDir;\ +< \n :global RmDir;\ +< \n :global RmFile;\ +< \n :global WaitForFile;\ +< \n\ +< \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ +< ithout-crl\" ];\ +< \n\ +< \n :local DirName (\"tmpfs/\" . [ \$CleanName \$FetchScript ]);\ +< \n :if ([ \$MkDir \$DirName ] = false) do={\ +< \n \$LogPrint error \$0 (\"Failed creating directory!\");\ +< \n :return false;\ +< \n }\ +< \n\ +< \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ +< \$GetRandom20CharAlNum ]);\ +< \n :onerror Err {\ +< \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ +< \\\ +< \n http-header-field=({ [ \$FetchUserAgentStr \$FetchScript ] }) as-v\ +< alue;\ +< \n } do={\ +< \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +< \n \$RmFile \$FileName;\ +< \n }\ +< \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ +< \_. \$Err);\ +< \n \$RmDir \$DirName;\ +< \n :return false;\ +< \n }\ +< \n\ +< \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +< \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ +< \_not show up.\");\ +< \n :return false;\ +< \n }\ +< \n\ +< \n :local FileSize [ /file/get \$FileName size ];\ +< \n :local Return \"\";\ +< \n :local VarSize 0;\ +< \n :while (\$VarSize != \$FileSize) do={\ +< \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ +< 768 file=\$FileName as-value ]->\"data\"));\ +< \n :set FileSize [ /file/get \$FileName size ];\ +< \n :set VarSize [ :len \$Return ];\ +< \n :if (\$VarSize > \$FileSize) do={\ +< \n :delay 100ms;\ +< \n }\ +< \n }\ +< \n \$RmDir \$DirName;\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set FetchUserAgentStr do={\ +< \n :local Caller [ :tostr \$1 ];\ +< \n\ +< \n :global GlobalScriptsUrl;\ +< \n :global CommitBrief;\ +< \n :global IfThenElse;\ +< \n :local Resource [ /system/resource/get ];\ +< \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ +< \_\$Resource->\"architecture-name\" . \\\ +< \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ +< CommitBrief ] . \")\");\ +< \n}\ +< \n\ +< \n:set Grep do={\ +< \n :local Input ([ :tostr \$1 ] . \"\\n\");\ +< \n :local Pattern [ :tostr \$2 ];\ +< \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ +< }\ +< \n :do {\ +< \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\ +< \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ +< \$Line}\ +< \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ +< Input ] ];\ +< \n } while=([ :len \$Input ] > 0);\ +< \n :return [];\ +< \n}\ +< \n\ +< \n:set HumanReadableNum do={\ +< \n :local Input [ :tonum \$1 ];\ +< \n :local Base [ :tonum \$2 ];\ +< \n :global EitherOr;\ +< \n :global IfThenElse;\ +< \n :local Prefix \"kMGTPE\";\ +< \n :local Pow 1;\ +< \n :set Base [ \$EitherOr \$Base 1024 ];\ +< \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\ +< \n :if (\$Input < \$Base) do={:return \$Input}\ +< \n :for I from=0 to=[ :len \$Prefix ] do={\ +< \n :set Pow (\$Pow * \$Base);\ +< \n :if (\$Input / \$Base < \$Pow) do={\ +< \n :set Prefix [ :pick \$Prefix \$I ];\ +< \n :local Tmp1 (\$Input * 100 / \$Pow);\ +< \n :local Tmp2 (\$Tmp1 / 100);\ +< \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\ +< \n :return (\$Tmp2 . \".\" . \\\ +< \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ +< 2 ] + 1) ] . \\\ +< \n \$Prefix . \$Bin);\ +< \n }\ +< \n }\ +< \n}\ +< \n\ +< \n:set CleanName do={\ +< \n :local Input [ :tostr \$1 ];\ +< \n :local Return \"\";\ +< \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +< \n :local Char [ :pick \$Input \$I ];\ +< \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ +< stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ +< \n :do {:if ([ :len \$Return ] = 0) do={:error true};\ +< \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ +< ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \ +< \n };\ +< \n :set Return (\$Return . \$Char)};\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set GetRandomNumber do={\ +< \n :global EitherOr;\ +< \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ +< \n}\ +< \n\ +< \n:set RandomDelay do={\ +< \n :local Time [ :tonum \$1 ];\ +< \n :local Unit [ :tostr \$2 ];\ +< \n :global EitherOr;\ +< \n :global GetRandomNumber;\ +< \n :global MAX;\ +< \n :if (\$Time = 0) do={:return false}\ +< \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ +< [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\ +< \n}\ +< \n\ +< \n:set EscapeForRegEx do={\ +< \n :local Input [ :tostr \$1 ];\ +< \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +< \n :local Return \"\";\ +< \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\ +< \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +< \n :local Char [ :pick \$Input \$I ];\ +< \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\ +< \n :set Return (\$Return . \$Char);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set ExitError do={\ +< \n :local ExitOK [ :tostr \$1 ];\ +< \n :local Name [ :tostr \$2 ];\ +< \n :local Error [ :tostr \$3 ];\ +< \n :global IfThenElse;\ +< \n :if (\$ExitOK = \"false\") do={\ +< \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ +< \\\ +< \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ +< ror\" . \\\ +< \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ +< \$Error) \".\" ]);\ +< \n }\ +< \n}\ +< \n\ +< \n:set ExitOnError do={\ +< \n :local Name [ :tostr \$1 ];\ +< \n :local Error [ :tostr \$2 ];\ +< \n :global IfThenElse;\ +< \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ +< \\\$\") \\\ +< \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ +< r\" . \\\ +< \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ +< rror) \".\" ]);\ +< \n}\ +< \n\ +< \n:set MiniDateTimeStamp do={\ +< \n /system/clock;\ +< \n :local vdate [get date];\ +< \n :local vtime [get time];\ +< \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\ +< \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\ +< \n :local M [:tonum \$MM];\ +< \n :if (\$vdate ~ \".../../....\") do={\ +< \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\ +< \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ +< PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\ +< \n :if (\$M>12) do={:set M (\$M - 12)}\ +< \n :set MM [:pick (100 + \$M) 1 3];\ +< \n }\ +< \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\ +< \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\ +< \n :local HH [:pick \$vtime 0 2];\ +< \n :local mm [:pick \$vtime 3 5];\ +< \n :local ss [:pick \$vtime 6 8];\ +< \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ +< \n}\ +< \n\ +< \n:set WaitForFile do={\ +< \n :local FileName [ :tostr \$1 ];\ +< \n :local WaitTime [ :totime \$2 ];\ +< \n :global CleanFilePath;\ +< \n :global EitherOr;\ +< \n :global MAX;\ +< \n :set FileName [ \$CleanFilePath \$FileName ];\ +< \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\ +< \n :do {\ +< \n :retry {\ +< \n /file/get \$FileName;\ +< \n :return true;\ +< \n } delay=\$Delay max=10;\ +< \n } on-error={ }\ +< \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\ +< \n :do {\ +< \n /file/get \$FileName;\ +< \n :return true;\ +< \n } on-error={ }\ +< \n :delay \$Delay;\ +< \n :set Delay (\$Delay * 3 / 2);\ +< \n }\ +< \n :return false;\ +< \n}\ +< \n\ +< \n:set FileGet do={\ +< \n :local FileName [ :tostr \$1 ];\ +< \n :global WaitForFile;\ +< \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\ +< \n :local FileVal false;\ +< \n :do {:set FileVal [ /file/get \$FileName ];\ +< \n } on-error={ }\ +< \n :return \$FileVal;\ +< \n}\ +< \n\ +< \n:set RmDir do={\ +< \n :local DirName [ :tostr \$1 ];\ +< \n :global FileGet;\ +< \n :global LogPrint;\ +< \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\ +< \n :local DirVal [ \$FileGet \$DirName ];\ +< \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ +< exist.\"); :return true};\ +< \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ +< Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\ +< \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ +< ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set RmFile do={\ +< \n :local FileName [ :tostr \$1 ];\ +< \n :global FileGet;\ +< \n :global LogPrint;\ +< \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\ +< \n :local FileVal [ \$FileGet \$FileName ];\ +< \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ +< \_exist.\"); :return true}\ +< \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ +< sk\") do={\ +< \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ +< ); :return false}\ +< \n :onerror Err {\ +< \n /file/remove \$FileName;\ +< \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ +< led: \" . \$Err); :return false}\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set MkDir do={\ +< \n :local Path [ :tostr \$1 ];\ +< \n :global CleanFilePath;\ +< \n :global FileGet;\ +< \n :global RmDir;\ +< \n :global WaitForFile;\ +< \n :global LogPrint;\ +< \n :local MkTmpfs do={\ +< \n :global WaitForFile;\ +< \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\ +< \n :if ([ :len \$TmpFs ] = 1) do={\ +< \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\ +< \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\ +< \n /disk/enable \$TmpFs;\ +< \n }\ +< \n :return true;\ +< \n }\ +< \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\ +< \n \$RmDir \"tmpfs\";\ +< \n :onerror Err {\ +< \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ +< /get total-memory ] / 3);\ +< \n \$WaitForFile \"tmpfs\";\ +< \n } do={\ +< \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ +< \_\$Err);\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n }\ +< \n :set Path [ \$CleanFilePath \$Path ];\ +< \n :if (\$Path = \"\") do={\ +< \n :return true;\ +< \n }\ +< \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\ +< \n :local PathVal [ \$FileGet \$Path ];\ +< \n :if (\$PathVal->\"type\" = \"directory\") do={\ +< \n \$LogPrint debug \$0 (\"... which already exists.\");\ +< \n :return true;\ +< \n }\ +< \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\ +< \n :if ([ \$MkTmpfs ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n }\ +< \n :onerror Err {\ +< \n /file/add type=\"directory\" name=\$Path;\ +< \n \$WaitForFile \$Path;\ +< \n } do={\ +< \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ +< : \" . \$Err);\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\ +< \n :return \$2;\ +< \n}\ +< \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\ +< \n :return \$2;\ +< \n}\ +< \n\ +< \n:set CharacterMultiply do={\ +< \n :local Str [ :tostr \$1 ];\ +< \n :local Num [ :tonum \$2 ];\ +< \n :if (\$Num = 0) do={:return \"\"}\ +< \n :local Return \"\";\ +< \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set CharacterReplace do={\ +< \n :local String [ :tostr \$1 ];\ +< \n :local ReplaceFrom [ :tostr \$2 ];\ +< \n :local ReplaceWith [ :tostr \$3 ];\ +< \n :local Return \"\";\ +< \n :if (\$ReplaceFrom = \"\") do={:return \$String}\ +< \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ +< \n :local Pos [ :find \$String \$ReplaceFrom ];\ +< \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ +< \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ +< \_\$String ] ];\ +< \n }\ +< \n :return (\$Return . \$String);\ +< \n}\ +< \n\ +< \n:set CleanFilePath do={\ +< \n :local Path [ :tostr \$1 ];\ +< \n :global CharacterReplace;\ +< \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ +< \"//\" \"/\" ]};\ +< \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ +< \_\$Path ] ]};\ +< \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ +< pick \$Path 0 ([ :len \$Path ] - 1) ]};\ +< \n :return \$Path;\ +< \n}\ +< \n\ +< \n:set IfThenElse do={\ +< \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ +< \$2};\ +< \n :return \$3;\ +< \n}\ +< \n\ +< \n:set EitherOr do={\ +< \n :global IfThenElse;\ +< \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ +< \$1 \$2 ]}\ +< \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ +< \_\$1 \$2 ]}\ +< \n# this works for boolean values, literal ones with parentheses\ +< \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\ +< \n}\ +< \n\ +< \n:set ParseKeyValueStore do={\ +< \n :local Source \$1;\ +< \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\ +< \n :do {\ +< \n :return [ :deserialize from=json \$Source ];\ +< \n } on-error={ }\ +< \n } \ +< \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ +< }\ +< \n :local Result ({});\ +< \n :foreach KeyValue in=[ :toarray \$Source ] do={\ +< \n :if ([ :find \$KeyValue \"=\" ]) do={\ +< \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\ +< \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ +< \_:len \$KeyValue ] ];\ +< \n :if (\$Value=\"true\") do={:set Value true}\ +< \n :if (\$Value=\"false\") do={:set Value false}\ +< \n :set (\$Result->\$Key) \$Value;\ +< \n } else={:set (\$Result->\$KeyValue) true}\ +< \n }\ +< \n :return \$Result;\ +< \n}\ +< \n:set RequiredRouterOS do={\ +< \n :local Caller [ :tostr \$1 ];\ +< \n :local Required [ :tostr \$2 ];\ +< \n :local Warn [ :tostr \$3 ];\ +< \n :global IfThenElse;\ +< \n :global LogPrint;\ +< \n :global VersionToNum;\ +< \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ +< \\\$\")) do={\ +< \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ +< \n :return false;\ +< \n }\ +< \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ +< e/update/get installed-version ] ]) do={\ +< \n :if (\$Warn = \"true\") do={\ +< \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ +< er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\ +< \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ +< es RouterOS \" . \$Required . \". Please update!\");\ +< \n }\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n:set VersionToNum do={\ +< \n :local Input [ :tostr \$1 ];\ +< \n :local Multi 0x1000000;\ +< \n :local Return 0;\ +< \n :global CharacterReplace;\ +< \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\ +< \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\ +< \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ +< \n }\ +< \n :foreach Value in=([ :toarray \$Input ], 0) do={\ +< \n :local Num [ :tonum \$Value ];\ +< \n :if (\$Multi = 0x100) do={\ +< \n :if ([ :typeof \$Num ] = \"num\") do={\ +< \n :set Return (\$Return + 0xff00);\ +< \n :set Multi (\$Multi / 0x100);\ +< \n } else={\ +< \n :if (\$Value = \"zero\") do={ }\ +< \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ +< }\ +< \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ +< \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\ +< \n }\ +< \n }\ +< \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ +< lue * \$Multi)); }\ +< \n :set Multi (\$Multi / 0x100);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n:set ScriptLock do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :local WaitMax [ :totime \$2 ];\ +< \n :global GetRandom20CharAlNum;\ +< \n :global IfThenElse;\ +< \n :global LogPrint;\ +< \n :global ScriptLockOrder;\ +< \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\ +< \n :set ScriptLockOrder ({});\ +< \n }\ +< \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\ +< \n :set (\$ScriptLockOrder->\$Script) ({});\ +< \n }\ +< \n :local JobCount do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ +< \n }\ +< \n :local TicketCount do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :global ScriptLockOrder;\ +< \n :local Count 0;\ +< \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +< \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ +< + 1)}\ +< \n }\ +< \n :return \$Count;\ +< \n }\ +< \n :local IsFirstTicket do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :local Check [ :tostr \$2 ];\ +< \n :global ScriptLockOrder;\ +< \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +< \n :if (\$Ticket = \$Check) do={:return true}\ +< \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ +< o={:return false}\ +< \n }\ +< \n :return false;\ +< \n }\ +< \n :local AddTicket do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :local Add [ :tostr \$2 ];\ +< \n :global ScriptLockOrder;\ +< \n :while (true) do={\ +< \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\ +< \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\ +< \n :delay 10ms;\ +< \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ +< e}\ +< \n }\ +< \n }\ +< \n :local RemoveTicket do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :local Remove [ :tostr \$2 ];\ +< \n :global ScriptLockOrder;\ +< \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\ +< \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\ +< \n :set (\$ScriptLockOrder->\$Script->\$Id);\ +< \n :delay 10ms;\ +< \n }\ +< \n }\ +< \n }\ +< \n :local CleanupTickets do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :global ScriptLockOrder;\ +< \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +< \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\ +< \n }\ +< \n :set (\$ScriptLockOrder->\$Script) ({});\ +< \n }\ +< \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\ +< \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ +< \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ +< \_exist!\");\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$JobCount \$Script ] = 0) do={\ +< \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ +< );\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\ +< \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ +< ript . \"', resetting!\");\ +< \n :set (\$ScriptLockOrder->\$Script) ({});\ +< \n /system/script/job/remove [ find where script=\$Script ];\ +< \n }\ +< \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\ +< \n \$AddTicket \$Script \$MyTicket;\ +< \n :local WaitInterval (\$WaitMax / 20);\ +< \n :local WaitTime \$WaitMax;\ +< \n :while (\$WaitTime > 0 && \\\ +< \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\ +< \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\ +< \n :set WaitTime (\$WaitTime - \$WaitInterval);\ +< \n :delay \$WaitInterval;\ +< \n }\ +< \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\ +< \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\ +< \n \$RemoveTicket \$Script \$MyTicket;\ +< \n \$CleanupTickets \$Script;\ +< \n :return true;\ +< \n }\ +< \n \$RemoveTicket \$Script \$MyTicket;\ +< \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ +< once\" . \\\ +< \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ +< \_lock\" \"\" ] . \"...\");\ +< \n :return false;\ +< \n}\ +< \n:set SendNotification do={ :onerror Err {\ +< \n :global SendNotification2;\ +< \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ +< \_silent=\$4 });\ +< \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ +< \n}\ +< \n:set SendNotification2 do={\ +< \n :local Notification \$1;\ +< \n :global NotificationFunctions;\ +< \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\ +< \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ +< ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\ +< \n }\ +< \n}\ +< \n:set SymbolByUnicodeName do={\ +< \n :local Name [ :tostr \$1 ];\ +< \n :global EitherOr;\ +< \n :global LogPrint;\ +< \n :global SymbolsExtra;\ +< \n :local Symbols ({\ +< \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\ +< \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\ +< \n \"arrow-down\"=\"\\E2\\AC\\87\";\ +< \n \"arrow-up\"=\"\\E2\\AC\\86\";\ +< \n \"calendar\"=\"\\F0\\9F\\93\\85\";\ +< \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\ +< \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\ +< \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\ +< \n \"cloud\"=\"\\E2\\98\\81\";\ +< \n \"cross-mark\"=\"\\E2\\9D\\8C\";\ +< \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\ +< \n \"fire\"=\"\\F0\\9F\\94\\A5\";\ +< \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\ +< \n \"gear\"=\"\\E2\\9A\\99\";\ +< \n \"heart\"=\"\\E2\\99\\A5\";\ +< \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\ +< \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\ +< \n \"information\"=\"\\E2\\84\\B9\";\ +< \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\ +< \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\ +< \n \"link\"=\"\\F0\\9F\\94\\97\";\ +< \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\ +< \n \"memo\"=\"\\F0\\9F\\93\\9D\";\ +< \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\ +< \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\ +< \n \"scissors\"=\"\\E2\\9C\\82\";\ +< \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\ +< \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\ +< \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\ +< \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\ +< \n \"sparkles\"=\"\\E2\\9C\\A8\";\ +< \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\ +< \n \"star\"=\"\\E2\\AD\\90\";\ +< \n \"warning-sign\"=\"\\E2\\9A\\A0\";\ +< \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\ +< \n }, \$SymbolsExtra);\ +< \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\ +< \n :local Special {\ +< \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\ +< \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\ +< \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\ +< \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\ +< \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\ +< \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ +< . \"'!\");\ +< \n :return \"\";\ +< \n }\ +< \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ +< me) ] . \"\\EF\\B8\\8F\");\ +< \n}\ +< \n:set SymbolForNotification do={\ +< \n :global NotificationsWithSymbols;\ +< \n :global SymbolByUnicodeName;\ +< \n :global IfThenElse;\ +< \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ +< \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\ +< \n :local Return \"\";\ +< \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ +< mbolByUnicodeName \$Symbol ])}\ +< \n :return (\$Return . \" \");\ +< \n}\ +< \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\ +< \n:set UrlEncode do={\ +< \n :local Input [ :tostr \$1 ];\ +< \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +< \n :local Return \"\";\ +< \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\ +< \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ +< %24\"; \"%25\"; \"%26\"; \"%27\";\ +< \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ +< \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\ +< \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ +< \"%7C\"; \"%7D\"; \"%7E\" };\ +< \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +< \n :local Char [ :pick \$Input \$I ];\ +< \n :local Replace [ :find \$Chars \$Char ];\ +< \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ +< ce)}\ +< \n :set Return (\$Return . \$Char);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n:set ValidateSyntax do={\ +< \n :local Code [ :tostr \$1 ];\ +< \n :global LogPrint;\ +< \n :onerror Err {\ +< \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\ +< \n } do={\ +< \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n:set IsDNSResolving do={\ +< \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ +< \n :return true;\ +< \n}\ +< \n:set IsFullyConnected do={\ +< \n :global IsDNSResolving;\ +< \n :global IsTimeSync;\ +< \n :if ([ \$IsDNSResolving ] = false) do={:return false};\ +< \n :if ([ \$IsTimeSync ] = false) do={:return false};\ +< \n :return true;\ +< \n}\ +< \n:set IsTimeSync do={\ +< \n :global IsTimeSyncCached;\ +< \n :global IsTimeSyncResetNtp;\ +< \n :if (\$IsTimeSyncCached = true) do={:return true}\ +< \n :if ([ /system/ntp/client/get enabled ] = true) do={\ +< \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\ +< \n :set IsTimeSyncCached true;\ +< \n :return true;\ +< \n }\ +< \n :local Uptime [ /system/resource/get uptime ];\ +< \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\ +< \n :set IsTimeSyncResetNtp \$Uptime;\ +< \n }\ +< \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\ +< \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ +< ;\ +< \n :set IsTimeSyncResetNtp \$Uptime;\ +< \n /system/ntp/client/set enabled=no;\ +< \n :delay 20ms;\ +< \n /system/ntp/client/set enabled=yes;\ +< \n :return false;\ +< \n }\ +< \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\ +< \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\ +< \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ +< ee license and x86.\";\ +< \n :return true;\ +< \n }\ +< \n :if ([ /ip/cloud/get update-time ] = true) do={\ +< \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\ +< \n :set IsTimeSyncCached true;\ +< \n :return true;\ +< \n }\ +< \n :return false;\ +< \n }\ +< \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ +< \n :return true;\ +< \n}\ +< \n\ +< \n# read parts of a large file\ +< \n:set FetchLargeFiles do={\ +< \n :local FetchLargeScript [:tostr \$1];\ +< \n :local fetchUrl [:tostr \$2];\ +< \n :local CheckCert [:tostr \$3];\ +< \n :local fetchMode [:tostr \$4];\ +< \n :local fetchMethod [:tostr \$5];\ +< \n :local FetchString \"undefined\";\ +< \n \ +< \n :global CleanName;\ +< \n :global FetchUserAgentStr;\ +< \n :global GetRandom20CharAlNum;\ +< \n :global IfThenElse;\ +< \n :global LogPrint;\ +< \n :global MkDir;\ +< \n :global RmDir;\ +< \n :global RmFile;\ +< \n :global WaitForFile;\ +< \n\ +< \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ +< ithout-crl\" ];\ +< \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ +< ode=\" . \$fetchMode)] ];\ +< \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ +< \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\ +< \n \ +< \n :local DirName (\"tmpfs/\" . [ \$CleanName \$FetchLargeScript ]);\ +< \n :if ([ \$MkDir \$DirName ] = false) do={\ +< \n \$LogPrint error \$0 (\"Failed creating directory!\");\ +< \n :return false;\ +< \n }\ +< \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ +< \$GetRandom20CharAlNum ]);\ +< \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ +< ttp-header-field=({ [ \$FetchUserAgentStr \$FetchLargeScript ] }) as-value\ +< ;\ +< \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\ +< \n :onerror Err {\ +< \n :set FetchString (\"/tool/fetch \" . \\\ +< \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ +< \_. \$fetchMethod . \"\\\" \")] . \\\ +< \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ +< \_. \"\\\") \" . \\\ +< \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ +< e . \" \")] . \\\ +< \n http-header-field=({ [ \$FetchUserAgentStr \$FetchLargeScript ] })\ +< \_as-value);\ +< \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\ +< \n :put [\$FetchString];\ +< \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ +< fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ +< \_\$FetchLargeScript ] }) as-value];\ +< \n } do={\ +< \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +< \n \$RmFile \$FileName;\ +< \n }\ +< \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ +< \_- \" . \$Err);\ +< \n \$RmDir \$DirName;\ +< \n :return false;\ +< \n }\ +< \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +< \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ +< \" did not show up.\");\ +< \n :return false;\ +< \n }\ +< \n :local FileSize [ /file/get \$FileName size ];\ +< \n :local Return \"\";\ +< \n :local VarSize 0;\ +< \n :while (\$VarSize != \$FileSize) do={\ +< \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ +< 768 file=\$FileName as-value ]->\"data\"));\ +< \n :set FileSize [ /file/get \$FileName size ];\ +< \n :set VarSize [ :len \$Return ];\ +< \n :if (\$VarSize > \$FileSize) do={\ +< \n :delay 100ms;\ +< \n }\ +< \n }\ +< \n \$RmDir \$DirName;\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set ScriptInstallUpdate do={ :onerror Err {\ +< \n :local Scripts [ :toarray \$1 ];\ +< \n :local NewComment [ :tostr \$2 ];\ +< \n :global InitSetup;\ +< \n\ +< \n :global CommitId;\ +< \n :global ScriptUpdatesCRLF;\ +< \n :global GlobalConfVersion;\ +< \n :global Identity;\ +< \n :global CertificateAvailable;\ +< \n :global CheckSumsVerify;\ +< \n :global GlobalScriptsUrl;\ +< \n :global SumsDirAndFileName;\ +< \n :global GlobalScriptsUrlSuffix;\ +< \n :global EitherOr;\ +< \n :global FetchUserAgentStr;\ +< \n :global Grep;\ +< \n :global IfThenElse;\ +< \n :global LogPrint;\ +< \n :global ParseKeyValueStore;\ +< \n :global RequiredRouterOS;\ +< \n :global SendNotification2;\ +< \n :global SymbolForNotification;\ +< \n :global ValidateSyntax;\ +< \n :global CommentsInScripts;\ +< \n\ +< \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\ +< \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ +< hout.\");\ +< \n }\ +< \n\ +< \n :foreach Script in=\$Scripts do={\ +< \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ +< \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\ +< \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ +< Vados\\n\" comment=\$NewComment;\ +< \n }\ +< \n }\ +< \n\ +< \n :local CommitIdBefore \$CommitId;\ +< \n :local GlobalConfVersionBefore \$GlobalConfVersion;\ +< \n :local ReloadGlobal false;\ +< \n :local DeviceMode [ /system/device-mode/get ];\ +< \n\ +< \n :if (\$CheckSumsVerify = true) do={\ +< \n :local CheckSums ({});\ +< \n :do {\ +< \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ +< iptsUrlSuffix);\ +< \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ +< \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ +< ficate=yes-without-crl \\\ +< \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ +< =user as-value ]->\"data\") ];\ +< \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\ +< \n }\ +< \n\ +< \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ +< s\" ] do={\ +< \n :local ScriptVal [ /system/script/get \$Script ];\ +< \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ +< ];\ +< \n :local SourceNew;\ +< \n\ +< \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ +< \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\ +< \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\ +< \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\ +< \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ +< iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ +< \"'!\");\ +< \n }\ +< \n }\ +< \n :do {\ +< \n :if (\$ScriptInfo->\"ignore\" = true) do={\ +< \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ +< e\" . \"', as requested.\");\ +< \n :error true;\ +< \n }\ +< \n :if (\$CheckSumsVerify = true) do={\ +< \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\ +< \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ +< ptInfo->\"url-suffix\") ] = 0 && \\\ +< \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ +< rce\") ] ] = \$CheckSum) do={\ +< \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ +< >\"name\" . \"' matches, ignoring.\");\ +< \n :error true;\ +< \n }\ +< \n }\ +< \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\ +< \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ +< fetch\" ] = false) do={\ +< \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ +< ng without.\");\ +< \n }\ +< \n }\ +< \n :onerror Err {\ +< \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ +< lScriptsUrl ];\ +< \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ +< lobalScriptsUrlSuffix ];\ +< \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ +< Suffix);\ +< \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ +< name\") . \"' from url: \" . \$Url);\ +< \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ +< \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ +< ut=user as-value ];\ +< \n :if (\$Result->\"status\" = \"finished\") do={\ +< \n :set SourceNew [ :tolf (\$Result->\"data\") ];\ +< \n } \ +< \n } do={\ +< \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ +< al->\"name\" . \"': \" . \$Err);\ +< \n :if (\$Err != \"Fetch failed with status 404\") do={\ +< \n :error false;\ +< \n }\ +< \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\ +< \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ +< \?\");\ +< \n /system/script/remove \$Script;\ +< \n :error false;\ +< \n }\ +< \n :if (\$CheckSumsVerify = true) do={\ +< \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ +< riptInfo->\"url-suffix\") ] = 0 && \\\ +< \n [ :len \$CheckSum ] = 0) do={\ +< \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ +< pdates with 'ignore=true' in comment.\");\ +< \n }\ +< \n }\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if ([ :len \$SourceNew ] = 0) do={\ +< \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ +< >\"name\") . \"'.\");\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :local SourceCRLF [ :tocrlf \$SourceNew ];\ +< \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ +< lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\ +< \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ +< \$ScriptVal->\"source\")) do={\ +< \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ +< . \"' source did not change. End of lines set to CRLF.\");\ +< \n if (\$ScriptUpdatesCRLF = false) do={\ +< \n :put [ :tolf \$SourceNew ];\ +< \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ +< ) . \"' source update end of lines to LF.\");\ +< \n }\ +< \n :error false;\ +< \n }\ +< \n }\ +< \n\ +< \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\ +< \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ +< l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ +< );\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if (\$CommentsInScripts = true) do={\ +< \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ +< \_\") ];\ +< \n :if ([ :len \$CommentLine ] = 0) do={\ +< \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ +< iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ +< noring!\");\ +< \n :error false;\ +< \n } else={\ +< \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ +< ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ +< ] + 2) [ :len \$CommentLine] ]) do={\ +< \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ +< \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ +< ;\ +< \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ +< ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\ +< \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ +< omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ +< ded!\");\ +< \n } else={\ +< \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ +< al->\"name\") . \"' did not change.\");\ +< \n :error false;\ +< \n }\ +< \n } \ +< \n }\ +< \n\ +< \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ +< \"\\23 requires RouterOS, \") ] ]->version);\ +< \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ +< \_false ] = false) do={\ +< \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ +< \") . \"' requires RouterOS \" . \\\ +< \n \$RequiredROS . \", which is not met by your installation. I\ +< gnoring!\");\ +< \n :error false;\ +< \n }\ +< \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ +< \\23 requires device-mode, \") ] ];\ +< \n :local MissingDM ({});\ +< \n :foreach Feature,Value in=\$RequiredDM do={\ +< \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ +< ceMode->\$Feature) = false) do={\ +< \n :set MissingDM (\$MissingDM, \$Feature);\ +< \n }\ +< \n }\ +< \n :if ([ :len \$MissingDM ] > 0) do={\ +< \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ +< \") . \"' requires disabled \" . \\\ +< \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ +< gnoring!\");\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\ +< \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ +< ScriptVal->\"name\") . \"' failed! Ignoring!\");\ +< \n :error false;\ +< \n }\ +< \n \ +< \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ +< ript comment: \" . (\$ScriptVal->\"comment\"));\ +< \n\ +< \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ +< Val->\"comment\") \\\ +< \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ +< F \$SourceNew ] \$Script;\ +< \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\ +< \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\ +< \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ +< o={\ +< \n :set ReloadGlobal true;\ +< \n }\ +< \n } on-error={ }\ +< \n }\ +< \n :if (\$ReloadGlobal = true) do={\ +< \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ +< \");\ +< \n :onerror Err {\ +< \n :global InitSetup (a);\ +< \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\ +< \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ +< ctions failed! \" . \$Err)}\ +< \n }\ +< \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\ +< \n \$LogPrint warning \$0 (\"The configuration version decreased from \ +< \" . \\\ +< \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\ +< \n \". Installed an older version\?\");\ +< \n }\ +< \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\ +< \n :global GlobalConfChanges;\ +< \n :global GlobalConfMigration;\ +< \n :local ChangeLogCode;\ +< \n :if ([ :len \$ChangeLogCode ] > 0) do={\ +< \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\ +< \n :onerror Err {\ +< \n [ :parse \$ChangeLogCode ];\ +< \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ +< . \$Err)}\ +< \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ +< dation!\")}\ +< \n }\ +< \n :if ([ :len \$GlobalConfMigration ] > 0) do={\ +< \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ +< \_do={\ +< \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\ +< \n :do {\ +< \n :if ([ :typeof \$Migration ] != \"str\") do={\ +< \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ +< \_\" is not available.\");\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\ +< \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ +< \_. \" failed syntax validation!\");\ +< \n :error false}\ +< \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ +< . \": \" . \$Migration);\ +< \n :onerror Err {\ +< \n [ :parse \$Migration ];\ +< \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ +< \_\$I . \" failed to run: \" . \$Err)}\ +< \n } on-error={ }\ +< \n }\ +< \n }\ +< \n :local NotificationMessage (\"The configuration version on \" . \$Id\ +< entity . \" increased \" . \\\ +< \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ +< d modification. \" . \\\ +< \n \"Please review and update global-config-overlay, then re-run glo\ +< bal-config.\");\ +< \n \$LogPrint info \$0 (\$NotificationMessage);\ +< \n :if ([ :len \$GlobalConfChanges ] > 0) do={\ +< \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ +< \");\ +< \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ +< \_do={\ +< \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\ +< \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ +< \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\ +< \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\ +< \n }\ +< \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ +< ws and changes are not available.\")}\ +< \n\ +< \n :set GlobalConfChanges;\ +< \n :set GlobalConfMigration;\ +< \n }\ +< \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ +< \n}\ +< \n\ +< \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\ +< \n:set GlobalEnvRemove do={\ +< \n :local doRmEnv [ :tostr \$1 ];\ +< \n :global GlobalScriptsUrl;\ +< \n :local ScriptsUrl;\ +< \n :global LogPrint;\ +< \n :if (\$doRmEnv != \"True\") do={\ +< \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ +< rue\\\" for confirm to remove global environment variables!\");\ +< \n :return [];\ +< \n :error true; \ +< \n } else={\ +< \n :set ScriptsUrl \$GlobalScriptsUrl;\ +< \n :delay 5;\ +< \n :foreach var in=[/system/script/environment print as-value] do={/sy\ +< stem/script/environment remove (\$var->\".id\")}\ +< \n :delay 5;\ +< \n :global GlobalScriptsUrl \$ScriptsUrl;\ +< \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\ +< \n :return [];\ +< \n :error false;\ +< \n }\ +< \n}\ +< \n\ +< \n# Add and fix global scheduler\ +< \n:put \"Add or/and fix Global scheduler...\";\ +< \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ +< ; }\";\ +< \n:local Comment \"Setup Global Environment for " +4004a1605,1629 +> 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="Windows Update script" disabled=yes 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" disabled=yes 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" disabled=yes name=\ +> create_mkdir_function_on_startup on-event=\ +> "/system script run create_mkdir_function;" policy=read,write,policy,test \ +> start-time=startup +4009a1635,1639 +> add comment="Scheduler for Amster-Backup-UpdateEmail" disabled=yes interval=\ +> 1w name=Amster-Backup-UpdateEmail on-event=\ +> "/system/script { run Amster-Backup-UpdateEmail; }" policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> start-date=2026-02-13 start-time=03:41:27 -- 2.52.0