From aca626dc7c7d785bbf4b3f5c228b4f265cc330cb Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 8 May 2026 13:00:54 +0300 Subject: [PATCH] Backup for MikroGig created successfully at May 08 13:00:54. --- .../20260508/20260508130050-Binary.backup | Bin 0 -> 157267 bytes MikroGig/20260508/20260508130050-Config.rsc | 2636 +++++++++++ .../20260508/20260508130050-Diff-Config.rsc | 4209 +++++++++++++++++ 3 files changed, 6845 insertions(+) create mode 100644 MikroGig/20260508/20260508130050-Binary.backup create mode 100644 MikroGig/20260508/20260508130050-Config.rsc create mode 100644 MikroGig/history/20260508/20260508130050-Diff-Config.rsc diff --git a/MikroGig/20260508/20260508130050-Binary.backup b/MikroGig/20260508/20260508130050-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..8e35c10e62fd0bbeccd912eb7f2e264e3ec60dd0 GIT binary patch literal 157267 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

-?+=o=1Y+)H+_(kWZqw^?iT;M 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 W?\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe true;\r\ + \n:global RunOnce (a);\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs false;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n\r\ + \n :local UrlSuffix \$Identity;\r\ + \n :local UrlDir \"certs/\";\r\ + \n :local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\"); \ + \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\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ + \_\\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n /tool/fetch (\$CertUrl . \$CertFileName) dst-path=\$CertFileName\ + \_as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n /certificate/set name=\"Root-YE\" [ find where common-name=\"Roo\ + t YE\" ];\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\"; \"mod/AM-\ + Certs-By-Ident\" } 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 Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\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\";\r\ + \n#: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:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \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# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/633/2f6d4158\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 14:35:03 05.05.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\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 CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\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 updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$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 :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\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:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$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={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$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={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \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\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log 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 :log 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 :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log 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 :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\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 ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$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=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' 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 :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 :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\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 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 [ :le\ + n \$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 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 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\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log 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 ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\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 :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \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 :log 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 :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log 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 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 VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log 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 :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 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\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\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\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \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 :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\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 :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \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\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\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\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log 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\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\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\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \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:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\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\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\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\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 \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\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 \"Every Day Set Global Environment Variables\";\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: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:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add dont-require-permissions=no name=mod/AM-Certs-By-Ident owner=admin \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\ + \n# RouterOS script: AM-Certs-By-Ident\ + \n# Script comment: Download custom Certificates By Routers Identity \ + \n# Copyright (c) 2005-2026 Vados \ + \n#\ + \n#\ + \n# requires RouterOS, version=7.19\ + \n# requires device-mode, fetch\ + \n#\ + \n# :local ScriptName [ :jobname ];\ + \n#\ + \n# CloudFlare\ + \n#/tool/fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalR\ + ootCA.crt.pem;\ + \n#/certificate/import file-name=DigiCertGlobalRootCA.crt.pem passphrase=\ + \"\";\ + \n#/tool/ fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobal\ + G2TLSRSASHA2562020CA1-1.crt.pem;\ + \n#/certificate/import file-name=DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt\ + .pem passphrase=\"\";\ + \n# Quad9\ + \n#/tool/fetch mode=https url=\"https://cacerts.digicert.com/DigiCertGloba\ + lG3TLSECCSHA3842020CA1-1.crt.pem\"\ + \n#/certificate/import file-name=DigiCertGlobalG3TLSECCSHA3842020CA1-1.crt\ + .pem passphrase=\"\";\ + \n\ + \n:global GlobalScriptsUrl;\ + \n:local UrlSuffix [/system/identity/get name];\ + \n:local UrlDir \"certs/\";\ + \n:local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\");\ + \n\ + \n:log error \$CertUrl;\ + \n\ + \n:local CertName \"DigiCert-Global-Root-CA.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Global-Root-CA\" [ find where common-na\ + me=\"DigiCert Global Root CA\" ];\ + \n\ + \n:set CertName \"DigiCert-Assured-ID-Root-CA.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-CA\" [ find where commo\ + n-name=\"DigiCert Assured ID Root CA\" ];\ + \n\ + \n:set CertName \"DigiCert-Assured-ID-Root-G2.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G2\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\ + \n\ + \n:set CertName \"DigiCert-Assured-ID-Root-G3.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G3\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\ + \n\ + \n:set CertName \"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G2 TLS RSA SHA256 2020 CA1\" ];\ + \n\ + \n:set CertName \"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G3 TLS ECC SHA384 2020 CA1\" ];\ + \n\ + \n:set CertName \"DigiCert-Global-Root-G2.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Global-Root-G2\" [ find where common-na\ + me=\"DigiCert Global Root G2\" ];\ + \n\ + \n:set CertName \"DigiCert-Global-Root-G3.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Global-Root-G3\" [ find where common-na\ + me=\"DigiCert Global Root G3\" ];\ + \n\ + \n:set CertName \"DigiCert-TLS-ECC-P384-Root-G5.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-TLS-ECC-P384-Root-G5\" [ find where com\ + mon-name=\"DigiCert TLS ECC P384 Root G5\" ];\ + \n\ + \n:set CertName \"DigiCert-TLS-RSA4096-Root-G5.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-TLS-RSA4096-Root-G5\" [ find where comm\ + on-name=\"DigiCert TLS RSA4096 Root G5\" ];\ + \n\ + \n:set CertName \"DigiCert-Trusted-Root-G4.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"DigiCert-Trusted-Root-G4\" [ find where common-n\ + ame=\"DigiCert Trusted Root G4\" ];\ + \n\ + \n:set CertName \"GTS-Root-R4.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"GTS-Root-R4\" [ find where common-name=\"GTS Roo\ + t R4\" ];\ + \n\ + \n:set CertName \"Go-Daddy-Root-Certificate-Authority-G2.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"Go-Daddy-Root-Certificate-Authority-G2\" [ find \ + where common-name=\"Go Daddy Root Certificate Authority - G2\" ];\ + \n\ + \n:set CertName \"ISRG-Root-X1.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"ISRG-Root-X1\" [ find where common-name=\"ISRG R\ + oot X1\" ];\ + \n\ + \n:set CertName \"Root-YE.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"Root-YE\" [ find where common-name=\"Root YE\" ]\ + ;\ + \n\ + \n:set CertName \"Starfield-Root-Certificate-Authority-G2.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"Starfield-Root-Certificate-Authority-G2\" [ find\ + \_where common-name=\"Starfield Root Certificate Authority - G2\" ];\ + \n\ + \n:set CertName \"USERTrust-RSA-Certification-Authority.pem\";\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\ + \n/certificate/set name=\"USERTrust-RSA-Certification-Authority\" [ find w\ + here common-name=\"USERTrust RSA Certification Authority\" ];\ + \n\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\ + \n#:set CertName \"GTS-Root-RX.pem\";\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\ + \n#internet\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\ + \n#:set CertName \"ISRG-Root-X2.pem\";\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\ + \n\ + \n\ + \n#/ip/dns/set allow-remote-requests=yes doh-max-concurrent-queries=100 do\ + h-max-server-connections=20 use-doh-server=https://security.cloudflare-dns\ + .com/dns-query verify-doh-cert=yes;\ + \n#/ip/dns/static remove [find where address=1.1.1.1];\ + \n#/ip/dns/static add address=1.1.1.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 1\";\ + \n#/ip/dns/ static remove [find where address=1.0.0.1];\ + \n#/ip/dns/static add address=1.0.0.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 2\"\ + \n#/ip dns static add address=2606:4700:4700::1111 name=security.cloudflar\ + e-dns.com type=AAAA\ + \n#/ip dns static add address=2606:4700:4700::1001 name=security.cloudflar\ + e-dns.com type=AAAA\ + \n#/ip/dns set servers=\"1.0.0.1, 8.8.4.4\";\ + \n#/ip/dns set servers=\"\";" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n:global GlobalScriptsUrl;\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n" +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com diff --git a/MikroGig/history/20260508/20260508130050-Diff-Config.rsc b/MikroGig/history/20260508/20260508130050-Diff-Config.rsc new file mode 100644 index 0000000..5f3f34e --- /dev/null +++ b/MikroGig/history/20260508/20260508130050-Diff-Config.rsc @@ -0,0 +1,4209 @@ +119,120c119 +< add comment="Script for setup routeros script system" \ +< dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +--- +> add dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +164c163 +< \n:global Identity [/system/identity/get name];\r\ +--- +> \n:global Identity [ /system identity get name ];\r\ +340,370c339,368 +< 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 Identity [/system/identity/get name];\r\ +< \n:global GlobalConfReady false;\r\ +< \n#\r\ +< \n#\r\ +< \n# Global Url For Amster scripts to fetch\r\ +< \n# most be defined in AM-Init-Script or AM-setup scripts\r\ +< \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ +< \n:global ScriptsUrlSuffix (a);\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\ +--- +> add dont-require-permissions=no name=AM-GlobalConfig owner=AM-GlobalConfig \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> source="#!rsc by Vados\ +> \n# RouterOS script: AM-GlobalConfig\ +> \n# Script comment: Global Config Script\ +> \n# Copyright (c) 2007-2026 Vados \ +> \n#\ +> \n#\ +> \n# Warning: Dont touch this line!\ +> \n:global Identity [ /system identity get name ];\ +> \n:global GlobalConfReady false;\ +> \n#\ +> \n#\ +> \n# Global Url For Amster scripts to fetch\ +> \n# most be defined in AM-Init-Script or AM-setup scripts\ +> \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ +> \n:global ScriptsUrlSuffix (a);\ +> \n:global CheckSumsVerify true;\ +> \n\ +> \n:global ScriptUpdatesCRLF true;\ +> \n:global CommentsInScripts true;\ +> \n\ +> \n# Debug output:\ +> \n:global PrintDebug true; #false;\ +> \n\ +> \n# Debug output for specific script:\ +> \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\ +> \n\ +> \n# Debug logs\ +> \n# Other actions (disk, email, remote or support) can be used as well.\ +372,381c370,379 +< eworm.de/main/DEBUG.html#debug-output).\r\ +< \n#/system/logging/add topics=script,debug action=memory;\r\ +< \n\r\ +< \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ +< \n:global Domain \"WORKGROUP\";\r\ +< \n\r\ +< \n:global EmailGeneralTo \"vados@vados.ru\";\r\ +< \n#:global EmailGeneralCc \"\";\r\ +< \n\r\ +< \n# \$ScriptInstallUpdate mod/notification-telegram\r\ +--- +> eworm.de/main/DEBUG.html#debug-output).\ +> \n#/system/logging/add topics=script,debug action=memory;\ +> \n\ +> \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\ +> \n:global Domain \"WORKGROUP\";\ +> \n\ +> \n:global EmailGeneralTo \"vados@vados.ru\";\ +> \n#:global EmailGeneralCc \"\";\ +> \n\ +> \n# \$ScriptInstallUpdate mod/notification-telegram\ +383,386c381,384 +< \";\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:global TelegramChatId \"-1003631309063\"; #\"454403445\";\ +> \n# Use this to send notifications to a specific topic in group.\ +> \n#:global TelegramThreadId \"30\";\ +388,411c386,409 +< !)\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# or user names. Groups allow to chat with devices simultaneously.\ +> \n:global TelegramChatIdsTrusted {\ +> \n \"454403445\"\ +> \n \"-1003631309063\"\ +> \n \"-5124482807\"\ +> \n \"1087968824\";\ +> \n};\ +> \n# \"-5294757340\";\ +> \n\ +> \n:global TelegramChatGroups \"(all)\";\ +> \n#:global TelegramChatGroups \"(all|home|office)\";\ +> \n\ +> \n:global NotificationFunctions {\ +> \n \"email\"\ +> \n \"telegram\";\ +> \n};\ +> \n# Toggle this to disable symbols in notifications.\ +> \n:global NotificationsWithSymbols true;\ +> \n:global TerminalColorOutput true;\ +> \n\ +> \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\ +> \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\ +> \n\ +413,415c411,413 +< ent\r\ +< \n:global updateChannel \"stable\";\r\ +< \n\r\ +--- +> ent\ +> \n:global updateChannel \"stable\";\ +> \n\ +417,431c415,429 +< \");\r\ +< \n:global CertRenewTime 2w;\r\ +< \n:global CertRenewPass (a); #{\r\ +< \n# \"\";\r\ +< \n# \"v3ry-s3cr3t\";\r\ +< \n# \"4n0th3r-s3cr3t\";\r\ +< \n#};\r\ +< \n:global CertWarnTime 1w;\r\ +< \n:global CertIssuedExportPass (a); # {\r\ +< \n# \"\";\r\ +< \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ +< \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ +< \n#};\r\ +< \n\r\ +< \n# Script BackupAndUpdate mode, possible values: backup,\r\ +--- +> \");\ +> \n:global CertRenewTime 2w;\ +> \n:global CertRenewPass (a); #{\ +> \n# \"\";\ +> \n# \"v3ry-s3cr3t\";\ +> \n# \"4n0th3r-s3cr3t\";\ +> \n#};\ +> \n:global CertWarnTime 1w;\ +> \n:global CertIssuedExportPass (a); # {\ +> \n# \"\";\ +> \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\ +> \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\ +> \n#};\ +> \n\ +> \n# Script BackupAndUpdate mode, possible values: backup,\ +433c431 +< n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ +--- +> n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \ +435c433 +< \_(ignores `forceBackup`)\r\ +--- +> \_(ignores `forceBackup`)\ +437,495c435,493 +< \_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\ +--- +> \_without updates\ +> \n# osnotify - Set `forceBackup` to always create backups on every run\ +> \n:global DevInfoIncludeIP true;\ +> \n:global BackupAndUpdateMode \"osnotify\"\ +> \n\ +> \n:global forceBackup true;\ +> \n:global BackupPassword \"Peskar55\";\ +> \n\ +> \n# SFTP Backup Variables\ +> \n:global BackupRandomDelay 0;\ +> \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\ +> \n:global BackupUploadUser \$Identity;\ +> \n:global BackupUploadPass \"root.mnuc.backuper\";\ +> \n\ +> \n:global BackupSendBinary true;\ +> \n:global BackupSendExport true;\ +> \n:global BackupSendGlobalConfig true;\ +> \n:global BackupSendScripts true;\ +> \n\ +> \n# Remove local file after uploading if no errors\ +> \n:global BackupRmLocal true;\ +> \n\ +> \n# Local Backups Root Directory \ +> \n:global BackupLocalRoot \"tmpfs\";\ +> \n\ +> \n# Encrypt Backup\ +> \n:global BackupEncrypt true;\ +> \n\ +> \n# Sensitive information in Backups\ +> \n:global BackupSens true;\ +> \n\ +> \n# User Export\ +> \n:global BackupUser true;\ +> \n\ +> \n# License Export (not for CHR, will silently skip)\ +> \n:global BackupLicense false;\ +> \n\ +> \n# SSH Keys\ +> \n:global BackupSshKeys true;\ +> \n\ +> \n# Certificate Export\ +> \n:global BackupCerts true;\ +> \n\ +> \n# Certificate Password\ +> \n:global BackupCertsPasswd \"\";\ +> \n\ +> \n# User-Manager Export\ +> \n:global BackupUserMan false;\ +> \n\ +> \n# The Dude Export\ +> \n:global BackupDude false;\ +> \n\ +> \n# User Files to export, comma-separated string or array of strings\ +> \n# User Files are not removed on backup\ +> \n# Any directory paths will be removed (/ -> _) on remote file\ +> \n# Nonpresent files are silently skipped\ +> \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\ +> \n\ +> \n# load functions and any custom scripts\ +497c495 +< erlay\" ], \\\r\ +--- +> erlay\" ], \\\ +499,500c497,498 +< verlay\\\\.d/.\" ]\r\ +< \n#\r\ +--- +> verlay\\\\.d/.\" ]\ +> \n#\ +503,506c501,503 +< \r\ +< \n# :onerror Err {\r\ +< \n# /system/script/run \$Script;\r\ +< \n# } do={\r\ +--- +> \n# :onerror Err {\ +> \n# /system/script/run \$Script;\ +> \n# } do={\ +508,512c505,509 +< \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ +< \n# }\r\ +< \n#}\r\ +< \n#:log info \"\\ndevMode = \$devMode\";\r\ +< \n#:log info \"\\ndevRunning = \$devRunning\";\r\ +--- +> \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\ +> \n# }\ +> \n#}\ +> \n#:log info \"\\ndevMode = \$devMode\";\ +> \n#:log info \"\\ndevRunning = \$devRunning\";\ +514,517c511,514 +< GlobalRUN\\r\?\\n\" ] do={\r\ +< \n :onerror Err {\r\ +< \n /system/script/run \$Script;\r\ +< \n } do={\r\ +--- +> GlobalRUN\\r\?\\n\" ] do={\ +> \n :onerror Err {\ +> \n /system/script/run \$Script;\ +> \n } do={\ +519,525c516,522 +< ] . \" 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\ +--- +> ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\ +> \n }\ +> \n}\ +> \n\ +> \n# signal we are ready\ +> \n:set GlobalConfReady true;\ +> \n:while (\$GlobalConfReady != true) do={:delay 500ms};\ +527,542c524,538 +< add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ +< owner=AM-GlobalFunc policy=\ +< ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ +< !rsc by Vados\r\ +< \n# RouterOS script: AM-GglobalFunc\r\ +< \n# Script comment: Global functions\r\ +< \n# Copyright (c) 2005-2026 Vados \r\ +< \n#\r\ +< \n#\r\ +< \n# requires RouterOS, version=7.19\r\ +< \n# requires device-mode, fetch, scheduler\r\ +< \n:local ExitOK false;\r\ +< \n:local ScriptName [ :jobname ];\r\ +< \n#:global checkRunJob \$SriptName;\r\ +< \n#:global fixCRLF;\r\ +< \n#:if (\$fixCRLF != false) do={\r\ +--- +> add dont-require-permissions=no name=AM-GlobalFunc owner=AM-GlobalFunc \ +> policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +> source="#!rsc by Vados\ +> \n# RouterOS script: AM-GglobalFunc\ +> \n# Script comment: Global functions\ +> \n# Copyright (c) 2005-2026 Vados \ +> \n#\ +> \n#\ +> \n# requires RouterOS, version=7.19\ +> \n# requires device-mode, fetch, scheduler\ +> \n:local ExitOK false;\ +> \n:local ScriptName [ :jobname ];\ +> \n#:global checkRunJob \$SriptName;\ +> \n#:global fixCRLF;\ +> \n#:if (\$fixCRLF != false) do={\ +545c541 +< }\r\ +--- +> }\ +547,553c543,549 +< et \$fixScript source ] ] \$fixScript};};\r\ +< \n#}\r\ +< \n:global GlobalFuncReady false;\r\ +< \n\r\ +< \n# Git commit id & info, expected configuration version\r\ +< \n:global CommitId \"main/633/2f6d4158\";\r\ +< \n:global CommitTAG \"unknown\";\r\ +--- +> et \$fixScript source ] ] \$fixScript};};\ +> \n#}\ +> \n:global GlobalFuncReady false;\ +> \n\ +> \n# Git commit id & info, expected configuration version\ +> \n:global CommitId \"main/625/14252114\";\ +> \n:global CommitTAG \"unknown\";\ +555,691c551,687 +< r: root, in 14:35:03 05.05.2026.\";\r\ +< \n\r\ +< \n# The variables are received right here.\r\ +< \n:global GlobalConfVersion 140;\r\ +< \n\r\ +< \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ +< \n\r\ +< \n:global Identity [/system/identity/get name];\r\ +< \n:global IdentityShort [:pick \$Identity 0 18];\r\ +< \n\r\ +< \n:global devBoardName [/system/resource/get board-name];\r\ +< \n:global devMode [/system/device-mode/get mode];\r\ +< \n:global devCurArch [/system/resource/get architecture-name];\r\ +< \n:global devCurVersion [/system/resource/get version];\r\ +< \n\r\ +< \n# Variables defined in AM-GlobalConfig.rsc\r\ +< \n:global TerminalColorOutput;\r\ +< \n:global CommentsInScripts;\r\ +< \n:global DetectIpAddrDefault;\r\ +< \n:global DetectIpAddrFallback;\r\ +< \n:global updateChannel;\r\ +< \n:global Domain;\r\ +< \n:global EmailGeneralTo;\r\ +< \n:global BackupAndUpdateMode;\r\ +< \n\r\ +< \n# Single functions, without nested functions.\r\ +< \n:global MiniDateTimeStamp;\r\ +< \n:global MicroDateTimeStamp;\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 CharacterMultiply;\r\ +< \n:global CharacterReplace;\r\ +< \n:global CleanFilePath;\r\ +< \n:global CleanName;\r\ +< \n\r\ +< \n:global CommitBrief;\r\ +< \n\r\ +< \n:global EitherOr;\r\ +< \n:global FormatLine;\r\ +< \n:global GetRandom20CharAlNum;\r\ +< \n:global GetRandom20CharHex;\r\ +< \n:global GetRandomNumber;\r\ +< \n:global Grep;\r\ +< \n:global IfThenElse;\r\ +< \n:global MAX;\r\ +< \n:global MIN;\r\ +< \n:global HumanReadableNum;\r\ +< \n\r\ +< \n:global IsFullyConnected;\r\ +< \n:global IsDNSResolving;\r\ +< \n:global IsTimeSync;\r\ +< \n:global IsTimeSyncCached;\r\ +< \n:global IsTimeSyncResetNtp;\r\ +< \n\r\ +< \n:global WaitDNSResolving;\r\ +< \n:global WaitFullyConnected;\r\ +< \n:global WaitTimeSync;\r\ +< \n:global MkDir;\r\ +< \n:global RmDir;\r\ +< \n:global RmFile;\r\ +< \n:global FileGet;\r\ +< \n:global Unix2Dos;\r\ +< \n:global UrlEncode;\r\ +< \n:global WaitForFile;\r\ +< \n:global ScriptLock;\r\ +< \n:global SendTelegram;\r\ +< \n:global NotificationFunctions;\r\ +< \n:global SendNotification;\r\ +< \n:global SendNotification2;\r\ +< \n:global SymbolForNotification;\r\ +< \n:global SymbolByUnicodeName;\r\ +< \n:global ValidateSyntax;\r\ +< \n:global CheckSumsVerify;\r\ +< \n:global GlobalConfChanges;\r\ +< \n:global GlobalConfMigration;\r\ +< \n:global VersionToNum;\r\ +< \n:global RequiredRouterOS;\r\ +< \n:global ExitError;\r\ +< \n:global ExitOnError;\r\ +< \n\r\ +< \n:global FetchHugeFiles;\r\ +< \n:global FetchUserAgentStr;\r\ +< \n:global FileExists;\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 updateChannel;\r\ +< \n :global PkgUpdStatus;\r\ +< \n :global currentUpdateChannel;\r\ +< \n :global ROsVerAvail;\r\ +< \n :global arrDeviceInfo;\r\ +< \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ +< \n :local CurrentChannel [ /system/package/update/get channel ];\r\ +--- +> r: root, in 02:45:03 05.05.2026.\";\ +> \n\ +> \n# The variables are received right here.\ +> \n:global GlobalConfVersion 140;\ +> \n\ +> \n:global SumsDirAndFileName \"tmp/checksums.json\";\ +> \n\ +> \n:global Identity [/system/identity/get name];\ +> \n:global IdentityShort [:pick \$Identity 0 18];\ +> \n\ +> \n:global devBoardName [/system/resource/get board-name];\ +> \n:global devMode [/system/device-mode/get mode];\ +> \n:global devCurArch [/system/resource/get architecture-name];\ +> \n:global devCurVersion [/system/resource/get version];\ +> \n\ +> \n# Variables defined in AM-GlobalConfig.rsc\ +> \n:global TerminalColorOutput;\ +> \n:global CommentsInScripts;\ +> \n:global DetectIpAddrDefault;\ +> \n:global DetectIpAddrFallback;\ +> \n:global updateChannel;\ +> \n:global Domain;\ +> \n:global EmailGeneralTo;\ +> \n:global BackupAndUpdateMode;\ +> \n\ +> \n# Single functions, without nested functions.\ +> \n:global MiniDateTimeStamp;\ +> \n:global MicroDateTimeStamp;\ +> \n\ +> \n# Include globals \$PrintDebug and \$PrintDebugOverride\ +> \n:global LogPrint;\ +> \n\ +> \n# DeviceInfo and Updates\ +> \n:global IsCheckUpdates;\ +> \n:global WaitCheckUpdates;\ +> \n:global GetPubIp;\ +> \n\ +> \n:global GetArrDeviceInfo;\ +> \n:global WaitArrDeviceInfo;\ +> \n\ +> \n:global devModel;\ +> \n:global devRunningMode;\ +> \n\ +> \n:global devRbRevision;\ +> \n:global devRbSerialNumber;\ +> \n:global devRbVerAvail;\ +> \n\ +> \n:global runningChannelVersion;\ +> \n:global runningChannel;\ +> \n:global runningVersion;\ +> \n\ +> \n:global devBuildTime;\ +> \n:global ROsVerAvail;\ +> \n:global PkgUpdStatus;\ +> \n:global currentUpdateChannel;\ +> \n\ +> \n:global ScriptInstallUpdate;\ +> \n\ +> \n:global DeviceInfo;\ +> \n\ +> \n:global OldMode;\ +> \n\ +> \n:global ParseKeyValueStore;\ +> \n:global RandomDelay;\ +> \n:global GetRandomNumber;\ +> \n:global EscapeForRegEx;\ +> \n:global CharacterMultiply;\ +> \n:global CharacterReplace;\ +> \n:global CleanFilePath;\ +> \n:global CleanName;\ +> \n\ +> \n:global CommitBrief;\ +> \n\ +> \n:global EitherOr;\ +> \n:global FormatLine;\ +> \n:global GetRandom20CharAlNum;\ +> \n:global GetRandom20CharHex;\ +> \n:global GetRandomNumber;\ +> \n:global Grep;\ +> \n:global IfThenElse;\ +> \n:global MAX;\ +> \n:global MIN;\ +> \n:global HumanReadableNum;\ +> \n\ +> \n:global IsFullyConnected;\ +> \n:global IsDNSResolving;\ +> \n:global IsTimeSync;\ +> \n:global IsTimeSyncCached;\ +> \n:global IsTimeSyncResetNtp;\ +> \n\ +> \n:global WaitDNSResolving;\ +> \n:global WaitFullyConnected;\ +> \n:global WaitTimeSync;\ +> \n:global MkDir;\ +> \n:global RmDir;\ +> \n:global RmFile;\ +> \n:global FileGet;\ +> \n:global Unix2Dos;\ +> \n:global UrlEncode;\ +> \n:global WaitForFile;\ +> \n:global ScriptLock;\ +> \n:global SendTelegram;\ +> \n:global NotificationFunctions;\ +> \n:global SendNotification;\ +> \n:global SendNotification2;\ +> \n:global SymbolForNotification;\ +> \n:global SymbolByUnicodeName;\ +> \n:global ValidateSyntax;\ +> \n:global CheckSumsVerify;\ +> \n:global GlobalConfChanges;\ +> \n:global GlobalConfMigration;\ +> \n:global VersionToNum;\ +> \n:global RequiredRouterOS;\ +> \n:global ExitError;\ +> \n:global ExitOnError;\ +> \n\ +> \n:global FetchHugeFiles;\ +> \n:global FetchUserAgentStr;\ +> \n:global FileExists;\ +> \n:global CertificateAvailable;\ +> \n:global CertificateDownload;\ +> \n:global CertificateNameByCN;\ +> \n:global CharacterMultiply;\ +> \n\ +> \n:global InspectVar;\ +> \n:global InspectVarRet;\ +> \n:global ParseCustom;\ +> \n\ +> \n:set IsCheckUpdates do={\ +> \n :local isInfo [:tobool \$1];\ +> \n :global updateChannel;\ +> \n :global PkgUpdStatus;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n :global arrDeviceInfo;\ +> \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \ +> \n :local CurrentChannel [ /system/package/update/get channel ];\ +693c689 +< el) do={\r\ +--- +> el) do={\ +695,703c691,699 +< \_delay=300ms max=5 on-error={};\r\ +< \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ +< \n }\r\ +< \n :local Update [ /system/package/update/get ];\r\ +< \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ +< \n :set currentUpdateChannel \$Channel;\r\ +< \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ +< \n :local StatusPkg \"undefined\";\r\ +< \n :log info (\$0 . \" Checking for updates...\");\r\ +--- +> \_delay=300ms max=5 on-error={};\ +> \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\ +> \n }\ +> \n :local Update [ /system/package/update/get ];\ +> \n :local Channel [ :tostr (\$Update->\"channel\") ];\ +> \n :set currentUpdateChannel \$Channel;\ +> \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\ +> \n :local StatusPkg \"undefined\";\ +> \n :log info (\$0 . \" Checking for updates...\");\ +705,707c701,703 +< dates without-paging as-value]->\"status\")} \\\r\ +< \n delay=300ms max=5 on-error={};\r\ +< \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ +--- +> dates without-paging as-value]->\"status\")} \\\ +> \n delay=300ms max=5 on-error={};\ +> \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\ +709c705 +< s true; } else={ :set PkgUpdStatus false; }\r\ +--- +> s true; } else={ :set PkgUpdStatus false; }\ +711,717c707,713 +< ] ];\r\ +< \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +< \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ +< \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +< \n }\r\ +--- +> ] ];\ +> \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +> \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ +> \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +> \n }\ +719,738c715,734 +< kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ +< \n :return true;\r\ +< \n } else={\r\ +< \n :return \$PkgUpdStatus;\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n:set WaitCheckUpdates do={\r\ +< \n :global IsCheckUpdates;\r\ +< \n :global PkgUpdStatus;\r\ +< \n :global currentUpdateChannel;\r\ +< \n :global ROsVerAvail;\r\ +< \n :global arrDeviceInfo;\r\ +< \n :local Status \"\";\r\ +< \n :local Update;\r\ +< \n :local WaitCount 0;\r\ +< \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +--- +> kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\ +> \n :return true;\ +> \n } else={\ +> \n :return \$PkgUpdStatus;\ +> \n }\ +> \n}\ +> \n\ +> \n:set WaitCheckUpdates do={\ +> \n :global IsCheckUpdates;\ +> \n :global PkgUpdStatus;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n :global arrDeviceInfo;\ +> \n :local Status \"\";\ +> \n :local Update;\ +> \n :local WaitCount 0;\ +> \n :if ([ \$IsCheckUpdates true ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +740,756c736,752 +< \") && \$WaitCount < 60) do={\r\ +< \n :delay 1s;\r\ +< \n :set WaitCount (\$WaitCount + 1);\r\ +< \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ +< \n }\r\ +< \n :set Update [ /system/package/update/get ];\r\ +< \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +< \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +< \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ +< \n :set PkgUpdStatus true;\r\ +< \n } else={\r\ +< \n :set PkgUpdStatus false;\r\ +< \n }\r\ +< \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ +< \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ +< \n }\r\ +< \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ +--- +> \") && \$WaitCount < 60) do={\ +> \n :delay 1s;\ +> \n :set WaitCount (\$WaitCount + 1);\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +> \n }\ +> \n :set Update [ /system/package/update/get ];\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +> \n :if ((\$Update->\"status\") = \"New version is available\") do={\ +> \n :set PkgUpdStatus true;\ +> \n } else={\ +> \n :set PkgUpdStatus false;\ +> \n }\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +> \n }\ +> \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\ +758,801c754,797 +< do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set WaitArrDeviceInfo do={\r\ +< \n :global GetArrDeviceInfo;\r\ +< \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ +< \n :delay 1s;\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n:set GetArrDeviceInfo do={\r\ +< \n :global LogPrint;\r\ +< \n :global arrDeviceInfo;\r\ +< \n :global devBoardName;\r\ +< \n :global devModel;\r\ +< \n :global devRunning;\r\ +< \n :global devCurArch;\r\ +< \n :global devRbRevision;\r\ +< \n :global devRbSerialNumber;\r\ +< \n :global devBuildTime;\r\ +< \n :global runningChannelVersion;\r\ +< \n :global runningChannel;\r\ +< \n :global runningVersion;\r\ +< \n :global currentUpdateChannel;\r\ +< \n :global ROsVerAvail;\r\ +< \n\r\ +< \n :local DeviceInfo;\r\ +< \n :local Resource [/system/resource/get];\r\ +< \n :local Update [ /system/package/update/get ];\r\ +< \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ +< \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ +< \n :local RouterBoard;\r\ +< \n :local IsRouterBoard false;\r\ +< \n :local RunningMode \"\";\r\ +< \n\r\ +< \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ +< \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ +< \n :set runningChannelVersion \$VersionString;\r\ +< \n :set runningVersion \$VersionString;\r\ +< \n :set runningChannel \"\";\r\ +< \n\r\ +--- +> do={\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set WaitArrDeviceInfo do={\ +> \n :global GetArrDeviceInfo;\ +> \n :while ([ \$GetArrDeviceInfo ] = false) do={\ +> \n :delay 1s;\ +> \n }\ +> \n}\ +> \n\ +> \n:set GetArrDeviceInfo do={\ +> \n :global LogPrint;\ +> \n :global arrDeviceInfo;\ +> \n :global devBoardName;\ +> \n :global devModel;\ +> \n :global devRunning;\ +> \n :global devCurArch;\ +> \n :global devRbRevision;\ +> \n :global devRbSerialNumber;\ +> \n :global devBuildTime;\ +> \n :global runningChannelVersion;\ +> \n :global runningChannel;\ +> \n :global runningVersion;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n\ +> \n :local DeviceInfo;\ +> \n :local Resource [/system/resource/get];\ +> \n :local Update [ /system/package/update/get ];\ +> \n :local VersionString [ :tostr (\$Resource->\"version\") ];\ +> \n :local ChannelStart [ :find \$VersionString \" (\" ];\ +> \n :local RouterBoard;\ +> \n :local IsRouterBoard false;\ +> \n :local RunningMode \"\";\ +> \n\ +> \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\ +> \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\ +> \n :set runningChannelVersion \$VersionString;\ +> \n :set runningVersion \$VersionString;\ +> \n :set runningChannel \"\";\ +> \n\ +803,804c799,800 +< {\r\ +< \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ +--- +> {\ +> \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\ +806,807c802,803 +< len \$VersionString ] ];\r\ +< \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ +--- +> len \$VersionString ] ];\ +> \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\ +809,813c805,808 +< \r\ +< \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ +< \n }\r\ +< \n }\r\ +< \n\r\ +--- +> \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\ +> \n }\ +> \n }\ +> \n\ +815,838c810,833 +< \_3] != \"x86\") do={\r\ +< \n :do {\r\ +< \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ +< \n# :set RouterBoard [ /system/routerboard/get ];\r\ +< \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ +< \n :set IsRouterBoard true;\r\ +< \n }\r\ +< \n } on-error={}\r\ +< \n }\r\ +< \n\r\ +< \n :do {\r\ +< \n :set RunningMode [ /system/device-mode/get mode ];\r\ +< \n } on-error={\r\ +< \n :do {\r\ +< \n :set RunningMode [ /system/device-mode/get running ];\r\ +< \n } on-error={\r\ +< \n :set RunningMode \"\";\r\ +< \n }\r\ +< \n }\r\ +< \n :set devRunning \$RunningMode;\r\ +< \n\r\ +< \n :if (\$IsRouterBoard = true) do={\r\ +< \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ +< \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ +--- +> \_3] != \"x86\") do={\ +> \n :do {\ +> \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\ +> \n# :set RouterBoard [ /system/routerboard/get ];\ +> \n :if ((\$RouterBoard->\"routerboard\") = true) do={\ +> \n :set IsRouterBoard true;\ +> \n }\ +> \n } on-error={}\ +> \n }\ +> \n\ +> \n :do {\ +> \n :set RunningMode [ /system/device-mode/get mode ];\ +> \n } on-error={\ +> \n :do {\ +> \n :set RunningMode [ /system/device-mode/get running ];\ +> \n } on-error={\ +> \n :set RunningMode \"\";\ +> \n }\ +> \n }\ +> \n :set devRunning \$RunningMode;\ +> \n\ +> \n :if (\$IsRouterBoard = true) do={\ +> \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\ +> \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\ +840,856c835,851 +< ];\r\ +< \n } else={\r\ +< \n :set devModel \$devBoardName;\r\ +< \n :set devRbRevision \"\";\r\ +< \n :set devRbSerialNumber \"\";\r\ +< \n }\r\ +< \n\r\ +< \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ +< \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ +< \n\r\ +< \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ +< \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ +< \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ +< \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ +< \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ +< \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ +< \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ +--- +> ];\ +> \n } else={\ +> \n :set devModel \$devBoardName;\ +> \n :set devRbRevision \"\";\ +> \n :set devRbSerialNumber \"\";\ +> \n }\ +> \n\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +> \n\ +> \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\ +> \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\ +> \n :set (\$DeviceInfo->\"model\") \$devModel;\ +> \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\ +> \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\ +> \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\ +> \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\ +858,861c853,856 +< ion;\r\ +< \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ +< \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ +< \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ +--- +> ion;\ +> \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\ +> \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\ +> \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\ +863c858 +< current-firmware\") ];\r\ +--- +> current-firmware\") ];\ +865,866c860,861 +< upgrade-firmware\") ];\r\ +< \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ +--- +> upgrade-firmware\") ];\ +> \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\ +868,869c863,864 +< alled-version\") ];\r\ +< \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ +--- +> alled-version\") ];\ +> \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\ +871,895c866,890 +< ) ];\r\ +< \n\r\ +< \n :set arrDeviceInfo \$DeviceInfo;\r\ +< \n :return \$DeviceInfo;\r\ +< \n}\r\ +< \n\r\ +< \n:set DeviceInfo do={\r\ +< \n :global GetArrDeviceInfo;\r\ +< \n :global GlobalConfVersion;\r\ +< \n :global Identity;\r\ +< \n :global IfThenElse;\r\ +< \n :global FormatLine;\r\ +< \n :global CommitBrief;\r\ +< \n\r\ +< \n :local License [/system/license/get];\r\ +< \n :local Snmp [ /snmp/get ];\r\ +< \n :local Info [ \$GetArrDeviceInfo ];\r\ +< \n\r\ +< \n :if ([ :typeof \$Info ] != \"array\") do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n\r\ +< \n :return ( \\\r\ +< \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ +--- +> ) ];\ +> \n\ +> \n :set arrDeviceInfo \$DeviceInfo;\ +> \n :return \$DeviceInfo;\ +> \n}\ +> \n\ +> \n:set DeviceInfo do={\ +> \n :global GetArrDeviceInfo;\ +> \n :global GlobalConfVersion;\ +> \n :global Identity;\ +> \n :global IfThenElse;\ +> \n :global FormatLine;\ +> \n :global CommitBrief;\ +> \n\ +> \n :local License [/system/license/get];\ +> \n :local Snmp [ /snmp/get ];\ +> \n :local Info [ \$GetArrDeviceInfo ];\ +> \n\ +> \n :if ([ :typeof \$Info ] != \"array\") do={\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :return ( \\\ +> \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\ +897,898c892,893 +< \_. \\\r\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ +--- +> \_. \\\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\ +900,901c895,896 +< \_\\\r\ +< \n \"Hardware:\\n\" . \\\r\ +--- +> \_\\\ +> \n \"Hardware:\\n\" . \\\ +903c898 +< \\\r\ +--- +> \\\ +905,909c900,904 +< n\" . \\\r\ +< \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ +< \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ +--- +> n\" . \\\ +> \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\ +> \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\ +911,912c906,907 +< \\n\") ] . \\\r\ +< \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ +--- +> \\n\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\ +914,916c909,911 +< \")) ] . \"\\n\") ] . \\\r\ +< \n \"RouterOS:\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ +--- +> \")) ] . \"\\n\") ] . \\\ +> \n \"RouterOS:\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\ +918c913 +< \")) ] . \"\\n\") ] . \\\r\ +--- +> \")) ] . \"\\n\") ] . \\\ +920c915 +< \\n\" . \\\r\ +--- +> \\n\" . \\\ +922,923c917,918 +< \_\"\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ +--- +> \_\"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\ +925c920 +< \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ +--- +> \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\ +927,928c922,923 +< \"\\n\") ] . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ +--- +> \"\\n\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\ +930c925 +< \_\\\r\ +--- +> \_\\\ +932,933c927,928 +< \_\"\\n\") ] . \\\r\ +< \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ +--- +> \_\"\\n\") ] . \\\ +> \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\ +935c930 +< ) \\\r\ +--- +> ) \\\ +937,942c932,937 +< \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ +< \n \"RouterOS-Scripts:\\n\" . \\\r\ +< \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ +< \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ +< \n}\r\ +< \n\r\ +--- +> \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\ +> \n \"RouterOS-Scripts:\\n\" . \\\ +> \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\ +> \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\ +> \n}\ +> \n\ +944,947c939,942 +< tionFunctions ({})}\r\ +< \n\r\ +< \n:set GetRandom20CharAlNum do={\r\ +< \n :global EitherOr;\r\ +--- +> tionFunctions ({})}\ +> \n\ +> \n:set GetRandom20CharAlNum do={\ +> \n :global EitherOr;\ +949,951c944,946 +< FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ +< \n}\r\ +< \n\r\ +--- +> FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ +> \n}\ +> \n\ +953c948 +< \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ +--- +> \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\ +955,961c950,956 +< \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ +< \n\r\ +< \n:global checkRunJob;\r\ +< \n:set checkRunJob do={\r\ +< \n :local Script [ :tostr \$1 ];\r\ +< \n :global ScriptLock; \r\ +< \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ +--- +> \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\ +> \n\ +> \n:global checkRunJob;\ +> \n:set checkRunJob do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLock; \ +> \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\ +963c958 +< :set Job [ /system/script/job/get \$Job ];\r\ +--- +> :set Job [ /system/script/job/get \$Job ];\ +965c960 +< stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ +--- +> stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\ +967,994c962,989 +< lse; \r\ +< \n}\r\ +< \n\r\ +< \n:set InspectVar do={\r\ +< \n :global InspectVarRet;\r\ +< \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ +< \n}\r\ +< \n\r\ +< \n:set CommitBrief do={\r\ +< \n :global CommitId;\r\ +< \n :global CommitInfo;\r\ +< \n :if (\$CommitId = \"unknown\") do={\r\ +< \n :return \"unknown\";\r\ +< \n }\r\ +< \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ +< \n}\r\ +< \n\r\ +< \n:set InspectVarRet do={\r\ +< \n :local Input \$1;\r\ +< \n :local Level (0 + [ :tonum \$2 ]);\r\ +< \n :global CharacterReplace;\r\ +< \n :global IfThenElse;\r\ +< \n :global InspectVarRet;\r\ +< \n :local IndentReturn do={\r\ +< \n :local Prefix [ :tostr \$1 ];\r\ +< \n :local Value [ :tostr \$2 ];\r\ +< \n :local Level [ :tonum \$3 ];\r\ +< \n :global CharacterMultiply;\r\ +--- +> lse; \ +> \n}\ +> \n\ +> \n:set InspectVar do={\ +> \n :global InspectVarRet;\ +> \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\ +> \n}\ +> \n\ +> \n:set CommitBrief do={\ +> \n :global CommitId;\ +> \n :global CommitInfo;\ +> \n :if (\$CommitId = \"unknown\") do={\ +> \n :return \"unknown\";\ +> \n }\ +> \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\ +> \n}\ +> \n\ +> \n:set InspectVarRet do={\ +> \n :local Input \$1;\ +> \n :local Level (0 + [ :tonum \$2 ]);\ +> \n :global CharacterReplace;\ +> \n :global IfThenElse;\ +> \n :global InspectVarRet;\ +> \n :local IndentReturn do={\ +> \n :local Prefix [ :tostr \$1 ];\ +> \n :local Value [ :tostr \$2 ];\ +> \n :local Level [ :tonum \$3 ];\ +> \n :global CharacterMultiply;\ +996,1019c991,1014 +< 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\ +--- +> fix . \"-> \" . \$Value);\ +> \n }\ +> \n :local TypeOf [ :typeof \$Input ];\ +> \n :local Len [ :len \$Input ];\ +> \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\ +> \n :if (\$TypeOf = \"array\") do={\ +> \n :foreach Key,Value in=\$Input do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +> \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\ +> \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\ +> \n }\ +> \n } else={\ +> \n :if (\$TypeOf = \"str\") do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +> \n [ \$IndentReturn \"len\" \$Len \$Level ]);\ +> \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\ +> \n }\ +> \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\ +> \n }\ +> \n }\ +> \n :if (\$TypeOf != \"nothing\") do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +1021,1036c1016,1031 +< \_\\\r\ +< \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ +< \n }\r\ +< \n }\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set GetPubIp do={\r\ +< \n :global DetectIpAddrDefault;\r\ +< \n :global DetectIpAddrFallback;\r\ +< \n\r\ +< \n :local PubIpAddr false;\r\ +< \n :local Url \$DetectIpAddrDefault;\r\ +< \n :local JobName [ :jobname ];\r\ +< \n\r\ +< \n :do {\r\ +--- +> \_\\\ +> \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\ +> \n }\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set GetPubIp do={\ +> \n :global DetectIpAddrDefault;\ +> \n :global DetectIpAddrFallback;\ +> \n\ +> \n :local PubIpAddr false;\ +> \n :local Url \$DetectIpAddrDefault;\ +> \n :local JobName [ :jobname ];\ +> \n\ +> \n :do {\ +1038c1033 +< ice: \" . \$Url . \"...\");\r\ +--- +> ice: \" . \$Url . \"...\");\ +1041c1036 +< )} \\\r\ +--- +> )} \\\ +1043,1044c1038,1039 +< detect public IP using default service: \" . \$Url . \".\")}\r\ +< \n } on-error={\r\ +--- +> detect public IP using default service: \" . \$Url . \".\")}\ +> \n } on-error={\ +1046,1047c1041,1042 +< ice: \" . \$Url . \".\");\r\ +< \n :set Url \$DetectIpAddrFallBack;\r\ +--- +> ice: \" . \$Url . \".\");\ +> \n :set Url \$DetectIpAddrFallBack;\ +1049c1044 +< vice: \" . \$Url . \"...\");\r\ +--- +> vice: \" . \$Url . \"...\");\ +1052c1047 +< )} \\\r\ +--- +> )} \\\ +1054,1056c1049,1051 +< \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ +< \n };\r\ +< \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ +--- +> \_detect public IP using fallback service: \" . \$Url . \".\")}\ +> \n };\ +> \n :local IpLen ([ :len \$PubIpAddr ] -1);\ +1058,1072c1053,1067 +< {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ +< \n :return \$PubIpAddr;\r\ +< \n}\r\ +< \n\r\ +< \n:set FormatLine do={\r\ +< \n :local Key [ :tostr \$1 ];\r\ +< \n :local Value [ :tostr \$2 ];\r\ +< \n :local Indent [ :tonum \$3 ];\r\ +< \n :local Spaces;\r\ +< \n :local Return \"\";\r\ +< \n :global CharacterMultiply;\r\ +< \n :global EitherOr;\r\ +< \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ +< \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ +< \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ +--- +> {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\ +> \n :return \$PubIpAddr;\ +> \n}\ +> \n\ +> \n:set FormatLine do={\ +> \n :local Key [ :tostr \$1 ];\ +> \n :local Value [ :tostr \$2 ];\ +> \n :local Indent [ :tonum \$3 ];\ +> \n :local Spaces;\ +> \n :local Return \"\";\ +> \n :global CharacterMultiply;\ +> \n :global EitherOr;\ +> \n :set Indent [ \$EitherOr \$Indent 16 ];\ +> \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\ +> \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\ +1074c1069 +< n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ +--- +> n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\ +1076,1087c1071,1082 +< \$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\ +--- +> \$Return ]) ] . \$Value)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ParseCustom do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Start [:find [ \$Str ] [:tostr \$2]];\ +> \n :local End [ :tostr \$3 ];\ +> \n :local Num [ :tonum \$4 ];\ +> \n :local Return;\ +> \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\ +> \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \ +1089,1102c1084,1097 +< 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\ +--- +> lse={\ +> \n :set End [:find \$rest \$End];\ +> \n :set Return [:pick \$rest 0 \$End];\ +> \n }\ +> \n:return \$Return;\ +> \n}\ +> \n\ +> \n:set LogPrint do={\ +> \n :local Severity [ :tostr \$1 ];\ +> \n :local Name [ :tostr \$2 ];\ +> \n :local Message [ :tostr \$3 ];\ +> \n :global PrintDebug;\ +> \n :global PrintDebugOverride;\ +> \n :global EitherOr;\ +1104,1110c1099,1105 +< ];\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 PrintSeverity do={\ +> \n :global TerminalColorOutput;\ +> \n :if (\$TerminalColorOutput != true) do={:return \$1}\ +> \n :local Color { debug=96; info=97; warning=93; error=91 };\ +> \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\ +> \n}\ +1112,1117c1107,1111 +< \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 ~ (\"^(custom|debug|error|info)\\\$\")) do={\ +> \n :if (\$Severity = \"debug\") do={:log debug \$Log}\ +> \n :if (\$Severity = \"error\") do={:log error \$Log}\ +> \n :if (\$Severity = \"info\" ) do={:log info \$Log}\ +> \n } else={:log warning \$Log; :set Severity \"warning\"}\ +1119,1135c1113,1129 +< erity \$Severity ] . \": \" . \$Message)}\r\ +< \n}\r\ +< \n\r\ +< \n:set CertificateAvailable do={\r\ +< \n :local CommonName [ :tostr \$1 ];\r\ +< \n :local UseFor [ :tostr \$2 ];\r\ +< \n\r\ +< \n :global CertificateDownload;\r\ +< \n :global ParseKeyValueStore;\r\ +< \n\r\ +< \n :if ([ :len \$UseFor ] = 0) do={\r\ +< \n :log warning (\$0 . \"The intended use is undefined!\");\r\ +< \n :set UseFor \"undefined\";\r\ +< \n }\r\ +< \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ +< \n [ /certificate/settings/get crl-download ] = true && \\\r\ +< \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ +--- +> erity \$Severity ] . \": \" . \$Message)}\ +> \n}\ +> \n\ +> \n:set CertificateAvailable do={\ +> \n :local CommonName [ :tostr \$1 ];\ +> \n :local UseFor [ :tostr \$2 ];\ +> \n\ +> \n :global CertificateDownload;\ +> \n :global ParseKeyValueStore;\ +> \n\ +> \n :if ([ :len \$UseFor ] = 0) do={\ +> \n :log warning (\$0 . \"The intended use is undefined!\");\ +> \n :set UseFor \"undefined\";\ +> \n }\ +> \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\ +> \n [ /certificate/settings/get crl-download ] = true && \\\ +> \n [ /certificate/settings/get crl-store ] = \"system\") do={\ +1137,1144c1131,1138 +< \\\r\ +< \n \"is configured to download certificate CRLs to system!\");\r\ +< \n }\r\ +< \n :if ([ :len \$CommonName ] = 0) do={\r\ +< \n :log warning (\$0 . \"No CommonName given!\");\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :local CertSettings [ /certificate/settings/get ];\r\ +--- +> \\\ +> \n \"is configured to download certificate CRLs to system!\");\ +> \n }\ +> \n :if ([ :len \$CommonName ] = 0) do={\ +> \n :log warning (\$0 . \"No CommonName given!\");\ +> \n :return false;\ +> \n }\ +> \n :local CertSettings [ /certificate/settings/get ];\ +1146,1148c1140,1141 +< \r\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ +--- +> \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\ +> \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +1150,1152c1143,1145 +< \_] ] > 0) do={\r\ +< \n :return true;\r\ +< \n }\r\ +--- +> \_] ] > 0) do={\ +> \n :return true;\ +> \n }\ +1154c1147 +< ) do={\r\ +--- +> ) do={\ +1156,1160c1149,1153 +< \"' not available.\");\r\ +< \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +--- +> \"' not available.\");\ +> \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +1162c1155 +< ) do={\r\ +--- +> ) do={\ +1164,1166c1157,1159 +< \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +< \n :return true;\r\ +< \n }\r\ +--- +> \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\ +> \n :return true;\ +> \n }\ +1168c1161 +< e ] ];\r\ +--- +> e ] ];\ +1170c1163 +< ertVal->\"skid\")) do={\r\ +--- +> ertVal->\"skid\")) do={\ +1172c1165 +< \_= 0) do={\r\ +--- +> \_= 0) do={\ +1174c1167 +< >\"CN\");\r\ +--- +> >\"CN\");\ +1176,1180c1169,1173 +< is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +< \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +--- +> is incomplete, missing '\" . \$IssuerCN . \"'.\");\ +> \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +1182,1196c1175,1189 +< \") ] ];\r\ +< \n }\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set CertificateDownload do={\r\ +< \n :local CommonName [ :tostr \$1 ];\r\ +< \n :global ScriptUpdatesBaseUrl;\r\ +< \n :global ScriptUpdatesUrlSuffix;\r\ +< \n :global CertificateNameByCN;\r\ +< \n :global CleanName;\r\ +< \n :global FetchUserAgentStr;\r\ +< \n :global RmFile;\r\ +< \n :global WaitForFile;\r\ +< \n\r\ +--- +> \") ] ];\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CertificateDownload do={\ +> \n :local CommonName [ :tostr \$1 ];\ +> \n :global ScriptUpdatesBaseUrl;\ +> \n :global ScriptUpdatesUrlSuffix;\ +> \n :global CertificateNameByCN;\ +> \n :global CleanName;\ +> \n :global FetchUserAgentStr;\ +> \n :global RmFile;\ +> \n :global WaitForFile;\ +> \n\ +1198,1201c1191,1193 +< \r\ +< \n \"CommonName '\" . \$CommonName . \"'.\");\r\ +< \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ +< \n :do {\r\ +--- +> \n \"CommonName '\" . \$CommonName . \"'.\");\ +> \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\ +> \n :do {\ +1203c1195 +< -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +--- +> -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +1205,1208c1197,1200 +< sUrlSuffix) \\\r\ +< \n dst-path=\$FileName as-value;\r\ +< \n \$WaitForFile \$FileName;\r\ +< \n } on-error={\r\ +--- +> sUrlSuffix) \\\ +> \n dst-path=\$FileName as-value;\ +> \n \$WaitForFile \$FileName;\ +> \n } on-error={\ +1210,1213c1202,1205 +< e '\" . \$CommonName . \\\r\ +< \n \"' from repository! Trying fallback to mkcert.org...\");\r\ +< \n :do {\r\ +< \n :local CertSettings [ /certificate/settings/get ];\r\ +--- +> e '\" . \$CommonName . \\\ +> \n \"' from repository! Trying fallback to mkcert.org...\");\ +> \n :do {\ +> \n :local CertSettings [ /certificate/settings/get ];\ +1215c1207 +< \_] ] = 0 && \\\r\ +--- +> \_] ] = 0 && \\\ +1217c1209 +< || \\\r\ +--- +> || \\\ +1219c1211 +< \\\r\ +--- +> \\\ +1221d1212 +< \r\ +1223c1214 +< \_Root X1\" ] ] > 0)) do={\r\ +--- +> \_Root X1\" ] ] > 0)) do={\ +1225,1227c1216,1217 +< \r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \n :return false;\ +> \n }\ +1229c1219 +< er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +--- +> er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +1231,1238c1221,1228 +< n ({ \$CommonName }) ] \\\r\ +< \n dst-path=\$FileName as-value;\r\ +< \n \$WaitForFile \$FileName;\r\ +< \n :if ([ /file/get \$FileName size ] = 0) do={\r\ +< \n \$RmFile \$FileName;\r\ +< \n :error false;\r\ +< \n }\r\ +< \n } on-error={\r\ +--- +> n ({ \$CommonName }) ] \\\ +> \n dst-path=\$FileName as-value;\ +> \n \$WaitForFile \$FileName;\ +> \n :if ([ /file/get \$FileName size ] = 0) do={\ +> \n \$RmFile \$FileName;\ +> \n :error false;\ +> \n }\ +> \n } on-error={\ +1240,1246c1230,1236 +< e '\" . \$CommonName . \"'!\");\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +< \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ +< \n :delay 1s;\r\ +< \n \$RmFile \$FileName;\r\ +--- +> e '\" . \$CommonName . \"'!\");\ +> \n :return false;\ +> \n }\ +> \n }\ +> \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\ +> \n :delay 1s;\ +> \n \$RmFile \$FileName;\ +1248c1238 +< ) do={\r\ +--- +> ) do={\ +1250c1240 +< +\\\$\") ];\r\ +--- +> +\\\$\") ];\ +1252,1254c1242,1244 +< e . \"' still unavailable!\");\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> e . \"' still unavailable!\");\ +> \n :return false;\ +> \n }\ +1256,1264c1246,1254 +< \"_[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\ +--- +> \"_[0-9]+\\\$\") ] do={\ +> \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CertificateNameByCN do={\ +> \n :local Match [ :tostr \$1 ];\ +> \n :global CleanName;\ +1266,1291c1256,1281 +< rint=\$Match or name=\$Match) ]->0);\r\ +< \n :if ([ :len \$Cert ] = 0) do={\r\ +< \n :log warning (\$0 .\" No matching certificate found.\");\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ +< \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set CharacterMultiply do={\r\ +< \n :local Str [ :tostr \$1 ];\r\ +< \n :local Num [ :tonum \$2 ];\r\ +< \n :if (\$Num = 0) do={:return \"\"}\r\ +< \n :local Return \"\";\r\ +< \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set FileExists do={\r\ +< \n :local FileName [ :tostr \$1 ];\r\ +< \n :local Type [ :tostr \$2 ];\r\ +< \n :global FileGet;\r\ +< \n :local FileVal [ \$FileGet \$FileName ];\r\ +< \n :if (\$FileVal = false) do={ :return false; }\r\ +< \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ +--- +> rint=\$Match or name=\$Match) ]->0);\ +> \n :if ([ :len \$Cert ] = 0) do={\ +> \n :log warning (\$0 .\" No matching certificate found.\");\ +> \n :return false;\ +> \n }\ +> \n :local CommonName [ /certificate/get \$Cert common-name ];\ +> \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CharacterMultiply do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Num [ :tonum \$2 ];\ +> \n :if (\$Num = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set FileExists do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :local Type [ :tostr \$2 ];\ +> \n :global FileGet;\ +> \n :local FileVal [ \$FileGet \$FileName ];\ +> \n :if (\$FileVal = false) do={ :return false; }\ +> \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\ +1293,1299c1283,1289 +< \_true; }\r\ +< \n :return false;\r\ +< \n}\r\ +< \n\r\ +< \n:set Grep do={\r\ +< \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ +< \n :local Pattern [ :tostr \$2 ];\r\ +--- +> \_true; }\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set Grep do={\ +> \n :local Input ([ :tostr \$1 ] . \"\\n\");\ +> \n :local Pattern [ :tostr \$2 ];\ +1301,1303c1291,1293 +< }\r\ +< \n :do {\r\ +< \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ +--- +> }\ +> \n :do {\ +> \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\ +1305c1295 +< \$Line}\r\ +--- +> \$Line}\ +1307,1329c1297,1319 +< 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\ +--- +> Input ] ];\ +> \n } while=([ :len \$Input ] > 0);\ +> \n :return [];\ +> \n}\ +> \n\ +> \n:set HumanReadableNum do={\ +> \n :local Input [ :tonum \$1 ];\ +> \n :local Base [ :tonum \$2 ];\ +> \n :global EitherOr;\ +> \n :global IfThenElse;\ +> \n :local Prefix \"kMGTPE\";\ +> \n :local Pow 1;\ +> \n :set Base [ \$EitherOr \$Base 1024 ];\ +> \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\ +> \n :if (\$Input < \$Base) do={:return \$Input}\ +> \n :for I from=0 to=[ :len \$Prefix ] do={\ +> \n :set Pow (\$Pow * \$Base);\ +> \n :if (\$Input / \$Base < \$Pow) do={\ +> \n :set Prefix [ :pick \$Prefix \$I ];\ +> \n :local Tmp1 (\$Input * 100 / \$Pow);\ +> \n :local Tmp2 (\$Tmp1 / 100);\ +> \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\ +> \n :return (\$Tmp2 . \".\" . \\\ +1331,1339c1321,1329 +< 2 ] + 1) ] . \\\r\ +< \n \$Prefix . \$Bin);\r\ +< \n }\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n:set CleanFilePath do={\r\ +< \n :local Path [ :tostr \$1 ];\r\ +< \n :global CharacterReplace;\r\ +--- +> 2 ] + 1) ] . \\\ +> \n \$Prefix . \$Bin);\ +> \n }\ +> \n }\ +> \n}\ +> \n\ +> \n:set CleanFilePath do={\ +> \n :local Path [ :tostr \$1 ];\ +> \n :global CharacterReplace;\ +1341c1331 +< \"//\" \"/\" ]; }\r\ +--- +> \"//\" \"/\" ]; }\ +1343c1333 +< n \$Path ] ]; }\r\ +--- +> n \$Path ] ]; }\ +1345,1353c1335,1343 +< :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ +< \n :return \$Path;\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\ +--- +> :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\ +> \n :return \$Path;\ +> \n}\ +> \n\ +> \n:set CleanName do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :local Return \"\";\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +1355,1356c1345,1346 +< stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ +< \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ +--- +> stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ +> \n :do {:if ([ :len \$Return ] = 0) do={:error true};\ +1358,1370c1348,1360 +< ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ +< \n };\r\ +< \n :set Return (\$Return . \$Char)};\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set RandomDelay do={\r\ +< \n :local Time [ :tonum \$1 ];\r\ +< \n :local Unit [ :tostr \$2 ];\r\ +< \n :global EitherOr;\r\ +< \n :global GetRandomNumber;\r\ +< \n :global MAX;\r\ +< \n :if (\$Time = 0) do={:return false}\r\ +--- +> ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \ +> \n };\ +> \n :set Return (\$Return . \$Char)};\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set RandomDelay do={\ +> \n :local Time [ :tonum \$1 ];\ +> \n :local Unit [ :tostr \$2 ];\ +> \n :global EitherOr;\ +> \n :global GetRandomNumber;\ +> \n :global MAX;\ +> \n :if (\$Time = 0) do={:return false}\ +1372,1393c1362,1383 +< [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ +< \n}\r\ +< \n\r\ +< \n:set EscapeForRegEx do={\r\ +< \n :local Input [ :tostr \$1 ];\r\ +< \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +< \n :local Return \"\";\r\ +< \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ +< \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ +< \n :local Char [ :pick \$Input \$I ];\r\ +< \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ +< \n :set Return (\$Return . \$Char);\r\ +< \n }\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set ExitError do={\r\ +< \n :local ExitOK [ :tostr \$1 ];\r\ +< \n :local Name [ :tostr \$2 ];\r\ +< \n :local Error [ :tostr \$3 ];\r\ +< \n :global IfThenElse;\r\ +< \n :if (\$ExitOK = \"false\") do={\r\ +--- +> [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\ +> \n}\ +> \n\ +> \n:set EscapeForRegEx do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +> \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ExitError do={\ +> \n :local ExitOK [ :tostr \$1 ];\ +> \n :local Name [ :tostr \$2 ];\ +> \n :local Error [ :tostr \$3 ];\ +> \n :global IfThenElse;\ +> \n :if (\$ExitOK = \"false\") do={\ +1395c1385 +< \\\r\ +--- +> \\\ +1397c1387 +< ror\" . \\\r\ +--- +> ror\" . \\\ +1399,1406c1389,1396 +< \$Error) \".\" ]);\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n:set ExitOnError do={\r\ +< \n :local Name [ :tostr \$1 ];\r\ +< \n :local Error [ :tostr \$2 ];\r\ +< \n :global IfThenElse;\r\ +--- +> \$Error) \".\" ]);\ +> \n }\ +> \n}\ +> \n\ +> \n:set ExitOnError do={\ +> \n :local Name [ :tostr \$1 ];\ +> \n :local Error [ :tostr \$2 ];\ +> \n :global IfThenElse;\ +1408c1398 +< \\\$\") \\\r\ +--- +> \\\$\") \\\ +1410c1400 +< r\" . \\\r\ +--- +> r\" . \\\ +1412,1424c1402,1414 +< rror) \".\" ]);\r\ +< \n}\r\ +< \n\r\ +< \n:set MiniDateTimeStamp do={\r\ +< \n :local mikro [ :tobool \$1 ];\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\ +--- +> rror) \".\" ]);\ +> \n}\ +> \n\ +> \n:set MiniDateTimeStamp do={\ +> \n :local mikro [ :tobool \$1 ];\ +> \n /system/clock;\ +> \n :local vdate [get date];\ +> \n :local vtime [get time];\ +> \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\ +> \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\ +> \n :local M [:tonum \$MM];\ +> \n :if (\$vdate ~ \".../../....\") do={\ +> \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\ +1426,1436c1416,1426 +< 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 :local Return;\r\ +< \n :if (\$mikro = true) do={\r\ +--- +> PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\ +> \n :if (\$M>12) do={:set M (\$M - 12)}\ +> \n :set MM [:pick (100 + \$M) 1 3];\ +> \n }\ +> \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\ +> \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\ +> \n :local HH [:pick \$vtime 0 2];\ +> \n :local mm [:pick \$vtime 3 5];\ +> \n :local ss [:pick \$vtime 6 8];\ +> \n :local Return;\ +> \n :if (\$mikro = true) do={\ +1438,1439c1428,1429 +< \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ +< \n } else={\r\ +--- +> \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\ +> \n } else={\ +1441,1493c1431,1482 +< \r\ +< \n }\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set WaitForFile do={\r\ +< \n :local FileName [ :tostr \$1 ];\r\ +< \n :local WaitTime [ :totime \$2 ];\r\ +< \n :global CleanFilePath;\r\ +< \n :global EitherOr;\r\ +< \n :global MAX;\r\ +< \n :set FileName [ \$CleanFilePath \$FileName ];\r\ +< \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ +< \n :do {\r\ +< \n :retry {\r\ +< \n /file/get \$FileName;\r\ +< \n :return true;\r\ +< \n } delay=\$Delay max=10;\r\ +< \n } on-error={ }\r\ +< \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ +< \n :do {\r\ +< \n /file/get \$FileName;\r\ +< \n :return true;\r\ +< \n } on-error={ }\r\ +< \n :delay \$Delay;\r\ +< \n :set Delay (\$Delay * 3 / 2);\r\ +< \n }\r\ +< \n :return false;\r\ +< \n}\r\ +< \n\r\ +< \n:set FileGet do={\r\ +< \n :local FileName [ :tostr \$1 ];\r\ +< \n :global WaitForFile;\r\ +< \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :local FileVal false;\r\ +< \n :do {\r\ +< \n :set FileVal [ /file/get \$FileName ];\r\ +< \n } on-error={ }\r\ +< \n :return \$FileVal;\r\ +< \n}\r\ +< \n\r\ +< \n:set RmDir do={\r\ +< \n :local DirName [ :tostr \$1 ];\r\ +< \n :global FileGet;\r\ +< \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ +< \n :local DirVal [ \$FileGet \$DirName ];\r\ +< \n :if (\$DirVal = false) do={\r\ +< \n :log debug (\$0 . \" ... which does not exist.\");\r\ +< \n :return true;\r\ +< \n };\r\ +< \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ +--- +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set WaitForFile do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :local WaitTime [ :totime \$2 ];\ +> \n :global CleanFilePath;\ +> \n :global EitherOr;\ +> \n :global MAX;\ +> \n :set FileName [ \$CleanFilePath \$FileName ];\ +> \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\ +> \n :do {\ +> \n :retry {\ +> \n /file/get \$FileName;\ +> \n :return true;\ +> \n } delay=\$Delay max=10;\ +> \n } on-error={ }\ +> \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\ +> \n :do {\ +> \n /file/get \$FileName;\ +> \n :return true;\ +> \n } on-error={ }\ +> \n :delay \$Delay;\ +> \n :set Delay (\$Delay * 3 / 2);\ +> \n }\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set FileGet do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :global WaitForFile;\ +> \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n :local FileVal false;\ +> \n :do {\ +> \n :set FileVal [ /file/get \$FileName ];\ +> \n } on-error={ }\ +> \n :return \$FileVal;\ +> \n}\ +> \n\ +> \n:set RmDir do={\ +> \n :local DirName [ :tostr \$1 ];\ +> \n :global FileGet;\ +> \n :log debug (\$0 . \" Removing directory: \". \$DirName);\ +> \n :local DirVal [ \$FileGet \$DirName ];\ +> \n :if (\$DirVal = false) do={\ +> \n :log debug (\$0 . \" ... which does not exist.\");\ +> \n :return true;\ +> \n };\ +> \n :if (\$DirVal->\"type\" != \"directory\") do={\ +1495,1500c1484,1489 +< ory.\");\r\ +< \n :return false;\r\ +< \n };\r\ +< \n :onerror Err {\r\ +< \n /file/remove \$DirName;\r\ +< \n } do={\r\ +--- +> ory.\");\ +> \n :return false;\ +> \n };\ +> \n :onerror Err {\ +> \n /file/remove \$DirName;\ +> \n } do={\ +1502,1516c1491,1505 +< : \" . \$Err);\r\ +< \n :return false;\r\ +< \n };\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set RmFile do={\r\ +< \n :local FileName [ :tostr \$1 ];\r\ +< \n :global FileGet;\r\ +< \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ +< \n :local FileVal [ \$FileGet \$FileName ];\r\ +< \n :if (\$FileVal = false) do={\r\ +< \n :log debug (\$0 . \" ... which does not exist.\");\r\ +< \n :return true;\r\ +< \n }\r\ +--- +> : \" . \$Err);\ +> \n :return false;\ +> \n };\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set RmFile do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :global FileGet;\ +> \n :log debug (\$0 . \" Removing file: \". \$FileName);\ +> \n :local FileVal [ \$FileGet \$FileName ];\ +> \n :if (\$FileVal = false) do={\ +> \n :log debug (\$0 . \" ... which does not exist.\");\ +> \n :return true;\ +> \n }\ +1518c1507 +< sk\") do={\r\ +--- +> sk\") do={\ +1520,1525c1509,1513 +< \r\ +< \n :return false;\r\ +< \n }\r\ +< \n :onerror Err {\r\ +< \n /file/remove \$FileName;\r\ +< \n } do={\r\ +--- +> \n :return false;\ +> \n }\ +> \n :onerror Err {\ +> \n /file/remove \$FileName;\ +> \n } do={\ +1527,1551c1515,1539 +< \_. \$Err); :return false;\r\ +< \n }\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set MkDir do={\r\ +< \n :local Path [ :tostr \$1 ];\r\ +< \n :global CleanFilePath;\r\ +< \n :global FileGet;\r\ +< \n :global RmDir;\r\ +< \n :global WaitForFile;\r\ +< \n\r\ +< \n :local MkTmpfs do={\r\ +< \n :global WaitForFile;\r\ +< \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ +< \n :if ([ :len \$TmpFs ] = 1) do={\r\ +< \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ +< \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ +< \n /disk/enable \$TmpFs;\r\ +< \n }\r\ +< \n :return true;\r\ +< \n }\r\ +< \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ +< \n \$RmDir \"tmpfs\";\r\ +< \n :onerror Err {\r\ +--- +> \_. \$Err); :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set MkDir do={\ +> \n :local Path [ :tostr \$1 ];\ +> \n :global CleanFilePath;\ +> \n :global FileGet;\ +> \n :global RmDir;\ +> \n :global WaitForFile;\ +> \n\ +> \n :local MkTmpfs do={\ +> \n :global WaitForFile;\ +> \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\ +> \n :if ([ :len \$TmpFs ] = 1) do={\ +> \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\ +> \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\ +> \n /disk/enable \$TmpFs;\ +> \n }\ +> \n :return true;\ +> \n }\ +> \n :log info (\$0 . \" Creating disk of type tmpfs.\");\ +> \n \$RmDir \"tmpfs\";\ +> \n :onerror Err {\ +1553,1555c1541,1543 +< /get total-memory ] / 3);\r\ +< \n \$WaitForFile \"tmpfs\";\r\ +< \n } do={\r\ +--- +> /get total-memory ] / 3);\ +> \n \$WaitForFile \"tmpfs\";\ +> \n } do={\ +1557,1580c1545,1568 +< Err);\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :return true;\r\ +< \n }\r\ +< \n :set Path [ \$CleanFilePath \$Path ];\r\ +< \n :if (\$Path = \"\") do={\r\ +< \n :return true;\r\ +< \n }\r\ +< \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ +< \n :local PathVal [ \$FileGet \$Path ];\r\ +< \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ +< \n :log debug (\$0 . \" ... which already exists.\");\r\ +< \n :return true;\r\ +< \n }\r\ +< \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ +< \n :if ([ \$MkTmpfs ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +< \n :onerror Err {\r\ +< \n /file/add type=\"directory\" name=\$Path;\r\ +< \n \$WaitForFile \$Path;\r\ +< \n } do={\r\ +--- +> Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n }\ +> \n :set Path [ \$CleanFilePath \$Path ];\ +> \n :if (\$Path = \"\") do={\ +> \n :return true;\ +> \n }\ +> \n :log debug (\$0 . \" Making directory: \" . \$Path);\ +> \n :local PathVal [ \$FileGet \$Path ];\ +> \n :if (\$PathVal->\"type\" = \"directory\") do={\ +> \n :log debug (\$0 . \" ... which already exists.\");\ +> \n :return true;\ +> \n }\ +> \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\ +> \n :if ([ \$MkTmpfs ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +> \n :onerror Err {\ +> \n /file/add type=\"directory\" name=\$Path;\ +> \n \$WaitForFile \$Path;\ +> \n } do={\ +1582,1609c1570,1597 +< \" . \$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\ +--- +> \" . \$Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\ +> \n :return \$2;\ +> \n}\ +> \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\ +> \n :return \$2;\ +> \n}\ +> \n\ +> \n:set CharacterMultiply do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Num [ :tonum \$2 ];\ +> \n :if (\$Num = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set CharacterReplace do={\ +> \n :local String [ :tostr \$1 ];\ +> \n :local ReplaceFrom [ :tostr \$2 ];\ +> \n :local ReplaceWith [ :tostr \$3 ];\ +> \n :local Return \"\";\ +> \n :if (\$ReplaceFrom = \"\") do={:return \$String}\ +1611,1612c1599 +< \r\ +< \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ +--- +> \n :local Pos [ :find \$String \$ReplaceFrom ];\ +1614d1600 +< \r\ +1616,1621c1602,1607 +< \_\$String ] ];\r\ +< \n }\r\ +< \n :return (\$Return . \$String);\r\ +< \n}\r\ +< \n\r\ +< \n:set IfThenElse do={\r\ +--- +> \_\$String ] ];\ +> \n }\ +> \n :return (\$Return . \$String);\ +> \n}\ +> \n\ +> \n:set IfThenElse do={\ +1623,1628c1609,1614 +< \$2};\r\ +< \n :return \$3;\r\ +< \n}\r\ +< \n\r\ +< \n:set EitherOr do={\r\ +< \n :global IfThenElse;\r\ +--- +> \$2};\ +> \n :return \$3;\ +> \n}\ +> \n\ +> \n:set EitherOr do={\ +> \n :global IfThenElse;\ +1630c1616 +< \$1 \$2 ]}\r\ +--- +> \$1 \$2 ]}\ +1632,1643c1618,1629 +< \_\$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\ +--- +> \_\$1 \$2 ]}\ +> \n# this works for boolean values, literal ones with parentheses\ +> \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\ +> \n}\ +> \n\ +> \n:set ParseKeyValueStore do={\ +> \n :local Source \$1;\ +> \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\ +> \n :do {\ +> \n :return [ :deserialize from=json \$Source ];\ +> \n } on-error={ }\ +> \n } \ +1645,1649c1631,1635 +< }\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 Result ({});\ +> \n :foreach KeyValue in=[ :toarray \$Source ] do={\ +> \n :if ([ :find \$KeyValue \"=\" ]) do={\ +> \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\ +1651,1664c1637,1650 +< \_:len \$KeyValue ] ];\r\ +< \n :if (\$Value=\"true\") do={:set Value true}\r\ +< \n :if (\$Value=\"false\") do={:set Value false}\r\ +< \n :set (\$Result->\$Key) \$Value;\r\ +< \n } else={:set (\$Result->\$KeyValue) true}\r\ +< \n }\r\ +< \n :return \$Result;\r\ +< \n}\r\ +< \n:set RequiredRouterOS do={\r\ +< \n :local Caller [ :tostr \$1 ];\r\ +< \n :local Required [ :tostr \$2 ];\r\ +< \n :local Warn [ :tostr \$3 ];\r\ +< \n :global IfThenElse;\r\ +< \n :global VersionToNum;\r\ +--- +> \_:len \$KeyValue ] ];\ +> \n :if (\$Value=\"true\") do={:set Value true}\ +> \n :if (\$Value=\"false\") do={:set Value false}\ +> \n :set (\$Result->\$Key) \$Value;\ +> \n } else={:set (\$Result->\$KeyValue) true}\ +> \n }\ +> \n :return \$Result;\ +> \n}\ +> \n:set RequiredRouterOS do={\ +> \n :local Caller [ :tostr \$1 ];\ +> \n :local Required [ :tostr \$2 ];\ +> \n :local Warn [ :tostr \$3 ];\ +> \n :global IfThenElse;\ +> \n :global VersionToNum;\ +1666,1669c1652,1655 +< \\\$\")) do={\r\ +< \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \\\$\")) do={\ +> \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\ +> \n :return false;\ +> \n }\ +1671,1672c1657,1658 +< e/update/get installed-version ] ]) do={\r\ +< \n :if (\$Warn = \"true\") do={\r\ +--- +> e/update/get installed-version ] ]) do={\ +> \n :if (\$Warn = \"true\") do={\ +1674c1660 +< 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ +--- +> 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\ +1676,1701c1662,1687 +< es RouterOS \" . \$Required . \". Please update!\");\r\ +< \n }\r\ +< \n :return false;\r\ +< \n }\r\ +< \n :return true;\r\ +< \n}\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\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\ +--- +> es RouterOS \" . \$Required . \". Please update!\");\ +> \n }\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set ValidateSyntax do={\ +> \n :local Code [ :tostr \$1 ];\ +> \n :global LogPrint;\ +> \n :onerror Err {\ +> \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\ +> \n } do={\ +> \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set VersionToNum do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :local Multi 0x1000000;\ +> \n :local Return 0;\ +> \n :global CharacterReplace;\ +> \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\ +> \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\ +1703,1712c1689,1697 +< \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 }\ +> \n :foreach Value in=([ :toarray \$Input ], 0) do={\ +> \n :local Num [ :tonum \$Value ];\ +> \n :if (\$Multi = 0x100) do={\ +> \n :if ([ :typeof \$Num ] = \"num\") do={\ +> \n :set Return (\$Return + 0xff00);\ +> \n :set Multi (\$Multi / 0x100);\ +> \n } else={\ +> \n :if (\$Value = \"zero\") do={ }\ +1714c1699 +< }\r\ +--- +> }\ +1716,1719c1701,1703 +< \r\ +< \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ +< \n }\r\ +< \n }\r\ +--- +> \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\ +> \n }\ +> \n }\ +1721,1740c1705,1724 +< lue * \$Multi)); }\r\ +< \n :set Multi (\$Multi / 0x100);\r\ +< \n }\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set ScriptLock do={\r\ +< \n :local Script [ :tostr \$1 ];\r\ +< \n :local WaitMax [ :totime \$2 ];\r\ +< \n :global GetRandom20CharAlNum;\r\ +< \n :global IfThenElse;\r\ +< \n :global ScriptLockOrder;\r\ +< \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ +< \n :set ScriptLockOrder ({});\r\ +< \n }\r\ +< \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ +< \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +< \n }\r\ +< \n :local JobCount do={\r\ +< \n :local Script [ :tostr \$1 ];\r\ +--- +> lue * \$Multi)); }\ +> \n :set Multi (\$Multi / 0x100);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ScriptLock do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local WaitMax [ :totime \$2 ];\ +> \n :global GetRandom20CharAlNum;\ +> \n :global IfThenElse;\ +> \n :global ScriptLockOrder;\ +> \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\ +> \n :set ScriptLockOrder ({});\ +> \n }\ +> \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n }\ +> \n :local JobCount do={\ +> \n :local Script [ :tostr \$1 ];\ +1742,1748c1726,1731 +< \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 }\ +> \n :local TicketCount do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLockOrder;\ +> \n :local Count 0;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +1750,1759c1733,1742 +< + 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\ +--- +> + 1)}\ +> \n }\ +> \n :return \$Count;\ +> \n }\ +> \n :local IsFirstTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Check [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :if (\$Ticket = \$Check) do={:return true}\ +1761,1772c1744,1755 +< 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\ +--- +> o={:return false}\ +> \n }\ +> \n :return false;\ +> \n }\ +> \n :local AddTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Add [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :while (true) do={\ +> \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\ +> \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\ +> \n :delay 10ms;\ +1774,1797c1757,1780 +< 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\ +--- +> e}\ +> \n }\ +> \n }\ +> \n :local RemoveTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Remove [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\ +> \n :set (\$ScriptLockOrder->\$Script->\$Id);\ +> \n :delay 10ms;\ +> \n }\ +> \n }\ +> \n }\ +> \n :local CleanupTickets do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\ +> \n }\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n }\ +> \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\ +> \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ +1799,1802c1782,1785 +< ist!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$JobCount \$Script ] = 0) do={\r\ +--- +> ist!\");\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$JobCount \$Script ] = 0) do={\ +1804,1807c1787,1790 +< );\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ +--- +> );\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\ +1809,1829c1792,1812 +< t . \"', resetting!\");\r\ +< \n :set (\$ScriptLockOrder->\$Script) ({});\r\ +< \n /system/script/job/remove [ find where script=\$Script ];\r\ +< \n }\r\ +< \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ +< \n \$AddTicket \$Script \$MyTicket;\r\ +< \n :local WaitInterval (\$WaitMax / 20);\r\ +< \n :local WaitTime \$WaitMax;\r\ +< \n :while (\$WaitTime > 0 && \\\r\ +< \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ +< \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ +< \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ +< \n :delay \$WaitInterval;\r\ +< \n }\r\ +< \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ +< \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ +< \n \$RemoveTicket \$Script \$MyTicket;\r\ +< \n \$CleanupTickets \$Script;\r\ +< \n :return true;\r\ +< \n }\r\ +< \n \$RemoveTicket \$Script \$MyTicket;\r\ +--- +> t . \"', resetting!\");\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n /system/script/job/remove [ find where script=\$Script ];\ +> \n }\ +> \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\ +> \n \$AddTicket \$Script \$MyTicket;\ +> \n :local WaitInterval (\$WaitMax / 20);\ +> \n :local WaitTime \$WaitMax;\ +> \n :while (\$WaitTime > 0 && \\\ +> \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\ +> \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\ +> \n :set WaitTime (\$WaitTime - \$WaitInterval);\ +> \n :delay \$WaitInterval;\ +> \n }\ +> \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\ +> \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\ +> \n \$RemoveTicket \$Script \$MyTicket;\ +> \n \$CleanupTickets \$Script;\ +> \n :return true;\ +> \n }\ +> \n \$RemoveTicket \$Script \$MyTicket;\ +1831c1814 +< once\" . \\\r\ +--- +> once\" . \\\ +1833,1838c1816,1821 +< \_lock\" \"\" ] . \"...\");\r\ +< \n :return false;\r\ +< \n}\r\ +< \n\r\ +< \n:set SendNotification do={ :onerror Err {\r\ +< \n :global SendNotification2;\r\ +--- +> \_lock\" \"\" ] . \"...\");\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set SendNotification do={ :onerror Err {\ +> \n :global SendNotification2;\ +1840,1847c1823,1830 +< \_silent=\$4 });\r\ +< \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ +< \n}\r\ +< \n\r\ +< \n:set SendNotification2 do={\r\ +< \n :local Notification \$1;\r\ +< \n :global NotificationFunctions;\r\ +< \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ +--- +> \_silent=\$4 });\ +> \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ +> \n}\ +> \n\ +> \n:set SendNotification2 do={\ +> \n :local Notification \$1;\ +> \n :global NotificationFunctions;\ +> \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\ +1849,1900c1832,1883 +< ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n:set SymbolByUnicodeName do={\r\ +< \n :local Name [ :tostr \$1 ];\r\ +< \n :global EitherOr;\r\ +< \n :global SymbolsExtra;\r\ +< \n :local Symbols ({\r\ +< \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ +< \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ +< \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ +< \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ +< \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ +< \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ +< \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ +< \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ +< \n \"cloud\"=\"\\E2\\98\\81\";\r\ +< \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ +< \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ +< \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ +< \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ +< \n \"gear\"=\"\\E2\\9A\\99\";\r\ +< \n \"heart\"=\"\\E2\\99\\A5\";\r\ +< \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ +< \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ +< \n \"information\"=\"\\E2\\84\\B9\";\r\ +< \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ +< \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ +< \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ +< \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ +< \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ +< \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ +< \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ +< \n \"scissors\"=\"\\E2\\9C\\82\";\r\ +< \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ +< \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ +< \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ +< \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ +< \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ +< \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ +< \n \"star\"=\"\\E2\\AD\\90\";\r\ +< \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ +< \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ +< \n }, \$SymbolsExtra);\r\ +< \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ +< \n :local Special {\r\ +< \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ +< \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ +< \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ +< \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ +< \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ +--- +> ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\ +> \n }\ +> \n}\ +> \n\ +> \n:set SymbolByUnicodeName do={\ +> \n :local Name [ :tostr \$1 ];\ +> \n :global EitherOr;\ +> \n :global SymbolsExtra;\ +> \n :local Symbols ({\ +> \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\ +> \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\ +> \n \"arrow-down\"=\"\\E2\\AC\\87\";\ +> \n \"arrow-up\"=\"\\E2\\AC\\86\";\ +> \n \"calendar\"=\"\\F0\\9F\\93\\85\";\ +> \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\ +> \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\ +> \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\ +> \n \"cloud\"=\"\\E2\\98\\81\";\ +> \n \"cross-mark\"=\"\\E2\\9D\\8C\";\ +> \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\ +> \n \"fire\"=\"\\F0\\9F\\94\\A5\";\ +> \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\ +> \n \"gear\"=\"\\E2\\9A\\99\";\ +> \n \"heart\"=\"\\E2\\99\\A5\";\ +> \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\ +> \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\ +> \n \"information\"=\"\\E2\\84\\B9\";\ +> \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\ +> \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\ +> \n \"link\"=\"\\F0\\9F\\94\\97\";\ +> \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\ +> \n \"memo\"=\"\\F0\\9F\\93\\9D\";\ +> \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\ +> \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\ +> \n \"scissors\"=\"\\E2\\9C\\82\";\ +> \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\ +> \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\ +> \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\ +> \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\ +> \n \"sparkles\"=\"\\E2\\9C\\A8\";\ +> \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\ +> \n \"star\"=\"\\E2\\AD\\90\";\ +> \n \"warning-sign\"=\"\\E2\\9A\\A0\";\ +> \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\ +> \n }, \$SymbolsExtra);\ +> \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\ +> \n :local Special {\ +> \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\ +> \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\ +> \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\ +> \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\ +> \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\ +1902,1904c1885,1887 +< '!\");\r\ +< \n :return \"\";\r\ +< \n }\r\ +--- +> '!\");\ +> \n :return \"\";\ +> \n }\ +1906,1912c1889,1895 +< me) ] . \"\\EF\\B8\\8F\");\r\ +< \n}\r\ +< \n\r\ +< \n:set SymbolForNotification do={\r\ +< \n :global NotificationsWithSymbols;\r\ +< \n :global SymbolByUnicodeName;\r\ +< \n :global IfThenElse;\r\ +--- +> me) ] . \"\\EF\\B8\\8F\");\ +> \n}\ +> \n\ +> \n:set SymbolForNotification do={\ +> \n :global NotificationsWithSymbols;\ +> \n :global SymbolByUnicodeName;\ +> \n :global IfThenElse;\ +1914,1915c1897,1898 +< \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ +< \n :local Return \"\";\r\ +--- +> \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\ +> \n :local Return \"\";\ +1917,1926c1900,1909 +< mbolByUnicodeName \$Symbol ])}\r\ +< \n :return (\$Return . \" \");\r\ +< \n}\r\ +< \n\r\ +< \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ +< \n:set UrlEncode do={\r\ +< \n :local Input [ :tostr \$1 ];\r\ +< \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ +< \n :local Return \"\";\r\ +< \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ +--- +> mbolByUnicodeName \$Symbol ])}\ +> \n :return (\$Return . \" \");\ +> \n}\ +> \n\ +> \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\ +> \n:set UrlEncode do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\ +1928c1911 +< %24\"; \"%25\"; \"%26\"; \"%27\";\r\ +--- +> %24\"; \"%25\"; \"%26\"; \"%27\";\ +1930c1913 +< \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ +--- +> \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\ +1932,1935c1915,1918 +< \"%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\ +--- +> \"%7C\"; \"%7D\"; \"%7E\" };\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +> \n :local Replace [ :find \$Chars \$Char ];\ +1937,1969c1920,1952 +< ce)}\r\ +< \n :set Return (\$Return . \$Char);\r\ +< \n }\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set IsDNSResolving do={\r\ +< \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set IsFullyConnected do={\r\ +< \n :global IsDNSResolving;\r\ +< \n :global IsTimeSync;\r\ +< \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ +< \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set IsTimeSync do={\r\ +< \n :global IsTimeSyncCached;\r\ +< \n :global IsTimeSyncResetNtp;\r\ +< \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ +< \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ +< \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ +< \n :set IsTimeSyncCached true;\r\ +< \n :return true;\r\ +< \n }\r\ +< \n :local Uptime [ /system/resource/get uptime ];\r\ +< \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ +< \n :set IsTimeSyncResetNtp \$Uptime;\r\ +< \n }\r\ +< \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ +--- +> ce)}\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set IsDNSResolving do={\ +> \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set IsFullyConnected do={\ +> \n :global IsDNSResolving;\ +> \n :global IsTimeSync;\ +> \n :if ([ \$IsDNSResolving ] = false) do={:return false};\ +> \n :if ([ \$IsTimeSync ] = false) do={:return false};\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set IsTimeSync do={\ +> \n :global IsTimeSyncCached;\ +> \n :global IsTimeSyncResetNtp;\ +> \n :if (\$IsTimeSyncCached = true) do={:return true}\ +> \n :if ([ /system/ntp/client/get enabled ] = true) do={\ +> \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\ +> \n :set IsTimeSyncCached true;\ +> \n :return true;\ +> \n }\ +> \n :local Uptime [ /system/resource/get uptime ];\ +> \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\ +> \n :set IsTimeSyncResetNtp \$Uptime;\ +> \n }\ +> \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\ +1971,1979c1954,1962 +< ;\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 :set IsTimeSyncResetNtp \$Uptime;\ +> \n /system/ntp/client/set enabled=no;\ +> \n :delay 20ms;\ +> \n /system/ntp/client/set enabled=yes;\ +> \n :return false;\ +> \n }\ +> \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\ +> \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\ +1981,1990c1964,1973 +< 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\ +--- +> ee license and x86.\";\ +> \n :return true;\ +> \n }\ +> \n :if ([ /ip/cloud/get update-time ] = true) do={\ +> \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\ +> \n :set IsTimeSyncCached true;\ +> \n :return true;\ +> \n }\ +> \n :return false;\ +> \n }\ +1992,2010c1975,1992 +< \r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n:set FetchHugeFiles do={\r\ +< \n :local ScriptName [ :tostr \$1 ];\r\ +< \n :local Url [ :tostr \$2 ];\r\ +< \n :local CheckCert [ :tostr \$3 ];\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 :return true;\ +> \n}\ +> \n\ +> \n:set FetchHugeFiles do={\ +> \n :local ScriptName [ :tostr \$1 ];\ +> \n :local Url [ :tostr \$2 ];\ +> \n :local CheckCert [ :tostr \$3 ];\ +> \n\ +> \n :global CleanName;\ +> \n :global FetchUserAgentStr;\ +> \n :global GetRandom20CharAlNum;\ +> \n :global IfThenElse;\ +> \n :global LogPrint;\ +> \n :global MkDir;\ +> \n :global RmDir;\ +> \n :global RmFile;\ +> \n :global WaitForFile;\ +> \n\ +2012,2019c1994,2001 +< ithout-crl\" ];\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\r\ +--- +> ithout-crl\" ];\ +> \n\ +> \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\ +> \n :if ([ \$MkDir \$DirName ] = false) do={\ +> \n \$LogPrint error \$0 (\"Failed creating directory!\");\ +> \n :return false;\ +> \n }\ +> \n\ +2021,2022c2003,2004 +< \$GetRandom20CharAlNum ]);\r\ +< \n :onerror Err {\r\ +--- +> \$GetRandom20CharAlNum ]);\ +> \n :onerror Err {\ +2024c2006 +< \\\r\ +--- +> \\\ +2026,2030c2008,2012 +< lue;\r\ +< \n } do={\r\ +< \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ +< \n \$RmFile \$FileName;\r\ +< \n }\r\ +--- +> lue;\ +> \n } do={\ +> \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +> \n \$RmFile \$FileName;\ +> \n }\ +2032,2037c2014,2019 +< \_. \$Err);\r\ +< \n \$RmDir \$DirName;\r\ +< \n :return false;\r\ +< \n }\r\ +< \n\r\ +< \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ +--- +> \_. \$Err);\ +> \n \$RmDir \$DirName;\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +2039,2046c2021,2028 +< \_not show up.\");\r\ +< \n :return false;\r\ +< \n }\r\ +< \n\r\ +< \n :local FileSize [ /file/get \$FileName size ];\r\ +< \n :local Return \"\";\r\ +< \n :local VarSize 0;\r\ +< \n :while (\$VarSize != \$FileSize) do={\r\ +--- +> \_not show up.\");\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :local FileSize [ /file/get \$FileName size ];\ +> \n :local Return \"\";\ +> \n :local VarSize 0;\ +> \n :while (\$VarSize != \$FileSize) do={\ +2048,2064c2030,2046 +< 768 file=\$FileName as-value ]->\"data\"));\r\ +< \n :set FileSize [ /file/get \$FileName size ];\r\ +< \n :set VarSize [ :len \$Return ];\r\ +< \n :if (\$VarSize > \$FileSize) do={\r\ +< \n :delay 100ms;\r\ +< \n }\r\ +< \n }\r\ +< \n \$RmDir \$DirName;\r\ +< \n :return \$Return;\r\ +< \n}\r\ +< \n\r\ +< \n:set FetchUserAgentStr do={\r\ +< \n :local Caller [ :tostr \$1 ];\r\ +< \n :global GlobalScriptsUrl;\r\ +< \n :global CommitBrief;\r\ +< \n :global IfThenElse;\r\ +< \n :local Resource [ /system/resource/get ];\r\ +--- +> 768 file=\$FileName as-value ]->\"data\"));\ +> \n :set FileSize [ /file/get \$FileName size ];\ +> \n :set VarSize [ :len \$Return ];\ +> \n :if (\$VarSize > \$FileSize) do={\ +> \n :delay 100ms;\ +> \n }\ +> \n }\ +> \n \$RmDir \$DirName;\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set FetchUserAgentStr do={\ +> \n :local Caller [ :tostr \$1 ];\ +> \n :global GlobalScriptsUrl;\ +> \n :global CommitBrief;\ +> \n :global IfThenElse;\ +> \n :local Resource [ /system/resource/get ];\ +2066c2048 +< \_\$Resource->\"architecture-name\" . \\\r\ +--- +> \_\$Resource->\"architecture-name\" . \\\ +2068,2097c2050,2079 +< CommitBrief ] . \")\");\r\ +< \n}\r\ +< \n\r\ +< \n:set ScriptInstallUpdate do={ :onerror Err {\r\ +< \n :local Scripts [ :toarray \$1 ];\r\ +< \n :local NewComment [ :tostr \$2 ];\r\ +< \n :global InitSetup;\r\ +< \n\r\ +< \n :global CommitId;\r\ +< \n :global ScriptUpdatesCRLF;\r\ +< \n :global GlobalConfVersion;\r\ +< \n :global Identity;\r\ +< \n :global CertificateAvailable;\r\ +< \n :global CheckSumsVerify;\r\ +< \n :global GlobalScriptsUrl;\r\ +< \n :global SumsDirAndFileName;\r\ +< \n :global GlobalScriptsUrlSuffix;\r\ +< \n :global EitherOr;\r\ +< \n :global FetchUserAgentStr;\r\ +< \n :global Grep;\r\ +< \n :global IfThenElse;\r\ +< \n :global LogPrint;\r\ +< \n :global ParseKeyValueStore;\r\ +< \n :global RequiredRouterOS;\r\ +< \n :global SendNotification2;\r\ +< \n :global SymbolForNotification;\r\ +< \n :global ValidateSyntax;\r\ +< \n :global CommentsInScripts;\r\ +< \n\r\ +< \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ +--- +> CommitBrief ] . \")\");\ +> \n}\ +> \n\ +> \n:set ScriptInstallUpdate do={ :onerror Err {\ +> \n :local Scripts [ :toarray \$1 ];\ +> \n :local NewComment [ :tostr \$2 ];\ +> \n :global InitSetup;\ +> \n\ +> \n :global CommitId;\ +> \n :global ScriptUpdatesCRLF;\ +> \n :global GlobalConfVersion;\ +> \n :global Identity;\ +> \n :global CertificateAvailable;\ +> \n :global CheckSumsVerify;\ +> \n :global GlobalScriptsUrl;\ +> \n :global SumsDirAndFileName;\ +> \n :global GlobalScriptsUrlSuffix;\ +> \n :global EitherOr;\ +> \n :global FetchUserAgentStr;\ +> \n :global Grep;\ +> \n :global IfThenElse;\ +> \n :global LogPrint;\ +> \n :global ParseKeyValueStore;\ +> \n :global RequiredRouterOS;\ +> \n :global SendNotification2;\ +> \n :global SymbolForNotification;\ +> \n :global ValidateSyntax;\ +> \n :global CommentsInScripts;\ +> \n\ +> \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\ +2099,2102c2081,2084 +< hout.\");\r\ +< \n }\r\ +< \n\r\ +< \n :foreach Script in=\$Scripts do={\r\ +--- +> hout.\");\ +> \n }\ +> \n\ +> \n :foreach Script in=\$Scripts do={\ +2104,2105c2086 +< \r\ +< \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ +--- +> \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\ +2107,2118c2088,2099 +< Vados\\n\" comment=\$NewComment;\r\ +< \n }\r\ +< \n }\r\ +< \n\r\ +< \n :local CommitIdBefore \$CommitId;\r\ +< \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ +< \n :local ReloadGlobal false;\r\ +< \n :local DeviceMode [ /system/device-mode/get ];\r\ +< \n\r\ +< \n :if (\$CheckSumsVerify = true) do={\r\ +< \n :local CheckSums ({});\r\ +< \n :do {\r\ +--- +> Vados\\n\" comment=\$NewComment;\ +> \n }\ +> \n }\ +> \n\ +> \n :local CommitIdBefore \$CommitId;\ +> \n :local GlobalConfVersionBefore \$GlobalConfVersion;\ +> \n :local ReloadGlobal false;\ +> \n :local DeviceMode [ /system/device-mode/get ];\ +> \n\ +> \n :if (\$CheckSumsVerify = true) do={\ +> \n :local CheckSums ({});\ +> \n :do {\ +2120c2101 +< iptsUrlSuffix);\r\ +--- +> iptsUrlSuffix);\ +2122d2102 +< \r\ +2124c2104 +< ficate=yes-without-crl \\\r\ +--- +> ficate=yes-without-crl \\\ +2126,2129c2106,2109 +< =user as-value ]->\"data\") ];\r\ +< \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ +< \n }\r\ +< \n\r\ +--- +> =user as-value ]->\"data\") ];\ +> \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\ +> \n }\ +> \n\ +2131,2132c2111,2112 +< s\" ] do={\r\ +< \n :local ScriptVal [ /system/script/get \$Script ];\r\ +--- +> s\" ] do={\ +> \n :local ScriptVal [ /system/script/get \$Script ];\ +2134,2136c2114,2116 +< ];\r\ +< \n :local SourceNew;\r\ +< \n\r\ +--- +> ];\ +> \n :local SourceNew;\ +> \n\ +2138,2140c2118,2120 +< \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ +< \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ +< \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ +--- +> \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\ +> \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\ +> \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\ +2143,2147c2123,2127 +< \"'!\");\r\ +< \n }\r\ +< \n }\r\ +< \n :do {\r\ +< \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ +--- +> \"'!\");\ +> \n }\ +> \n }\ +> \n :do {\ +> \n :if (\$ScriptInfo->\"ignore\" = true) do={\ +2149,2153c2129,2133 +< e\" . \"', as requested.\");\r\ +< \n :error true;\r\ +< \n }\r\ +< \n :if (\$CheckSumsVerify = true) do={\r\ +< \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ +--- +> e\" . \"', as requested.\");\ +> \n :error true;\ +> \n }\ +> \n :if (\$CheckSumsVerify = true) do={\ +> \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\ +2155c2135 +< ptInfo->\"url-suffix\") ] = 0 && \\\r\ +--- +> ptInfo->\"url-suffix\") ] = 0 && \\\ +2157c2137 +< rce\") ] ] = \$CheckSum) do={\r\ +--- +> rce\") ] ] = \$CheckSum) do={\ +2159,2163c2139,2143 +< >\"name\" . \"' matches, ignoring.\");\r\ +< \n :error true;\r\ +< \n }\r\ +< \n }\r\ +< \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ +--- +> >\"name\" . \"' matches, ignoring.\");\ +> \n :error true;\ +> \n }\ +> \n }\ +> \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\ +2165c2145 +< fetch\" ] = false) do={\r\ +--- +> fetch\" ] = false) do={\ +2167,2170c2147,2150 +< ng without.\");\r\ +< \n }\r\ +< \n }\r\ +< \n :onerror Err {\r\ +--- +> ng without.\");\ +> \n }\ +> \n }\ +> \n :onerror Err {\ +2172c2152 +< lScriptsUrl ];\r\ +--- +> lScriptsUrl ];\ +2174c2154 +< lobalScriptsUrlSuffix ];\r\ +--- +> lobalScriptsUrlSuffix ];\ +2176c2156 +< Suffix);\r\ +--- +> Suffix);\ +2178c2158 +< name\") . \"' from url: \" . \$Url);\r\ +--- +> name\") . \"' from url: \" . \$Url);\ +2180d2159 +< \r\ +2182,2186c2161,2165 +< ut=user as-value ];\r\ +< \n :if (\$Result->\"status\" = \"finished\") do={\r\ +< \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ +< \n } \r\ +< \n } do={\r\ +--- +> ut=user as-value ];\ +> \n :if (\$Result->\"status\" = \"finished\") do={\ +> \n :set SourceNew [ :tolf (\$Result->\"data\") ];\ +> \n } \ +> \n } do={\ +2188,2192c2167,2171 +< 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\ +--- +> al->\"name\" . \"': \" . \$Err);\ +> \n :if (\$Err != \"Fetch failed with status 404\") do={\ +> \n :error false;\ +> \n }\ +> \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\ +2194,2198c2173,2177 +< \?\");\r\ +< \n /system/script/remove \$Script;\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if (\$CheckSumsVerify = true) do={\r\ +--- +> \?\");\ +> \n /system/script/remove \$Script;\ +> \n :error false;\ +> \n }\ +> \n :if (\$CheckSumsVerify = true) do={\ +2200,2201c2179,2180 +< riptInfo->\"url-suffix\") ] = 0 && \\\r\ +< \n [ :len \$CheckSum ] = 0) do={\r\ +--- +> riptInfo->\"url-suffix\") ] = 0 && \\\ +> \n [ :len \$CheckSum ] = 0) do={\ +2203,2209c2182,2188 +< 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\ +--- +> pdates with 'ignore=true' in comment.\");\ +> \n }\ +> \n }\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if ([ :len \$SourceNew ] = 0) do={\ +2211,2215c2190,2194 +< >\"name\") . \"'.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ +--- +> >\"name\") . \"'.\");\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :local SourceCRLF [ :tocrlf \$SourceNew ];\ +2217c2196 +< lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ +--- +> lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\ +2219c2198 +< \$ScriptVal->\"source\")) do={\r\ +--- +> \$ScriptVal->\"source\")) do={\ +2221,2223c2200,2202 +< . \"' source did not change. End of lines set to CRLF.\");\r\ +< \n if (\$ScriptUpdatesCRLF = false) do={\r\ +< \n :put [ :tolf \$SourceNew ];\r\ +--- +> . \"' source did not change. End of lines set to CRLF.\");\ +> \n if (\$ScriptUpdatesCRLF = false) do={\ +> \n :put [ :tolf \$SourceNew ];\ +2225,2231c2204,2210 +< ) . \"' 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\ +--- +> ) . \"' source update end of lines to LF.\");\ +> \n }\ +> \n :error false;\ +> \n }\ +> \n }\ +> \n\ +> \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\ +2234,2238c2213,2217 +< );\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :if (\$CommentsInScripts = true) do={\r\ +--- +> );\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if (\$CommentsInScripts = true) do={\ +2240,2241c2219,2220 +< \_\") ];\r\ +< \n :if ([ :len \$CommentLine ] = 0) do={\r\ +--- +> \_\") ];\ +> \n :if ([ :len \$CommentLine ] = 0) do={\ +2244,2246c2223,2225 +< noring!\");\r\ +< \n :error false;\r\ +< \n } else={\r\ +--- +> noring!\");\ +> \n :error false;\ +> \n } else={\ +2249c2228 +< ] + 2) [ :len \$CommentLine] ]) do={\r\ +--- +> ] + 2) [ :len \$CommentLine] ]) do={\ +2252c2231 +< ;\r\ +--- +> ;\ +2254c2233 +< ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ +--- +> ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\ +2257,2258c2236,2237 +< ded!\");\r\ +< \n } else={\r\ +--- +> ded!\");\ +> \n } else={\ +2260,2265c2239,2244 +< al->\"name\") . \"' did not change.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n } \r\ +< \n }\r\ +< \n\r\ +--- +> al->\"name\") . \"' did not change.\");\ +> \n :error false;\ +> \n }\ +> \n } \ +> \n }\ +> \n\ +2267c2246 +< \"\\23 requires RouterOS, \") ] ]->version);\r\ +--- +> \"\\23 requires RouterOS, \") ] ]->version);\ +2269c2248 +< \_false ] = false) do={\r\ +--- +> \_false ] = false) do={\ +2271c2250 +< \") . \"' requires RouterOS \" . \\\r\ +--- +> \") . \"' requires RouterOS \" . \\\ +2273,2275c2252,2254 +< gnoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +--- +> gnoring!\");\ +> \n :error false;\ +> \n }\ +2277,2279c2256,2258 +< \\23 requires device-mode, \") ] ];\r\ +< \n :local MissingDM ({});\r\ +< \n :foreach Feature,Value in=\$RequiredDM do={\r\ +--- +> \\23 requires device-mode, \") ] ];\ +> \n :local MissingDM ({});\ +> \n :foreach Feature,Value in=\$RequiredDM do={\ +2281,2285c2260,2264 +< ceMode->\$Feature) = false) do={\r\ +< \n :set MissingDM (\$MissingDM, \$Feature);\r\ +< \n }\r\ +< \n }\r\ +< \n :if ([ :len \$MissingDM ] > 0) do={\r\ +--- +> ceMode->\$Feature) = false) do={\ +> \n :set MissingDM (\$MissingDM, \$Feature);\ +> \n }\ +> \n }\ +> \n :if ([ :len \$MissingDM ] > 0) do={\ +2287c2266 +< \") . \"' requires disabled \" . \\\r\ +--- +> \") . \"' requires disabled \" . \\\ +2289,2293c2268,2272 +< gnoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ +--- +> gnoring!\");\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\ +2295,2298c2274,2277 +< ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n \r\ +--- +> ScriptVal->\"name\") . \"' failed! Ignoring!\");\ +> \n :error false;\ +> \n }\ +> \n \ +2300,2301c2279,2280 +< ript comment: \" . (\$ScriptVal->\"comment\"));\r\ +< \n\r\ +--- +> ript comment: \" . (\$ScriptVal->\"comment\"));\ +> \n\ +2303c2282 +< Val->\"comment\") \\\r\ +--- +> Val->\"comment\") \\\ +2305,2307c2284,2286 +< F \$SourceNew ] \$Script;\r\ +< \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ +< \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ +--- +> F \$SourceNew ] \$Script;\ +> \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\ +> \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\ +2309,2314c2288,2293 +< o={\r\ +< \n :set ReloadGlobal true;\r\ +< \n }\r\ +< \n } on-error={ }\r\ +< \n }\r\ +< \n :if (\$ReloadGlobal = true) do={\r\ +--- +> o={\ +> \n :set ReloadGlobal true;\ +> \n }\ +> \n } on-error={ }\ +> \n }\ +> \n :if (\$ReloadGlobal = true) do={\ +2316,2319c2295,2298 +< \");\r\ +< \n :onerror Err {\r\ +< \n :global InitSetup (a);\r\ +< \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ +--- +> \");\ +> \n :onerror Err {\ +> \n :global InitSetup (a);\ +> \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\ +2321,2323c2300,2302 +< ctions failed! \" . \$Err)}\r\ +< \n }\r\ +< \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ +--- +> ctions failed! \" . \$Err)}\ +> \n }\ +> \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\ +2325,2336c2304,2315 +< \" . \\\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 \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\ +> \n \". Installed an older version\?\");\ +> \n }\ +> \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\ +> \n :global GlobalConfChanges;\ +> \n :global GlobalConfMigration;\ +> \n :local ChangeLogCode;\ +> \n :if ([ :len \$ChangeLogCode ] > 0) do={\ +> \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\ +> \n :onerror Err {\ +> \n [ :parse \$ChangeLogCode ];\ +2338c2317 +< . \$Err)}\r\ +--- +> . \$Err)}\ +2340,2342c2319,2321 +< dation!\")}\r\ +< \n }\r\ +< \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ +--- +> dation!\")}\ +> \n }\ +> \n :if ([ :len \$GlobalConfMigration ] > 0) do={\ +2344,2347c2323,2326 +< \_do={\r\ +< \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ +< \n :do {\r\ +< \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ +--- +> \_do={\ +> \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\ +> \n :do {\ +> \n :if ([ :typeof \$Migration ] != \"str\") do={\ +2349,2352c2328,2331 +< \_\" is not available.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ +--- +> \_\" is not available.\");\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\ +2354,2355c2333,2334 +< \_. \" failed syntax validation!\");\r\ +< \n :error false}\r\ +--- +> \_. \" failed syntax validation!\");\ +> \n :error false}\ +2357,2359c2336,2338 +< . \": \" . \$Migration);\r\ +< \n :onerror Err {\r\ +< \n [ :parse \$Migration ];\r\ +--- +> . \": \" . \$Migration);\ +> \n :onerror Err {\ +> \n [ :parse \$Migration ];\ +2361,2364c2340,2343 +< \_\$I . \" failed to run: \" . \$Err)}\r\ +< \n } on-error={ }\r\ +< \n }\r\ +< \n }\r\ +--- +> \_\$I . \" failed to run: \" . \$Err)}\ +> \n } on-error={ }\ +> \n }\ +> \n }\ +2366c2345 +< entity . \" increased \" . \\\r\ +--- +> entity . \" increased \" . \\\ +2368c2347 +< d modification. \" . \\\r\ +--- +> d modification. \" . \\\ +2370,2372c2349,2351 +< bal-config.\");\r\ +< \n \$LogPrint info \$0 (\$NotificationMessage);\r\ +< \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ +--- +> bal-config.\");\ +> \n \$LogPrint info \$0 (\$NotificationMessage);\ +> \n :if ([ :len \$GlobalConfChanges ] > 0) do={\ +2374c2353 +< \");\r\ +--- +> \");\ +2376,2377c2355,2356 +< \_do={\r\ +< \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ +--- +> \_do={\ +> \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\ +2379,2383c2358,2361 +< \r\ +< \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ +< \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ +< \n }\r\ +< \n } else={\r\ +--- +> \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\ +> \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\ +> \n }\ +> \n } else={\ +2385,2388c2363,2366 +< \_changes are not available.\");\r\ +< \n\r\ +< \n }\r\ +< \n\r\ +--- +> \_changes are not available.\");\ +> \n\ +> \n }\ +> \n\ +2390c2368 +< } else={ :global GlobalConfChanges (a); }\r\ +--- +> } else={ :global GlobalConfChanges (a); }\ +2392,2398c2370,2376 +< on; } else={ :global GlobalConfMigration (a); }\r\ +< \n }\r\ +< \n} do={\r\ +< \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +< \n} }\r\ +< \n\r\ +< \n# load modules\r\ +--- +> on; } else={ :global GlobalConfMigration (a); }\ +> \n }\ +> \n} do={\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +> \n} }\ +> \n\ +> \n# load modules\ +2400,2405c2378,2383 +< ns\\\\.d|mod)/.\" ] do={\r\ +< \n :local ScriptVal [ /system/script/get \$Script ];\r\ +< \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ +< \n :onerror Err {\r\ +< \n /system/script/run \$Script;\r\ +< \n } do={\r\ +--- +> ns\\\\.d|mod)/.\" ] do={\ +> \n :local ScriptVal [ /system/script/get \$Script ];\ +> \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\ +> \n :onerror Err {\ +> \n /system/script/run \$Script;\ +> \n } do={\ +2407,2409c2385,2387 +< ailed to run: \" . \$Err);\r\ +< \n }\r\ +< \n } else={\r\ +--- +> ailed to run: \" . \$Err);\ +> \n }\ +> \n } else={\ +2411,2416c2389,2394 +< led syntax validation, skipping.\");\r\ +< \n }\r\ +< \n}\r\ +< \n\r\ +< \n# Add and fix global scheduler\r\ +< \n:put \"Add or/and fix Global scheduler...\";\r\ +--- +> led syntax validation, skipping.\");\ +> \n }\ +> \n}\ +> \n\ +> \n# Add and fix global scheduler\ +> \n:put \"Add or/and fix Global scheduler...\";\ +2418,2419c2396,2397 +< ; }\";\r\ +< \n:local Comment \"Every Day Set Global Environment Variables\";\r\ +--- +> ; }\";\ +> \n:local Comment \"Every Day Set Global Environment Variables\";\ +2421c2399 +< = 0) do={\r\ +--- +> = 0) do={\ +2423,2424c2401,2402 +< ent=\$OnEvent start-time=startup;\r\ +< \n}\r\ +--- +> ent=\$OnEvent start-time=startup;\ +> \n}\ +2426,2428c2404,2406 +< \_do={\r\ +< \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ +< \n}\r\ +--- +> \_do={\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\ +> \n}\ +2430,2434c2408,2412 +< ) 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\ +--- +> ) do={\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\ +> \n}\ +> \n# Add Update Script scheduler\ +> \n:put \"Add or/and fix Update Script scheduler\";\ +2436,2437c2414 +< \r\ +< \n:set Comment \"Every Day Check For Update Scripts\";\r\ +--- +> \n:set Comment \"Every Day Check For Update Scripts\";\ +2439c2416 +< \" ] ] = 0) do={\r\ +--- +> \" ] ] = 0) do={\ +2441,2445c2418,2422 +< start-time=startup interval=1d on-event=\$OnEvent;\r\ +< \n}\r\ +< \n\r\ +< \n:onerror Err {\r\ +< \n :global GlobalConfReady;\r\ +--- +> start-time=startup interval=1d on-event=\$OnEvent;\ +> \n}\ +> \n\ +> \n:onerror Err {\ +> \n :global GlobalConfReady;\ +2447,2449c2424,2426 +< \_not ready.\"); }; } delay=100ms max=5;\r\ +< \n\r\ +< \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ +--- +> \_not ready.\"); }; } delay=100ms max=5;\ +> \n\ +> \n:log warning (\"This script \$ScriptName Loaded \" . \\\ +2451c2428 +< \") ] . \\\r\ +--- +> \") ] . \\\ +2453,2461c2430,2438 +< \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ +< \n # signal we are ready\r\ +< \n:set GlobalFuncReady true;\r\ +< \n:set ExitOK true;\r\ +< \n\r\ +< \n:log info (\$0 . \"Global configs ready!\");\r\ +< \n} do={\r\ +< \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +< \n}\r\ +--- +> \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\ +> \n # signal we are ready\ +> \n:set GlobalFuncReady true;\ +> \n:set ExitOK true;\ +> \n\ +> \n:log info (\$0 . \"Global configs ready!\");\ +> \n} do={\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +> \n}\ -- 2.52.0