From a0bf42d8742c1bde9e65e633ce7cc9c8ef2d37be Mon Sep 17 00:00:00 2001 From: vados-dev Date: Mon, 2 Mar 2026 22:20:03 +0300 Subject: [PATCH] Backup for MikroNUC sucessfully creatd at Mar 02 22:20:03. --- .../20260302/20260302222001-Binary.backup | Bin 0 -> 307886 bytes MikroNUC/20260302/20260302222001-Config.rsc | 2770 +++++++++++++++++ .../20260302/20260302222001-Diff-Config.rsc | 4 + 3 files changed, 2774 insertions(+) create mode 100644 MikroNUC/20260302/20260302222001-Binary.backup create mode 100644 MikroNUC/20260302/20260302222001-Config.rsc create mode 100644 MikroNUC/history/20260302/20260302222001-Diff-Config.rsc diff --git a/MikroNUC/20260302/20260302222001-Binary.backup b/MikroNUC/20260302/20260302222001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..8ff766a6da0d9c0430bcad1f4660ca5533394505 GIT binary patch literal 307886 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\"name\") ];\r\ + \n#[/system/script get \$expScript name];\r\ + \n:delay 2s;\r\ + \n\r\ + \n:set expSrc [/system/script print where name=\$expName];\r\ + \n/system/script print where name=\$expName;\r\ + \n#[:put [/system/script get \$expScript source]];\r\ + \n:put [\$expSrc];\r\ + \n:delay 2s;\r\ + \n:set FileName \$expName;\r\ + \n:set FilePath (\$DirPath . \$FileName);\r\ + \n\r\ + \n#:log warning \"\\n----------------------\\n\\\$expSrc = \$expSrc\\n____\ + ______________________________\";\r\ + \n:log info \"\\n\\\$FileName = '\$FileName'\";\r\ + \n:log info \"\\n\\\$FilePath = \$FilePath\";\r\ + \n#:log warning {/system/script/get source=[/system/script/get \$expScript\ + \_source];};\r\ + \n\r\ + \n#\$[/system script get [/system script find name=\"\$FileName\"] source]\ + \r\ + \n\r\ + \n#:local gettingScript \"\$FileName\";\r\ + \n#:execute script=\"[[:parse \\\"[:parse { :put (\"\$[/system script get \ + [/system script find name=\$FileName] source]\"); } \\\"]]\"; \\\r\ + \n\r\ + \n#:execute script={:put \"[:parse \\\"[:parse [/system/script get [/syste\ + m/script find name=\$gettingScript] source];\\\"]]\";} \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n:do {\r\ + \n:local fName (\$FilePath . \".rsc\");\r\ + \n#:delay 3s;\r\ + \n#/file add name=\$fName;\r\ + \n:put [:tostr [\$expSrc]];\r\ + \n/file set \$fName contents=[:put [\$expSrc]];\r\ + \n:delay 3s;\r\ + \n\$WaitForFile \$fName;\r\ + \n(\$FilePath . \".rsc\");\r\ + \n#:delay 2s;\r\ + \n\r\ + \n} on-error={\r\ + \n:log error \"\\nERROR \\\$FilePath = \$FilePath\";\r\ + \n}\r\ + \n#\$WaitForFile (\$FilePath . \".rsc\");\r\ + \n#:execute script={ :put [/system/script get [:put \$FileName] source]; }\ + ;\r\ + \n#/system/script export \$Sscript file=\$FilePath;\r\ + \n#/system/script/export [:put [/system/script/get \$expScript source]] fi\ + le=\$FilePath;\r\ + \n#:execute script={ :put [/system/script/get \$expScript source]; } \\\r\ + \n\r\ + \n#:log warning \"\\n\\\$expScript = \$expScript\";\r\ + \n# \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n#script={:put [/system/script/get \$FileName source];} file=(\$FilePath\ + \_. \".rsc\\00\");\r\ + \n#/system script export \$src file=(\$FilePath . \$FileName);\r\ + \n}\r\ + \n\r\ + \n:log warning \"\\nComplete!\";\r\ + \n\r\ + \n # :execute script={ :put [ /system/script/get Amster-GlobalConfig sou\ + rce ]; } \\\r\ + \n # file=(\$FilePath . \".conf\\00\");\r\ + \n # \$WaitForFile (\$FilePath . \".conf\");\r\ + \n # :onerror Err {\r\ + \n # /tool/fetch upload=yes url=(\$BackupUploadUrl . \"/\" . \$FileName\ + \_. \".conf\") \\\r\ + \n # user=\$BackupUploadUser password=\$BackupUploadPass src-path=(\ + \$FilePath . \".conf\");\r\ + \n # :set ConfigFile [ /file/get (\$FilePath . \".conf\") ];\r\ + \n # :set (\$ConfigFile->\"name\") (\$FileName . \".conf\");\r\ + \n " +add dont-require-permissions=no name=test1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n#:local runningVer [:find [/system/resource/get version] \"(\"];\r\ + \n\r\ + \n:local runningChannel;\r\ + \n:local runningVersion;\r\ + \n:local ParseCustom;\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n \r\ + \n:global runningChannel [\$ParseCustom [/system/resource/get version] \"(\ + \" \")\" 1];\r\ + \n:log warning [\$runningChannel];\r\ + \n:set runningVersion [\$ParseCustom [/system/resource/get version] \" \" \ + \")\" 2];\r\ + \n:log warning [\$runningVersion];\r\ + \n\r\ + \n\r\ + \n\r\ + \n# :if ([:len \$open] = 0) do={\r\ + \n# :log error \"\$SMP Could not extract installed OS channel from vers\ + ion string: `\$runningOsAndChannel`.\";\r\ + \n# :error \"\$SMP error, check logs\";\r\ + \n# }\r\ + \n# :local rest [:pick \$runningOsAndChannel (\$open+1) [:len \$runningOs\ + AndChannel]];\r\ + \n# :local close [:find \$rest \")\"];\r\ + \n# :local channel [:pick \$rest 0 \$close];\r\ + \n# :return \$channel;\r\ + \n#}" +add dont-require-permissions=no name=01-Amster-Init-Script owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# Amster Initial Script\r\ + \n#\r\ + \n#:global GlobalEnvRemove true; /system/script {run Amster-GlobalEnvRemov\ + e; };\r\ + \n#:delay 1s;\r\ + \n:#global ReloadGlobal true; \r\ + \n\r\ + \n:global AmScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global defOwner \"vados\";\r\ + \n:global AmFirstRun;\r\ + \n\r\ + \n:set AmFirstRun do={\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n #:global ParseKeyValueStore;\r\ + \n #:local AmUpdCRLF true;\r\ + \n #:local IfThenElse;\r\ + \n #:set IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1\ + \_] = true) do={:return \$2}; :return \$3}\r\ + \n #/certificate/settings/set builtin-trust-store=fetch;\r\ + \n #/tool/fetch \"\$scriptsUrl/certs/Root-YE.pem\" dst-path=\"root-ye.p\ + em\";\r\ + \n #/certificate/import file-name=\"root-ye.pem\" passphrase=\"\";\r\ + \n # For basic verification we rename the certificate and print it by f\ + ingerprint. Make sure exactly this one certificate (\"Root-YE\") is shown.\ + \r\ + \n #/certificate/set name=\"Root-YE\" [ find where common-name=\"Root Y\ + E\" ];\r\ + \n #/certificate/print proplist=name,fingerprint where fingerprint=\"e1\ + 4ffcad5b0025731006caa43a121a22d8e9700f4fb9cf852f02a708aa5d5666\";\r\ + \n #:log info \"\\nAmScriptsUrl = \$AmScriptsUrl\";\r\ + \n :local Scripts {\r\ + \n \"Amster-GlobalConfig\"\r\ + \n \"Amster-GlobalFunc\";\r\ + \n# \"Amster-SFTP-backup\"\r\ + \n# \"Amster-BkpEmail-and-upd\";\r\ + \n };\r\ + \n# /system/script/set owner=(\$ScriptVal->\"name\") \\\r\ + \n# source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRLF \$S\ + ourceNew ] \$Script;\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n /system/script { run Amster-GlobalConfig; run Amster-GlobalFunc; }\r\ + \n}\r\ + \n:global AmUpdRun;\r\ + \n:set AmUpdRun do={\r\ + \n #:local UpdScript [ :tostr \$1 ];\r\ + \n #:global ParseKeyValueStore;\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n :local Scripts {\r\ + \n# \"Amster-GlobalConfig\"\r\ + \n# \"Amster-GlobalFunc\"\r\ + \n# \"Amster-GlobalRemove\"\r\ + \n \"Amster-backup-SFTP\"\r\ + \n \"Amster-SFTP-backup\"\r\ + \n \"Amster-BkpEmail-and-upd\"\r\ + \n \"Amster-TG-Bot\"\r\ + \n \"Amster-TG-Notification\";\r\ + \n };\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"updating \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n# /system/script/add name=\$Script owner=\$AmOwner source=([ /tool/fe\ + tch check-certificate=yes-without-crl (\"\$AmScriptsUrl\" . \$Script . \".\ + rsc\") output=user as-value ]->\"data\"); };\r\ + \n}\r\ + \n\r\ + \n\$AmFirstRun;\r\ + \n#\$AmUpdRun;\r\ + \n\r\ + \n#\$setUpdExist;\r\ + \n#:global setUpdExist;\r\ + \n#:global ParseKeyValueStore;\r\ + \n#:set setUpdExist do={\r\ + \n#:do {\r\ + \n#:global ParseKeyValueStore;\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\\r\?\\n#comment=*\" ] do={\r\ + \n# :local ScriptVal [ /system/script/get \$Script ];\r\ + \n# :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"#comment\"\ + ) ];\r\ + \n# :local scriptName (\$ScriptVal->\"name\");\r\ + \n#:log warning (\"\\n\\\$scriptName = \". \$scriptName);\r\ + \n#: log warning (\"\\n\\\$ScriptInfo = \". \$ScriptInfo);\r\ + \n# }\r\ + \n#} on-error={}\r\ + \n#}\r\ + \n#\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run\ + -count;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;\r\ + \n#;(evl / (evl /docommand=;(evl / (evl /foreachcounter=\$Script;do=;(evl \ + / (evl /localname=\$ScriptVal;value=(evl (evl /system/script/getnumber=\$S\ + cript))) (evl /localname=\$ScriptInfo;value=(evl (<%% \$ParseKeyValueStore\ + \_(> \$ParseKeyValueStore);(-> \$ScriptVal comment)))) (evl /localname=\$s\ + criptName) (evl /setname=\$scriptName;value=(-> #\$ScriptVal name)) (evl /\ + log/errormessage=(. \r\ + \n# \$ ScriptInfo = \$ScriptInfo)));in=(evl (evl /system/script/findwhere\ + =\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run-c\ + ount;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;(~ \$so\ + urce (. ^#!rsc by Vados \r\ + \n# \? \r\ + \n#));5))));on-error=;(evl /)))\r\ + \n" +add dont-require-permissions=no name="Download cAP's Packages" owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# +------------------------------+\r\ + \n# | |\r\ + \n# | Mikrotik RouterOS Scripts |\r\ + \n# | _Download cAP's Packages_ |\r\ + \n# | |\r\ + \n# +------------------------------+\r\ + \n# https://github.com/sebastian13/mikrotik-routeros-scripts\r\ + \n#\r\ + \n\r\ + \n# Set a directory path providing the required space\r\ + \n# Add a microSD card https://wiki.mikrotik.com/wiki/Manual:System/Disks\ + \r\ + \n# or setup a RAM-Disk via '/disk/add type=tmpfs tmpfs-max-size=20M slot=\ + ram'\r\ + \n:local dir \"/tmpfs/capsman-packages\";\r\ + \n\r\ + \n\r\ + \n# Set Package Path if required, set policy to none if using 'upgrade-cap\ + s' script\r\ + \n/interface/wifi/capsman/set package-path=\$dir upgrade-policy=none;\r\ + \n/caps-man/manager/set package-path=\$dir upgrade-policy=none;\r\ + \n#require-same-version;\r\ + \n\r\ + \n:local installed [/system package get value-name=version [find where nam\ + e=\"routeros\"]]\r\ + \n\r\ + \n# Delete old downloads\r\ + \n# /file/remove [ find type=package name~\"capsman*\" ]\r\ + \n\r\ + \n# Starting from RouterOS version 7.13, drivers for older wireless and 60\ + GHz interfaces are\r\ + \n# part of the separate \"wireless\" package. The existing \"wifiwave2\" \ + package has been divided\r\ + \n# into distinct packages: \"wifi-qcom\" and \"wifi-qcom-ac\".\r\ + \n# RouterOS >=7.12 is required to upgrade to 7.13.\r\ + \n# https://forum.mikrotik.com/viewtopic.php\?t=202423\r\ + \n\r\ + \n:foreach architecture in={ \"arm\";\r\ + \n# \"arm64\";\r\ + \n \"x86_64\";\r\ + \n \"mipsbe\"} do={\r\ + \n :foreach package in={ \"routeros\";\r\ + \n# \"wifi-qcom-ac\";\r\ + \n# \"wifi-qcom\";\r\ + \n \"wireless\"} do={ :do {\r\ + \n :put \"\"\r\ + \n :put \"Download \$package \$installed for \$architecture\"\r\ + \n /tool fetch mode=https \\\r\ + \n url=\"https://download.mikrotik.com/routeros/\$installed/\$packa\ + ge-\$installed-\$architecture.npk\" \\\r\ + \n dst-path=\"\$dir/\$package-\$installed-\$architecture.npk\"\r\ + \n } on-error={ :put \"Error downloading the file. On a 404, note t\ + hat the package may not exist for the specified architecture!\" }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Script for setup routeros scrypt system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros scrypt 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#:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados\ + \" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$Scri\ + pt;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Script\ + ;\r\ + \n# }\r\ + \n#}\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :put \"Thr tmpfs variable is true. Checking for tmpfs/scripts director\ + y...\";\r\ + \n :if (\$tmpfs = true && [/file find name=\"tmpfs/scripts\"] != \"\") do\ + ={\r\ + \n :log debug (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\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 :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 comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global GlobalConfReady false;\r\ + \n# \\/ start edit\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in Amster-Init-Script\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\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\"; #:global EmailGeneralCc \"\";\ + \r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.21\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\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 CleanFilePath;\r\ + \n:global CleanName;\r\ + \n:global CharacterReplace;\r\ + \n:global CharacterMultiply;\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if (\$CurrentChannel != \$updateChannel) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n \r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel (\$Update->\"channel\");\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n \r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([:len \$arrDeviceInfo] = 0) do={\r\ + \n :global arrDeviceInfo ({});\r\ + \n :local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};}\ + );\r\ + \n }\r\ + \n # else={:local arrDeviceInfo ({})}\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [[ :parse \"/\ + system/package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"\ + Error\")};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannel\"; \$Cu\ + rrentChannel;};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentVersion\"; (\$U\ + pdate->\"installed-version\");};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannelVersion\ + \"; [/system/resource/get version];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateChannel\"; [\$up\ + dateChannel];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateVersion\"; (\$Up\ + date->\"latest-version\");};\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\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\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n \r\ + \n :global arrDeviceInfo [:toarray {\"section\"={\"key\"=\"\"; \"value\"\ + =\"\";} }];\r\ + \n #:do {:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system/package\ + /update/get\" ]]} on-error={}\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devRbCurrentFw;\r\ + \n :global devRbUpgradeFw;\r\ + \n \r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global ROsVerCurrent;\r\ + \n :global ROsChannelCurrent;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :global ParseCustom;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global devBuildTime;\r\ + \n :global GetPubIp;\r\ + \n \r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :set devBuildTime (\$Resource->\"build-time\");\r\ + \n :set runningChannelVersion (\$Resource->\"version\");\r\ + \n :set runningChannel [\$ParseCustom \$runningChannelVersion \"(\" \")\ + \" 1];\r\ + \n :set runningVersion [\$ParseCustom \$runningChannelVersion \" \"];\r\ + \n \r\ + \n :do {\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :local RouterBoard;\r\ + \n :do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on\ + -error={}\r\ + \n :set devModel (\$RouterBoard->\"model\");\r\ + \n :set devRbRevision (\$RouterBoard->\"revision\");\r\ + \n :set devRbSerialNumber (\$RouterBoard->\"serial-number\");\r\ + \n #:set devRbCurrentFw (\$RouterBoard->\"current-firmware\");\r\ + \n #:set devRbUpgradeFw (\$RouterBoard->\"upgrade-firmware\");\r\ + \n :if (\$devCurArch = \"mipsbe\" || \$devCurArch = \"arm\") do={\r\ + \n :global devRunning [ /system/device-mode/get mode ];\r\ + \n } else={\r\ + \n :global devRunning [/system/device-mode/get running];}\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n \r\ + \n :set devRbRevision false;\r\ + \n :set devRbSerialNumber false;\r\ + \n# :set devRbCurrentFw false;\r\ + \n# :set devRbUpgradeFw false;\r\ + \n #:set devCurrentFw \$runningVersion;#:set devUpgradeFw \$ROsVerAvail\ + ;\r\ + \n :set devRunning [/system/device-mode/get running];\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Error in Function getDevice!\");\r\ + \n :return false;\r\ + \n }\r\ + \n:return true;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global WaitArrDeviceInfo;\r\ + \n # \$WaitDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devCurArch;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global PiblicIpAddress;\r\ + \n\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :local Return;\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n \r\ + \n :set Return ([ \$FormatLine \"Hostname:\" \$Identity ] . \"\\n\" . \\\ + \r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location:\" (\$Snmp->\"location\") ] . \"\\n\") \ + ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact:\" (\$Snmp->\"contact\") ] . \"\\n\") ] \ + . \\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board:\" . \$devBoardName ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Arch:\" . \$devCurArch ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Model:\" \$devModel ] . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbRevision ] > 0) \\\r\ + \n (\" \" . \$devRbRevision) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbSerialNumber ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial:\" . \$devRbSerialNumber ] . \"\\n\"\ + ) ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"nleve\ + l\")) ] . \"\\n\") ] . \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \"Running Channel\" \$runningChannel ] . \"\\n\" . \\\ + \r\ + \n [ \$FormatLine \" Installed:\" (\$Update->\"installed-version\") \ + ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :typeof (\$Update->\"latest-version\") ] != \"noth\ + ing\" && \\\r\ + \n \$Update->\"installed-version\" != \$Update->\"latest-version\")\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Update->\"latest-version\") ]\ + \_. \"\\n\") ] . \\\r\ + \n [ \$IfThenElse (\$RouterBoard->\"routerboard\" = true && \\\r\ + \n \$RouterBoard->\"current-firmware\" != \$RouterBoard->\"upgrade-\ + firmware\") \\\r\ + \n ([ \$FormatLine \" Firmware\" (\$RouterBoard->\"current-firmwar\ + e\") ] . \"\\n\") ] . \\ \r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fail\ + ed to detect public IP using default service: \" . \$Url . \".\")}\r\ + \n #:error \"Failed to detect public IP using default service: \$Url\ + .\"};\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :if (\$PubIpAddr = false) do={\r\ + \n :set PubIpAddr \"not-detected\";\r\ + \n } else={\r\ + \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ + \n }\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n \$LogPrint warning \$0 (\"This system has low free flash space but \ + \" . \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint info \$0 (\"There are \" . \$CertCount . \" Certificates \ + with CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :global LogPrint;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set 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 ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n \r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n \r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \"checksums.json\" . \$GlobalScrip\ + tsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint error \$Name ([ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\ + \$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {:set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :global LogPrint;\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\r\ + \n \r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\r\ + \n \r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Setup Global Environment for scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n:log warning (\"This script \$ScriptName Loaded on \" . \$devBoardName .\ + \_\"\\nRouterOS: \" . \$devCurVersion . \"\\nArchitecture: \" . \$devCurAr\ + ch . \"\\nIdentity: \" . \$Identity);\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n\r\ + \n#root.mnuc.backuper\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\r\ + \n#/usb1/mikro_bak_rsa.pub" +add dont-require-permissions=yes name=MkTmpfs owner=vados policy=\ + ftp,read,write,policy,test,sniff,sensitive source=\ + ":global MkDir;\r\ + \n\r\ + \n\$MkDir /usb1/tmpfs;" +add dont-require-permissions=no name=CreateContainer owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local contIF \"veth1\";\r\ + \n:local contIP \"10.10.10.10/24\";\r\ + \n:local contGW \"10.10.10.1\";\r\ + \n#/interface/veth/add name=\$contIF address=\$contIP gateway=\$contGW;\r\ + \n:local contBridgeIF \"Bridge-DOC\";\r\ + \n:local contBridgeIP \"10.10.10.1/24\";\r\ + \n/interface/bridge/add name=\$contBridgeIF;\r\ + \n/ip/address/add address=\$contBridgeIP interface=\$contBridgeIF;\r\ + \n/interface/bridge/port/add bridge=\$contBridgeIF interface=\$contIF;\r\ + \n/container/config/set ram-high=768M registry-url=https://registry-1.dock\ + er.io tmpdir=sata1/tmp\r\ + \n" +add dont-require-permissions=no name=carkeeperbot owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/mounts/add list=carkeeper_configs/.profile src=sata1/carkeeper/c\ + onfigs/.profile dst=/root/.ashrc;\r\ + \n/container/mounts/add list=carkeeper_configs/php.ini src=sata1/carkeeper\ + /configs/php.ini dst=/etc/php82/php.ini;\r\ + \n#/container/mounts/add list=carkeeper_configs src=sata1/carkeeper/config\ + s dst=/configs;\r\ + \n/container/mounts/add list=carkeeper_app src=sata1/carkeeper/app dst=/ap\ + p;\r\ + \n/container/mounts/add list=carkeeper_scripts src=sata1/carkeeper/scripts\ + \_dst=/scripts;\r\ + \n/container/mounts/add list=carkeeper_configs/sshd_config src=sata1/carke\ + eper/configs/sshd_config dst=/etc/ssh/sshd_config;\r\ + \n\r\ + \n/container/mounts/add list=carkeeper_tmp src=sata1/carkeeper/tmp dst=/va\ + r/tmp;\r\ + \n/container/mounts/add list=carkeeper_sync src=sata1/carkeeper/sync dst=/\ + var/sync;\r\ + \n" +/tool e-mail +set certificate-verification=no from=MikroNUC port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool netwatch +add disabled=yes down-script=\ + ":local msg \"Host MikroYellow is DOWN\";\r\ + \n\$TGSendMessage \$msg;" host=10.30.30.86 http-codes="" interval=10s \ + test-script="" type=simple up-script=\ + ":global TGSendMessage;\r\ + \n\$TGSendMessage \"Host MikroYellow is UP\";" +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260302/20260302222001-Diff-Config.rsc b/MikroNUC/history/20260302/20260302222001-Diff-Config.rsc new file mode 100644 index 0000000..55bc9c7 --- /dev/null +++ b/MikroNUC/history/20260302/20260302222001-Diff-Config.rsc @@ -0,0 +1,4 @@ +1c1 +< # 2026-03-02 22:20:01 by RouterOS 7.21.1 +--- +> # 2026-03-02 22:10:01 by RouterOS 7.21.1 -- 2.52.0