mirror of https://github.com/statping/statping
				
				
				
			Add Gotify notifier
							parent
							
								
									158c53f56a
								
							
						
					
					
						commit
						d991fe64b1
					
				|  | @ -0,0 +1,91 @@ | |||
| package notifiers | ||||
| 
 | ||||
| import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/statping/statping/types/failures" | ||||
| 	"github.com/statping/statping/types/notifications" | ||||
| 	"github.com/statping/statping/types/notifier" | ||||
| 	"github.com/statping/statping/types/services" | ||||
| 	"github.com/statping/statping/utils" | ||||
| ) | ||||
| 
 | ||||
| var _ notifier.Notifier = (*gotify)(nil) | ||||
| 
 | ||||
| type gotify struct { | ||||
| 	*notifications.Notification | ||||
| } | ||||
| 
 | ||||
| func (g *gotify) Select() *notifications.Notification { | ||||
| 	return g.Notification | ||||
| } | ||||
| 
 | ||||
| var Gotify = &gotify{¬ifications.Notification{ | ||||
| 	Method:      "gotify", | ||||
| 	Title:       "Gotify", | ||||
| 	Host:        "https://gotify.myserver.com", | ||||
| 	Description: "Use Gotify to receive push notifications. Add your Gotify URL and App Token to receive notifications.", | ||||
| 	Author:      "Hugo van Rijswijk", | ||||
| 	AuthorUrl:   "https://github.com/hugo-vrijswijk", | ||||
| 	Icon:        "fa dot-circle", | ||||
| 	Delay:       time.Duration(5 * time.Second), | ||||
| 	Limits:      60, | ||||
| 	SuccessData: `{"title": "{{.Service.Name}}", "message": "Your service '{{.Service.Name}}' is currently online!", "priority": 2}`, | ||||
| 	FailureData: `{"title": "{{.Service.Name}}", "message": "Your service '{{.Service.Name}}' is currently failing! Reason: {{.Failure.Issue}}", "priority": 5}`, | ||||
| 	DataType:    "json", | ||||
| 	Form: []notifications.NotificationForm{{ | ||||
| 		Type:      "text", | ||||
| 		Title:     "Gotify URL", | ||||
| 		SmallText: "Gotify server URL, including http(s):// and port if needed", | ||||
| 		DbField:   "Host", | ||||
| 		Required:  true, | ||||
| 	}, { | ||||
| 		Type:      "text", | ||||
| 		Title:     "App Token", | ||||
| 		SmallText: "The Application Token generated by Gotify", | ||||
| 		DbField:   "api_key", | ||||
| 		Required:  true, | ||||
| 	}}}, | ||||
| } | ||||
| 
 | ||||
| // Send will send a HTTP Post to the Gotify API. It accepts type: string
 | ||||
| func (g *gotify) sendMessage(msg string) (string, error) { | ||||
| 	var url string | ||||
| 	if strings.HasSuffix(g.Host, "/") { | ||||
| 		url = g.Host + "message" | ||||
| 	} else { | ||||
| 		url = g.Host + "/message" | ||||
| 	} | ||||
| 
 | ||||
| 	headers := []string{"X-Gotify-Key=" + g.ApiKey} | ||||
| 
 | ||||
| 	content, _, err := utils.HttpRequest(url, "POST", "application/json", headers, strings.NewReader(msg), time.Duration(10*time.Second), true, nil) | ||||
| 
 | ||||
| 	return string(content), err | ||||
| } | ||||
| 
 | ||||
| // OnFailure will trigger failing service
 | ||||
| func (g *gotify) OnFailure(s services.Service, f failures.Failure) (string, error) { | ||||
| 	out, err := g.sendMessage(ReplaceVars(g.FailureData, s, f)) | ||||
| 	return out, err | ||||
| } | ||||
| 
 | ||||
| // OnSuccess will trigger successful service
 | ||||
| func (g *gotify) OnSuccess(s services.Service) (string, error) { | ||||
| 	out, err := g.sendMessage(ReplaceVars(g.SuccessData, s, failures.Failure{})) | ||||
| 	return out, err | ||||
| } | ||||
| 
 | ||||
| // OnTest will test the Gotify notifier
 | ||||
