M README.md => README.md +4 -1
@@ 67,9 67,12 @@ resolved {
ntfy {
# URL of the ntfy topic - required
topic https://ntfy.sh/alertmanager-alerts
- # ntfy access control (https://ntfy.sh/docs/config/#access-control)
+ # ntfy authentication via Basic Auth (https://docs.ntfy.sh/publish/#username-password)
user user
password pass
+ # ntfy authentication via access tokens (https://docs.ntfy.sh/publish/#access-tokens)
+ # Either access-token or a user/password combination can be used - not both.
+ access-token foobar
}
alertmanager {
M config.go => config.go +16 -3
@@ 1,6 1,7 @@
package main
import (
+ "errors"
"fmt"
"strings"
"time"
@@ 30,9 31,10 @@ type config struct {
}
type ntfyConfig struct {
- Topic string
- User string
- Password string
+ Topic string
+ User string
+ Password string
+ AccessToken string
}
type labels struct {
@@ 212,6 214,17 @@ func readConfig(path string) (*config, error) {
}
}
+ d = ntfyDir.Children.Get("access-token")
+ if d != nil {
+ if err := d.ParseParams(&config.ntfy.AccessToken); err != nil {
+ return nil, err
+ }
+ }
+
+ if config.ntfy.User != "" && config.ntfy.AccessToken != "" {
+ return nil, errors.New("ntfy: cannot use both an access-token and a user/password at the same time")
+ }
+
cacheDir := cfg.Get("cache")
if cacheDir != nil {
M main.go => main.go +3 -1
@@ 244,10 244,12 @@ func (rcv *receiver) publish(n *notification) error {
return err
}
- // Basic auth
+ // ntfy authentication
if rcv.cfg.ntfy.Password != "" && rcv.cfg.ntfy.User != "" {
auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", rcv.cfg.ntfy.User, rcv.cfg.ntfy.Password)))
req.Header.Set("Authorization", fmt.Sprintf("Basic %s", auth))
+ } else if rcv.cfg.ntfy.AccessToken != "" {
+ req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", rcv.cfg.ntfy.AccessToken))
}
req.Header.Set("X-Title", n.title)