aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Christian Hesse <mail@eworm.de>2020-02-28 15:26:26 +0100
committerGravatar Christian Hesse <mail@eworm.de>2020-02-28 15:26:26 +0100
commit001e7eeb39ee993539334805622f8cd24fde63e9 (patch)
tree1e1efe76ea0fe68d6c8a52ccf47814d7c9219d8c
parent3db752bc979be5f7eaff4f64e96d5f854b83eff5 (diff)
global-functions: sort alphabetically
-rw-r--r--check-certificates6
-rw-r--r--check-routeros-update2
-rw-r--r--cloud-backup2
-rw-r--r--collect-wireless-mac.capsman2
-rw-r--r--collect-wireless-mac.local2
-rw-r--r--collect-wireless-mac.template2
-rw-r--r--daily-psk.template2
-rw-r--r--dhcp-to-dns2
-rw-r--r--email-backup10
-rw-r--r--global-functions561
-rw-r--r--gps-track2
-rw-r--r--ipv6-update2
-rw-r--r--packages-update2
-rw-r--r--script-updates8
-rw-r--r--sms-forward4
-rw-r--r--update-tunnelbroker2
-rw-r--r--upload-backup14
17 files changed, 312 insertions, 313 deletions
diff --git a/check-certificates b/check-certificates
index d94c330..38f1c79 100644
--- a/check-certificates
+++ b/check-certificates
@@ -4,17 +4,17 @@
#
# check for certificate validity
-:global Identity;
-:global CertRenewUrl;
:global CertRenewPass;
+:global CertRenewUrl;
+:global Identity;
:global CertificateNameByCN;
+:global LogPrintExit;
:global ParseKeyValueStore;
:global SendNotification;
:global TimeIsSync;
:global UrlEncode;
:global WaitForFile;
-:global LogPrintExit;
:local FormatExpire do={
:global CharacterReplace;
diff --git a/check-routeros-update b/check-routeros-update
index d622ba3..4ed52f3 100644
--- a/check-routeros-update
+++ b/check-routeros-update
@@ -9,9 +9,9 @@
:global SentRouterosUpdateNotification;
:global DeviceInfo;
+:global LogPrintExit;
:global ScriptFromTerminal;
:global SendNotification;
-:global LogPrintExit;
:local DoUpdate do={
:if ([ / system script print count-only where name="packages-update" ] > 0) do={
diff --git a/cloud-backup b/cloud-backup
index 5875cd1..9a225a2 100644
--- a/cloud-backup
+++ b/cloud-backup
@@ -4,8 +4,8 @@
#
# upload backup to MikroTik cloud
-:global Identity;
:global BackupPassword;
+:global Identity;
:global DeviceInfo;
:global SendNotification;
diff --git a/collect-wireless-mac.capsman b/collect-wireless-mac.capsman
index 2b9b23f..a280cea 100644
--- a/collect-wireless-mac.capsman
+++ b/collect-wireless-mac.capsman
@@ -9,8 +9,8 @@
:global Identity;
:global GetMacVendor;
-:global SendNotification;
:global ScriptLock;
+:global SendNotification;
$ScriptLock "collect-wireless-mac.capsman";
diff --git a/collect-wireless-mac.local b/collect-wireless-mac.local
index 3241c27..cf09fa5 100644
--- a/collect-wireless-mac.local
+++ b/collect-wireless-mac.local
@@ -9,8 +9,8 @@
:global Identity;
:global GetMacVendor;
-:global SendNotification;
:global ScriptLock;
+:global SendNotification;
$ScriptLock "collect-wireless-mac.local";
diff --git a/collect-wireless-mac.template b/collect-wireless-mac.template
index 6ad55a2..8f8ded8 100644
--- a/collect-wireless-mac.template
+++ b/collect-wireless-mac.template
@@ -10,8 +10,8 @@
:global Identity;
:global GetMacVendor;
-:global SendNotification;
:global ScriptLock;
+:global SendNotification;
$ScriptLock "collect-wireless-mac%TEMPL%";
diff --git a/daily-psk.template b/daily-psk.template
index e0ae26a..88353a4 100644
--- a/daily-psk.template
+++ b/daily-psk.template
@@ -8,8 +8,8 @@
# !! This is just a template! Replace '%PATH%' with 'caps-man'
# !! or 'interface wireless'!
-:global Identity;
:global DailyPskMatchComment;
+:global Identity;
:global SendNotification;
:global UrlEncode;
diff --git a/dhcp-to-dns b/dhcp-to-dns
index 5343513..0d92278 100644
--- a/dhcp-to-dns
+++ b/dhcp-to-dns
@@ -6,9 +6,9 @@
:global CharacterReplace;
-:global Identity;
:global Domain;
:global HostNameInZone;
+:global Identity;
:local Zone;
:if ($HostNameInZone = true) do={
diff --git a/email-backup b/email-backup
index 978ac4d..2449173 100644
--- a/email-backup
+++ b/email-backup
@@ -4,13 +4,13 @@
#
# create and email backup and config file
-:global Identity;
-:global Domain;
-:global EmailBackupTo;
-:global EmailBackupCc;
+:global BackupPassword;
:global BackupSendBinary;
:global BackupSendExport;
-:global BackupPassword;
+:global Domain;
+:global EmailBackupCc;
+:global EmailBackupTo;
+:global Identity;
:global CharacterReplace;
:global DeviceInfo;
diff --git a/global-functions b/global-functions
index cdc7300..cc8ca20 100644
--- a/global-functions
+++ b/global-functions
@@ -9,89 +9,64 @@
:global ExpectedConfigVersion 12;
# global variables not to be changed by user
+:global Identity [ / system identity get name ];
:global SentConfigChangesNotification "-";
-:global SentRouterosUpdateNotification "-";
:global SentLteFirmwareUpgradeNotification "-";
-:global Identity [ / system identity get name ];
+:global SentRouterosUpdateNotification "-";
# global functions
-:global UrlEncode;
-:global CharacterReplace;
-:global CertificateNameByCN;
-:global CertificateDownload;
:global CertificateAvailable;
-:global SendEMail;
-:global SendTelegram;
-:global SendNotification;
-:global GetMacVendor;
+:global CertificateDownload;
+:global CertificateNameByCN;
+:global CharacterReplace;
:global CleanFilePath;
+:global DeviceInfo;
:global DownloadPackage;
-:global ScriptLock;
-:global ScriptFromTerminal;
-:global WaitForFile;
-:global ParseKeyValueStore;
+:global GetMacVendor;
:global GetRandom;
+:global LogPrintExit;
+:global MailServerIsUp;
+:global ParseKeyValueStore;
:global RandomDelay;
-:global DeviceInfo;
+:global ScriptFromTerminal;
:global ScriptInstallUpdate;
-:global MailServerIsUp;
+:global ScriptLock;
+:global SendEMail;
+:global SendNotification;
+:global SendTelegram;
:global TimeIsSync;
+:global UrlEncode;
+:global WaitForFile;
:global WaitTimeSync;
-:global LogPrintExit;
-# 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;
-}
+# check and download required certificate
+:set CertificateAvailable do={
+ :local CommonName [ :tostr $1 ];
-# character replace
-:set CharacterReplace do={
- :local String [ :tostr $1 ];
- :local ReplaceFrom [ :tostr $2 ];
- :local ReplaceWith [ :tostr $3 ];
- :local Return "";
+ :global CertificateDownload;
+ :global ParseKeyValueStore;
- :if ($ReplaceFrom = "") do={
- :return $String;
+ :if ([ / system resource get free-hdd-space ] < 8388608 && \
+ [ / 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!";
}
- :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 ] ];
+ :if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
+ :log info ("Certificate with CommonName \"" . $CommonName . "\" not available.");
+ $CertificateDownload $CommonName;
}
- :return ($Return . $String);
-}
-
-# name a certificate by its common-name
-:set CertificateNameByCN do={
- :local CommonName [ :tostr $1 ];
-
- :global CharacterReplace;
-
- :local Cert [ / certificate find where common-name=$CommonName ];
- / certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $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
@@ -126,118 +101,34 @@
}
}
-# check and download required certificate
-:set CertificateAvailable do={
+# name a certificate by its common-name
+:set CertificateNameByCN do={
:local CommonName [ :tostr $1 ];
- :global CertificateDownload;
- :global ParseKeyValueStore;
-
- :if ([ / system resource get free-hdd-space ] < 8388608 && \
- [ / 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;
- }
+ :global CharacterReplace;
- :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");
+ :local Cert [ / certificate find where common-name=$CommonName ];
+ / certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $CommonName " " "-" ] "---" "-" ];
}
-# 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;
+# character replace
+:set CharacterReplace do={
+ :local String [ :tostr $1 ];
+ :local ReplaceFrom [ :tostr $2 ];
+ :local ReplaceWith [ :tostr $3 ];
+ :local Return "";
- :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!";
- }
+ :if ($ReplaceFrom = "") do={
+ :return $String;
}
-}
-
-# 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!";
- }
+ :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 ] ];
}
-}
-
-# 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;
-}
-
-
-# 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";
- }
+ :return ($Return . $String);
}
# clean file path
@@ -259,6 +150,49 @@
: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
:set DownloadPackage do={
:local PkgName [ :tostr $1 ];
@@ -304,50 +238,75 @@
:return false;
}
-# lock script against multiple invocation
-:set ScriptLock do={
- :global LogPrintExit;
+# get MAC vendor
+:set GetMacVendor do={
+ :local Mac [ :tostr $1 ];
- :local Script [ :tostr $1 ];
+ :global CertificateAvailable;
- :if ([ / system script job print count-only where script=$Script ] > 1) do={
- $LogPrintExit info ("Script " . $Script . " started more than once... Aborting.") true;
+ :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";
}
}
-# check if script is run from terminal
-:set ScriptFromTerminal do={
- :local Script [ :tostr $1 ];
+# generate random number
+# Warning: This is a *very* weak algorithm and in *no way*
+# useful for cryptography or similar!
+:set GetRandom do={
+ :local Max ([ :tonum $1 ] + 1);
+ :local Sum 0;
- :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;
- }
+ :foreach Interface in=[ /interface find ] do={
+ :set Sum ($Sum + [ /interface get $Interface tx-byte ]);
}
-
- :return false;
+ :return ($Sum % $Max);
}
-# wait for file to be available
-:set WaitForFile do={
- :global CleanFilePath;
+# log and print with same text, optionally exit
+:set LogPrintExit do={
+ :local Severity [ :tostr $1 ];
+ :local Message [ :tostr $2 ];
+ :local Exit [ :tostr $3 ];
- :local FileName [ $CleanFilePath [ :tostr $1 ] ];
- :local I 0;
+ :if ($Severity ~ "^(error|info)\$") do={
+ :if ($Severity = "error" ) do={ :log error $Message; }
+ :if ($Severity = "info" ) do={ :log info $Message; }
+ } else={
+ :log warning $Message;
+ }
- :while ([ file print count-only where name=$FileName ] = 0) do={
- :if ($I > 20) do={
- :return false;
+ :if ($Exit = "true") do={
+ :error ($Severity . ": " . $Message);
+ } else={
+ :put ($Severity . ": " . $Message);
+ }
+}
+
+# check if mail server is up
+:set MailServerIsUp do={
+ :local MailServer [ / tool e-mail get address ];
+ :local MailHost $MailServer;
+
+ :if ([ / tool netwatch print count-only where comment=$MailServer ] = 0) do={
+ :log warn ("Adding netwatch entry for mail server.");
+ :local MailHost $MailServer;
+ :if ([ :typeof [ :toip $MailHost ] ] != "ip" ) do={
+ :set MailHost [ :resolve $MailServer ];
}
- :delay 100ms;
- :set I ($I + 1);
+ / tool netwatch add comment=$MailServer host=[ :resolve $MailServer ];
}
- :return true;
+
+ :if ([ / tool netwatch get [ find where comment=$MailServer ] status ] = "up") do={
+ :return true;
+ }
+
+ :return false;
}
# parse key value store
@@ -366,19 +325,6 @@
:return $Result;
}
-# generate random number
-# Warning: This is a *very* weak algorithm and in *no way*
-# useful for cryptography or similar!
-:set GetRandom do={
- :local Max ([ :tonum $1 ] + 1);
- :local Sum 0;
-
- :foreach Interface in=[ /interface find ] do={
- :set Sum ($Sum + [ /interface get $Interface tx-byte ]);
- }
- :return ($Sum % $Max);
-}
-
# delay a random amount of seconds
:set RandomDelay do={
:global GetRandom;
@@ -386,47 +332,22 @@
:delay ([ $GetRandom $1 ] . "s");
}
-# 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 ];
+# check if script is run from terminal
+:set ScriptFromTerminal do={
+ :local Script [ :tostr $1 ];
- :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");
+ :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;
}
- :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;
+ :return false;
}
# install new scripts, update existing scripts
@@ -442,25 +363,81 @@
/ system script run script-updates;
}
-# check if mail server is up
-:set MailServerIsUp do={
- :local MailServer [ / tool e-mail get address ];
- :local MailHost $MailServer;
+# lock script against multiple invocation
+:set ScriptLock do={
+ :global LogPrintExit;
- :if ([ / tool netwatch print count-only where comment=$MailServer ] = 0) do={
- :log warn ("Adding netwatch entry for mail server.");
- :local MailHost $MailServer;
- :if ([ :typeof [ :toip $MailHost ] ] != "ip" ) do={
- :set MailHost [ :resolve $MailServer ];
- }
- / tool netwatch add comment=$MailServer host=[ :resolve $MailServer ];
+ :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;
}
+}
- :if ([ / tool netwatch get [ find where comment=$MailServer ] status ] = "up") do={
- :return 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!";
+ }
}
+}
- :return false;
+# 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
@@ -478,6 +455,48 @@
: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
:set WaitTimeSync do={
:global TimeIsSync;
@@ -490,23 +509,3 @@
: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);
- }
-}
diff --git a/gps-track b/gps-track
index 3b944b3..2513e03 100644
--- a/gps-track
+++ b/gps-track
@@ -4,8 +4,8 @@
#
# track gps data by sending json data to http server
-:global Identity;
:global GpsTrackUrl;
+:global Identity;
:local CoordinateFormat [ /system gps get coordinate-format ];
:local Gps [ / system gps monitor once as-value ];
diff --git a/ipv6-update b/ipv6-update
index 7621082..baea7c3 100644
--- a/ipv6-update
+++ b/ipv6-update
@@ -6,8 +6,8 @@
:local PdPrefix $"pd-prefix";
-:global ParseKeyValueStore;
:global LogPrintExit;
+:global ParseKeyValueStore;
:if ([ :typeof $PdPrefix ] = "nothing") do={
$LogPrintExit error "This script is supposed to run from ipv6 dhcp-client." true;
diff --git a/packages-update b/packages-update
index b364b18..5baa78b 100644
--- a/packages-update
+++ b/packages-update
@@ -5,9 +5,9 @@
# download packages and reboot for installation
:global DownloadPackage;
+:global LogPrintExit;
:global ScriptFromTerminal;
:global ScriptLock;
-:global LogPrintExit;
$ScriptLock "packages-update";
diff --git a/script-updates b/script-updates
index 2cdc703..b84fcbf 100644
--- a/script-updates
+++ b/script-updates
@@ -8,14 +8,14 @@
:global GlobalConfigVersion;
:global Identity;
:global IDonate;
-:global SentConfigChangesNotification;
-:global ScriptUpdatesFetch;
:global ScriptUpdatesBaseUrl;
-:global ScriptUpdatesUrlSuffix;
+:global ScriptUpdatesFetch;
:global ScriptUpdatesIgnore;
+:global ScriptUpdatesUrlSuffix;
+:global SentConfigChangesNotification;
-:global SendNotification;
:global LogPrintExit;
+:global SendNotification;
:foreach Script in=[ / system script find where source~"^#!rsc" ] do={
:local Ignore 0;
diff --git a/sms-forward b/sms-forward
index e84cfea..2ace48d 100644
--- a/sms-forward
+++ b/sms-forward
@@ -6,9 +6,9 @@
:global Identity;
-:global SendNotification;
-:global MailServerIsUp;
:global LogPrintExit;
+:global MailServerIsUp;
+:global SendNotification;
# check mail server
:if ($MailServerIsUp = false) do={
diff --git a/update-tunnelbroker b/update-tunnelbroker
index bd36439..3aed610 100644
--- a/update-tunnelbroker
+++ b/update-tunnelbroker
@@ -4,8 +4,8 @@
# Michael Gisbers <michael@gisbers.de>
:global CertificateAvailable;
-:global ParseKeyValueStore;
:global LogPrintExit;
+:global ParseKeyValueStore;
:if ([ / ip cloud get ddns-enabled ] != true) do={
$LogPrintExit error "IP cloud DDNS is not enabled." true;
diff --git a/upload-backup b/upload-backup
index fb9f9cd..16c6bd8 100644
--- a/upload-backup
+++ b/upload-backup
@@ -4,19 +4,19 @@
#
# create and upload backup and config file
-:global Identity;
-:global Domain;
-:global BackupUploadUrl;
-:global BackupUploadUser;
-:global BackupUploadPass;
+:global BackupPassword;
:global BackupSendBinary;
:global BackupSendExport;
-:global BackupPassword;
+:global BackupUploadPass;
+:global BackupUploadUrl;
+:global BackupUploadUser;
+:global Domain;
+:global Identity;
:global CharacterReplace;
:global DeviceInfo;
-:global SendNotification;
:global LogPrintExit;
+:global SendNotification;
:if ($BackupSendBinary != true && \
$BackupSendExport != true) do={