From 001e7eeb39ee993539334805622f8cd24fde63e9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 28 Feb 2020 15:26:26 +0100 Subject: global-functions: sort alphabetically --- check-certificates | 6 +- check-routeros-update | 2 +- cloud-backup | 2 +- collect-wireless-mac.capsman | 2 +- collect-wireless-mac.local | 2 +- collect-wireless-mac.template | 2 +- daily-psk.template | 2 +- dhcp-to-dns | 2 +- email-backup | 10 +- global-functions | 611 +++++++++++++++++++++--------------------- gps-track | 2 +- ipv6-update | 2 +- packages-update | 2 +- script-updates | 8 +- sms-forward | 4 +- update-tunnelbroker | 2 +- upload-backup | 14 +- 17 files changed, 337 insertions(+), 338 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,33 +150,76 @@ :return $Path; } -# download package from upgrade server -:set DownloadPackage do={ - :local PkgName [ :tostr $1 ]; - :local PkgVer [ :tostr $2 ]; - :local PkgArch [ :tostr $3 ]; - :local PkgDir [ :tostr $4 ]; - - :global CertificateAvailable; - :global CleanFilePath; - :global WaitForFile; - - :if ([ :len $PkgName ] = 0) do={ return false; } - :if ([ :len $PkgVer ] = 0) do={ :set PkgVer [ / system package update get installed-version ]; } - :if ([ :len $PkgArch ] = 0) do={ :set PkgArch [ / system resource get architecture-name ]; } - - :local PkgFile ($PkgName . "-" . $PkgVer . "-" . $PkgArch . ".npk"); - :if ($PkgArch = "x86_64") do={ - :set PkgFile ($PkgName . "-" . $PkgVer . ".npk"); - } - :local PkgDest [ $CleanFilePath ($PkgDir . "/" . $PkgFile) ]; +# get readable device info +:set DeviceInfo do={ + :global ExpectedConfigVersion; + :global GlobalConfigVersion; + :global Identity; - $CertificateAvailable "Let's Encrypt Authority X3"; + :local Resource [ / system resource get ]; + :local RouterBoard [ / system routerboard get ]; + :local Update [ / system package update get ]; - :local Retry 3; - :while ($Retry > 0) do={ - :do { - / tool fetch check-certificate=yes-without-crl \ + :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 ]; + :local PkgVer [ :tostr $2 ]; + :local PkgArch [ :tostr $3 ]; + :local PkgDir [ :tostr $4 ]; + + :global CertificateAvailable; + :global CleanFilePath; + :global WaitForFile; + + :if ([ :len $PkgName ] = 0) do={ return false; } + :if ([ :len $PkgVer ] = 0) do={ :set PkgVer [ / system package update get installed-version ]; } + :if ([ :len $PkgArch ] = 0) do={ :set PkgArch [ / system resource get architecture-name ]; } + + :local PkgFile ($PkgName . "-" . $PkgVer . "-" . $PkgArch . ".npk"); + :if ($PkgArch = "x86_64") do={ + :set PkgFile ($PkgName . "-" . $PkgVer . ".npk"); + } + :local PkgDest [ $CleanFilePath ($PkgDir . "/" . $PkgFile) ]; + + $CertificateAvailable "Let's Encrypt Authority X3"; + + :local Retry 3; + :while ($Retry > 0) do={ + :do { + / tool fetch check-certificate=yes-without-crl \ ("https://upgrade.mikrotik.com/routeros/" . $PkgVer . "/" . $PkgFile) \ dst-path=$PkgDest; $WaitForFile $PkgDest; @@ -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 :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={ -- cgit v1.2.3-54-g00ecf