| func (g *gotify) OnTest() (string, error) { | ||||
| 	msg := `{"title:" "Test" "message": "Testing the Gotify Notifier", "priority": 0}` | ||||
| 	content, err := g.sendMessage(msg) | ||||
| 
 | ||||
| 	return content, err | ||||
| } | ||||
| 
 | ||||
| // OnSave will trigger when this notifier is saved
 | ||||
| func (g *gotify) OnSave() (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | @ -0,0 +1,79 @@ | |||
| package notifiers | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/statping/statping/database" | ||||
| 	"github.com/statping/statping/types/core" | ||||
| 	"github.com/statping/statping/types/failures" | ||||
| 	"github.com/statping/statping/types/notifications" | ||||
| 	"github.com/statping/statping/types/null" | ||||
| 	"github.com/statping/statping/types/services" | ||||
| 	"github.com/statping/statping/utils" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	GOTIFY_URL   string | ||||
| 	GOTIFY_TOKEN string | ||||
| ) | ||||
| 
 | ||||
| func TestGotifyNotifier(t *testing.T) { | ||||
| 	err := utils.InitLogs() | ||||
| 	require.Nil(t, err) | ||||
| 	GOTIFY_URL = utils.Params.GetString("GOTIFY_URL") | ||||
| 	GOTIFY_TOKEN = utils.Params.GetString("GOTIFY_TOKEN") | ||||
| 
 | ||||
| 	db, err := database.OpenTester() | ||||
| 	require.Nil(t, err) | ||||
| 	db.AutoMigrate(¬ifications.Notification{}) | ||||
| 	notifications.SetDB(db) | ||||
| 	core.Example() | ||||
| 
 | ||||
| 	if GOTIFY_URL == "" { | ||||
| 		t.Log("gotify notifier testing skipped, missing GOTIFY_URL environment variable") | ||||
| 		t.SkipNow() | ||||
| 	} | ||||
| 	if GOTIFY_TOKEN == "" { | ||||
| 		t.Log("gotify notifier testing skipped, missing GOTIFY_TOKEN environment variable") | ||||
| 		t.SkipNow() | ||||
| 	} | ||||
| 
 | ||||
| 	t.Run("Load gotify", func(t *testing.T) { | ||||
| 		Gotify.Host = GOTIFY_URL | ||||
| 		Gotify.Delay = time.Duration(100 * time.Millisecond) | ||||
| 		Gotify.Enabled = null.NewNullBool(true) | ||||
| 
 | ||||
| 		Add(Gotify) | ||||
| 
 | ||||
| 		assert.Equal(t, "Hugo van Rijswijk", Gotify.Author) | ||||
| 		assert.Equal(t, GOTIFY_URL, Gotify.Host) | ||||
| 	}) | ||||
| 
 | ||||
| 	t.Run("gotify Notifier Tester", func(t *testing.T) { | ||||
| 		assert.True(t, Gotify.CanSend()) | ||||
| 	}) | ||||
| 
 | ||||
| 	t.Run("gotify Notifier Tester OnSave", func(t *testing.T) { | ||||
| 		_, err := Gotify.OnSave() | ||||
| 		assert.Nil(t, err) | ||||
| 	}) | ||||
| 
 | ||||
| 	t.Run("gotify OnFailure", func(t *testing.T) { | ||||
| 		_, err := Gotify.OnFailure(services.Example(false), failures.Example()) | ||||
| 		assert.Nil(t, err) | ||||
| 	}) | ||||
| 
 | ||||
| 	t.Run("gotify OnSuccess", func(t *testing.T) { | ||||
| 		_, err := Gotify.OnSuccess(services.Example(true)) | ||||
| 		assert.Nil(t, err) | ||||
| 	}) | ||||
| 
 | ||||
| 	t.Run("gotify Test", func(t *testing.T) { | ||||
| 		_, err := Gotify.OnTest() | ||||
| 		assert.Nil(t, err) | ||||
| 	}) | ||||
| 
 | ||||
| } | ||||
|  | @ -32,6 +32,7 @@ func InitNotifiers() { | |||
| 		Mobile, | ||||
| 		Pushover, | ||||
| 		statpingMailer, | ||||
| 		Gotify, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Hugo van Rijswijk
						Hugo van Rijswijk