global-functions: sort alphabetically

This commit is contained in:
Christian Hesse 2020-02-28 15:26:26 +01:00
parent 3db752bc97
commit 001e7eeb39
17 changed files with 339 additions and 340 deletions

View file

@ -4,17 +4,17 @@
# #
# check for certificate validity # check for certificate validity
:global Identity;
:global CertRenewUrl;
:global CertRenewPass; :global CertRenewPass;
:global CertRenewUrl;
:global Identity;
:global CertificateNameByCN; :global CertificateNameByCN;
:global LogPrintExit;
:global ParseKeyValueStore; :global ParseKeyValueStore;
:global SendNotification; :global SendNotification;
:global TimeIsSync; :global TimeIsSync;
:global UrlEncode; :global UrlEncode;
:global WaitForFile; :global WaitForFile;
:global LogPrintExit;
:local FormatExpire do={ :local FormatExpire do={
:global CharacterReplace; :global CharacterReplace;

View file

@ -9,9 +9,9 @@
:global SentRouterosUpdateNotification; :global SentRouterosUpdateNotification;
:global DeviceInfo; :global DeviceInfo;
:global LogPrintExit;
:global ScriptFromTerminal; :global ScriptFromTerminal;
:global SendNotification; :global SendNotification;
:global LogPrintExit;
:local DoUpdate do={ :local DoUpdate do={
:if ([ / system script print count-only where name="packages-update" ] > 0) do={ :if ([ / system script print count-only where name="packages-update" ] > 0) do={

View file

@ -4,8 +4,8 @@
# #
# upload backup to MikroTik cloud # upload backup to MikroTik cloud
:global Identity;
:global BackupPassword; :global BackupPassword;
:global Identity;
:global DeviceInfo; :global DeviceInfo;
:global SendNotification; :global SendNotification;

View file

@ -9,8 +9,8 @@
:global Identity; :global Identity;
:global GetMacVendor; :global GetMacVendor;
:global SendNotification;
:global ScriptLock; :global ScriptLock;
:global SendNotification;
$ScriptLock "collect-wireless-mac.capsman"; $ScriptLock "collect-wireless-mac.capsman";

View file

@ -9,8 +9,8 @@
:global Identity; :global Identity;
:global GetMacVendor; :global GetMacVendor;
:global SendNotification;
:global ScriptLock; :global ScriptLock;
:global SendNotification;
$ScriptLock "collect-wireless-mac.local"; $ScriptLock "collect-wireless-mac.local";

View file

@ -10,8 +10,8 @@
:global Identity; :global Identity;
:global GetMacVendor; :global GetMacVendor;
:global SendNotification;
:global ScriptLock; :global ScriptLock;
:global SendNotification;
$ScriptLock "collect-wireless-mac%TEMPL%"; $ScriptLock "collect-wireless-mac%TEMPL%";

View file

@ -8,8 +8,8 @@
# !! This is just a template! Replace '%PATH%' with 'caps-man' # !! This is just a template! Replace '%PATH%' with 'caps-man'
# !! or 'interface wireless'! # !! or 'interface wireless'!
:global Identity;
:global DailyPskMatchComment; :global DailyPskMatchComment;
:global Identity;
:global SendNotification; :global SendNotification;
:global UrlEncode; :global UrlEncode;

View file

@ -6,9 +6,9 @@
:global CharacterReplace; :global CharacterReplace;
:global Identity;
:global Domain; :global Domain;
:global HostNameInZone; :global HostNameInZone;
:global Identity;
:local Zone; :local Zone;
:if ($HostNameInZone = true) do={ :if ($HostNameInZone = true) do={

View file

@ -4,13 +4,13 @@
# #
# create and email backup and config file # create and email backup and config file
:global Identity; :global BackupPassword;
:global Domain;
:global EmailBackupTo;
:global EmailBackupCc;
:global BackupSendBinary; :global BackupSendBinary;
:global BackupSendExport; :global BackupSendExport;
:global BackupPassword; :global Domain;
:global EmailBackupCc;
:global EmailBackupTo;
:global Identity;
:global CharacterReplace; :global CharacterReplace;
:global DeviceInfo; :global DeviceInfo;

View file

@ -9,89 +9,64 @@
:global ExpectedConfigVersion 12; :global ExpectedConfigVersion 12;
# global variables not to be changed by user # global variables not to be changed by user
:global SentConfigChangesNotification "-";
:global SentRouterosUpdateNotification "-";
:global SentLteFirmwareUpgradeNotification "-";
:global Identity [ / system identity get name ]; :global Identity [ / system identity get name ];
:global SentConfigChangesNotification "-";
:global SentLteFirmwareUpgradeNotification "-";
:global SentRouterosUpdateNotification "-";
# global functions # global functions
:global UrlEncode;
:global CharacterReplace;
:global CertificateNameByCN;
:global CertificateDownload;
:global CertificateAvailable; :global CertificateAvailable;
:global SendEMail; :global CertificateDownload;
:global SendTelegram; :global CertificateNameByCN;
:global SendNotification; :global CharacterReplace;
:global GetMacVendor;
:global CleanFilePath; :global CleanFilePath;
:global DownloadPackage;
:global ScriptLock;
:global ScriptFromTerminal;
:global WaitForFile;
:global ParseKeyValueStore;
:global GetRandom;
:global RandomDelay;
:global DeviceInfo; :global DeviceInfo;
:global ScriptInstallUpdate; :global DownloadPackage;
:global MailServerIsUp; :global GetMacVendor;
:global TimeIsSync; :global GetRandom;
:global WaitTimeSync;
:global LogPrintExit; :global LogPrintExit;
:global MailServerIsUp;
:global ParseKeyValueStore;
:global RandomDelay;
:global ScriptFromTerminal;
:global ScriptInstallUpdate;
:global ScriptLock;
:global SendEMail;
:global SendNotification;
:global SendTelegram;
:global TimeIsSync;
:global UrlEncode;
:global WaitForFile;
:global WaitTimeSync;
# url encoding # check and download required certificate
:set UrlEncode do={ :set CertificateAvailable do={
:local Input [ :tostr $1 ];
:local Return "";
:if ([ :len $Input ] > 0) do={
:local Chars " !\"#\$%&'()*+,:;<=>\?@[\\]^`{|}~";
:local Subs { "%20"; "%21"; "%22"; "%23"; "%24"; "%25"; "%26"; "%27"; "%28"; "%29";
"%2A"; "%2B"; "%2C"; "%3A"; "%3B"; "%3C"; "%3D"; "%3E"; "%3F"; "%40";
"%5B"; "%5C"; "%5D"; "%5E"; "%60"; "%7B"; "%7C"; "%7D"; "%7E" };
:for I from=0 to=([ :len $Input ] - 1) do={
:local Char [ :pick $Input $I ];
:local Replace [ :find $Chars $Char ];
:if ([ :len $Replace ] > 0) do={
:set Char ($Subs->$Replace);
}
:set Return ($Return . $Char);
}
}
:return $Return;
}
# character replace
:set CharacterReplace do={
:local String [ :tostr $1 ];
:local ReplaceFrom [ :tostr $2 ];
:local ReplaceWith [ :tostr $3 ];
:local Return "";
:if ($ReplaceFrom = "") do={
:return $String;
}
:while ([ :typeof [ :find $String $ReplaceFrom ] ] != "nil") do={
:local Pos [ :find $String $ReplaceFrom ];
:set Return ($Return . [ :pick $String 0 $Pos ] . $ReplaceWith);
:set String [ :pick $String ($Pos + [ :len $ReplaceFrom ]) [ :len $String ] ];
}
:return ($Return . $String);
}
# name a certificate by its common-name
:set CertificateNameByCN do={
:local CommonName [ :tostr $1 ]; :local CommonName [ :tostr $1 ];
:global CharacterReplace; :global CertificateDownload;
:global ParseKeyValueStore;
:local Cert [ / certificate find where common-name=$CommonName ]; :if ([ / system resource get free-hdd-space ] < 8388608 && \
/ certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $CommonName " " "-" ] "---" "-" ]; [ / certificate settings get crl-download ] = true && \
[ / certificate settings get crl-store ] = "system") do={
:log warn "This system has low free flash space but is configured to download certificate CRLs to system!";
}
:if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
:log info ("Certificate with CommonName \"" . $CommonName . "\" not available.");
$CertificateDownload $CommonName;
}
:local CertVal;
:local Issuer $CommonName;
:do {
:if ([ / certificate print count-only where common-name=$Issuer ] = 0) do={
:log info ("Certificate chain for \"" . $CommonName . "\" is incomplete, missing \"" . $Issuer . "\".");
$CertificateDownload $CommonName;
}
:set CertVal [ / certificate get [ find where common-name=$Issuer ] ];
:set Issuer ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN");
} while=($Issuer != $CertVal->"common-name");
} }
# download and import certificate # download and import certificate
@ -126,118 +101,34 @@
} }
} }
# check and download required certificate # name a certificate by its common-name
:set CertificateAvailable do={ :set CertificateNameByCN do={
:local CommonName [ :tostr $1 ]; :local CommonName [ :tostr $1 ];
:global CertificateDownload; :global CharacterReplace;
:global ParseKeyValueStore;
:if ([ / system resource get free-hdd-space ] < 8388608 && \ :local Cert [ / certificate find where common-name=$CommonName ];
[ / certificate settings get crl-download ] = true && \ / certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $CommonName " " "-" ] "---" "-" ];
[ / certificate settings get crl-store ] = "system") do={
:log warn "This system has low free flash space but is configured to download certificate CRLs to system!";
}
:if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
:log info ("Certificate with CommonName \"" . $CommonName . "\" not available.");
$CertificateDownload $CommonName;
}
:local CertVal;
:local Issuer $CommonName;
:do {
:if ([ / certificate print count-only where common-name=$Issuer ] = 0) do={
:log info ("Certificate chain for \"" . $CommonName . "\" is incomplete, missing \"" . $Issuer . "\".");
$CertificateDownload $CommonName;
}
:set CertVal [ / certificate get [ find where common-name=$Issuer ] ];
:set Issuer ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN");
} while=($Issuer != $CertVal->"common-name");
} }
# send notification via e-mail # character replace
:set SendEMail do={ :set CharacterReplace do={
:local Subject [ :tostr $1 ]; :local String [ :tostr $1 ];
:local Message [ :tostr $2 ]; :local ReplaceFrom [ :tostr $2 ];
:local Attach [ :tostr $3 ]; :local ReplaceWith [ :tostr $3 ];
:local Return "";
:global Identity; :if ($ReplaceFrom = "") do={
:global EmailGeneralTo; :return $String;
:global EmailGeneralCc;
:if ([ :len $EmailGeneralTo ] > 0) do={
:do {
:local Signature [ / system note get note ];
:if ([ :len $Signature ] > 0) do={
:set Signature ("\n-- \n" . $Signature);
}
/ tool e-mail send to=$EmailGeneralTo cc=$EmailGeneralCc \
subject=("[" . $Identity . "] " . $Subject) \
body=($Message . $Signature) file=$Attach;
} on-error={
:log warning "Failed sending notification mail!";
}
} }
}
# send notification via telegram :while ([ :typeof [ :find $String $ReplaceFrom ] ] != "nil") do={
:set SendTelegram do={ :local Pos [ :find $String $ReplaceFrom ];
:local Subject [ :tostr $1 ]; :set Return ($Return . [ :pick $String 0 $Pos ] . $ReplaceWith);
:local Message [ :tostr $2 ]; :set String [ :pick $String ($Pos + [ :len $ReplaceFrom ]) [ :len $String ] ];
:local Silent [ :tostr $3 ];
:global Identity;
:global TelegramTokenId;
:global TelegramChatId;
:global UrlEncode;
:global CertificateAvailable;
:if ([ :len $TelegramTokenId ] > 0 && [ :len $TelegramChatId ] > 0) do={
$CertificateAvailable "Go Daddy Secure Certificate Authority - G2";
:do {
/ tool fetch check-certificate=yes-without-crl output=none http-method=post \
("https://api.telegram.org/bot" . $TelegramTokenId . "/sendMessage") \
http-data=("chat_id=" . $TelegramChatId . "&disable_notification=" . $Silent . \
"&text=" . [ $UrlEncode ("[" . $Identity . "] " . $Subject . "\n\n" . $Message) ]);
} on-error={
:log warning "Failed sending telegram notification!";
}
} }
}
# send notification via e-mail and telegram :return ($Return . $String);
# Note that attachment is ignored for telegram, silent is ignored for e-mail!
:set SendNotification do={
:local Subject [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Attach [ :tostr $3 ];
:local Silent [ :tostr $4 ];
:global SendEMail;
:global SendTelegram;
$SendEMail $Subject $Message $Attach;
$SendTelegram $Subject $Message $Silent;
}
# get MAC vendor
:set GetMacVendor do={
:local Mac [ :tostr $1 ];
:global CertificateAvailable;
:do {
:local Vendor;
$CertificateAvailable "Let's Encrypt Authority X3";
:set Vendor ([ / tool fetch check-certificate=yes-without-crl \
("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data");
:return $Vendor;
} on-error={
:return "unknown vendor";
}
} }
# clean file path # clean file path
@ -259,6 +150,49 @@
:return $Path; :return $Path;
} }
# get readable device info
:set DeviceInfo do={
:global ExpectedConfigVersion;
:global GlobalConfigVersion;
:global Identity;
:local Resource [ / system resource get ];
:local RouterBoard [ / system routerboard get ];
:local Update [ / system package update get ];
:local Info ( \
"Hostname: " . $Identity . "\n" . \
"Board name: " . $Resource->"board-name" . "\n" . \
"Architecture: " . $Resource->"architecture-name");
:if ($RouterBoard->"routerboard" = true) do={
:local Revision "";
:if ([ :len ($RouterBoard->"revision") ] > 0) do={
:set Revision (" " . $RouterBoard->"revision");
}
:set Info ($Info . "\n" . \
"Model: " . $RouterBoard->"model" . $Revision . "\n" . \
"Serial number: " . $RouterBoard->"serial-number");
}
:set Info ($Info . "\n" . \
"RouterOS:\n" . \
" Channel: " . $Update->"channel" . "\n" . \
" Installed: " . $Update->"installed-version");
:if ([ :typeof ($Update->"latest-version") ] != "nothing" && \
$Update->"installed-version" != $Update->"latest-version") do={
:set Info ($Info . "\n" . \
" Available: " . $Update->"latest-version");
}
:set Info ($Info . "\n" . \
"RouterOS-Scripts Configuration Version:\n" . \
" Current: " . $GlobalConfigVersion);
:if ($GlobalConfigVersion != $ExpectedConfigVersion) do={
:set Info ($Info . "\n" . \
" Expected: " . $ExpectedConfigVersion);
}
:return $Info;
}
# download package from upgrade server # download package from upgrade server
:set DownloadPackage do={ :set DownloadPackage do={
:local PkgName [ :tostr $1 ]; :local PkgName [ :tostr $1 ];
@ -304,68 +238,23 @@
:return false; :return false;
} }
# lock script against multiple invocation # get MAC vendor
:set ScriptLock do={ :set GetMacVendor do={
:global LogPrintExit; :local Mac [ :tostr $1 ];
:local Script [ :tostr $1 ]; :global CertificateAvailable;
:if ([ / system script job print count-only where script=$Script ] > 1) do={ :do {
$LogPrintExit info ("Script " . $Script . " started more than once... Aborting.") true; :local Vendor;
$CertificateAvailable "Let's Encrypt Authority X3";
:set Vendor ([ / tool fetch check-certificate=yes-without-crl \
("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data");
:return $Vendor;
} on-error={
:return "unknown vendor";
} }
} }
# check if script is run from terminal
:set ScriptFromTerminal do={
:local Script [ :tostr $1 ];
:foreach Job in=[ / system script job find where script=$Script ] do={
:set Job [ / system script job get $Job ];
:while ([ :typeof ($Job->"parent") ] = "id") do={
:set Job [ / system script job get [ find where .id=($Job->"parent") ] ];
}
:if (($Job->"type") = "login") do={
:log debug ("Script " . $Script . " started from terminal.");
:return true;
}
}
:return false;
}
# wait for file to be available
:set WaitForFile do={
:global CleanFilePath;
:local FileName [ $CleanFilePath [ :tostr $1 ] ];
:local I 0;
:while ([ file print count-only where name=$FileName ] = 0) do={
:if ($I > 20) do={
:return false;
}
:delay 100ms;
:set I ($I + 1);
}
:return true;
}
# parse key value store
:set ParseKeyValueStore do={
:global CharacterReplace;
:local Source $1;
:if ([ :typeof $Source ] != "array") do={
:set Source [ :tostr $1 ];
}
:local Result [ :toarray "" ];
:foreach KeyValue in=[ :toarray $Source ] do={
:set KeyValue [ :toarray [ $CharacterReplace $KeyValue "=" "," ] ];
:set ($Result->($KeyValue->0)) ($KeyValue->1);
}
:return $Result;
}
# generate random number # generate random number
# Warning: This is a *very* weak algorithm and in *no way* # Warning: This is a *very* weak algorithm and in *no way*
# useful for cryptography or similar! # useful for cryptography or similar!
@ -379,67 +268,24 @@
:return ($Sum % $Max); :return ($Sum % $Max);
} }
# delay a random amount of seconds # log and print with same text, optionally exit
:set RandomDelay do={ :set LogPrintExit do={
:global GetRandom; :local Severity [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Exit [ :tostr $3 ];
:delay ([ $GetRandom $1 ] . "s"); :if ($Severity ~ "^(error|info)\$") do={
} :if ($Severity = "error" ) do={ :log error $Message; }
:if ($Severity = "info" ) do={ :log info $Message; }
# get readable device info } else={
:set DeviceInfo do={ :log warning $Message;
:global ExpectedConfigVersion;
:global GlobalConfigVersion;
:global Identity;
:local Resource [ / system resource get ];
:local RouterBoard [ / system routerboard get ];
:local Update [ / system package update get ];
:local Info ( \
"Hostname: " . $Identity . "\n" . \
"Board name: " . $Resource->"board-name" . "\n" . \
"Architecture: " . $Resource->"architecture-name");
:if ($RouterBoard->"routerboard" = true) do={
:local Revision "";
:if ([ :len ($RouterBoard->"revision") ] > 0) do={
:set Revision (" " . $RouterBoard->"revision");
}
:set Info ($Info . "\n" . \
"Model: " . $RouterBoard->"model" . $Revision . "\n" . \
"Serial number: " . $RouterBoard->"serial-number");
}
:set Info ($Info . "\n" . \
"RouterOS:\n" . \
" Channel: " . $Update->"channel" . "\n" . \
" Installed: " . $Update->"installed-version");
:if ([ :typeof ($Update->"latest-version") ] != "nothing" && \
$Update->"installed-version" != $Update->"latest-version") do={
:set Info ($Info . "\n" . \
" Available: " . $Update->"latest-version");
}
:set Info ($Info . "\n" . \
"RouterOS-Scripts Configuration Version:\n" . \
" Current: " . $GlobalConfigVersion);
:if ($GlobalConfigVersion != $ExpectedConfigVersion) do={
:set Info ($Info . "\n" . \
" Expected: " . $ExpectedConfigVersion);
} }
:return $Info; :if ($Exit = "true") do={
} :error ($Severity . ": " . $Message);
} else={
# install new scripts, update existing scripts :put ($Severity . ": " . $Message);
:set ScriptInstallUpdate do={
:local Scripts [ :toarray $1 ];
:foreach Script in=$Scripts do={
:if ([ / system script print count-only where name=$Script ] = 0) do={
:log info ("Adding new script: " . $Script);
/ system script add name=$Script source="#!rsc";
}
} }
/ system script run script-updates;
} }
# check if mail server is up # check if mail server is up
@ -463,6 +309,137 @@
:return false; :return false;
} }
# parse key value store
:set ParseKeyValueStore do={
:global CharacterReplace;
:local Source $1;
:if ([ :typeof $Source ] != "array") do={
:set Source [ :tostr $1 ];
}
:local Result [ :toarray "" ];
:foreach KeyValue in=[ :toarray $Source ] do={
:set KeyValue [ :toarray [ $CharacterReplace $KeyValue "=" "," ] ];
:set ($Result->($KeyValue->0)) ($KeyValue->1);
}
:return $Result;
}
# delay a random amount of seconds
:set RandomDelay do={
:global GetRandom;
:delay ([ $GetRandom $1 ] . "s");
}
# check if script is run from terminal
:set ScriptFromTerminal do={
:local Script [ :tostr $1 ];
:foreach Job in=[ / system script job find where script=$Script ] do={
:set Job [ / system script job get $Job ];
:while ([ :typeof ($Job->"parent") ] = "id") do={
:set Job [ / system script job get [ find where .id=($Job->"parent") ] ];
}
:if (($Job->"type") = "login") do={
:log debug ("Script " . $Script . " started from terminal.");
:return true;
}
}
:return false;
}
# install new scripts, update existing scripts
:set ScriptInstallUpdate do={
:local Scripts [ :toarray $1 ];
:foreach Script in=$Scripts do={
:if ([ / system script print count-only where name=$Script ] = 0) do={
:log info ("Adding new script: " . $Script);
/ system script add name=$Script source="#!rsc";
}
}
/ system script run script-updates;
}
# lock script against multiple invocation
:set ScriptLock do={
:global LogPrintExit;
:local Script [ :tostr $1 ];
:if ([ / system script job print count-only where script=$Script ] > 1) do={
$LogPrintExit info ("Script " . $Script . " started more than once... Aborting.") true;
}
}
# send notification via e-mail
:set SendEMail do={
:local Subject [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Attach [ :tostr $3 ];
:global Identity;
:global EmailGeneralTo;
:global EmailGeneralCc;
:if ([ :len $EmailGeneralTo ] > 0) do={
:do {
:local Signature [ / system note get note ];
:if ([ :len $Signature ] > 0) do={
:set Signature ("\n-- \n" . $Signature);
}
/ tool e-mail send to=$EmailGeneralTo cc=$EmailGeneralCc \
subject=("[" . $Identity . "] " . $Subject) \
body=($Message . $Signature) file=$Attach;
} on-error={
:log warning "Failed sending notification mail!";
}
}
}
# send notification via e-mail and telegram
# Note that attachment is ignored for telegram, silent is ignored for e-mail!
:set SendNotification do={
:local Subject [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Attach [ :tostr $3 ];
:local Silent [ :tostr $4 ];
:global SendEMail;
:global SendTelegram;
$SendEMail $Subject $Message $Attach;
$SendTelegram $Subject $Message $Silent;
}
# send notification via telegram
:set SendTelegram do={
:local Subject [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Silent [ :tostr $3 ];
:global Identity;
:global TelegramTokenId;
:global TelegramChatId;
:global UrlEncode;
:global CertificateAvailable;
:if ([ :len $TelegramTokenId ] > 0 && [ :len $TelegramChatId ] > 0) do={
$CertificateAvailable "Go Daddy Secure Certificate Authority - G2";
:do {
/ tool fetch check-certificate=yes-without-crl output=none http-method=post \
("https://api.telegram.org/bot" . $TelegramTokenId . "/sendMessage") \
http-data=("chat_id=" . $TelegramChatId . "&disable_notification=" . $Silent . \
"&text=" . [ $UrlEncode ("[" . $Identity . "] " . $Subject . "\n\n" . $Message) ]);
} on-error={
:log warning "Failed sending telegram notification!";
}
}
}
# check if system time is sync # check if system time is sync
:set TimeIsSync do={ :set TimeIsSync do={
:if ([ / system ntp client get enabled ] = true && \ :if ([ / system ntp client get enabled ] = true && \
@ -478,6 +455,48 @@
:return false; :return false;
} }
# url encoding
:set UrlEncode do={
:local Input [ :tostr $1 ];
:local Return "";
:if ([ :len $Input ] > 0) do={
:local Chars " !\"#\$%&'()*+,:;<=>\?@[\\]^`{|}~";
:local Subs { "%20"; "%21"; "%22"; "%23"; "%24"; "%25"; "%26"; "%27"; "%28"; "%29";
"%2A"; "%2B"; "%2C"; "%3A"; "%3B"; "%3C"; "%3D"; "%3E"; "%3F"; "%40";
"%5B"; "%5C"; "%5D"; "%5E"; "%60"; "%7B"; "%7C"; "%7D"; "%7E" };
:for I from=0 to=([ :len $Input ] - 1) do={
:local Char [ :pick $Input $I ];
:local Replace [ :find $Chars $Char ];
:if ([ :len $Replace ] > 0) do={
:set Char ($Subs->$Replace);
}
:set Return ($Return . $Char);
}
}
:return $Return;
}
# wait for file to be available
:set WaitForFile do={
:global CleanFilePath;
:local FileName [ $CleanFilePath [ :tostr $1 ] ];
:local I 0;
:while ([ file print count-only where name=$FileName ] = 0) do={
:if ($I > 20) do={
:return false;
}
:delay 100ms;
:set I ($I + 1);
}
:return true;
}
# wait for time to become synced # wait for time to become synced
:set WaitTimeSync do={ :set WaitTimeSync do={
:global TimeIsSync; :global TimeIsSync;
@ -490,23 +509,3 @@
:delay 1s; :delay 1s;
} }
} }
# log and print with same text, optionally exit
:set LogPrintExit do={
:local Severity [ :tostr $1 ];
:local Message [ :tostr $2 ];
:local Exit [ :tostr $3 ];
:if ($Severity ~ "^(error|info)\$") do={
:if ($Severity = "error" ) do={ :log error $Message; }
:if ($Severity = "info" ) do={ :log info $Message; }
} else={
:log warning $Message;
}
:if ($Exit = "true") do={
:error ($Severity . ": " . $Message);
} else={
:put ($Severity . ": " . $Message);
}
}

View file

@ -4,8 +4,8 @@
# #
# track gps data by sending json data to http server # track gps data by sending json data to http server
:global Identity;
:global GpsTrackUrl; :global GpsTrackUrl;
:global Identity;
:local CoordinateFormat [ /system gps get coordinate-format ]; :local CoordinateFormat [ /system gps get coordinate-format ];
:local Gps [ / system gps monitor once as-value ]; :local Gps [ / system gps monitor once as-value ];

View file

@ -6,8 +6,8 @@
:local PdPrefix $"pd-prefix"; :local PdPrefix $"pd-prefix";
:global ParseKeyValueStore;
:global LogPrintExit; :global LogPrintExit;
:global ParseKeyValueStore;
:if ([ :typeof $PdPrefix ] = "nothing") do={ :if ([ :typeof $PdPrefix ] = "nothing") do={
$LogPrintExit error "This script is supposed to run from ipv6 dhcp-client." true; $LogPrintExit error "This script is supposed to run from ipv6 dhcp-client." true;

View file

@ -5,9 +5,9 @@
# download packages and reboot for installation # download packages and reboot for installation
:global DownloadPackage; :global DownloadPackage;
:global LogPrintExit;
:global ScriptFromTerminal; :global ScriptFromTerminal;
:global ScriptLock; :global ScriptLock;
:global LogPrintExit;
$ScriptLock "packages-update"; $ScriptLock "packages-update";

View file

@ -8,14 +8,14 @@
:global GlobalConfigVersion; :global GlobalConfigVersion;
:global Identity; :global Identity;
:global IDonate; :global IDonate;
:global SentConfigChangesNotification;
:global ScriptUpdatesFetch;
:global ScriptUpdatesBaseUrl; :global ScriptUpdatesBaseUrl;
:global ScriptUpdatesUrlSuffix; :global ScriptUpdatesFetch;
:global ScriptUpdatesIgnore; :global ScriptUpdatesIgnore;
:global ScriptUpdatesUrlSuffix;
:global SentConfigChangesNotification;
:global SendNotification;
:global LogPrintExit; :global LogPrintExit;
:global SendNotification;
:foreach Script in=[ / system script find where source~"^#!rsc" ] do={ :foreach Script in=[ / system script find where source~"^#!rsc" ] do={
:local Ignore 0; :local Ignore 0;

View file

@ -6,9 +6,9 @@
:global Identity; :global Identity;
:global SendNotification;
:global MailServerIsUp;
:global LogPrintExit; :global LogPrintExit;
:global MailServerIsUp;
:global SendNotification;
# check mail server # check mail server
:if ($MailServerIsUp = false) do={ :if ($MailServerIsUp = false) do={

View file

@ -4,8 +4,8 @@
# Michael Gisbers <michael@gisbers.de> # Michael Gisbers <michael@gisbers.de>
:global CertificateAvailable; :global CertificateAvailable;
:global ParseKeyValueStore;
:global LogPrintExit; :global LogPrintExit;
:global ParseKeyValueStore;
:if ([ / ip cloud get ddns-enabled ] != true) do={ :if ([ / ip cloud get ddns-enabled ] != true) do={
$LogPrintExit error "IP cloud DDNS is not enabled." true; $LogPrintExit error "IP cloud DDNS is not enabled." true;

View file

@ -4,19 +4,19 @@
# #
# create and upload backup and config file # create and upload backup and config file
:global Identity; :global BackupPassword;
:global Domain;
:global BackupUploadUrl;
:global BackupUploadUser;
:global BackupUploadPass;
:global BackupSendBinary; :global BackupSendBinary;
:global BackupSendExport; :global BackupSendExport;
:global BackupPassword; :global BackupUploadPass;
:global BackupUploadUrl;
:global BackupUploadUser;
:global Domain;
:global Identity;
:global CharacterReplace; :global CharacterReplace;
:global DeviceInfo; :global DeviceInfo;
:global SendNotification;
:global LogPrintExit; :global LogPrintExit;
:global SendNotification;
:if ($BackupSendBinary != true && \ :if ($BackupSendBinary != true && \
$BackupSendExport != true) do={ $BackupSendExport != true) do={