From dc1216c221c96d0eb35ecb387cac81723c0eb408 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 4 Jan 2021 22:29:48 +0100 Subject: [PATCH] Add Pushover notification (#254) Co-authored-by: CrazyMax --- docs/assets/notif/pushover.png | Bin 0 -> 13763 bytes docs/config/index.md | 1 + docs/config/notif.md | 1 + docs/notif/amqp.md | 20 ++-- docs/notif/discord.md | 10 +- docs/notif/gotify.md | 12 +-- docs/notif/mqtt.md | 11 +++ docs/notif/pushover.md | 30 ++++++ docs/notif/rocketchat.md | 14 +-- docs/notif/slack.md | 6 +- docs/notif/teams.md | 6 +- docs/notif/telegram.md | 8 +- docs/notif/webhook.md | 12 +-- go.mod | 1 + go.sum | 2 + internal/config/config_test.go | 4 + internal/config/fixtures/config.test.yml | 3 + internal/config/fixtures/config.validate.yml | 3 + internal/model/notif.go | 1 + internal/model/notif_pushover.go | 20 ++++ internal/notif/client.go | 4 + internal/notif/pushover/pushover.go | 91 +++++++++++++++++++ mkdocs.yml | 1 + 23 files changed, 217 insertions(+), 44 deletions(-) create mode 100644 docs/assets/notif/pushover.png create mode 100644 docs/notif/pushover.md create mode 100644 internal/model/notif_pushover.go create mode 100644 internal/notif/pushover/pushover.go diff --git a/docs/assets/notif/pushover.png b/docs/assets/notif/pushover.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cc40f937fa29dad5fc4ff7ec17452d3217d1a5 GIT binary patch literal 13763 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 #fda!eg)c>Z`g2jOY%LG=F+G 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 literal 0 HcmV?d00001 diff --git a/docs/config/index.md b/docs/config/index.md index 27108aa5..90efdb45 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -206,6 +206,7 @@ Can be transposed to: * [mail](../notif/mail.md) * [matrix](../notif/matrix.md) * [mqtt](../notif/mqtt.md) + * [pushover](../notif/pushover.md) * [rocketchat](../notif/rocketchat.md) * [script](../notif/script.md) * [slack](../notif/slack.md) diff --git a/docs/config/notif.md b/docs/config/notif.md index 33262947..083ff2d4 100644 --- a/docs/config/notif.md +++ b/docs/config/notif.md @@ -6,6 +6,7 @@ * [`mail`](../notif/mail.md) * [`matrix`](../notif/matrix.md) * [`mqtt`](../notif/mqtt.md) +* [`pushover`](../notif/pushover.md) * [`rocketchat`](../notif/rocketchat.md) * [`script`](../notif/script.md) * [`slack`](../notif/slack.md) diff --git a/docs/notif/amqp.md b/docs/notif/amqp.md index e058c351..e8b7fda0 100644 --- a/docs/notif/amqp.md +++ b/docs/notif/amqp.md @@ -15,16 +15,6 @@ You can send notifications to any amqp compatible server with the following sett queue: queue ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_AMQP_HOST` - * `DIUN_NOTIF_AMQP_PORT` - * `DIUN_NOTIF_AMQP_USERNAME` - * `DIUN_NOTIF_AMQP_USERNAMEFILE` - * `DIUN_NOTIF_AMQP_PASSWORD` - * `DIUN_NOTIF_AMQP_PASSWORDFILE` - * `DIUN_NOTIF_AMQP_EXCHANGE` - * `DIUN_NOTIF_AMQP_QUEUE` - | Name | Default | Description | |--------------------|---------------|---------------| | `host`[^1] | `localhost` | AMQP server host | @@ -36,6 +26,16 @@ You can send notifications to any amqp compatible server with the following sett | `exchange` | | Name of the exchange the message will be sent to | | `queue`[^1] | | Name of the queue the message will be sent to | +!!! abstract "Environment variables" + * `DIUN_NOTIF_AMQP_HOST` + * `DIUN_NOTIF_AMQP_PORT` + * `DIUN_NOTIF_AMQP_USERNAME` + * `DIUN_NOTIF_AMQP_USERNAMEFILE` + * `DIUN_NOTIF_AMQP_PASSWORD` + * `DIUN_NOTIF_AMQP_PASSWORDFILE` + * `DIUN_NOTIF_AMQP_EXCHANGE` + * `DIUN_NOTIF_AMQP_QUEUE` + ## Sample The JSON response will look like this: diff --git a/docs/notif/discord.md b/docs/notif/discord.md index 727670bd..6c5c84c7 100644 --- a/docs/notif/discord.md +++ b/docs/notif/discord.md @@ -18,17 +18,17 @@ Allow to send notifications to your Discord channel. timeout: 10s ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_DISCORD_WEBHOOKURL` - * `DIUN_NOTIF_DISCORD_MENTIONS` - * `DIUN_NOTIF_DISCORD_TIMEOUT` - | Name | Default | Description | |--------------------|---------------|---------------| | `webhookURL`[^1] | | Discord [incoming webhook URL](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks) | | `mentions` | | List of users or roles to notify | | `timeout` | `10s` | Timeout specifies a time limit for the request to be made | +!!! abstract "Environment variables" + * `DIUN_NOTIF_DISCORD_WEBHOOKURL` + * `DIUN_NOTIF_DISCORD_MENTIONS` + * `DIUN_NOTIF_DISCORD_TIMEOUT` + ## Sample ![](../assets/notif/discord-1.png) diff --git a/docs/notif/gotify.md b/docs/notif/gotify.md index 5a8bb7be..0b2ea849 100644 --- a/docs/notif/gotify.md +++ b/docs/notif/gotify.md @@ -14,12 +14,6 @@ Notifications can be sent using a [Gotify](https://gotify.net/) instance. timeout: 10s ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_GOTIFY_ENDPOINT` - * `DIUN_NOTIF_GOTIFY_TOKEN` - * `DIUN_NOTIF_GOTIFY_PRIORITY` - * `DIUN_NOTIF_GOTIFY_TIMEOUT` - | Name | Default | Description | |--------------------|---------------|---------------| | `endpoint`[^1] | | Gotify base URL | @@ -27,6 +21,12 @@ Notifications can be sent using a [Gotify](https://gotify.net/) instance. | `priority` | `1` | The priority of the message | | `timeout` | `10s` | Timeout specifies a time limit for the request to be made | +!!! abstract "Environment variables" + * `DIUN_NOTIF_GOTIFY_ENDPOINT` + * `DIUN_NOTIF_GOTIFY_TOKEN` + * `DIUN_NOTIF_GOTIFY_PRIORITY` + * `DIUN_NOTIF_GOTIFY_TIMEOUT` + ## Sample ![](../assets/notif/gotify.png) diff --git a/docs/notif/mqtt.md b/docs/notif/mqtt.md index 24f6a74f..d4ae4ffc 100644 --- a/docs/notif/mqtt.md +++ b/docs/notif/mqtt.md @@ -29,6 +29,17 @@ You can send notifications to any MQTT compatible server with the following sett | `topic`[^1] | | Topic the message will be sent to | | `qos` | `0` | Ensured message delivery at specified Quality of Service (QoS) | +!!! abstract "Environment variables" + * `DIUN_NOTIF_MQTT_HOST` + * `DIUN_NOTIF_MQTT_PORT` + * `DIUN_NOTIF_MQTT_USERNAME` + * `DIUN_NOTIF_MQTT_USERNAMEFILE` + * `DIUN_NOTIF_MQTT_PASSWORD` + * `DIUN_NOTIF_MQTT_PASSWORDFILE` + * `DIUN_NOTIF_MQTT_CLIENT` + * `DIUN_NOTIF_MQTT_TOPIC` + * `DIUN_NOTIF_MQTT_QOS` + ## Sample The JSON response will look like this: diff --git a/docs/notif/pushover.md b/docs/notif/pushover.md new file mode 100644 index 00000000..0a7f2e6f --- /dev/null +++ b/docs/notif/pushover.md @@ -0,0 +1,30 @@ +# Pushover notifications + +You can send notifications using [Pushover](https://pushover.net/). + +## Configuration + +!!! example "File" + ```yaml + notif: + pushover: + token: uQiRzpo4DXghDmr9QzzfQu27cmVRsG + recipient: gznej3rKEVAvPUxu9vvNnqpmZpokzF + ``` + +| Name | Default | Description | +|--------------------|---------------|---------------| +| `token` | | Pushover [application/API token](https://pushover.net/api#registration) | +| `tokenFile` | | Use content of secret file as Pushover application/API token if `token` not defined | +| `recipient` | | User key to send notification to | +| `recipientFile` | | Use content of secret file as User key if `recipient` not defined | + +!!! abstract "Environment variables" + * `DIUN_NOTIF_PUSHOVER_TOKEN` + * `DIUN_NOTIF_PUSHOVER_TOKENFILE` + * `DIUN_NOTIF_PUSHOVER_RECIPIENT` + * `DIUN_NOTIF_PUSHOVER_RECIPIENTFILE` + +## Sample + +![](../assets/notif/pushover.png) diff --git a/docs/notif/rocketchat.md b/docs/notif/rocketchat.md index 30d6ccc0..d46f1064 100644 --- a/docs/notif/rocketchat.md +++ b/docs/notif/rocketchat.md @@ -15,13 +15,6 @@ Allow to send notifications to your Rocket.Chat channel. timeout: 10s ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_ROCKETCHAT_ENDPOINT` - * `DIUN_NOTIF_ROCKETCHAT_CHANNEL` - * `DIUN_NOTIF_ROCKETCHAT_USERID` - * `DIUN_NOTIF_ROCKETCHAT_TOKEN` - * `DIUN_NOTIF_ROCKETCHAT_TIMEOUT` - | Name | Default | Description | |--------------------|---------------|---------------| | `endpoint`[^1] | | Rocket.Chat base URL | @@ -33,6 +26,13 @@ Allow to send notifications to your Rocket.Chat channel. !!! warning You must first create a _Personal Access Token_ through your account settings on your Rocket.Chat instance. +!!! abstract "Environment variables" + * `DIUN_NOTIF_ROCKETCHAT_ENDPOINT` + * `DIUN_NOTIF_ROCKETCHAT_CHANNEL` + * `DIUN_NOTIF_ROCKETCHAT_USERID` + * `DIUN_NOTIF_ROCKETCHAT_TOKEN` + * `DIUN_NOTIF_ROCKETCHAT_TIMEOUT` + ## Sample ![](../assets/notif/rocketchat.png) diff --git a/docs/notif/slack.md b/docs/notif/slack.md index c2c85016..c8513c59 100644 --- a/docs/notif/slack.md +++ b/docs/notif/slack.md @@ -14,13 +14,13 @@ You can send notifications to your Slack channel using an [incoming webhook URL] webhookURL: https://hooks.slack.com/services/ABCD12EFG/HIJK34LMN/01234567890abcdefghij ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_SLACK_WEBHOOKURL` - | Name | Default | Description | |--------------------|---------------|---------------| | `webhookURL`[^1] | | Slack [incoming webhook URL](https://api.slack.com/messaging/webhooks) | +!!! abstract "Environment variables" + * `DIUN_NOTIF_SLACK_WEBHOOKURL` + ## Sample ![](../assets/notif/slack.png) diff --git a/docs/notif/teams.md b/docs/notif/teams.md index c31bf5fc..9c418e76 100644 --- a/docs/notif/teams.md +++ b/docs/notif/teams.md @@ -11,13 +11,13 @@ You can send notifications to your Teams team-channel using an [incoming webhook webhookURL: https://outlook.office.com/webhook/ABCD12EFG/HIJK34LMN/01234567890abcdefghij ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_TEAMS_WEBHOOKURL` - | Name | Default | Description | |--------------------|---------------|---------------| | `webhookURL`[^1] | | Teams [incoming webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/what-are-webhooks-and-connectors) | +!!! abstract "Environment variables" + * `DIUN_NOTIF_TEAMS_WEBHOOKURL` + ## Sample ![](../assets/notif/teams.png) diff --git a/docs/notif/telegram.md b/docs/notif/telegram.md index 041381c3..10218de9 100644 --- a/docs/notif/telegram.md +++ b/docs/notif/telegram.md @@ -19,15 +19,15 @@ Multiple chat IDs can be provided in order to deliver notifications to multiple - 987654321 ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_TELEGRAM_TOKEN` - * `DIUN_NOTIF_TELEGRAM_CHATIDS` (comma separated) - | Name | Default | Description | |--------------------|---------------|---------------| | `token`[^1] | | Telegram bot token | | `chatIDs`[^1] | | List of chat IDs to send notifications to | +!!! abstract "Environment variables" + * `DIUN_NOTIF_TELEGRAM_TOKEN` + * `DIUN_NOTIF_TELEGRAM_CHATIDS` (comma separated) + ## Sample ![](../assets/notif/telegram.png) diff --git a/docs/notif/webhook.md b/docs/notif/webhook.md index b5edea2c..9f06c1a9 100644 --- a/docs/notif/webhook.md +++ b/docs/notif/webhook.md @@ -16,12 +16,6 @@ You can send webhook notifications with the following settings. timeout: 10s ``` -!!! abstract "Environment variables" - * `DIUN_NOTIF_WEBHOOK_ENDPOINT` - * `DIUN_NOTIF_WEBHOOK_METHOD` - * `DIUN_NOTIF_WEBHOOK_HEADERS_` - * `DIUN_NOTIF_WEBHOOK_TIMEOUT` - | Name | Default | Description | |--------------------|---------------|---------------| | `endpoint`[^1] | | URL of the HTTP request | @@ -29,6 +23,12 @@ You can send webhook notifications with the following settings. | `headers` | | Map of additional headers to be sent (key is case insensitive) | | `timeout` | `10s` | Timeout specifies a time limit for the request to be made | +!!! abstract "Environment variables" + * `DIUN_NOTIF_WEBHOOK_ENDPOINT` + * `DIUN_NOTIF_WEBHOOK_METHOD` + * `DIUN_NOTIF_WEBHOOK_HEADERS_` + * `DIUN_NOTIF_WEBHOOK_TIMEOUT` + ## Sample The JSON response will look like this: diff --git a/go.mod b/go.mod index 6455f167..6ba71ebd 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df github.com/go-playground/validator/v10 v10.4.1 github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible + github.com/gregdel/pushover v0.0.0-20201104094836-ddbe0c1d3a38 github.com/hako/durafmt v0.0.0-20190612201238-650ed9f29a84 github.com/imdario/mergo v0.3.11 github.com/matcornic/hermes/v2 v2.1.0 diff --git a/go.sum b/go.sum index 09af4a3e..3b72ecca 100644 --- a/go.sum +++ b/go.sum @@ -202,6 +202,8 @@ github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregdel/pushover v0.0.0-20201104094836-ddbe0c1d3a38 h1:jb9bDQ07E8YdegHcvFJ6r0JAQhSxT6BQjDLn/xAMu64= +github.com/gregdel/pushover v0.0.0-20201104094836-ddbe0c1d3a38/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hako/durafmt v0.0.0-20190612201238-650ed9f29a84 h1:RvcDqcKLua4b/jtXez7ZVe9s6Iq5N6ujVevqY4FBQmM= github.com/hako/durafmt v0.0.0-20190612201238-650ed9f29a84/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= diff --git a/internal/config/config_test.go b/internal/config/config_test.go index fa37412f..d9bf694c 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -131,6 +131,10 @@ func TestLoadFile(t *testing.T) { Topic: "docker/diun", QoS: 0, }, + Pushover: &model.NotifPushover{ + Token: "uQiRzpo4DXghDmr9QzzfQu27cmVRsG", + Recipient: "gznej3rKEVAvPUxu9vvNnqpmZpokzF", + }, RocketChat: &model.NotifRocketChat{ Endpoint: "http://rocket.foo.com:3000", Channel: "#general", diff --git a/internal/config/fixtures/config.test.yml b/internal/config/fixtures/config.test.yml index f2573899..6940ee69 100644 --- a/internal/config/fixtures/config.test.yml +++ b/internal/config/fixtures/config.test.yml @@ -51,6 +51,9 @@ notif: client: "diun" topic: "docker/diun" qos: 0 + pushover: + token: uQiRzpo4DXghDmr9QzzfQu27cmVRsG + recipient: gznej3rKEVAvPUxu9vvNnqpmZpokzF rocketchat: endpoint: http://rocket.foo.com:3000 channel: "#general" diff --git a/internal/config/fixtures/config.validate.yml b/internal/config/fixtures/config.validate.yml index 35e622d6..20e7ecca 100644 --- a/internal/config/fixtures/config.validate.yml +++ b/internal/config/fixtures/config.validate.yml @@ -51,6 +51,9 @@ notif: client: "diun" topic: "docker/diun" qos: 0 + pushover: + token: uQiRzpo4DXghDmr9QzzfQu27cmVRsG + recipient: gznej3rKEVAvPUxu9vvNnqpmZpokzF rocketchat: endpoint: http://rocket.foo.com:3000 channel: "#general" diff --git a/internal/model/notif.go b/internal/model/notif.go index e6c2e8b2..d8c7a705 100644 --- a/internal/model/notif.go +++ b/internal/model/notif.go @@ -31,6 +31,7 @@ type Notif struct { Mail *NotifMail `yaml:"mail,omitempty" json:"mail,omitempty"` Matrix *NotifMatrix `yaml:"matrix,omitempty" json:"matrix,omitempty"` Mqtt *NotifMqtt `yaml:"mqtt,omitempty" json:"mqtt,omitempty"` + Pushover *NotifPushover `yaml:"pushover,omitempty" json:"pushover,omitempty"` RocketChat *NotifRocketChat `yaml:"rocketchat,omitempty" json:"rocketchat,omitempty"` Script *NotifScript `yaml:"script,omitempty" json:"script,omitempty"` Slack *NotifSlack `yaml:"slack,omitempty" json:"slack,omitempty"` diff --git a/internal/model/notif_pushover.go b/internal/model/notif_pushover.go new file mode 100644 index 00000000..5b496966 --- /dev/null +++ b/internal/model/notif_pushover.go @@ -0,0 +1,20 @@ +package model + +// NotifPushover holds Pushover notification configuration details +type NotifPushover struct { + Token string `yaml:"token,omitempty" json:"token,omitempty" validate:"omitempty"` + TokenFile string `yaml:"tokenFile,omitempty" json:"tokenFile,omitempty" validate:"omitempty,file"` + Recipient string `yaml:"recipient,omitempty" json:"recipient,omitempty" validate:"omitempty"` + RecipientFile string `yaml:"recipientFile,omitempty" json:"recipientFile,omitempty" validate:"omitempty,file"` + Priority int `yaml:"priority,omitempty" json:"priority,omitempty" validate:"omitempty,min=-2,max=2"` +} + +// GetDefaults gets the default values +func (s *NotifPushover) GetDefaults() *NotifPushover { + return nil +} + +// SetDefaults sets the default values +func (s *NotifPushover) SetDefaults() { + // noop +} diff --git a/internal/notif/client.go b/internal/notif/client.go index db214e4a..8a3fb271 100644 --- a/internal/notif/client.go +++ b/internal/notif/client.go @@ -11,6 +11,7 @@ import ( "github.com/crazy-max/diun/v4/internal/notif/matrix" "github.com/crazy-max/diun/v4/internal/notif/mqtt" "github.com/crazy-max/diun/v4/internal/notif/notifier" + "github.com/crazy-max/diun/v4/internal/notif/pushover" "github.com/crazy-max/diun/v4/internal/notif/rocketchat" "github.com/crazy-max/diun/v4/internal/notif/script" "github.com/crazy-max/diun/v4/internal/notif/slack" @@ -59,6 +60,9 @@ func New(config *model.Notif, meta model.Meta) (*Client, error) { if config.Mqtt != nil { c.notifiers = append(c.notifiers, mqtt.New(config.Mqtt, meta)) } + if config.Pushover != nil { + c.notifiers = append(c.notifiers, pushover.New(config.Pushover, meta)) + } if config.RocketChat != nil { c.notifiers = append(c.notifiers, rocketchat.New(config.RocketChat, meta)) } diff --git a/internal/notif/pushover/pushover.go b/internal/notif/pushover/pushover.go new file mode 100644 index 00000000..b3d245a8 --- /dev/null +++ b/internal/notif/pushover/pushover.go @@ -0,0 +1,91 @@ +package pushover + +import ( + "bytes" + "errors" + "fmt" + "text/template" + "time" + + "github.com/crazy-max/diun/v4/internal/model" + "github.com/crazy-max/diun/v4/internal/notif/notifier" + "github.com/crazy-max/diun/v4/pkg/utl" + "github.com/gregdel/pushover" +) + +// Client represents an active Pushover notification object +type Client struct { + *notifier.Notifier + cfg *model.NotifPushover + meta model.Meta +} + +// New creates a new Pushover notification instance +func New(config *model.NotifPushover, meta model.Meta) notifier.Notifier { + return notifier.Notifier{ + Handler: &Client{ + cfg: config, + meta: meta, + }, + } +} + +// Name returns notifier's name +func (c *Client) Name() string { + return "pushover" +} + +// Send creates and sends a Pushover notification with an entry +func (c *Client) Send(entry model.NotifEntry) error { + token, err := utl.GetSecret(c.cfg.Token, c.cfg.TokenFile) + if err != nil { + return errors.New("Cannot retrieve token secret for Pushover notifier") + } + + recipient, err := utl.GetSecret(c.cfg.Recipient, c.cfg.RecipientFile) + if err != nil { + return errors.New("Cannot retrieve recipient secret for Pushover notifier") + } + + app := pushover.New(token) + user := pushover.NewRecipient(recipient) + + title := fmt.Sprintf("Image update for %s", entry.Image.String()) + if entry.Status == model.ImageStatusNew { + title = fmt.Sprintf("New image %s has been added", entry.Image.String()) + } + + tagTpl := "{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}" + if len(entry.Image.HubLink) > 0 { + tagTpl = `{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}` + } + + var msgBuf bytes.Buffer + msgTpl := template.Must(template.New("email").Parse(fmt.Sprintf("Docker tag %s which you subscribed to through {{ .Entry.Provider }} provider has been {{ if (eq .Entry.Status \"new\") }}newly added{{ else }}updated{{ end }} on {{ .Hostname }}.", tagTpl))) + if err := msgTpl.Execute(&msgBuf, struct { + Hostname string + Entry model.NotifEntry + }{ + Hostname: c.meta.Hostname, + Entry: entry, + }); err != nil { + return err + } + + _, err = app.GetRecipientDetails(user) + if err != nil { + return err + } + + _, err = app.SendMessage(&pushover.Message{ + Message: msgBuf.String(), + Title: title, + Priority: c.cfg.Priority, + URL: c.meta.URL, + URLTitle: c.meta.Name, + Timestamp: time.Now().Unix(), + HTML: true, + }, user) + + return err +} diff --git a/mkdocs.yml b/mkdocs.yml index fb54cc53..95b0c473 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -94,6 +94,7 @@ nav: - Mail: notif/mail.md - Matrix: notif/matrix.md - MQTT: notif/mqtt.md + - Pushover: notif/pushover.md - Rocket.Chat: notif/rocketchat.md - Script: notif/script.md - Slack: notif/slack.md