aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Christian Hesse <mail@eworm.de>2023-10-11 07:40:55 +0200
committerGravatar Christian Hesse <mail@eworm.de>2023-10-17 14:05:03 +0200
commit5932586ee4c573903dbd40b4f422ffb2819b9ba2 (patch)
tree3c6d504c5acbc984011bbb4ad81654cfb98c4fe4
parent5fbf584d4ca128e5acfd0424ec66e2edc24dd946 (diff)
introduce mod/notification-ntfy...change-109
... for sending notifications via Ntfy (https://ntfy.sh/). TODO: use proper formatting once supported in Android app: https://github.com/binwiederhier/ntfy/issues/889
-rw-r--r--README.md1
-rw-r--r--doc/backup-cloud.md3
-rw-r--r--doc/backup-upload.md3
-rw-r--r--doc/check-certificates.md3
-rw-r--r--doc/check-health.md3
-rw-r--r--doc/check-routeros-update.md3
-rw-r--r--doc/collect-wireless-mac.md3
-rw-r--r--doc/daily-psk.md3
-rw-r--r--doc/log-forward.md3
-rw-r--r--doc/mod/notification-email.md1
-rw-r--r--doc/mod/notification-matrix.md1
-rw-r--r--doc/mod/notification-ntfy.md79
-rw-r--r--doc/mod/notification-telegram.md1
-rw-r--r--doc/netwatch-notify.md3
-rw-r--r--doc/sms-forward.md3
-rw-r--r--global-config.rsc12
-rw-r--r--global-functions.rsc2
-rw-r--r--mod/notification-ntfy.rsc129
-rw-r--r--news-and-changes.rsc1
19 files changed, 243 insertions, 14 deletions
diff --git a/README.md b/README.md
index de97c84..ec771f7 100644
--- a/README.md
+++ b/README.md
@@ -241,6 +241,7 @@ Available modules
* [IP address calculation](doc/mod/ipcalc.md)
* [Send notifications via e-mail](doc/mod/notification-email.md)
* [Send notifications via Matrix](doc/mod/notification-matrix.md)
+* [Send notifications via Ntfy](doc/mod/notification-ntfy.md)
* [Send notifications via Telegram](doc/mod/notification-telegram.md)
* [Download script and run it once](doc/mod/scriptrunonce.md)
* [Import ssh keys for public key authentication](doc/mod/ssh-keys-import.md)
diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md
index b612fc4..f084d5b 100644
--- a/doc/backup-cloud.md
+++ b/doc/backup-cloud.md
@@ -42,7 +42,8 @@ The configuration goes to `global-config-overlay`, these are the parameters:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Usage and invocation
diff --git a/doc/backup-upload.md b/doc/backup-upload.md
index f9aaa29..b132e56 100644
--- a/doc/backup-upload.md
+++ b/doc/backup-upload.md
@@ -48,7 +48,8 @@ The configuration goes to `global-config-overlay`, these are the parameters:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
### Issues with SFTP client
diff --git a/doc/check-certificates.md b/doc/check-certificates.md
index 58151f3..95ff534 100644
--- a/doc/check-certificates.md
+++ b/doc/check-certificates.md
@@ -44,7 +44,8 @@ subject alternative name (aka *Subject Alt Name* or *SAN*) can be used.
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Usage and invocation
diff --git a/doc/check-health.md b/doc/check-health.md
index 3f4c70f..34b5faf 100644
--- a/doc/check-health.md
+++ b/doc/check-health.md
@@ -80,7 +80,8 @@ The configuration goes to `global-config-overlay`, these are the parameters:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
---
diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md
index 3b5c2bd..dbe83b8 100644
--- a/doc/check-routeros-update.md
+++ b/doc/check-routeros-update.md
@@ -66,7 +66,8 @@ The configuration goes to `global-config-overlay`, these are the parameters:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Usage and invocation
diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md
index 9ba1e3a..2b17055 100644
--- a/doc/collect-wireless-mac.md
+++ b/doc/collect-wireless-mac.md
@@ -47,7 +47,8 @@ entries are to be added.
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Usage and invocation
diff --git a/doc/daily-psk.md b/doc/daily-psk.md
index 60a645f..f551e46 100644
--- a/doc/daily-psk.md
+++ b/doc/daily-psk.md
@@ -72,7 +72,8 @@ For legacy local interface:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[trix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
---
diff --git a/doc/log-forward.md b/doc/log-forward.md
index 43ae897..4212381 100644
--- a/doc/log-forward.md
+++ b/doc/log-forward.md
@@ -67,7 +67,8 @@ To forward **all** (ignoring severity) log messages with topics `account`
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Tips & Tricks
diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md
index 8dc2ecf..6b1142d 100644
--- a/doc/mod/notification-email.md
+++ b/doc/mod/notification-email.md
@@ -73,6 +73,7 @@ See also
--------
* [Send notifications via Matrix](notification-matrix.md)
+* [Send notifications via Ntfy](notification-ntfy.md)
* [Send notifications via Telegram](notification-telegram.md)
---
diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md
index ab8efc9..e9e3174 100644
--- a/doc/mod/notification-matrix.md
+++ b/doc/mod/notification-matrix.md
@@ -119,6 +119,7 @@ See also
--------
* [Send notifications via e-mail](notification-email.md)
+* [Send notifications via Ntfy](notification-ntfy.md)
* [Send notifications via Telegram](notification-telegram.md)
---
diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md
new file mode 100644
index 0000000..64e49f0
--- /dev/null
+++ b/doc/mod/notification-ntfy.md
@@ -0,0 +1,79 @@
+Send notifications via Ntfy
+===========================
+
+[⬅️ Go back to main README](../../README.md)
+
+> ℹ️️ **Info**: This module can not be used on its own but requires the base
+> installation. See [main README](../../README.md) for details.
+
+Description
+-----------
+
+This module adds support for sending notifications via
+[Ntfy](https://ntfy.sh/). A queue is used to make sure
+notifications are not lost on failure but sent later.
+
+Requirements and installation
+-----------------------------
+
+Just install the module:
+
+ $ScriptInstallUpdate mod/notification-ntfy;
+
+Also install the Ntfy app on your mobile device or use the
+[web app](https://ntfy.sh/app) in a browser of your choice.
+
+Configuration
+-------------
+
+Creating an account is not required. Just choose a topic and you are good
+to go.
+
+> ⚠️ **Warning**: If you use ntfy without sign-up, the topic is essentially
+> a password, so pick something that's not easily guessable.
+
+Edit `global-config-overlay`, add `NtfyServer` (leave it unchanged, unless
+you are self-hosting the service) and `NtfyTopic` with your choosen topic.
+Then reload the configuration.
+
+> ℹ️ **Info**: Copy relevant configuration from
+> [`global-config`](../../global-config.rsc) (the one without `-overlay`) to
+> your local `global-config-overlay` and modify it to your specific needs.
+
+Usage and invocation
+--------------------
+
+There's nothing special to do. Every script or function sending a notification
+will now send it to your Ntfy topic.
+
+But of course you can use the function to send notifications directly. Give
+it a try:
+
+ $SendNtfy "Subject..." "Body..."
+
+Alternatively this sends a notification with all available and configured
+methods:
+
+ $SendNotification "Subject..." "Body..."
+
+To use the functions in your own scripts you have to declare them first.
+Place this before you call them:
+
+ :global SendNtfy;
+ :global SendNotification;
+
+In case there is a situation when the queue needs to be purged there is a
+function available:
+
+ $PurgeNtfyQueue;
+
+See also
+--------
+
+* [Send notifications via e-mail](notification-email.md)
+* [Send notifications via Matrix](notification-matrix.md)
+* [Send notifications via Telegram](notification-telegram.md)
+
+---
+[⬅️ Go back to main README](../../README.md)
+[⬆️ Go back to top](#top)
diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md
index 89659c8..387d511 100644
--- a/doc/mod/notification-telegram.md
+++ b/doc/mod/notification-telegram.md
@@ -98,6 +98,7 @@ See also
* [Chat with your router and send commands via Telegram bot](../telegram-chat.md)
* [Send notifications via e-mail](notification-email.md)
* [Send notifications via Matrix](notification-matrix.md)
+* [Send notifications via Ntfy](notification-ntfy.md)
---
[⬅️ Go back to main README](../../README.md)
diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md
index 6df233b..b673af8 100644
--- a/doc/netwatch-notify.md
+++ b/doc/netwatch-notify.md
@@ -40,7 +40,8 @@ The hosts to be checked have to be added to netwatch with specific comment:
Also notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
### Hooks
diff --git a/doc/sms-forward.md b/doc/sms-forward.md
index 5967903..823805e 100644
--- a/doc/sms-forward.md
+++ b/doc/sms-forward.md
@@ -49,7 +49,8 @@ The configuration goes to `global-config-overlay`, this is the only parameter:
Notification settings are required for
[e-mail](mod/notification-email.md),
-[matrix](mod/notification-matrix.md) and/or
+[matrix](mod/notification-matrix.md),
+[ntfy](mod/notification-ntfy.md) and/or
[telegram](mod/notification-telegram.md).
Tips & Tricks
diff --git a/global-config.rsc b/global-config.rsc
index 28148e0..5d39c86 100644
--- a/global-config.rsc
+++ b/global-config.rsc
@@ -52,9 +52,15 @@
#:global MatrixAccessToken "123456ABCDEFGHI...";
#:global MatrixRoom "!example:matrix.org";
-# It is possible to override e-mail, Telegram and Matrix setting for every
-# script. This is done in arrays, where 'Override' is appended to the
-# variable name, like this:
+# You can send Ntfy notifications. Configure these settings and
+# install the module:
+# $ScriptInstallUpdate mod/notification-ntfy
+:global NtfyServer "ntfy.sh";
+:global NtfyTopic "";
+
+# It is possible to override e-mail, Telegram, Matrix and Ntfy setting
+# for every script. This is done in arrays, where 'Override' is appended
+# to the variable name, like this:
#:global EmailGeneralToOverride {
# "check-certificates"="override@example.com";
# "backup-email"="backup@example.com";
diff --git a/global-functions.rsc b/global-functions.rsc
index 876f7d8..2433e57 100644
--- a/global-functions.rsc
+++ b/global-functions.rsc
@@ -12,7 +12,7 @@
:local 0 "global-functions";
# expected configuration version
-:global ExpectedConfigVersion 108;
+:global ExpectedConfigVersion 109;
# global variables not to be changed by user
:global GlobalFunctionsReady false;
diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc
new file mode 100644
index 0000000..a94e1be
--- /dev/null
+++ b/mod/notification-ntfy.rsc
@@ -0,0 +1,129 @@
+#!rsc by RouterOS
+# RouterOS script: mod/notification-ntfy
+# Copyright (c) 2013-2023 Christian Hesse <mail@eworm.de>
+# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md
+#
+# send notifications via Ntfy (ntfy.sh)
+# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md
+
+:global FlushNtfyQueue;
+:global NotificationFunctions;
+:global PurgeNtfyQueue;
+:global SendNtfy;
+:global SendNtfy2;
+
+# flush ntfy queue
+:set FlushNtfyQueue do={
+ :global NtfyQueue;
+ :global NtfyMessageIDs;
+
+ :global IsFullyConnected;
+ :global LogPrintExit2;
+
+ :if ([ $IsFullyConnected ] = false) do={
+ $LogPrintExit2 debug $0 ("System is not fully connected, not flushing.") false;
+ :return false;
+ }
+
+ :local AllDone true;
+ :local QueueLen [ :len $NtfyQueue ];
+
+ :if ([ :len [ /system/scheduler/find where name=$0 ] ] > 0 && $QueueLen = 0) do={
+ $LogPrintExit2 warning $0 ("Flushing Ntfy messages from scheduler, but queue is empty.") false;
+ }
+
+ :foreach Id,Message in=$NtfyQueue do={
+ :if ([ :typeof $Message ] = "array" ) do={
+ :do {
+ /tool/fetch check-certificate=yes-without-crl output=none http-method=post \
+ ($Message->"url") http-header-field=($Message->"headers") http-data=($Message->"text") as-value;
+ :set ($NtfyQueue->$Id);
+ } on-error={
+ $LogPrintExit2 debug $0 ("Sending queued Ntfy message failed.") false;
+ :set AllDone false;
+ }
+ }
+ }
+
+ :if ($AllDone = true && $QueueLen = [ :len $NtfyQueue ]) do={
+ /system/scheduler/remove [ find where name=$0 ];
+ :set NtfyQueue;
+ }
+}
+
+# send notification via ntfy - expects one array argument
+:set ($NotificationFunctions->"ntfy") do={
+ :local Notification $1;
+
+ :global Identity;
+ :global IdentityExtra;
+ :global NtfyQueue;
+ :global NtfyServer;
+ :global NtfyServerOverride;
+ :global NtfyTopic;
+ :global NtfyTopicOverride;
+
+ :global EitherOr;
+ :global IfThenElse;
+ :global LogPrintExit2;
+ :global SymbolForNotification;
+ :global UrlEncode;
+
+ :local Server [ $EitherOr ($NtfyServerOverride->($Notification->"origin")) $NtfyServer ];
+ :local Topic [ $EitherOr ($NtfyTopicOverride->($Notification->"origin")) $NtfyTopic ];
+
+ :if ([ :len $Topic ] = 0) do={
+ :return false;
+ }
+
+ :local Url ("https://" . $NtfyServer . "/" . [ $UrlEncode $NtfyTopic ]);
+ :local Headers ({ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \
+ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) });
+ :local Text (($Notification->"message") . "\n");
+ :if ([ :len ($Notification->"link") ] > 0) do={
+ :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . ($Notification->"link"));
+ }
+
+ :do {
+ /tool/fetch check-certificate=yes-without-crl output=none http-method=post \
+ $Url http-header-field=$Headers http-data=$Text as-value;
+ } on-error={
+ $LogPrintExit2 info $0 ("Failed sending ntfy notification! Queuing...") false;
+
+ :if ([ :typeof $NtfyQueue ] = "nothing") do={
+ :set NtfyQueue ({});
+ }
+ :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \
+ "This message was queued since " . [ /system/clock/get date ] . " " . \
+ [ /system/clock/get time ] . " and may be obsolete.");
+ :set ($NtfyQueue->[ :len $NtfyQueue ]) { url=$Url; headers=$Headers; text=$Text };
+ :if ([ :len [ /system/scheduler/find where name="\$FlushNtfyQueue" ] ] = 0) do={
+ /system/scheduler/add name="\$FlushNtfyQueue" interval=1m start-time=startup \
+ on-event=(":global FlushNtfyQueue; \$FlushNtfyQueue;");
+ }
+ }
+}
+
+# purge the Ntfy queue
+:set PurgeNtfyQueue do={
+ :global NtfyQueue;
+
+ /system/scheduler/remove [ find where name="\$FlushNtfyQueue" ];
+ :set NtfyQueue;
+}
+
+# send notification via ntfy - expects at least two string arguments
+:set SendNtfy do={
+ :global SendNtfy2;
+
+ $SendNtfy2 ({ subject=$1; message=$2; link=$3; silent=$4 });
+}
+
+# send notification via ntfy - expects one array argument
+:set SendNtfy2 do={
+ :local Notification $1;
+
+ :global NotificationFunctions;
+
+ ($NotificationFunctions->"ntfy") ("\$NotificationFunctions->\"ntfy\"") $Notification;
+}
diff --git a/news-and-changes.rsc b/news-and-changes.rsc
index debd756..29c8bd6 100644
--- a/news-and-changes.rsc
+++ b/news-and-changes.rsc
@@ -22,6 +22,7 @@
106="Modified 'telegram-chat' to make it act on message replies, without activation. Also made it answer a single question mark with a short notice.";
107="Dropped support for non-fixed width font in Telegram notifications.";
108="Enhanced 'log-forward' to list log messages with colorful bullets to indicate severity.";
+ 109="Added support to send notifications via Ntfy (ntfy.sh).";
};
# Migration steps to be applied on script updates