From ba1a61f0b521d2a46addae631be6255c7389a6d6 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Tue, 3 Mar 2026 08:40:04 +0300 Subject: [PATCH] Backup for MikroNUC sucessfully creatd at Mar 03 08:40:04. --- .../20260303/20260303084001-Binary.backup | Bin 0 -> 307886 bytes MikroNUC/20260303/20260303084001-Config.rsc | 2770 +++++++++++++++++ .../20260303/20260303084001-Diff-Config.rsc | 4 + 3 files changed, 2774 insertions(+) create mode 100644 MikroNUC/20260303/20260303084001-Binary.backup create mode 100644 MikroNUC/20260303/20260303084001-Config.rsc create mode 100644 MikroNUC/history/20260303/20260303084001-Diff-Config.rsc diff --git a/MikroNUC/20260303/20260303084001-Binary.backup b/MikroNUC/20260303/20260303084001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..554c063cd6d9cf53ef879c45b3c2b349d7c05243 GIT binary patch literal 307886 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 z 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

(@YdNg+H6OpC&&Sk8tL7t`Gd-5Xh__?L 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 SBgB\"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/20260303/20260303084001-Diff-Config.rsc b/MikroNUC/history/20260303/20260303084001-Diff-Config.rsc new file mode 100644 index 0000000..dc84326 --- /dev/null +++ b/MikroNUC/history/20260303/20260303084001-Diff-Config.rsc @@ -0,0 +1,4 @@ +1c1 +< # 2026-03-03 08:40:01 by RouterOS 7.21.1 +--- +> # 2026-03-02 23:20:02 by RouterOS 7.21.1 -- 2.52.0