From 3dbe7462bcf1d4eac607bee26699715cd0ff4b63 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Mon, 4 May 2026 19:40:58 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at May 04 19:40:58. --- .../20260504/20260504194001-Binary.backup | Bin 0 -> 252589 bytes .../20260504/20260504194001-Config.rsc | 4078 ++++++++++++++++ .../20260504/20260504194001-Diff-Config.rsc | 4326 +++++++++++++++++ 3 files changed, 8404 insertions(+) create mode 100644 MikroMaster/20260504/20260504194001-Binary.backup create mode 100644 MikroMaster/20260504/20260504194001-Config.rsc create mode 100644 MikroMaster/history/20260504/20260504194001-Diff-Config.rsc diff --git a/MikroMaster/20260504/20260504194001-Binary.backup b/MikroMaster/20260504/20260504194001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..190a174097bdf5576cacea20fe0c7489e016725f GIT binary patch literal 252589 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%0A*&+3KX)5lJ8TJ2Nb~1b41lSRDb7( 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⪼F0s2 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\"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\ + \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/588/3cafe107\";\ + \n:global CommitTAG \"unknown\";\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 19:35:03 04.05.2026.\";\ + \n\ + \n# The variables are received right here.\ + \n:global GlobalConfVersion 140;\ + \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 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 GetRandom20CharHex;\ + \n:global GetRandomNumber;\ + \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 ExitError;\ + \n:global ExitOnError;\ + \n\ + \n:global FetchHugeFiles;\ + \n:global FetchUserAgentStr;\ + \n:global FileExists;\ + \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 updateChannel;\ + \n :global PkgUpdStatus;\ + \n :global currentUpdateChannel;\ + \n :global ROsVerAvail;\ + \n :global arrDeviceInfo;\ + \n :log info (\$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 :log info (\$0 . \" Set updates channel to: \$updateChannel\");\ + \n }\ + \n :local Update [ /system/package/update/get ];\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\ + \n :set currentUpdateChannel \$Channel;\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\ + \n :local StatusPkg \"undefined\";\ + \n :log info (\$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 :log info (\$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 :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ + \n :log info (\$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 :local Status \"\";\ + \n :local Update;\ + \n :local WaitCount 0;\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\ + \n :return false;\ + \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 :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 :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 :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\ + \n:set GetRandom20CharAlNum do={\ + \n :global EitherOr;\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ + \n}\ + \n\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\ + \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: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: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: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: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:set FileExists do={\ + \n :local FileName [ :tostr \$1 ];\ + \n :local Type [ :tostr \$2 ];\ + \n :global FileGet;\ + \n :local FileVal [ \$FileGet \$FileName ];\ + \n :if (\$FileVal = false) do={ :return false; }\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\ + \n :return false;\ + \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 CleanFilePath do={\ + \n :local Path [ :tostr \$1 ];\ + \n :global CharacterReplace;\ + \n :while (\$Path ~ \"//\") do={\ + \n :set \$Path [ \$CharacterReplace \$Path \"//\" \"/\" ];\ + \n }\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={\ + \n :set Path [ :pick \$Path 1 [ :len \$Path ] ];\ + \n }\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={\ + \n :set Path [ :pick \$Path 0 ([ :len \$Path ] - 1) ];\ + \n }\ + \n :return \$Path;\ + \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={ :e\ + rror true; }\ + \n :set Char \"-\";\ + \n } on-error={\ + \n :set Char \"\";\ + \n }\ + \n }\ + \n :set Return (\$Return . \$Char);\ + \n }\ + \n :return \$Return;\ + \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={\ + \n :return false;\ + \n }\ + \n :local FileVal false;\ + \n :do {\ + \n :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 :log debug (\$0 . \" Removing directory: \". \$DirName);\ + \n :local DirVal [ \$FileGet \$DirName ];\ + \n :if (\$DirVal = false) do={\ + \n :log debug (\$0 . \" ... which does not exist.\");\ + \n :return true;\ + \n };\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\ + \n :return false;\ + \n };\ + \n :onerror Err {\ + \n /file/remove \$DirName;\ + \n } do={\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\ + \n :return false;\ + \n };\ + \n :return true;\ + \n}\ + \n\ + \n:set RmFile do={\ + \n :local FileName [ :tostr \$1 ];\ + \n :global FileGet;\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\ + \n :local FileVal [ \$FileGet \$FileName ];\ + \n :if (\$FileVal = false) do={\ + \n :log debug (\$0 . \" ... which does not exist.\");\ + \n :return true;\ + \n }\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \n :return false;\ + \n }\ + \n :onerror Err {\ + \n /file/remove \$FileName;\ + \n } do={\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\ + \n }\ + \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\ + \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 :log info (\$0 . \" The tmpfs is disabled, enabling.\");\ + \n /disk/enable \$TmpFs;\ + \n }\ + \n :return true;\ + \n }\ + \n :log 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 :log 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 :log debug (\$0 . \" Making directory: \" . \$Path);\ + \n :local PathVal [ \$FileGet \$Path ];\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\ + \n :log 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 :log 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 [ :le\ + n \$Path ] ]; }\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\ + \n :return \$Path;\ + \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={ :e\ + rror true; }\ + \n :set Char \"-\";\ + \n } on-error={\ + \n :set Char \"\";\ + \n }\ + \n }\ + \n :set Return (\$Return . \$Char);\ + \n }\ + \n :return \$Return;\ + \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 VersionToNum;\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\ + \n :log 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 :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 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\ + \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\ + \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\ + \n:set ScriptLock do={\ + \n :local Script [ :tostr \$1 ];\ + \n :local WaitMax [ :totime \$2 ];\ + \n :global GetRandom20CharAlNum;\ + \n :global IfThenElse;\ + \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 :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\ + \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 :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', 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\ + \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\ + \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\ + \n:set SymbolByUnicodeName do={\ + \n :local Name [ :tostr \$1 ];\ + \n :global EitherOr;\ + \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 :log 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\ + \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\ + \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\ + \n:set IsDNSResolving do={\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ + \n :return true;\ + \n}\ + \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\ + \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# Description of parameters:\ + \n# \$1 - script name for logging and user agent\ + \n# \$2 - url to fetch from\ + \n# \$3 - check-certificate value for /tool/fetch (true/false)\ + \n# \$4 - mode value for /tool/fetch (optional, e.g. \"keep-broken\", \"ht\ + tps-only\", \"http-only\"\ + \n# \"no-redirects\", \"background\", \"background-and-keep-broken\",\ + \_\"background-and-https-only\",\ + \n# \"background-and-http-only\", \"background-and-no-redirects\", \"\ + background-and-keep-broken-and-https-only\", \"background-and-keep-broken-\ + and-http-only\",\ + \n# \"background-and-keep-broken-and-no-redirects\")\ + \n# \$5 - fetch method for /tool/fetch (optional, e.g. \"get\", \"head\", \ + \"post\", \"put\", \"patch\", \"delete\")\ + \n#:set FetchLargeFiles do={\ + \n# :local RunName [:tostr \$1];\ + \n# :local fetchUrl [:tostr \$2];\ + \n# :local fetchFile [:tostr \$3];\ + \n# :local CheckCert [:tostr \$4];\ + \n# :local fetchMode [:tostr \$5];\ + \n# :local fetchMethod [:tostr \$6];\ + \n# :local tmpName;\ + \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-\ + without-crl\" ];\ + \n#\ + \n# :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\ + \n# :local DirName (\"tmpfs/\" . \$tmpName);\ + \n# :if ([ \$MkDir \$DirName ] = false) do={\ + \n# :log error (\$RunName . \" Failed creating directory: \" . \$DirNam\ + e . \"!\");\ + \n# :return false;\ + \n# }\ + \n#\ + \n# :local FileName (\$DirName . \"/\" . [ \$CleanName \$fetchFile ] . \"\ + -\" . [ \$GetRandom20CharAlNum 5 ]);\ + \n# :local Url (\$fetchUrl . \$fetchFile);\ + \n# :onerror Err {\ + \n# /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName\ + \_\\\ + \n# http-header-field=({ [ \$FetchUserAgentStr \$RunName ] }) as-valu\ + e;\ + \n# } do={\ + \n# :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ + \n# \$RmFile \$FileName;\ + \n# }\ + \n# :log error (\$RunName . \" Failed downloading from '\" . \$Url . \"\ + ' - \" . \$Err);\ + \n# \$RmDir \$DirName;\ + \n# :return false;\ + \n# }\ + \n#\ + \n# :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ + \n# :log error (\$RunName . \" 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=3\ + 2768 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## \$RmFile \$FileName;\ + \n# \$RmDir \$DirName;\ + \n# :return \$Return;\ + \n#}\ + \n\ + \n:set FetchHugeFiles do={\ + \n :local ScriptName [ :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 \$ScriptName ]);\ + \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 \$ScriptName ] }) as-va\ + lue;\ + \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 :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 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={\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ + \n} }\ + \n\ + \n# load modules\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\ + \n :local ScriptVal [ /system/script/get \$Script ];\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\ + \n :onerror Err {\ + \n /system/script/run \$Script;\ + \n } do={\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\ + \n }\ + \n } else={\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\ + \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 \"Every Day Set Global Environment Variables\";\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\ + \n}\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\ + \n}\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\ + \n}\ + \n# Add Update Script scheduler\ + \n:put \"Add or/and fix Update Script scheduler\";\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \n:set Comment \"Every Day Check For Update Scripts\";\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\ + \n}\ + \n\ + \n:onerror Err {\ + \n :global GlobalConfReady;\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\ + \n\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\ + \n # signal we are ready\ + \n:set GlobalFuncReady true;\ + \n:set ExitOK true;\ + \n\ + \n:log info (\$0 . \"Global configs ready!\");\ + \n} do={\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ + \n}\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/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 +add comment="Every Day Set Global Environment Variables" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +/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/20260504194001-Diff-Config.rsc b/MikroMaster/history/20260504/20260504194001-Diff-Config.rsc new file mode 100644 index 0000000..cc76d0d --- /dev/null +++ b/MikroMaster/history/20260504/20260504194001-Diff-Config.rsc @@ -0,0 +1,4326 @@ +512c512,513 +< add dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +--- +> add comment="Script for setup routeros script system" \ +> dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +724,753c725,755 +< 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.\ +--- +> add comment="Global Config Script" dont-require-permissions=no name=\ +> AM-GlobalConfig owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +> !rsc by Vados\r\ +> \n# RouterOS script: AM-GlobalConfig\r\ +> \n# Script comment: Global Config Script\r\ +> \n# Copyright (c) 2007-2026 Vados \r\ +> \n#\r\ +> \n#\r\ +> \n# Warning: Dont touch this line!\r\ +> \n:global Identity [ /system identity get name ];\r\ +> \n:global GlobalConfReady false;\r\ +> \n#\r\ +> \n#\r\ +> \n# Global Url For Amster scripts to fetch\r\ +> \n# most be defined in AM-Init-Script or AM-setup scripts\r\ +> \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +> \n:global ScriptsUrlSuffix \"\";\r\ +> \n:global CheckSumsVerify true;\r\ +> \n\r\ +> \n:global ScriptUpdatesCRLF true;\r\ +> \n:global CommentsInScripts true;\r\ +> \n\r\ +> \n# Debug output:\r\ +> \n:global PrintDebug true; #false;\r\ +> \n\r\ +> \n# Debug output for specific script:\r\ +> \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ +> \n\r\ +> \n# Debug logs\r\ +> \n# Other actions (disk, email, remote or support) can be used as well.\r\ +755,764c757,766 +< 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\ +--- +> eworm.de/main/DEBUG.html#debug-output).\r\ +> \n#/system/logging/add topics=script,debug action=memory;\r\ +> \n\r\ +> \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ +> \n:global Domain \"WORKGROUP\";\r\ +> \n\r\ +> \n:global EmailGeneralTo \"vados@vados.ru\";\r\ +> \n#:global EmailGeneralCc \"\";\r\ +> \n\r\ +> \n# \$ScriptInstallUpdate mod/notification-telegram\r\ +766,769c768,771 +< \";\ +< \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\ +< \n# Use this to send notifications to a specific topic in group.\ +< \n#:global TelegramThreadId \"30\";\ +--- +> \";\r\ +> \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ +> \n# Use this to send notifications to a specific topic in group.\r\ +> \n#:global TelegramThreadId \"30\";\r\ +771,794c773,796 +< !)\ +< \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\ +--- +> !)\r\ +> \n# or user names. Groups allow to chat with devices simultaneously.\r\ +> \n:global TelegramChatIdsTrusted {\r\ +> \n \"454403445\"\r\ +> \n \"-1003631309063\"\r\ +> \n \"-5124482807\"\r\ +> \n \"1087968824\";\r\ +> \n};\r\ +> \n# \"-5294757340\";\r\ +> \n\r\ +> \n:global TelegramChatGroups \"(all)\";\r\ +> \n#:global TelegramChatGroups \"(all|home|office)\";\r\ +> \n\r\ +> \n:global NotificationFunctions {\r\ +> \n \"email\"\r\ +> \n \"telegram\";\r\ +> \n};\r\ +> \n# Toggle this to disable symbols in notifications.\r\ +> \n:global NotificationsWithSymbols true;\r\ +> \n:global TerminalColorOutput true;\r\ +> \n\r\ +> \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ +> \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ +> \n\r\ +796,798c798,800 +< ent\ +< \n:global updateChannel \"stable\";\ +< \n\ +--- +> ent\r\ +> \n:global updateChannel \"stable\";\r\ +> \n\r\ +800,814c802,816 +< \");\ +< \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,\ +--- +> \");\r\ +> \n:global CertRenewTime 2w;\r\ +> \n:global CertRenewPass {\r\ +> \n \"\";\r\ +> \n# \"v3ry-s3cr3t\";\r\ +> \n# \"4n0th3r-s3cr3t\";\r\ +> \n};\r\ +> \n:global CertWarnTime 1w;\r\ +> \n:global CertIssuedExportPass {\r\ +> \n \"\";\r\ +> \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ +> \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ +> \n};\r\ +> \n\r\ +> \n# Script BackupAndUpdate mode, possible values: backup,\r\ +816c818 +< n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \ +--- +> n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ +818c820 +< \_(ignores `forceBackup`)\ +--- +> \_(ignores `forceBackup`)\r\ +820,878c822,880 +< \_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\ +--- +> \_without updates\r\ +> \n# osnotify - Set `forceBackup` to always create backups on every run\r\ +> \n:global DevInfoIncludeIP true;\r\ +> \n:global BackupAndUpdateMode \"osnotify\"\r\ +> \n\r\ +> \n:global forceBackup true;\r\ +> \n:global BackupPassword \"Peskar55\";\r\ +> \n\r\ +> \n# SFTP Backup Variables\r\ +> \n:global BackupRandomDelay 0;\r\ +> \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ +> \n:global BackupUploadUser \$Identity;\r\ +> \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ +> \n\r\ +> \n:global BackupSendBinary true;\r\ +> \n:global BackupSendExport true;\r\ +> \n:global BackupSendGlobalConfig true;\r\ +> \n:global BackupSendScripts true;\r\ +> \n\r\ +> \n# Remove local file after uploading if no errors\r\ +> \n:global BackupRmLocal true;\r\ +> \n\r\ +> \n# Local Backups Root Directory \r\ +> \n:global BackupLocalRoot \"tmpfs\";\r\ +> \n\r\ +> \n# Encrypt Backup\r\ +> \n:global BackupEncrypt true;\r\ +> \n\r\ +> \n# Sensitive information in Backups\r\ +> \n:global BackupSens true;\r\ +> \n\r\ +> \n# User Export\r\ +> \n:global BackupUser true;\r\ +> \n\r\ +> \n# License Export (not for CHR, will silently skip)\r\ +> \n:global BackupLicense false;\r\ +> \n\r\ +> \n# SSH Keys\r\ +> \n:global BackupSshKeys true;\r\ +> \n\r\ +> \n# Certificate Export\r\ +> \n:global BackupCerts true;\r\ +> \n\r\ +> \n# Certificate Password\r\ +> \n:global BackupCertsPasswd \"\";\r\ +> \n\r\ +> \n# User-Manager Export\r\ +> \n:global BackupUserMan false;\r\ +> \n\r\ +> \n# The Dude Export\r\ +> \n:global BackupDude false;\r\ +> \n\r\ +> \n# User Files to export, comma-separated string or array of strings\r\ +> \n# User Files are not removed on backup\r\ +> \n# Any directory paths will be removed (/ -> _) on remote file\r\ +> \n# Nonpresent files are silently skipped\r\ +> \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ +> \n\r\ +> \n# load functions and any custom scripts\r\ +880c882 +< erlay\" ], \\\ +--- +> erlay\" ], \\\r\ +882,883c884,885 +< verlay\\\\.d/.\" ]\ +< \n#\ +--- +> verlay\\\\.d/.\" ]\r\ +> \n#\r\ +886,888c888,891 +< \n# :onerror Err {\ +< \n# /system/script/run \$Script;\ +< \n# } do={\ +--- +> \r\ +> \n# :onerror Err {\r\ +> \n# /system/script/run \$Script;\r\ +> \n# } do={\r\ +890,894c893,897 +< \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\ +< \n# }\ +< \n#}\ +< \n#:log info \"\\ndevMode = \$devMode\";\ +< \n#:log info \"\\ndevRunning = \$devRunning\";\ +--- +> \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ +> \n# }\r\ +> \n#}\r\ +> \n#:log info \"\\ndevMode = \$devMode\";\r\ +> \n#:log info \"\\ndevRunning = \$devRunning\";\r\ +896,899c899,902 +< GlobalRUN\\r\?\\n\" ] do={\ +< \n :onerror Err {\ +< \n /system/script/run \$Script;\ +< \n } do={\ +--- +> GlobalRUN\\r\?\\n\" ] do={\r\ +> \n :onerror Err {\r\ +> \n /system/script/run \$Script;\r\ +> \n } do={\r\ +901,907c904,910 +< ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\ +< \n }\ +< \n}\ +< \n\ +< \n# signal we are ready\ +< \n:set GlobalConfReady true;\ +< \n:while (\$GlobalConfReady != true) do={:delay 500ms};\ +--- +> ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n# signal we are ready\r\ +> \n:set GlobalConfReady true;\r\ +> \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ +909,923c912,927 +< 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\ +< \n:local ScriptName [ :jobname ];\ +< \n#:global checkRunJob \$SriptName;\ +< \n#:global fixCRLF;\ +< \n#:if (\$fixCRLF != false) do={\ +--- +> add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ +> owner=AM-GlobalFunc policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +> !rsc by Vados\r\ +> \n# RouterOS script: AM-GglobalFunc\r\ +> \n# Script comment: Global functions\r\ +> \n# Copyright (c) 2005-2026 Vados \r\ +> \n#\r\ +> \n#\r\ +> \n# requires RouterOS, version=7.19\r\ +> \n# requires device-mode, fetch, scheduler\r\ +> \n\r\ +> \n:local ScriptName [ :jobname ];\r\ +> \n#:global checkRunJob \$SriptName;\r\ +> \n#:global fixCRLF;\r\ +> \n#:if (\$fixCRLF != false) do={\r\ +926c930 +< }\ +--- +> }\r\ +928,934c932,938 +< et \$fixScript source ] ] \$fixScript};};\ +< \n#}\ +< \n:global GlobalFuncReady false;\ +< \n\ +< \n# Git commit id & info, expected configuration version\ +< \n:global CommitId \"main/588/3cafe107\";\ +< \n:global CommitTAG \"unknown\";\ +--- +> et \$fixScript source ] ] \$fixScript};};\r\ +> \n#}\r\ +> \n:global GlobalFuncReady false;\r\ +> \n\r\ +> \n# Git commit id & info, expected configuration version\r\ +> \n:global CommitId \"main/576/0cc4cd57\";\r\ +> \n:global CommitTAG \"unknown\";\r\ +936,1072c940,1075 +< r: root, in 19:35:03 04.05.2026.\";\ +< \n\ +< \n# The variables are received right here.\ +< \n:global GlobalConfVersion 140;\ +< \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 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 GetRandom20CharHex;\ +< \n:global GetRandomNumber;\ +< \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 ExitError;\ +< \n:global ExitOnError;\ +< \n\ +< \n:global FetchHugeFiles;\ +< \n:global FetchUserAgentStr;\ +< \n:global FileExists;\ +< \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 updateChannel;\ +< \n :global PkgUpdStatus;\ +< \n :global currentUpdateChannel;\ +< \n :global ROsVerAvail;\ +< \n :global arrDeviceInfo;\ +< \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \ +< \n :local CurrentChannel [ /system/package/update/get channel ];\ +--- +> r: root, in 16:45:02 04.05.2026.\";\r\ +> \n\r\ +> \n# The variables are received right here.\r\ +> \n:global GlobalConfVersion 140;\r\ +> \n\r\ +> \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ +> \n\r\ +> \n:global Identity [/system/identity/get name];\r\ +> \n:global IdentityShort [:pick \$Identity 0 18];\r\ +> \n\r\ +> \n:global devBoardName [/system/resource/get board-name];\r\ +> \n:global devMode [/system/device-mode/get mode];\r\ +> \n:global devCurArch [/system/resource/get architecture-name];\r\ +> \n:global devCurVersion [/system/resource/get version];\r\ +> \n\r\ +> \n# Variables defined in AM-GlobalConfig.rsc\r\ +> \n:global TerminalColorOutput;\r\ +> \n:global CommentsInScripts;\r\ +> \n:global DetectIpAddrDefault;\r\ +> \n:global DetectIpAddrFallback;\r\ +> \n:global updateChannel;\r\ +> \n:global Domain;\r\ +> \n:global EmailGeneralTo;\r\ +> \n:global BackupAndUpdateMode;\r\ +> \n\r\ +> \n# Single functions, without nested functions.\r\ +> \n:global GlobalEnvRemove;\r\ +> \n:global MiniDateTimeStamp;\r\ +> \n\r\ +> \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ +> \n:global LogPrint;\r\ +> \n\r\ +> \n# DeviceInfo and Updates\r\ +> \n:global IsCheckUpdates;\r\ +> \n:global WaitCheckUpdates;\r\ +> \n:global GetPubIp;\r\ +> \n\r\ +> \n:global GetArrDeviceInfo;\r\ +> \n:global WaitArrDeviceInfo;\r\ +> \n\r\ +> \n:global devModel;\r\ +> \n:global devRunningMode;\r\ +> \n\r\ +> \n:global devRbRevision;\r\ +> \n:global devRbSerialNumber;\r\ +> \n:global devRbVerAvail;\r\ +> \n\r\ +> \n:global runningChannelVersion;\r\ +> \n:global runningChannel;\r\ +> \n:global runningVersion;\r\ +> \n\r\ +> \n:global devBuildTime;\r\ +> \n:global ROsVerAvail;\r\ +> \n:global PkgUpdStatus;\r\ +> \n:global currentUpdateChannel;\r\ +> \n\r\ +> \n:global ScriptInstallUpdate;\r\ +> \n\r\ +> \n:global DeviceInfo;\r\ +> \n\r\ +> \n:global OldMode;\r\ +> \n\r\ +> \n:global ParseKeyValueStore;\r\ +> \n:global RandomDelay;\r\ +> \n:global GetRandomNumber;\r\ +> \n:global EscapeForRegEx;\r\ +> \n:global ExitError;\r\ +> \n:global ExitOnError;\r\ +> \n:global CharacterMultiply;\r\ +> \n:global CharacterReplace;\r\ +> \n:global CleanFilePath;\r\ +> \n:global CleanName;\r\ +> \n\r\ +> \n:global CommitBrief;\r\ +> \n\r\ +> \n:global EitherOr;\r\ +> \n:global FormatLine;\r\ +> \n:global GetRandom20CharAlNum;\r\ +> \n:global GetRandom20CharHex;\r\ +> \n:global GetRandomNumber;\r\ +> \n:global Grep;\r\ +> \n:global IfThenElse;\r\ +> \n:global MAX;\r\ +> \n:global MIN;\r\ +> \n:global HumanReadableNum;\r\ +> \n\r\ +> \n:global IsFullyConnected;\r\ +> \n:global IsDNSResolving;\r\ +> \n:global IsTimeSync;\r\ +> \n:global IsTimeSyncCached;\r\ +> \n:global IsTimeSyncResetNtp;\r\ +> \n\r\ +> \n:global WaitDNSResolving;\r\ +> \n:global WaitFullyConnected;\r\ +> \n:global WaitTimeSync;\r\ +> \n:global MkDir;\r\ +> \n:global RmDir;\r\ +> \n:global RmFile;\r\ +> \n:global FileGet;\r\ +> \n:global Unix2Dos;\r\ +> \n:global UrlEncode;\r\ +> \n:global WaitForFile;\r\ +> \n:global ScriptLock;\r\ +> \n:global SendTelegram;\r\ +> \n:global NotificationFunctions;\r\ +> \n:global SendNotification;\r\ +> \n:global SendNotification2;\r\ +> \n:global SymbolForNotification;\r\ +> \n:global SymbolByUnicodeName;\r\ +> \n:global ValidateSyntax;\r\ +> \n:global CheckSumsVerify;\r\ +> \n:global GlobalConfChanges;\r\ +> \n:global GlobalConfMigration;\r\ +> \n:global VersionToNum;\r\ +> \n:global RequiredRouterOS;\r\ +> \n\r\ +> \n:global FetchUserAgentStr;\r\ +> \n:global CertificateAvailable;\r\ +> \n:global CertificateDownload;\r\ +> \n:global CertificateNameByCN;\r\ +> \n:global CharacterMultiply;\r\ +> \n:global FetchLargeFiles;\r\ +> \n:global InspectVar;\r\ +> \n:global InspectVarRet;\r\ +> \n:global ParseCustom;\r\ +> \n\r\ +> \n:set IsCheckUpdates do={\r\ +> \n :local isInfo [:tobool \$1];\r\ +> \n :global LogPrint;\r\ +> \n :global updateChannel;\r\ +> \n :global PkgUpdStatus;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n :global arrDeviceInfo;\r\ +> \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ +> \n :local CurrentChannel [ /system/package/update/get channel ];\r\ +1074c1077 +< el) do={\ +--- +> el) do={\r\ +1076,1084c1079,1091 +< \_delay=300ms max=5 on-error={};\ +< \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\ +< \n }\ +< \n :local Update [ /system/package/update/get ];\ +< \n :local Channel [ :tostr (\$Update->\"channel\") ];\ +< \n :set currentUpdateChannel \$Channel;\ +< \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\ +< \n :local StatusPkg \"undefined\";\ +< \n :log info (\$0 . \" Checking for updates...\");\ +--- +> \_delay=300ms max=5 on-error={};\r\ +> \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ +> \r\ +> \n }\r\ +> \n\r\ +> \n :local Update [ /system/package/update/get ];\r\ +> \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set currentUpdateChannel \$Channel;\r\ +> \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ +> \n\r\ +> \n\r\ +> \n :local StatusPkg \"undefined\";\r\ +> \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ +1086,1088c1093,1095 +< dates without-paging as-value]->\"status\")} \\\ +< \n delay=300ms max=5 on-error={};\ +< \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\ +--- +> dates without-paging as-value]->\"status\")} \\\r\ +> \n delay=300ms max=5 on-error={};\r\ +> \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ +1090c1097 +< s true; } else={ :set PkgUpdStatus false; }\ +--- +> s true; } else={ :set PkgUpdStatus false; }\r\ +1092,1098c1099,1105 +< ] ];\ +< \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +< \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ +< \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +< \n }\ +--- +> ] ];\r\ +> \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +> \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ +> \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +> \n }\r\ +1100,1119c1107,1129 +< 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 :local Status \"\";\ +< \n :local Update;\ +< \n :local WaitCount 0;\ +< \n :if ([ \$IsCheckUpdates true ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +--- +> kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ +> \n :return true;\r\ +> \n } else={\r\ +> \n :return \$PkgUpdStatus;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitCheckUpdates do={\r\ +> \n :global IsCheckUpdates;\r\ +> \n :global PkgUpdStatus;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n :global arrDeviceInfo;\r\ +> \n\r\ +> \n :local Status \"\";\r\ +> \n :local Update;\r\ +> \n :local WaitCount 0;\r\ +> \n\r\ +> \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +1121,1137c1131,1149 +< \") && \$WaitCount < 60) do={\ +< \n :delay 1s;\ +< \n :set WaitCount (\$WaitCount + 1);\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +< \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;\ +--- +> \") && \$WaitCount < 60) do={\r\ +> \n :delay 1s;\r\ +> \n :set WaitCount (\$WaitCount + 1);\r\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +> \n }\r\ +> \n\r\ +> \n :set Update [ /system/package/update/get ];\r\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +> \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ +> \n :set PkgUpdStatus true;\r\ +> \n } else={\r\ +> \n :set PkgUpdStatus false;\r\ +> \n }\r\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +> \n }\r\ +> \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ +> \n\r\ +1139,1182c1151,1195 +< 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 :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\ +--- +> do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitArrDeviceInfo do={\r\ +> \n :global GetArrDeviceInfo;\r\ +> \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ +> \n :delay 1s;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set GetArrDeviceInfo do={\r\ +> \n :global LogPrint;\r\ +> \n :global arrDeviceInfo;\r\ +> \n\r\ +> \n :global devBoardName;\r\ +> \n :global devModel;\r\ +> \n :global devRunning;\r\ +> \n :global devCurArch;\r\ +> \n :global devRbRevision;\r\ +> \n :global devRbSerialNumber;\r\ +> \n :global devBuildTime;\r\ +> \n :global runningChannelVersion;\r\ +> \n :global runningChannel;\r\ +> \n :global runningVersion;\r\ +> \n :global currentUpdateChannel;\r\ +> \n :global ROsVerAvail;\r\ +> \n\r\ +> \n :local DeviceInfo;\r\ +> \n :local Resource [/system/resource/get];\r\ +> \n :local Update [ /system/package/update/get ];\r\ +> \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ +> \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ +> \n :local RouterBoard;\r\ +> \n :local IsRouterBoard false;\r\ +> \n :local RunningMode \"\";\r\ +> \n\r\ +> \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ +> \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ +> \n :set runningChannelVersion \$VersionString;\r\ +> \n :set runningVersion \$VersionString;\r\ +> \n :set runningChannel \"\";\r\ +> \n\r\ +1184,1185c1197,1198 +< {\ +< \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\ +--- +> {\r\ +> \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ +1187,1188c1200,1201 +< len \$VersionString ] ];\ +< \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\ +--- +> len \$VersionString ] ];\r\ +> \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ +1190,1193c1203,1207 +< \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\ +< \n }\ +< \n }\ +< \n\ +--- +> \r\ +> \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +1195,1218c1209,1232 +< \_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\") ];\ +--- +> \_3] != \"x86\") do={\r\ +> \n :do {\r\ +> \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ +> \n# :set RouterBoard [ /system/routerboard/get ];\r\ +> \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ +> \n :set IsRouterBoard true;\r\ +> \n }\r\ +> \n } on-error={}\r\ +> \n }\r\ +> \n\r\ +> \n :do {\r\ +> \n :set RunningMode [ /system/device-mode/get mode ];\r\ +> \n } on-error={\r\ +> \n :do {\r\ +> \n :set RunningMode [ /system/device-mode/get running ];\r\ +> \n } on-error={\r\ +> \n :set RunningMode \"\";\r\ +> \n }\r\ +> \n }\r\ +> \n :set devRunning \$RunningMode;\r\ +> \n\r\ +> \n :if (\$IsRouterBoard = true) do={\r\ +> \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ +> \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ +1220,1236c1234,1250 +< ];\ +< \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;\ +--- +> ];\r\ +> \n } else={\r\ +> \n :set devModel \$devBoardName;\r\ +> \n :set devRbRevision \"\";\r\ +> \n :set devRbSerialNumber \"\";\r\ +> \n }\r\ +> \n\r\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +> \n\r\ +> \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ +> \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ +> \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ +> \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ +> \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ +> \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ +> \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ +1238,1241c1252,1255 +< ion;\ +< \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\ +< \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\ +< \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\ +--- +> ion;\r\ +> \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ +> \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ +> \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ +1243c1257 +< current-firmware\") ];\ +--- +> current-firmware\") ];\r\ +1245,1246c1259,1260 +< upgrade-firmware\") ];\ +< \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\ +--- +> upgrade-firmware\") ];\r\ +> \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ +1248,1249c1262,1263 +< alled-version\") ];\ +< \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\ +--- +> alled-version\") ];\r\ +> \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ +1251,1275c1265,1289 +< ) ];\ +< \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) \\\ +--- +> ) ];\r\ +> \n\r\ +> \n :set arrDeviceInfo \$DeviceInfo;\r\ +> \n :return \$DeviceInfo;\r\ +> \n}\r\ +> \n\r\ +> \n:set DeviceInfo do={\r\ +> \n :global GetArrDeviceInfo;\r\ +> \n :global GlobalConfVersion;\r\ +> \n :global Identity;\r\ +> \n :global IfThenElse;\r\ +> \n :global FormatLine;\r\ +> \n :global CommitBrief;\r\ +> \n\r\ +> \n :local License [/system/license/get];\r\ +> \n :local Snmp [ /snmp/get ];\r\ +> \n :local Info [ \$GetArrDeviceInfo ];\r\ +> \n\r\ +> \n :if ([ :typeof \$Info ] != \"array\") do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :return ( \\\r\ +> \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ +1277,1278c1291,1292 +< \_. \\\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\ +--- +> \_. \\\r\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ +1280,1281c1294,1295 +< \_\\\ +< \n \"Hardware:\\n\" . \\\ +--- +> \_\\\r\ +> \n \"Hardware:\\n\" . \\\r\ +1283c1297 +< \\\ +--- +> \\\r\ +1285,1289c1299,1303 +< n\" . \\\ +< \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\ +< \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\ +--- +> n\" . \\\r\ +> \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ +> \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ +1291,1292c1305,1306 +< \\n\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\ +--- +> \\n\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ +1294,1296c1308,1310 +< \")) ] . \"\\n\") ] . \\\ +< \n \"RouterOS:\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\ +--- +> \")) ] . \"\\n\") ] . \\\r\ +> \n \"RouterOS:\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ +1298c1312 +< \")) ] . \"\\n\") ] . \\\ +--- +> \")) ] . \"\\n\") ] . \\\r\ +1300c1314 +< \\n\" . \\\ +--- +> \\n\" . \\\r\ +1302,1303c1316,1317 +< \_\"\\n\" . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\ +--- +> \_\"\\n\" . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ +1305c1319 +< \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\ +--- +> \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ +1307,1308c1321,1322 +< \"\\n\") ] . \\\ +< \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\ +--- +> \"\\n\") ] . \\\r\ +> \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ +1310c1324 +< \_\\\ +--- +> \_\\\r\ +1312,1313c1326,1327 +< \_\"\\n\") ] . \\\ +< \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\ +--- +> \_\"\\n\") ] . \\\r\ +> \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ +1315c1329 +< ) \\\ +--- +> ) \\\r\ +1317,1322c1331,1336 +< \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\ +< \n \"RouterOS-Scripts:\\n\" . \\\ +< \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\ +< \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\ +< \n}\ +< \n\ +--- +> \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ +> \n \"RouterOS-Scripts:\\n\" . \\\r\ +> \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ +> \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ +> \n}\r\ +> \n\r\ +1324,1327c1338,1341 +< tionFunctions ({})}\ +< \n\ +< \n:set GetRandom20CharAlNum do={\ +< \n :global EitherOr;\ +--- +> tionFunctions ({})}\r\ +> \n\r\ +> \n:set GetRandom20CharAlNum do={\r\ +> \n :global EitherOr;\r\ +1329,1331c1343,1345 +< FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ +< \n}\ +< \n\ +--- +> FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ +> \n}\r\ +> \n\r\ +1333c1347 +< \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\ +--- +> \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ +1335,1341c1349,1355 +< \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\ +< \n\ +< \n:global checkRunJob;\ +< \n:set checkRunJob do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :global ScriptLock; \ +< \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\ +--- +> \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ +> \n\r\ +> \n:global checkRunJob;\r\ +> \n:set checkRunJob do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLock; \r\ +> \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ +1343c1357 +< :set Job [ /system/script/job/get \$Job ];\ +--- +> :set Job [ /system/script/job/get \$Job ];\r\ +1345c1359 +< stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\ +--- +> stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ +1347,1374c1361,1388 +< 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;\ +--- +> lse; \r\ +> \n}\r\ +> \n\r\ +> \n:set InspectVar do={\r\ +> \n :global InspectVarRet;\r\ +> \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ +> \n}\r\ +> \n\r\ +> \n:set CommitBrief do={\r\ +> \n :global CommitId;\r\ +> \n :global CommitInfo;\r\ +> \n :if (\$CommitId = \"unknown\") do={\r\ +> \n :return \"unknown\";\r\ +> \n }\r\ +> \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ +> \n}\r\ +> \n\r\ +> \n:set InspectVarRet do={\r\ +> \n :local Input \$1;\r\ +> \n :local Level (0 + [ :tonum \$2 ]);\r\ +> \n :global CharacterReplace;\r\ +> \n :global IfThenElse;\r\ +> \n :global InspectVarRet;\r\ +> \n :local IndentReturn do={\r\ +> \n :local Prefix [ :tostr \$1 ];\r\ +> \n :local Value [ :tostr \$2 ];\r\ +> \n :local Level [ :tonum \$3 ];\r\ +> \n :global CharacterMultiply;\r\ +1376,1399c1390,1413 +< 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\" . \\\ +--- +> fix . \"-> \" . \$Value);\r\ +> \n }\r\ +> \n :local TypeOf [ :typeof \$Input ];\r\ +> \n :local Len [ :len \$Input ];\r\ +> \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ +> \n :if (\$TypeOf = \"array\") do={\r\ +> \n :foreach Key,Value in=\$Input do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +> \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ +> \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ +> \n }\r\ +> \n } else={\r\ +> \n :if (\$TypeOf = \"str\") do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +> \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ +> \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ +> \n }\r\ +> \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ +> \n }\r\ +> \n }\r\ +> \n :if (\$TypeOf != \"nothing\") do={\r\ +> \n :set \$Return (\$Return . \"\\n\" . \\\r\ +1401,1416c1415,1461 +< \_\\\ +< \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\ +< \n }\ +< \n }\ +< \n :return \$Return;\ +< \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 {\ +--- +> \_\\\r\ +> \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ +> \n }\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n# !!! The function is not ready !!!\r\ +> \n:global FetchHttpInfo do={\r\ +> \n :local Mac [ :tostr \$1 ];\r\ +> \n :global CertificateAvailable;\r\ +> \n :global IsMacLocallyAdministered;\r\ +> \n :global LogPrint;\r\ +> \n :local Url \"https://api.macvendors.com/\";\r\ +> \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ +> y administered\";}\r\ +> \n :do {\r\ +> \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ +> o={\r\ +> \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ +> \");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :local Vendor ([ /tool/fetch \r\ +> \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ +> \n :return \$Vendor;\r\ +> \n } on-error={\r\ +> \n :onerror Err {\r\ +> \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ +> as-value;\r\ +> \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ +> );\r\ +> \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ +> rr); }\r\ +> \n :return \"unknown vendor\";\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set GetPubIp do={\r\ +> \n :global DetectIpAddrDefault;\r\ +> \n :global DetectIpAddrFallback;\r\ +> \n\r\ +> \n :local PubIpAddr false;\r\ +> \n :local Url \$DetectIpAddrDefault;\r\ +> \n :local JobName [ :jobname ];\r\ +> \n\r\ +> \n :do {\r\ +1418c1463 +< ice: \" . \$Url . \"...\");\ +--- +> ice: \" . \$Url . \"...\");\r\ +1421c1466 +< )} \\\ +--- +> )} \\\r\ +1423,1424c1468,1469 +< detect public IP using default service: \" . \$Url . \".\")}\ +< \n } on-error={\ +--- +> detect public IP using default service: \" . \$Url . \".\")}\r\ +> \n } on-error={\r\ +1426,1427c1471,1472 +< ice: \" . \$Url . \".\");\ +< \n :set Url \$DetectIpAddrFallBack;\ +--- +> ice: \" . \$Url . \".\");\r\ +> \n :set Url \$DetectIpAddrFallBack;\r\ +1429c1474 +< vice: \" . \$Url . \"...\");\ +--- +> vice: \" . \$Url . \"...\");\r\ +1432c1477 +< )} \\\ +--- +> )} \\\r\ +1434,1436c1479,1481 +< \_detect public IP using fallback service: \" . \$Url . \".\")}\ +< \n };\ +< \n :local IpLen ([ :len \$PubIpAddr ] -1);\ +--- +> \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ +> \n };\r\ +> \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ +1438,1452c1483,1497 +< {: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 . \":\")}\ +--- +> {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ +> \n :return \$PubIpAddr;\r\ +> \n}\r\ +> \n\r\ +> \n:set FormatLine do={\r\ +> \n :local Key [ :tostr \$1 ];\r\ +> \n :local Value [ :tostr \$2 ];\r\ +> \n :local Indent [ :tonum \$3 ];\r\ +> \n :local Spaces;\r\ +> \n :local Return \"\";\r\ +> \n :global CharacterMultiply;\r\ +> \n :global EitherOr;\r\ +> \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ +> \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ +> \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ +1454c1499 +< n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\ +--- +> n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ +1456,1467c1501,1512 +< \$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]]; \ +--- +> \$Return ]) ] . \$Value)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ParseCustom do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ +> \n :local End [ :tostr \$3 ];\r\ +> \n :local Num [ :tonum \$4 ];\r\ +> \n :local Return;\r\ +> \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ +> \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ +1469,1482c1514,1527 +< 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;\ +--- +> lse={\r\ +> \n :set End [:find \$rest \$End];\r\ +> \n :set Return [:pick \$rest 0 \$End];\r\ +> \n }\r\ +> \n:return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set LogPrint do={\r\ +> \n :local Severity [ :tostr \$1 ];\r\ +> \n :local Name [ :tostr \$2 ];\r\ +> \n :local Message [ :tostr \$3 ];\r\ +> \n :global PrintDebug;\r\ +> \n :global PrintDebugOverride;\r\ +> \n :global EitherOr;\r\ +1484,1490c1529,1535 +< ];\ +< \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}\ +--- +> ];\r\ +> \n :local PrintSeverity do={\r\ +> \n :global TerminalColorOutput;\r\ +> \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ +> \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ +> \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ +> \n}\r\ +1492,1496c1537,1542 +< \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\"}\ +--- +> \r\ +> \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ +> \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ +> \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ +> \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ +> \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ +1498,1514c1544,1560 +< erity \$Severity ] . \": \" . \$Message)}\ +< \n}\ +< \n\ +< \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={\ +--- +> erity \$Severity ] . \": \" . \$Message)}\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateAvailable do={\r\ +> \n :local CommonName [ :tostr \$1 ];\r\ +> \n :local UseFor [ :tostr \$2 ];\r\ +> \n\r\ +> \n :global CertificateDownload;\r\ +> \n :global ParseKeyValueStore;\r\ +> \n\r\ +> \n :if ([ :len \$UseFor ] = 0) do={\r\ +> \n :log warning (\$0 . \"The intended use is undefined!\");\r\ +> \n :set UseFor \"undefined\";\r\ +> \n }\r\ +> \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ +> \n [ /certificate/settings/get crl-download ] = true && \\\r\ +> \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ +1516,1523c1562,1569 +< \\\ +< \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 ];\ +--- +> \\\r\ +> \n \"is configured to download certificate CRLs to system!\");\r\ +> \n }\r\ +> \n :if ([ :len \$CommonName ] = 0) do={\r\ +> \n :log warning (\$0 . \"No CommonName given!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local CertSettings [ /certificate/settings/get ];\r\ +1525,1526c1571,1573 +< \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +--- +> \r\ +> \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ +> \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ +1528,1530c1575,1577 +< \_] ] > 0) do={\ +< \n :return true;\ +< \n }\ +--- +> \_] ] > 0) do={\r\ +> \n :return true;\r\ +> \n }\r\ +1532c1579 +< ) do={\ +--- +> ) do={\r\ +1534,1538c1581,1585 +< \"' not available.\");\ +< \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n }\ +--- +> \"' not available.\");\r\ +> \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +1540c1587 +< ) do={\ +--- +> ) do={\r\ +1542,1544c1589,1591 +< \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\ +< \n :return true;\ +< \n }\ +--- +> \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +> \n :return true;\r\ +> \n }\r\ +1546c1593 +< e ] ];\ +--- +> e ] ];\r\ +1548c1595 +< ertVal->\"skid\")) do={\ +--- +> ertVal->\"skid\")) do={\r\ +1550c1597 +< \_= 0) do={\ +--- +> \_= 0) do={\r\ +1552c1599 +< >\"CN\");\ +--- +> >\"CN\");\r\ +1554,1558c1601,1605 +< is incomplete, missing '\" . \$IssuerCN . \"'.\");\ +< \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\ +< \n :return false;\ +< \n }\ +< \n }\ +--- +> is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +> \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +1560,1574c1607,1621 +< \") ] ];\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \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\ +--- +> \") ] ];\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateDownload do={\r\ +> \n :local CommonName [ :tostr \$1 ];\r\ +> \n :global ScriptUpdatesBaseUrl;\r\ +> \n :global ScriptUpdatesUrlSuffix;\r\ +> \n :global CertificateNameByCN;\r\ +> \n :global CleanName;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global RmFile;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +1576,1578c1623,1626 +< \n \"CommonName '\" . \$CommonName . \"'.\");\ +< \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\ +< \n :do {\ +--- +> \r\ +> \n \"CommonName '\" . \$CommonName . \"'.\");\r\ +> \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ +> \n :do {\r\ +1580c1628 +< -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +--- +> -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +1582,1585c1630,1633 +< sUrlSuffix) \\\ +< \n dst-path=\$FileName as-value;\ +< \n \$WaitForFile \$FileName;\ +< \n } on-error={\ +--- +> sUrlSuffix) \\\r\ +> \n dst-path=\$FileName as-value;\r\ +> \n \$WaitForFile \$FileName;\r\ +> \n } on-error={\r\ +1587,1590c1635,1638 +< e '\" . \$CommonName . \\\ +< \n \"' from repository! Trying fallback to mkcert.org...\");\ +< \n :do {\ +< \n :local CertSettings [ /certificate/settings/get ];\ +--- +> e '\" . \$CommonName . \\\r\ +> \n \"' from repository! Trying fallback to mkcert.org...\");\r\ +> \n :do {\r\ +> \n :local CertSettings [ /certificate/settings/get ];\r\ +1592c1640 +< \_] ] = 0 && \\\ +--- +> \_] ] = 0 && \\\r\ +1594c1642 +< || \\\ +--- +> || \\\r\ +1596c1644 +< \\\ +--- +> \\\r\ +1597a1646 +> \r\ +1599c1648 +< \_Root X1\" ] ] > 0)) do={\ +--- +> \_Root X1\" ] ] > 0)) do={\r\ +1601,1602c1650,1652 +< \n :return false;\ +< \n }\ +--- +> \r\ +> \n :return false;\r\ +> \n }\r\ +1604c1654 +< er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +--- +> er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +1606,1613c1656,1663 +< 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 ({ \$CommonName }) ] \\\r\ +> \n dst-path=\$FileName as-value;\r\ +> \n \$WaitForFile \$FileName;\r\ +> \n :if ([ /file/get \$FileName size ] = 0) do={\r\ +> \n \$RmFile \$FileName;\r\ +> \n :error false;\r\ +> \n }\r\ +> \n } on-error={\r\ +1615,1621c1665,1671 +< e '\" . \$CommonName . \"'!\");\ +< \n :return false;\ +< \n }\ +< \n }\ +< \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\ +< \n :delay 1s;\ +< \n \$RmFile \$FileName;\ +--- +> e '\" . \$CommonName . \"'!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ +> \n :delay 1s;\r\ +> \n \$RmFile \$FileName;\r\ +1623c1673 +< ) do={\ +--- +> ) do={\r\ +1625c1675 +< +\\\$\") ];\ +--- +> +\\\$\") ];\r\ +1627,1629c1677,1679 +< e . \"' still unavailable!\");\ +< \n :return false;\ +< \n }\ +--- +> e . \"' still unavailable!\");\r\ +> \n :return false;\r\ +> \n }\r\ +1631,1639c1681,1689 +< \"_[0-9]+\\\$\") ] do={\ +< \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\ +< \n }\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set CertificateNameByCN do={\ +< \n :local Match [ :tostr \$1 ];\ +< \n :global CleanName;\ +--- +> \"_[0-9]+\\\$\") ] do={\r\ +> \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CertificateNameByCN do={\r\ +> \n :local Match [ :tostr \$1 ];\r\ +> \n :global CleanName;\r\ +1641,1674c1691,1725 +< 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:set FileExists do={\ +< \n :local FileName [ :tostr \$1 ];\ +< \n :local Type [ :tostr \$2 ];\ +< \n :global FileGet;\ +< \n :local FileVal [ \$FileGet \$FileName ];\ +< \n :if (\$FileVal = false) do={ :return false; }\ +< \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\ +< \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ +< \_true; }\ +< \n :return false;\ +< \n}\ +< \n\ +< \n:set Grep do={\ +< \n :local Input ([ :tostr \$1 ] . \"\\n\");\ +< \n :local Pattern [ :tostr \$2 ];\ +--- +> rint=\$Match or name=\$Match) ]->0);\r\ +> \n :if ([ :len \$Cert ] = 0) do={\r\ +> \n :log warning (\$0 .\" No matching certificate found.\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ +> \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterMultiply do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Num [ :tonum \$2 ];\r\ +> \n :if (\$Num = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set FetchUserAgentStr do={\r\ +> \n :local Caller [ :tostr \$1 ];\r\ +> \n\r\ +> \n :global GlobalScriptsUrl;\r\ +> \n :global CommitBrief;\r\ +> \n :global IfThenElse;\r\ +> \n :local Resource [ /system/resource/get ];\r\ +> \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ +> \_\$Resource->\"architecture-name\" . \\\r\ +> \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ +> CommitBrief ] . \")\");\r\ +> \n}\r\ +> \n\r\ +> \n:set Grep do={\r\ +> \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ +> \n :local Pattern [ :tostr \$2 ];\r\ +1676,1678c1727,1729 +< }\ +< \n :do {\ +< \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\ +--- +> }\r\ +> \n :do {\r\ +> \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ +1680c1731 +< \$Line}\ +--- +> \$Line}\r\ +1682,1704c1733,1755 +< 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 . \".\" . \\\ +--- +> Input ] ];\r\ +> \n } while=([ :len \$Input ] > 0);\r\ +> \n :return [];\r\ +> \n}\r\ +> \n\r\ +> \n:set HumanReadableNum do={\r\ +> \n :local Input [ :tonum \$1 ];\r\ +> \n :local Base [ :tonum \$2 ];\r\ +> \n :global EitherOr;\r\ +> \n :global IfThenElse;\r\ +> \n :local Prefix \"kMGTPE\";\r\ +> \n :local Pow 1;\r\ +> \n :set Base [ \$EitherOr \$Base 1024 ];\r\ +> \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ +> \n :if (\$Input < \$Base) do={:return \$Input}\r\ +> \n :for I from=0 to=[ :len \$Prefix ] do={\r\ +> \n :set Pow (\$Pow * \$Base);\r\ +> \n :if (\$Input / \$Base < \$Pow) do={\r\ +> \n :set Prefix [ :pick \$Prefix \$I ];\r\ +> \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ +> \n :local Tmp2 (\$Tmp1 / 100);\r\ +> \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ +> \n :return (\$Tmp2 . \".\" . \\\r\ +1706,1731c1757,1767 +< 2 ] + 1) ] . \\\ +< \n \$Prefix . \$Bin);\ +< \n }\ +< \n }\ +< \n}\ +< \n\ +< \n:set CleanFilePath do={\ +< \n :local Path [ :tostr \$1 ];\ +< \n :global CharacterReplace;\ +< \n :while (\$Path ~ \"//\") do={\ +< \n :set \$Path [ \$CharacterReplace \$Path \"//\" \"/\" ];\ +< \n }\ +< \n :if ([ :pick \$Path 0 ] = \"/\") do={\ +< \n :set Path [ :pick \$Path 1 [ :len \$Path ] ];\ +< \n }\ +< \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={\ +< \n :set Path [ :pick \$Path 0 ([ :len \$Path ] - 1) ];\ +< \n }\ +< \n :return \$Path;\ +< \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 ];\ +--- +> 2 ] + 1) ] . \\\r\ +> \n \$Prefix . \$Bin);\r\ +> \n }\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set CleanName do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :local Return \"\";\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +1733,1753c1769,1784 +< stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ +< \n :do { :if ([ :len \$Return ] = 0) do={ :error true; } }\ +< \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={ :e\ +< rror true; }\ +< \n :set Char \"-\";\ +< \n } on-error={\ +< \n :set Char \"\";\ +< \n }\ +< \n }\ +< \n :set Return (\$Return . \$Char);\ +< \n }\ +< \n :return \$Return;\ +< \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}\ +--- +> stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ +> \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ +> \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ +> ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ +> \n };\r\ +> \n :set Return (\$Return . \$Char)};\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set RandomDelay do={\r\ +> \n :local Time [ :tonum \$1 ];\r\ +> \n :local Unit [ :tostr \$2 ];\r\ +> \n :global EitherOr;\r\ +> \n :global GetRandomNumber;\r\ +> \n :global MAX;\r\ +> \n :if (\$Time = 0) do={:return false}\r\ +1755,1776c1786,1807 +< [ \$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={\ +--- +> [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ +> \n}\r\ +> \n\r\ +> \n:set EscapeForRegEx do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +> \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ +> \n :set Return (\$Return . \$Char);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ExitError do={\r\ +> \n :local ExitOK [ :tostr \$1 ];\r\ +> \n :local Name [ :tostr \$2 ];\r\ +> \n :local Error [ :tostr \$3 ];\r\ +> \n :global IfThenElse;\r\ +> \n :if (\$ExitOK = \"false\") do={\r\ +1778c1809 +< \\\ +--- +> \\\r\ +1780c1811 +< ror\" . \\\ +--- +> ror\" . \\\r\ +1782,1789c1813,1820 +< \$Error) \".\" ]);\ +< \n }\ +< \n}\ +< \n\ +< \n:set ExitOnError do={\ +< \n :local Name [ :tostr \$1 ];\ +< \n :local Error [ :tostr \$2 ];\ +< \n :global IfThenElse;\ +--- +> \$Error) \".\" ]);\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set ExitOnError do={\r\ +> \n :local Name [ :tostr \$1 ];\r\ +> \n :local Error [ :tostr \$2 ];\r\ +> \n :global IfThenElse;\r\ +1791c1822 +< \\\$\") \\\ +--- +> \\\$\") \\\r\ +1793c1824 +< r\" . \\\ +--- +> r\" . \\\r\ +1795,1806c1826,1837 +< 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\"];\ +--- +> rror) \".\" ]);\r\ +> \n}\r\ +> \n\r\ +> \n:set MiniDateTimeStamp do={\r\ +> \n /system/clock;\r\ +> \n :local vdate [get date];\r\ +> \n :local vtime [get time];\r\ +> \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ +> \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ +> \n :local M [:tonum \$MM];\r\ +> \n :if (\$vdate ~ \".../../....\") do={\r\ +> \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ +1808,1867c1839,1898 +< 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={\ +< \n :return false;\ +< \n }\ +< \n :local FileVal false;\ +< \n :do {\ +< \n :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 :log debug (\$0 . \" Removing directory: \". \$DirName);\ +< \n :local DirVal [ \$FileGet \$DirName ];\ +< \n :if (\$DirVal = false) do={\ +< \n :log debug (\$0 . \" ... which does not exist.\");\ +< \n :return true;\ +< \n };\ +< \n :if (\$DirVal->\"type\" != \"directory\") do={\ +--- +> PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ +> \n :if (\$M>12) do={:set M (\$M - 12)}\r\ +> \n :set MM [:pick (100 + \$M) 1 3];\r\ +> \n }\r\ +> \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ +> \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ +> \n :local HH [:pick \$vtime 0 2];\r\ +> \n :local mm [:pick \$vtime 3 5];\r\ +> \n :local ss [:pick \$vtime 6 8];\r\ +> \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ +> \n}\r\ +> \n\r\ +> \n:set WaitForFile do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :local WaitTime [ :totime \$2 ];\r\ +> \n :global CleanFilePath;\r\ +> \n :global EitherOr;\r\ +> \n :global MAX;\r\ +> \n :set FileName [ \$CleanFilePath \$FileName ];\r\ +> \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ +> \n :do {\r\ +> \n :retry {\r\ +> \n /file/get \$FileName;\r\ +> \n :return true;\r\ +> \n } delay=\$Delay max=10;\r\ +> \n } on-error={ }\r\ +> \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ +> \n :do {\r\ +> \n /file/get \$FileName;\r\ +> \n :return true;\r\ +> \n } on-error={ }\r\ +> \n :delay \$Delay;\r\ +> \n :set Delay (\$Delay * 3 / 2);\r\ +> \n }\r\ +> \n :return false;\r\ +> \n}\r\ +> \n\r\ +> \n:set FileGet do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :global WaitForFile;\r\ +> \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local FileVal false;\r\ +> \n :do {\r\ +> \n :set FileVal [ /file/get \$FileName ];\r\ +> \n } on-error={ }\r\ +> \n :return \$FileVal;\r\ +> \n}\r\ +> \n\r\ +> \n:set RmDir do={\r\ +> \n :local DirName [ :tostr \$1 ];\r\ +> \n :global FileGet;\r\ +> \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ +> \n :local DirVal [ \$FileGet \$DirName ];\r\ +> \n :if (\$DirVal = false) do={\r\ +> \n :log debug (\$0 . \" ... which does not exist.\");\r\ +> \n :return true;\r\ +> \n };\r\ +> \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ +1869,1874c1900,1905 +< ory.\");\ +< \n :return false;\ +< \n };\ +< \n :onerror Err {\ +< \n /file/remove \$DirName;\ +< \n } do={\ +--- +> ory.\");\r\ +> \n :return false;\r\ +> \n };\r\ +> \n :onerror Err {\r\ +> \n /file/remove \$DirName;\r\ +> \n } do={\r\ +1876,1890c1907,1921 +< : \" . \$Err);\ +< \n :return false;\ +< \n };\ +< \n :return true;\ +< \n}\ +< \n\ +< \n:set RmFile do={\ +< \n :local FileName [ :tostr \$1 ];\ +< \n :global FileGet;\ +< \n :log debug (\$0 . \" Removing file: \". \$FileName);\ +< \n :local FileVal [ \$FileGet \$FileName ];\ +< \n :if (\$FileVal = false) do={\ +< \n :log debug (\$0 . \" ... which does not exist.\");\ +< \n :return true;\ +< \n }\ +--- +> : \" . \$Err);\r\ +> \n :return false;\r\ +> \n };\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set RmFile do={\r\ +> \n :local FileName [ :tostr \$1 ];\r\ +> \n :global FileGet;\r\ +> \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ +> \n :local FileVal [ \$FileGet \$FileName ];\r\ +> \n :if (\$FileVal = false) do={\r\ +> \n :log debug (\$0 . \" ... which does not exist.\");\r\ +> \n :return true;\r\ +> \n }\r\ +1892c1923 +< sk\") do={\ +--- +> sk\") do={\r\ +1894,1898c1925,1930 +< \n :return false;\ +< \n }\ +< \n :onerror Err {\ +< \n /file/remove \$FileName;\ +< \n } do={\ +--- +> \r\ +> \n :return false;\r\ +> \n }\r\ +> \n :onerror Err {\r\ +> \n /file/remove \$FileName;\r\ +> \n } do={\r\ +1900,1924c1932,1956 +< \_. \$Err); :return false;\ +< \n }\ +< \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\ +< \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 :log info (\$0 . \" The tmpfs is disabled, enabling.\");\ +< \n /disk/enable \$TmpFs;\ +< \n }\ +< \n :return true;\ +< \n }\ +< \n :log info (\$0 . \" Creating disk of type tmpfs.\");\ +< \n \$RmDir \"tmpfs\";\ +< \n :onerror Err {\ +--- +> \_. \$Err); :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set MkDir do={\r\ +> \n :local Path [ :tostr \$1 ];\r\ +> \n :global CleanFilePath;\r\ +> \n :global FileGet;\r\ +> \n :global RmDir;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +> \n :local MkTmpfs do={\r\ +> \n :global WaitForFile;\r\ +> \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ +> \n :if ([ :len \$TmpFs ] = 1) do={\r\ +> \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ +> \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ +> \n /disk/enable \$TmpFs;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ +> \n \$RmDir \"tmpfs\";\r\ +> \n :onerror Err {\r\ +1926,1928c1958,1960 +< /get total-memory ] / 3);\ +< \n \$WaitForFile \"tmpfs\";\ +< \n } do={\ +--- +> /get total-memory ] / 3);\r\ +> \n \$WaitForFile \"tmpfs\";\r\ +> \n } do={\r\ +1930,1953c1962,1985 +< Err);\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n }\ +< \n :set Path [ \$CleanFilePath \$Path ];\ +< \n :if (\$Path = \"\") do={\ +< \n :return true;\ +< \n }\ +< \n :log debug (\$0 . \" Making directory: \" . \$Path);\ +< \n :local PathVal [ \$FileGet \$Path ];\ +< \n :if (\$PathVal->\"type\" = \"directory\") do={\ +< \n :log 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={\ +--- +> Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :set Path [ \$CleanFilePath \$Path ];\r\ +> \n :if (\$Path = \"\") do={\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ +> \n :local PathVal [ \$FileGet \$Path ];\r\ +> \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ +> \n :log debug (\$0 . \" ... which already exists.\");\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ +> \n :if ([ \$MkTmpfs ] = false) do={\r\ +> \n :return false;\r\ +> \n }\r\ +> \n }\r\ +> \n :onerror Err {\r\ +> \n /file/add type=\"directory\" name=\$Path;\r\ +> \n \$WaitForFile \$Path;\r\ +> \n } do={\r\ +1955,1982c1987,2014 +< \" . \$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}\ +--- +> \" . \$Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ +> \n :return \$2;\r\ +> \n}\r\ +> \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ +> \n :return \$2;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterMultiply do={\r\ +> \n :local Str [ :tostr \$1 ];\r\ +> \n :local Num [ :tonum \$2 ];\r\ +> \n :if (\$Num = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set CharacterReplace do={\r\ +> \n :local String [ :tostr \$1 ];\r\ +> \n :local ReplaceFrom [ :tostr \$2 ];\r\ +> \n :local ReplaceWith [ :tostr \$3 ];\r\ +> \n :local Return \"\";\r\ +> \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ +1984c2016,2017 +< \n :local Pos [ :find \$String \$ReplaceFrom ];\ +--- +> \r\ +> \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ +1985a2019 +> \r\ +1987,2024c2021,2038 +< \_\$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 [ :le\ +< n \$Path ] ]; }\ +< \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ +< :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\ +< \n :return \$Path;\ +< \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={ :e\ +< rror true; }\ +< \n :set Char \"-\";\ +< \n } on-error={\ +< \n :set Char \"\";\ +< \n }\ +< \n }\ +< \n :set Return (\$Return . \$Char);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set IfThenElse do={\ +--- +> \_\$String ] ];\r\ +> \n }\r\ +> \n :return (\$Return . \$String);\r\ +> \n}\r\ +> \n\r\ +> \n:set CleanFilePath do={\r\ +> \n :local Path [ :tostr \$1 ];\r\ +> \n :global CharacterReplace;\r\ +> \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ +> \"//\" \"/\" ]};\r\ +> \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ +> \_\$Path ] ]};\r\ +> \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ +> pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ +> \n :return \$Path;\r\ +> \n}\r\ +> \n\r\ +> \n:set IfThenElse do={\r\ +2026,2031c2040,2045 +< \$2};\ +< \n :return \$3;\ +< \n}\ +< \n\ +< \n:set EitherOr do={\ +< \n :global IfThenElse;\ +--- +> \$2};\r\ +> \n :return \$3;\r\ +> \n}\r\ +> \n\r\ +> \n:set EitherOr do={\r\ +> \n :global IfThenElse;\r\ +2033c2047 +< \$1 \$2 ]}\ +--- +> \$1 \$2 ]}\r\ +2035,2046c2049,2060 +< \_\$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 } \ +--- +> \_\$1 \$2 ]}\r\ +> \n# this works for boolean values, literal ones with parentheses\r\ +> \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ +> \n}\r\ +> \n\r\ +> \n:set ParseKeyValueStore do={\r\ +> \n :local Source \$1;\r\ +> \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ +> \n :do {\r\ +> \n :return [ :deserialize from=json \$Source ];\r\ +> \n } on-error={ }\r\ +> \n } \r\ +2048,2052c2062,2066 +< }\ +< \n :local Result ({});\ +< \n :foreach KeyValue in=[ :toarray \$Source ] do={\ +< \n :if ([ :find \$KeyValue \"=\" ]) do={\ +< \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\ +--- +> }\r\ +> \n :local Result ({});\r\ +> \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ +> \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ +> \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ +2054,2067c2068,2081 +< \_: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 VersionToNum;\ +--- +> \_:len \$KeyValue ] ];\r\ +> \n :if (\$Value=\"true\") do={:set Value true}\r\ +> \n :if (\$Value=\"false\") do={:set Value false}\r\ +> \n :set (\$Result->\$Key) \$Value;\r\ +> \n } else={:set (\$Result->\$KeyValue) true}\r\ +> \n }\r\ +> \n :return \$Result;\r\ +> \n}\r\ +> \n:set RequiredRouterOS do={\r\ +> \n :local Caller [ :tostr \$1 ];\r\ +> \n :local Required [ :tostr \$2 ];\r\ +> \n :local Warn [ :tostr \$3 ];\r\ +> \n :global IfThenElse;\r\ +> \n :global VersionToNum;\r\ +2069,2072c2083,2086 +< \\\$\")) do={\ +< \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\ +< \n :return false;\ +< \n }\ +--- +> \\\$\")) do={\r\ +> \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ +> \n :return false;\r\ +> \n }\r\ +2074,2075c2088,2089 +< e/update/get installed-version ] ]) do={\ +< \n :if (\$Warn = \"true\") do={\ +--- +> e/update/get installed-version ] ]) do={\r\ +> \n :if (\$Warn = \"true\") do={\r\ +2077c2091 +< 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\ +--- +> 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ +2079,2104c2093,2105 +< es RouterOS \" . \$Required . \". Please update!\");\ +< \n }\ +< \n :return false;\ +< \n }\ +< \n :return true;\ +< \n}\ +< \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\ +< \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={\ +--- +> es RouterOS \" . \$Required . \". Please update!\");\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n:set VersionToNum do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :local Multi 0x1000000;\r\ +> \n :local Return 0;\r\ +> \n :global CharacterReplace;\r\ +> \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ +> \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ +2106,2114c2107,2116 +< \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={ }\ +--- +> \r\ +> \n }\r\ +> \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ +> \n :local Num [ :tonum \$Value ];\r\ +> \n :if (\$Multi = 0x100) do={\r\ +> \n :if ([ :typeof \$Num ] = \"num\") do={\r\ +> \n :set Return (\$Return + 0xff00);\r\ +> \n :set Multi (\$Multi / 0x100);\r\ +> \n } else={\r\ +> \n :if (\$Value = \"zero\") do={ }\r\ +2116c2118 +< }\ +--- +> }\r\ +2118,2120c2120,2123 +< \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\ +< \n }\ +< \n }\ +--- +> \r\ +> \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ +> \n }\r\ +> \n }\r\ +2122,2141c2125,2144 +< lue * \$Multi)); }\ +< \n :set Multi (\$Multi / 0x100);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set ScriptLock do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :local WaitMax [ :totime \$2 ];\ +< \n :global GetRandom20CharAlNum;\ +< \n :global IfThenElse;\ +< \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 ];\ +--- +> lue * \$Multi)); }\r\ +> \n :set Multi (\$Multi / 0x100);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ScriptLock do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local WaitMax [ :totime \$2 ];\r\ +> \n :global GetRandom20CharAlNum;\r\ +> \n :global IfThenElse;\r\ +> \n :global ScriptLockOrder;\r\ +> \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ +> \n :set ScriptLockOrder ({});\r\ +> \n }\r\ +> \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n }\r\ +> \n :local JobCount do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +2143,2148c2146,2152 +< \n }\ +< \n :local TicketCount do={\ +< \n :local Script [ :tostr \$1 ];\ +< \n :global ScriptLockOrder;\ +< \n :local Count 0;\ +< \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +--- +> \r\ +> \n }\r\ +> \n :local TicketCount do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :local Count 0;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +2150,2159c2154,2163 +< + 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}\ +--- +> + 1)}\r\ +> \n }\r\ +> \n :return \$Count;\r\ +> \n }\r\ +> \n :local IsFirstTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Check [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :if (\$Ticket = \$Check) do={:return true}\r\ +2161,2172c2165,2176 +< 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;\ +--- +> o={:return false}\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :local AddTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Add [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :while (true) do={\r\ +> \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ +> \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ +> \n :delay 10ms;\r\ +2174,2197c2178,2201 +< 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={\ +--- +> e}\r\ +> \n }\r\ +> \n }\r\ +> \n :local RemoveTicket do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :local Remove [ :tostr \$2 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ +> \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ +> \n :delay 10ms;\r\ +> \n }\r\ +> \n }\r\ +> \n }\r\ +> \n :local CleanupTickets do={\r\ +> \n :local Script [ :tostr \$1 ];\r\ +> \n :global ScriptLockOrder;\r\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ +> \n }\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n }\r\ +> \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ +> \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ +2199,2202c2203,2206 +< ist!\");\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$JobCount \$Script ] = 0) do={\ +--- +> ist!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$JobCount \$Script ] = 0) do={\r\ +2204,2207c2208,2211 +< );\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\ +--- +> );\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ +2209,2229c2213,2233 +< t . \"', 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;\ +--- +> t . \"', resetting!\");\r\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +> \n /system/script/job/remove [ find where script=\$Script ];\r\ +> \n }\r\ +> \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ +> \n \$AddTicket \$Script \$MyTicket;\r\ +> \n :local WaitInterval (\$WaitMax / 20);\r\ +> \n :local WaitTime \$WaitMax;\r\ +> \n :while (\$WaitTime > 0 && \\\r\ +> \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ +> \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ +> \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ +> \n :delay \$WaitInterval;\r\ +> \n }\r\ +> \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ +> \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ +> \n \$RemoveTicket \$Script \$MyTicket;\r\ +> \n \$CleanupTickets \$Script;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n \$RemoveTicket \$Script \$MyTicket;\r\ +2231c2235 +< once\" . \\\ +--- +> once\" . \\\r\ +2233,2238c2237,2242 +< \_lock\" \"\" ] . \"...\");\ +< \n :return false;\ +< \n}\ +< \n\ +< \n:set SendNotification do={ :onerror Err {\ +< \n :global SendNotification2;\ +--- +> \_lock\" \"\" ] . \"...\");\r\ +> \n :return false;\r\ +> \n}\r\ +> \n\r\ +> \n:set SendNotification do={ :onerror Err {\r\ +> \n :global SendNotification2;\r\ +2240,2247c2244,2251 +< \_silent=\$4 });\ +< \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ +< \n}\ +< \n\ +< \n:set SendNotification2 do={\ +< \n :local Notification \$1;\ +< \n :global NotificationFunctions;\ +< \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\ +--- +> \_silent=\$4 });\r\ +> \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ +> \n}\r\ +> \n\r\ +> \n:set SendNotification2 do={\r\ +> \n :local Notification \$1;\r\ +> \n :global NotificationFunctions;\r\ +> \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ +2249,2300c2253,2304 +< ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\ +< \n }\ +< \n}\ +< \n\ +< \n:set SymbolByUnicodeName do={\ +< \n :local Name [ :tostr \$1 ];\ +< \n :global EitherOr;\ +< \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={\ +--- +> ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ +> \n }\r\ +> \n}\r\ +> \n\r\ +> \n:set SymbolByUnicodeName do={\r\ +> \n :local Name [ :tostr \$1 ];\r\ +> \n :global EitherOr;\r\ +> \n :global SymbolsExtra;\r\ +> \n :local Symbols ({\r\ +> \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ +> \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ +> \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ +> \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ +> \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ +> \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ +> \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ +> \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ +> \n \"cloud\"=\"\\E2\\98\\81\";\r\ +> \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ +> \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ +> \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ +> \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ +> \n \"gear\"=\"\\E2\\9A\\99\";\r\ +> \n \"heart\"=\"\\E2\\99\\A5\";\r\ +> \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ +> \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ +> \n \"information\"=\"\\E2\\84\\B9\";\r\ +> \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ +> \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ +> \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ +> \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ +> \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ +> \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ +> \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ +> \n \"scissors\"=\"\\E2\\9C\\82\";\r\ +> \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ +> \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ +> \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ +> \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ +> \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ +> \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ +> \n \"star\"=\"\\E2\\AD\\90\";\r\ +> \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ +> \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ +> \n }, \$SymbolsExtra);\r\ +> \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ +> \n :local Special {\r\ +> \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ +> \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ +> \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ +> \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ +> \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ +2302,2304c2306,2308 +< '!\");\ +< \n :return \"\";\ +< \n }\ +--- +> '!\");\r\ +> \n :return \"\";\r\ +> \n }\r\ +2306,2312c2310,2316 +< me) ] . \"\\EF\\B8\\8F\");\ +< \n}\ +< \n\ +< \n:set SymbolForNotification do={\ +< \n :global NotificationsWithSymbols;\ +< \n :global SymbolByUnicodeName;\ +< \n :global IfThenElse;\ +--- +> me) ] . \"\\EF\\B8\\8F\");\r\ +> \n}\r\ +> \n\r\ +> \n:set SymbolForNotification do={\r\ +> \n :global NotificationsWithSymbols;\r\ +> \n :global SymbolByUnicodeName;\r\ +> \n :global IfThenElse;\r\ +2314,2315c2318,2319 +< \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\ +< \n :local Return \"\";\ +--- +> \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ +> \n :local Return \"\";\r\ +2317,2326c2321,2330 +< mbolByUnicodeName \$Symbol ])}\ +< \n :return (\$Return . \" \");\ +< \n}\ +< \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 !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\ +--- +> mbolByUnicodeName \$Symbol ])}\r\ +> \n :return (\$Return . \" \");\r\ +> \n}\r\ +> \n\r\ +> \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ +> \n:set UrlEncode do={\r\ +> \n :local Input [ :tostr \$1 ];\r\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +> \n :local Return \"\";\r\ +> \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ +2328c2332 +< %24\"; \"%25\"; \"%26\"; \"%27\";\ +--- +> %24\"; \"%25\"; \"%26\"; \"%27\";\r\ +2330c2334 +< \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\ +--- +> \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ +2332,2335c2336,2339 +< \"%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 ];\ +--- +> \"%7C\"; \"%7D\"; \"%7E\" };\r\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +> \n :local Char [ :pick \$Input \$I ];\r\ +> \n :local Replace [ :find \$Chars \$Char ];\r\ +2337,2369c2341,2384 +< ce)}\ +< \n :set Return (\$Return . \$Char);\ +< \n }\ +< \n :return \$Return;\ +< \n}\ +< \n\ +< \n:set IsDNSResolving do={\ +< \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ +< \n :return true;\ +< \n}\ +< \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\ +< \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}\ +--- +> ce)}\r\ +> \n :set Return (\$Return . \$Char);\r\ +> \n }\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ValidateSyntax do={\r\ +> \n :local Code [ :tostr \$1 ];\r\ +> \n :onerror Err {\r\ +> \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ +> \n } do={\r\ +> \n :log debug (\$0 . \"Validation failed: \" . \$Err);\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsDNSResolving do={\r\ +> \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsFullyConnected do={\r\ +> \n :global IsDNSResolving;\r\ +> \n :global IsTimeSync;\r\ +> \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ +> \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n:set IsTimeSync do={\r\ +> \n :global IsTimeSyncCached;\r\ +> \n :global IsTimeSyncResetNtp;\r\ +> \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ +> \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ +> \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ +> \n :set IsTimeSyncCached true;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :local Uptime [ /system/resource/get uptime ];\r\ +> \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ +> \n :set IsTimeSyncResetNtp \$Uptime;\r\ +> \n }\r\ +> \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ +2371,2379c2386,2394 +< ;\ +< \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={\ +--- +> ;\r\ +> \n :set IsTimeSyncResetNtp \$Uptime;\r\ +> \n /system/ntp/client/set enabled=no;\r\ +> \n :delay 20ms;\r\ +> \n /system/ntp/client/set enabled=yes;\r\ +> \n :return false;\r\ +> \n }\r\ +> \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ +> \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ +2381,2390c2396,2405 +< 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 }\ +--- +> ee license and x86.\";\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ +> \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ +> \n :set IsTimeSyncCached true;\r\ +> \n :return true;\r\ +> \n }\r\ +> \n :return false;\r\ +> \n }\r\ +2392,2399c2407,2415 +< \n :return true;\ +< \n}\ +< \n\ +< \n# read parts of a large file\ +< \n# Description of parameters:\ +< \n# \$1 - script name for logging and user agent\ +< \n# \$2 - url to fetch from\ +< \n# \$3 - check-certificate value for /tool/fetch (true/false)\ +--- +> \r\ +> \n :return true;\r\ +> \n}\r\ +> \n\r\ +> \n# read parts of a large file\r\ +> \n# Description of parameters:\r\ +> \n# \$1 - script name for logging and user agent\r\ +> \n# \$2 - url to fetch from\r\ +> \n# \$3 - check-certificate value for /tool/fetch (true/false)\r\ +2401c2417 +< tps-only\", \"http-only\"\ +--- +> tps-only\", \"http-only\"\r\ +2403c2419 +< \_\"background-and-https-only\",\ +--- +> \_\"background-and-https-only\",\r\ +2406,2407c2422,2423 +< and-http-only\",\ +< \n# \"background-and-keep-broken-and-no-redirects\")\ +--- +> and-http-only\",\r\ +> \n# \"background-and-keep-broken-and-no-redirects\")\r\ +2409,2494c2425,2443 +< \"post\", \"put\", \"patch\", \"delete\")\ +< \n#:set FetchLargeFiles do={\ +< \n# :local RunName [:tostr \$1];\ +< \n# :local fetchUrl [:tostr \$2];\ +< \n# :local fetchFile [:tostr \$3];\ +< \n# :local CheckCert [:tostr \$4];\ +< \n# :local fetchMode [:tostr \$5];\ +< \n# :local fetchMethod [:tostr \$6];\ +< \n# :local tmpName;\ +< \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-\ +< without-crl\" ];\ +< \n#\ +< \n# :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\ +< \n# :local DirName (\"tmpfs/\" . \$tmpName);\ +< \n# :if ([ \$MkDir \$DirName ] = false) do={\ +< \n# :log error (\$RunName . \" Failed creating directory: \" . \$DirNam\ +< e . \"!\");\ +< \n# :return false;\ +< \n# }\ +< \n#\ +< \n# :local FileName (\$DirName . \"/\" . [ \$CleanName \$fetchFile ] . \"\ +< -\" . [ \$GetRandom20CharAlNum 5 ]);\ +< \n# :local Url (\$fetchUrl . \$fetchFile);\ +< \n# :onerror Err {\ +< \n# /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName\ +< \_\\\ +< \n# http-header-field=({ [ \$FetchUserAgentStr \$RunName ] }) as-valu\ +< e;\ +< \n# } do={\ +< \n# :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +< \n# \$RmFile \$FileName;\ +< \n# }\ +< \n# :log error (\$RunName . \" Failed downloading from '\" . \$Url . \"\ +< ' - \" . \$Err);\ +< \n# \$RmDir \$DirName;\ +< \n# :return false;\ +< \n# }\ +< \n#\ +< \n# :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +< \n# :log error (\$RunName . \" 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=3\ +< 2768 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## \$RmFile \$FileName;\ +< \n# \$RmDir \$DirName;\ +< \n# :return \$Return;\ +< \n#}\ +< \n\ +< \n:set FetchHugeFiles do={\ +< \n :local ScriptName [ :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\ +--- +> \"post\", \"put\", \"patch\", \"delete\")\r\ +> \n:set FetchLargeFiles do={\r\ +> \n :local RunName [:tostr \$1];\r\ +> \n :local fetchUrl [:tostr \$2];\r\ +> \n :local fetchFile [:tostr \$3];\r\ +> \n :local CheckCert [:tostr \$4];\r\ +> \n :local fetchMode [:tostr \$5];\r\ +> \n :local fetchMethod [:tostr \$6];\r\ +> \n :local tmpName;\r\ +> \n :global CleanName;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global GetRandom20CharAlNum;\r\ +> \n :global IfThenElse;\r\ +> \n :global LogPrint;\r\ +> \n :global MkDir;\r\ +> \n :global RmDir;\r\ +> \n :global RmFile;\r\ +> \n :global WaitForFile;\r\ +> \n\r\ +2496,2506c2445,2458 +< ithout-crl\" ];\ +< \n\ +< \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\ +< \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 {\ +--- +> ithout-crl\" ];\r\ +> \n\r\ +> \n :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\r\ +> \n :local DirName (\"tmpfs/\" . \$tmpName);\r\ +> \n :if ([ \$MkDir \$DirName ] = false) do={\r\ +> \n :log error (\$RunName . \" Failed creating directory: \" . \$DirName\ +> \_. \"!\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$fetchFile ] . \"-\ +> \" . [ \$GetRandom20CharAlNum 5 ]);\r\ +> \n :local Url (\$fetchUrl . \$fetchFile);\r\ +> \n :onerror Err {\r\ +2508,2530c2460,2482 +< \\\ +< \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ +< lue;\ +< \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={\ +--- +> \\\r\ +> \n http-header-field=({ [ \$FetchUserAgentStr \$RunName ] }) as-value\ +> ;\r\ +> \n } do={\r\ +> \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ +> \n \$RmFile \$FileName;\r\ +> \n }\r\ +> \n :log error (\$RunName . \" Failed downloading from '\" . \$Url . \"'\ +> \_- \" . \$Err);\r\ +> \n \$RmDir \$DirName;\r\ +> \n :return false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ +> \n :log error (\$RunName . \" The file downloaded from '\" . \$Url . \"\ +> ' did not show up.\");\r\ +> \n :return false;\r\ +> \n }\r\ +> \n \r\ +> \n :local FileSize [ /file/get \$FileName size ];\r\ +> \n :local Return \"\";\r\ +> \n :local VarSize 0;\r\ +> \n :while (\$VarSize != \$FileSize) do={\r\ +2532,2586c2484,2527 +< 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 :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 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={\ +--- +> 768 file=\$FileName as-value ]->\"data\"));\r\ +> \n :set FileSize [ /file/get \$FileName size ];\r\ +> \n :set VarSize [ :len \$Return ];\r\ +> \n :if (\$VarSize > \$FileSize) do={\r\ +> \n :delay 100ms;\r\ +> \n }\r\ +> \n }\r\ +> \n# \$RmFile \$FileName;\r\ +> \n \$RmDir \$DirName;\r\ +> \n :return \$Return;\r\ +> \n}\r\ +> \n\r\ +> \n:set ScriptInstallUpdate do={ :onerror Err {\r\ +> \n :local Scripts [ :toarray \$1 ];\r\ +> \n :local NewComment [ :tostr \$2 ];\r\ +> \n :global InitSetup;\r\ +> \n\r\ +> \n :global CommitId;\r\ +> \n :global ScriptUpdatesCRLF;\r\ +> \n :global GlobalConfVersion;\r\ +> \n :global Identity;\r\ +> \n :global CertificateAvailable;\r\ +> \n :global CheckSumsVerify;\r\ +> \n :global GlobalScriptsUrl;\r\ +> \n :global SumsDirAndFileName;\r\ +> \n :global GlobalScriptsUrlSuffix;\r\ +> \n :global EitherOr;\r\ +> \n :global FetchUserAgentStr;\r\ +> \n :global Grep;\r\ +> \n :global IfThenElse;\r\ +> \n :global LogPrint;\r\ +> \n :global ParseKeyValueStore;\r\ +> \n :global RequiredRouterOS;\r\ +> \n :global SendNotification2;\r\ +> \n :global SymbolForNotification;\r\ +> \n :global ValidateSyntax;\r\ +> \n :global CommentsInScripts;\r\ +> \n\r\ +> \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ +> \n :log warning (\$0 . \"Downloading certificate failed, trying without\ +> .\");\r\ +> \n }\r\ +> \n\r\ +> \n :foreach Script in=\$Scripts do={\r\ +2588c2529,2530 +< \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\ +--- +> \r\ +> \n :log info (\$0 . \" Adding new script: \" . \$Script);\r\ +2590,2601c2532,2543 +< 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 {\ +--- +> Vados\\n\" comment=\$NewComment;\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +> \n :local CommitIdBefore \$CommitId;\r\ +> \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ +> \n :local ReloadGlobal false;\r\ +> \n :local DeviceMode [ /system/device-mode/get ];\r\ +> \n\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +> \n :local CheckSums ({});\r\ +> \n :do {\r\ +2603c2545 +< iptsUrlSuffix);\ +--- +> iptsUrlSuffix);\r\ +2604a2547 +> \r\ +2606c2549 +< ficate=yes-without-crl \\\ +--- +> ficate=yes-without-crl \\\r\ +2608,2611c2551,2554 +< =user as-value ]->\"data\") ];\ +< \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\ +< \n }\ +< \n\ +--- +> =user as-value ]->\"data\") ];\r\ +> \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ +> \n }\r\ +> \n\r\ +2613,2614c2556,2557 +< s\" ] do={\ +< \n :local ScriptVal [ /system/script/get \$Script ];\ +--- +> s\" ] do={\r\ +> \n :local ScriptVal [ /system/script/get \$Script ];\r\ +2616,2618c2559,2561 +< ];\ +< \n :local SourceNew;\ +< \n\ +--- +> ];\r\ +> \n :local SourceNew;\r\ +> \n\r\ +2620,2622c2563,2565 +< \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\ +< \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\ +< \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\ +--- +> \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ +> \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ +> \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ +2625,2629c2568,2572 +< \"'!\");\ +< \n }\ +< \n }\ +< \n :do {\ +< \n :if (\$ScriptInfo->\"ignore\" = true) do={\ +--- +> \"'!\");\r\ +> \n }\r\ +> \n }\r\ +> \n :do {\r\ +> \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ +2631,2635c2574,2578 +< e\" . \"', as requested.\");\ +< \n :error true;\ +< \n }\ +< \n :if (\$CheckSumsVerify = true) do={\ +< \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\ +--- +> e\" . \"', as requested.\");\r\ +> \n :error true;\r\ +> \n }\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +> \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ +2637c2580 +< ptInfo->\"url-suffix\") ] = 0 && \\\ +--- +> ptInfo->\"url-suffix\") ] = 0 && \\\r\ +2639c2582 +< rce\") ] ] = \$CheckSum) do={\ +--- +> rce\") ] ] = \$CheckSum) do={\r\ +2641,2645c2584,2588 +< >\"name\" . \"' matches, ignoring.\");\ +< \n :error true;\ +< \n }\ +< \n }\ +< \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\ +--- +> >\"name\" . \"' matches, ignoring.\");\r\ +> \n :error true;\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ +2647c2590 +< fetch\" ] = false) do={\ +--- +> fetch\" ] = false) do={\r\ +2649,2652c2592,2595 +< ng without.\");\ +< \n }\ +< \n }\ +< \n :onerror Err {\ +--- +> ng without.\");\r\ +> \n }\r\ +> \n }\r\ +> \n :onerror Err {\r\ +2654c2597 +< lScriptsUrl ];\ +--- +> lScriptsUrl ];\r\ +2656c2599 +< lobalScriptsUrlSuffix ];\ +--- +> lobalScriptsUrlSuffix ];\r\ +2658c2601 +< Suffix);\ +--- +> Suffix);\r\ +2660c2603 +< name\") . \"' from url: \" . \$Url);\ +--- +> name\") . \"' from url: \" . \$Url);\r\ +2661a2605 +> \r\ +2663,2667c2607,2611 +< ut=user as-value ];\ +< \n :if (\$Result->\"status\" = \"finished\") do={\ +< \n :set SourceNew [ :tolf (\$Result->\"data\") ];\ +< \n } \ +< \n } do={\ +--- +> ut=user as-value ];\r\ +> \n :if (\$Result->\"status\" = \"finished\") do={\r\ +> \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ +> \n } \r\ +> \n } do={\r\ +2669,2673c2613,2617 +< al->\"name\" . \"': \" . \$Err);\ +< \n :if (\$Err != \"Fetch failed with status 404\") do={\ +< \n :error false;\ +< \n }\ +< \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\ +--- +> al->\"name\" . \"': \" . \$Err);\r\ +> \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ +2675,2679c2619,2623 +< \?\");\ +< \n /system/script/remove \$Script;\ +< \n :error false;\ +< \n }\ +< \n :if (\$CheckSumsVerify = true) do={\ +--- +> \?\");\r\ +> \n /system/script/remove \$Script;\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if (\$CheckSumsVerify = true) do={\r\ +2681,2682c2625,2626 +< riptInfo->\"url-suffix\") ] = 0 && \\\ +< \n [ :len \$CheckSum ] = 0) do={\ +--- +> riptInfo->\"url-suffix\") ] = 0 && \\\r\ +> \n [ :len \$CheckSum ] = 0) do={\r\ +2684,2690c2628,2634 +< pdates with 'ignore=true' in comment.\");\ +< \n }\ +< \n }\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if ([ :len \$SourceNew ] = 0) do={\ +--- +> pdates with 'ignore=true' in comment.\");\r\ +> \n }\r\ +> \n }\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ :len \$SourceNew ] = 0) do={\r\ +2692,2696c2636,2640 +< >\"name\") . \"'.\");\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :local SourceCRLF [ :tocrlf \$SourceNew ];\ +--- +> >\"name\") . \"'.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ +2698c2642 +< lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\ +--- +> lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ +2700c2644 +< \$ScriptVal->\"source\")) do={\ +--- +> \$ScriptVal->\"source\")) do={\r\ +2702,2704c2646,2648 +< . \"' source did not change. End of lines set to CRLF.\");\ +< \n if (\$ScriptUpdatesCRLF = false) do={\ +< \n :put [ :tolf \$SourceNew ];\ +--- +> . \"' source did not change. End of lines set to CRLF.\");\r\ +> \n if (\$ScriptUpdatesCRLF = false) do={\r\ +> \n :put [ :tolf \$SourceNew ];\r\ +2706,2712c2650,2656 +< ) . \"' source update end of lines to LF.\");\ +< \n }\ +< \n :error false;\ +< \n }\ +< \n }\ +< \n\ +< \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\ +--- +> ) . \"' source update end of lines to LF.\");\r\ +> \n }\r\ +> \n :error false;\r\ +> \n }\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ +2715,2719c2659,2663 +< );\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if (\$CommentsInScripts = true) do={\ +--- +> );\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if (\$CommentsInScripts = true) do={\r\ +2721,2722c2665,2666 +< \_\") ];\ +< \n :if ([ :len \$CommentLine ] = 0) do={\ +--- +> \_\") ];\r\ +> \n :if ([ :len \$CommentLine ] = 0) do={\r\ +2725,2727c2669,2671 +< noring!\");\ +< \n :error false;\ +< \n } else={\ +--- +> noring!\");\r\ +> \n :error false;\r\ +> \n } else={\r\ +2730c2674 +< ] + 2) [ :len \$CommentLine] ]) do={\ +--- +> ] + 2) [ :len \$CommentLine] ]) do={\r\ +2733c2677 +< ;\ +--- +> ;\r\ +2735c2679 +< ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\ +--- +> ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ +2738,2739c2682,2683 +< ded!\");\ +< \n } else={\ +--- +> ded!\");\r\ +> \n } else={\r\ +2741,2746c2685,2690 +< al->\"name\") . \"' did not change.\");\ +< \n :error false;\ +< \n }\ +< \n } \ +< \n }\ +< \n\ +--- +> al->\"name\") . \"' did not change.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n } \r\ +> \n }\r\ +> \n\r\ +2748c2692 +< \"\\23 requires RouterOS, \") ] ]->version);\ +--- +> \"\\23 requires RouterOS, \") ] ]->version);\r\ +2750c2694 +< \_false ] = false) do={\ +--- +> \_false ] = false) do={\r\ +2752c2696 +< \") . \"' requires RouterOS \" . \\\ +--- +> \") . \"' requires RouterOS \" . \\\r\ +2754,2756c2698,2700 +< gnoring!\");\ +< \n :error false;\ +< \n }\ +--- +> gnoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +2758,2760c2702,2704 +< \\23 requires device-mode, \") ] ];\ +< \n :local MissingDM ({});\ +< \n :foreach Feature,Value in=\$RequiredDM do={\ +--- +> \\23 requires device-mode, \") ] ];\r\ +> \n :local MissingDM ({});\r\ +> \n :foreach Feature,Value in=\$RequiredDM do={\r\ +2762,2766c2706,2710 +< ceMode->\$Feature) = false) do={\ +< \n :set MissingDM (\$MissingDM, \$Feature);\ +< \n }\ +< \n }\ +< \n :if ([ :len \$MissingDM ] > 0) do={\ +--- +> ceMode->\$Feature) = false) do={\r\ +> \n :set MissingDM (\$MissingDM, \$Feature);\r\ +> \n }\r\ +> \n }\r\ +> \n :if ([ :len \$MissingDM ] > 0) do={\r\ +2768c2712 +< \") . \"' requires disabled \" . \\\ +--- +> \") . \"' requires disabled \" . \\\r\ +2770,2774c2714,2718 +< gnoring!\");\ +< \n :error false;\ +< \n }\ +< \n\ +< \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\ +--- +> gnoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n\r\ +> \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ +2776,2779c2720,2723 +< ScriptVal->\"name\") . \"' failed! Ignoring!\");\ +< \n :error false;\ +< \n }\ +< \n \ +--- +> ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n \r\ +2781,2782c2725,2726 +< ript comment: \" . (\$ScriptVal->\"comment\"));\ +< \n\ +--- +> ript comment: \" . (\$ScriptVal->\"comment\"));\r\ +> \n\r\ +2784c2728 +< Val->\"comment\") \\\ +--- +> Val->\"comment\") \\\r\ +2786,2788c2730,2732 +< F \$SourceNew ] \$Script;\ +< \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\ +< \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\ +--- +> F \$SourceNew ] \$Script;\r\ +> \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ +> \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ +2790,2795c2734,2739 +< o={\ +< \n :set ReloadGlobal true;\ +< \n }\ +< \n } on-error={ }\ +< \n }\ +< \n :if (\$ReloadGlobal = true) do={\ +--- +> o={\r\ +> \n :set ReloadGlobal true;\r\ +> \n }\r\ +> \n } on-error={ }\r\ +> \n }\r\ +> \n :if (\$ReloadGlobal = true) do={\r\ +2797,2800c2741,2744 +< \");\ +< \n :onerror Err {\ +< \n :global InitSetup (a);\ +< \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\ +--- +> \");\r\ +> \n :onerror Err {\r\ +> \n :global InitSetup (a);\r\ +> \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ +2802,2804c2746,2748 +< ctions failed! \" . \$Err)}\ +< \n }\ +< \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\ +--- +> ctions failed! \" . \$Err)}\r\ +> \n }\r\ +> \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ +2806,2817c2750,2761 +< \" . \\\ +< \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 ];\ +--- +> \" . \\\r\ +> \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ +> \n \". Installed an older version\?\");\r\ +> \n }\r\ +> \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ +> \n :global GlobalConfChanges;\r\ +> \n :global GlobalConfMigration;\r\ +> \n :local ChangeLogCode;\r\ +> \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ +> \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ +> \n :onerror Err {\r\ +> \n [ :parse \$ChangeLogCode ];\r\ +2819c2763 +< . \$Err)}\ +--- +> . \$Err)}\r\ +2821,2823c2765,2767 +< dation!\")}\ +< \n }\ +< \n :if ([ :len \$GlobalConfMigration ] > 0) do={\ +--- +> dation!\")}\r\ +> \n }\r\ +> \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ +2825,2828c2769,2772 +< \_do={\ +< \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\ +< \n :do {\ +< \n :if ([ :typeof \$Migration ] != \"str\") do={\ +--- +> \_do={\r\ +> \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ +> \n :do {\r\ +> \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ +2830,2833c2774,2777 +< \_\" is not available.\");\ +< \n :error false;\ +< \n }\ +< \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\ +--- +> \_\" is not available.\");\r\ +> \n :error false;\r\ +> \n }\r\ +> \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ +2835,2836c2779,2780 +< \_. \" failed syntax validation!\");\ +< \n :error false}\ +--- +> \_. \" failed syntax validation!\");\r\ +> \n :error false}\r\ +2838,2840c2782,2784 +< . \": \" . \$Migration);\ +< \n :onerror Err {\ +< \n [ :parse \$Migration ];\ +--- +> . \": \" . \$Migration);\r\ +> \n :onerror Err {\r\ +> \n [ :parse \$Migration ];\r\ +2842,2845c2786,2789 +< \_\$I . \" failed to run: \" . \$Err)}\ +< \n } on-error={ }\ +< \n }\ +< \n }\ +--- +> \_\$I . \" failed to run: \" . \$Err)}\r\ +> \n } on-error={ }\r\ +> \n }\r\ +> \n }\r\ +2847c2791 +< entity . \" increased \" . \\\ +--- +> entity . \" increased \" . \\\r\ +2849c2793 +< d modification. \" . \\\ +--- +> d modification. \" . \\\r\ +2851,2853c2795,2797 +< bal-config.\");\ +< \n \$LogPrint info \$0 (\$NotificationMessage);\ +< \n :if ([ :len \$GlobalConfChanges ] > 0) do={\ +--- +> bal-config.\");\r\ +> \n \$LogPrint info \$0 (\$NotificationMessage);\r\ +> \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ +2855c2799 +< \");\ +--- +> \");\r\ +2857,2858c2801,2802 +< \_do={\ +< \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\ +--- +> \_do={\r\ +> \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ +2860,2862c2804,2807 +< \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\ +< \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\ +< \n }\ +--- +> \r\ +> \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ +> \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ +> \n }\r\ +2864,2891c2809,2819 +< ws and changes are not available.\")}\ +< \n\ +< \n :set GlobalConfChanges;\ +< \n :set GlobalConfMigration;\ +< \n }\ +< \n} do={\ +< \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +< \n} }\ +< \n\ +< \n# load modules\ +< \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ +< ns\\\\.d|mod)/.\" ] do={\ +< \n :local ScriptVal [ /system/script/get \$Script ];\ +< \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\ +< \n :onerror Err {\ +< \n /system/script/run \$Script;\ +< \n } do={\ +< \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ +< ailed to run: \" . \$Err);\ +< \n }\ +< \n } else={\ +< \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ +< led syntax validation, skipping.\");\ +< \n }\ +< \n}\ +< \n\ +< \n# Add and fix global scheduler\ +< \n:put \"Add or/and fix Global scheduler...\";\ +--- +> ws and changes are not available.\")}\r\ +> \n\r\ +> \n :set GlobalConfChanges;\r\ +> \n :set GlobalConfMigration;\r\ +> \n }\r\ +> \n} do={\r\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +> \n} }\r\ +> \n\r\ +> \n# Add and fix global scheduler\r\ +> \n:put \"Add or/and fix Global scheduler...\";\r\ +2893,2894c2821,2822 +< ; }\";\ +< \n:local Comment \"Every Day Set Global Environment Variables\";\ +--- +> ; }\";\r\ +> \n:local Comment \"Every Day Set Global Environment Variables\";\r\ +2896c2824 +< = 0) do={\ +--- +> = 0) do={\r\ +2898,2899c2826,2827 +< ent=\$OnEvent start-time=startup;\ +< \n}\ +--- +> ent=\$OnEvent start-time=startup;\r\ +> \n}\r\ +2901,2903c2829,2831 +< \_do={\ +< \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\ +< \n}\ +--- +> \_do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ +> \n}\r\ +2905,2909c2833,2837 +< ) do={\ +< \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\ +< \n}\ +< \n# Add Update Script scheduler\ +< \n:put \"Add or/and fix Update Script scheduler\";\ +--- +> ) do={\r\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ +> \n}\r\ +> \n# Add Update Script scheduler\r\ +> \n:put \"Add or/and fix Update Script scheduler\";\r\ +2911c2839,2840 +< \n:set Comment \"Every Day Check For Update Scripts\";\ +--- +> \r\ +> \n:set Comment \"Every Day Check For Update Scripts\";\r\ +2913c2842 +< \" ] ] = 0) do={\ +--- +> \" ] ] = 0) do={\r\ +2915,2923c2844,2847 +< start-time=startup interval=1d on-event=\$OnEvent;\ +< \n}\ +< \n\ +< \n:onerror Err {\ +< \n :global GlobalConfReady;\ +< \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ +< \_not ready.\"); }; } delay=100ms max=5;\ +< \n\ +< \n:log warning (\"This script \$ScriptName Loaded \" . \\\ +--- +> start-time=startup interval=1d on-event=\$OnEvent;\r\ +> \n}\r\ +> \n\r\ +> \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ +2925c2849 +< \") ] . \\\ +--- +> \") ] . \\\r\ +2927,2935c2851,2857 +< \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\ +< \n # signal we are ready\ +< \n:set GlobalFuncReady true;\ +< \n:set ExitOK true;\ +< \n\ +< \n:log info (\$0 . \"Global configs ready!\");\ +< \n} do={\ +< \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +< \n}\ +--- +> \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ +> \n# signal we are ready\r\ +> \n:set GlobalFuncReady true;\r\ +> \n" +> add dont-require-permissions=no name=AM-FwAddrLists owner=AM-FwAddrLists \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> source="#!rsc by Vados\ -- 2.52.0

~g0+X5Ftk7n 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