Add Unraid and Gotify notifications
This commit is contained in:
+41
-16
@@ -3,6 +3,7 @@ package notify
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -16,8 +17,10 @@ import (
|
||||
type SecretGetter interface{ Get(string) (string, error) }
|
||||
|
||||
type Sender struct {
|
||||
Secrets SecretGetter
|
||||
Client *http.Client
|
||||
Secrets SecretGetter
|
||||
Client *http.Client
|
||||
NotifyPath string
|
||||
RunCommand func(context.Context, string, ...string) error
|
||||
}
|
||||
|
||||
func (s *Sender) Send(ctx context.Context, target model.NotificationTarget, title, message, severity string) error {
|
||||
@@ -27,25 +30,47 @@ func (s *Sender) Send(ctx context.Context, target model.NotificationTarget, titl
|
||||
switch target.Type {
|
||||
case "unraid":
|
||||
importance := "normal"
|
||||
if severity == "error" {
|
||||
if severity == "failed" || severity == "error" {
|
||||
importance = "alert"
|
||||
} else if severity == "warning" {
|
||||
importance = "warning"
|
||||
}
|
||||
return exec.CommandContext(ctx, "/usr/local/emhttp/webGui/scripts/notify", "-e", "Backupper", "-s", title, "-d", message, "-i", importance).Run()
|
||||
case "ntfy":
|
||||
endpoint := strings.TrimRight(target.URL, "/") + "/" + url.PathEscape(target.Topic)
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewBufferString(message))
|
||||
path := s.NotifyPath
|
||||
if path == "" {
|
||||
path = "/usr/local/emhttp/webGui/scripts/notify"
|
||||
}
|
||||
args := []string{"-e", "Backupper", "-s", title, "-d", message, "-i", importance, "-l", "/Tools/Backupper"}
|
||||
if s.RunCommand != nil {
|
||||
return s.RunCommand(ctx, path, args...)
|
||||
}
|
||||
return exec.CommandContext(ctx, path, args...).Run()
|
||||
case "gotify":
|
||||
token, err := s.Secrets.Get(target.TokenRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Title", title)
|
||||
req.Header.Set("Tags", "floppy_disk")
|
||||
if target.TokenRef != "" {
|
||||
token, err := s.Secrets.Get(target.TokenRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+token)
|
||||
endpoint, err := url.Parse(strings.TrimRight(target.URL, "/") + "/message")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
query := endpoint.Query()
|
||||
query.Set("token", token)
|
||||
endpoint.RawQuery = query.Encode()
|
||||
priority := 2
|
||||
if severity == "warning" {
|
||||
priority = 5
|
||||
} else if severity == "failed" || severity == "error" {
|
||||
priority = 8
|
||||
}
|
||||
payload, err := json.Marshal(map[string]any{"title": title, "message": message, "priority": priority})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint.String(), bytes.NewReader(payload))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
client := s.Client
|
||||
if client == nil {
|
||||
client = &http.Client{Timeout: 15 * time.Second}
|
||||
@@ -56,7 +81,7 @@ func (s *Sender) Send(ctx context.Context, target model.NotificationTarget, titl
|
||||
}
|
||||
defer response.Body.Close()
|
||||
if response.StatusCode < 200 || response.StatusCode >= 300 {
|
||||
return fmt.Errorf("ntfy returned %s", response.Status)
|
||||
return fmt.Errorf("Gotify returned %s", response.Status)
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user