mirror of https://github.com/statping/statping
comments notifiers - fix routes
parent
4018904ac1
commit
cccac659e0
|
@ -67,7 +67,7 @@ func (s *Service) SelectHitsGroupBy(group string) ([]*types.Hit, error) {
|
||||||
return hits, err.Error
|
return hits, err.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// TotalHits returns the total amount of successfull hits a service has
|
// TotalHits returns the total amount of successful hits a service has
|
||||||
func (s *Service) TotalHits() (uint64, error) {
|
func (s *Service) TotalHits() (uint64, error) {
|
||||||
var count uint64
|
var count uint64
|
||||||
col := hitsDB().Where("service = ?", s.Id)
|
col := hitsDB().Where("service = ?", s.Id)
|
||||||
|
|
|
@ -51,7 +51,19 @@ func Router() *mux.Router {
|
||||||
r.Handle("/charts/{id}.js", http.HandlerFunc(RenderServiceChartHandler))
|
r.Handle("/charts/{id}.js", http.HandlerFunc(RenderServiceChartHandler))
|
||||||
r.Handle("/setup", http.HandlerFunc(SetupHandler)).Methods("GET")
|
r.Handle("/setup", http.HandlerFunc(SetupHandler)).Methods("GET")
|
||||||
r.Handle("/setup", http.HandlerFunc(ProcessSetupHandler)).Methods("POST")
|
r.Handle("/setup", http.HandlerFunc(ProcessSetupHandler)).Methods("POST")
|
||||||
r.Handle("/dashboard", http.HandlerFunc(DashboardHandler)).Methods("GET").HandlerFunc(UsersHandler).Methods("GET")
|
r.Handle("/dashboard", http.HandlerFunc(DashboardHandler)).Methods("GET")
|
||||||
|
r.Handle("/dashboard", http.HandlerFunc(LoginHandler)).Methods("POST")
|
||||||
|
r.Handle("/logout", http.HandlerFunc(LogoutHandler))
|
||||||
|
r.Handle("/services", http.HandlerFunc(ServicesHandler)).Methods("GET")
|
||||||
|
r.Handle("/services", http.HandlerFunc(CreateServiceHandler)).Methods("POST")
|
||||||
|
r.Handle("/services/reorder", http.HandlerFunc(ReorderServiceHandler)).Methods("POST")
|
||||||
|
r.Handle("/service/{id}", http.HandlerFunc(ServicesViewHandler)).Methods("GET")
|
||||||
|
r.Handle("/service/{id}", http.HandlerFunc(ServicesUpdateHandler)).Methods("POST")
|
||||||
|
r.Handle("/service/{id}/edit", http.HandlerFunc(ServicesViewHandler))
|
||||||
|
r.Handle("/service/{id}/delete", http.HandlerFunc(ServicesDeleteHandler))
|
||||||
|
r.Handle("/service/{id}/delete_failures", http.HandlerFunc(ServicesDeleteFailuresHandler)).Methods("GET")
|
||||||
|
r.Handle("/service/{id}/checkin", http.HandlerFunc(CheckinCreateUpdateHandler)).Methods("POST")
|
||||||
|
r.Handle("/users", http.HandlerFunc(UsersHandler)).Methods("GET")
|
||||||
r.Handle("/users", http.HandlerFunc(CreateUserHandler)).Methods("POST")
|
r.Handle("/users", http.HandlerFunc(CreateUserHandler)).Methods("POST")
|
||||||
r.Handle("/user/{id}", http.HandlerFunc(UsersEditHandler)).Methods("GET")
|
r.Handle("/user/{id}", http.HandlerFunc(UsersEditHandler)).Methods("GET")
|
||||||
r.Handle("/user/{id}", http.HandlerFunc(UpdateUserHandler)).Methods("POST")
|
r.Handle("/user/{id}", http.HandlerFunc(UpdateUserHandler)).Methods("POST")
|
||||||
|
|
|
@ -57,6 +57,7 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send will send a HTTP Post to the Discord API. It accepts type: []byte
|
||||||
func (u *Discord) Send(msg interface{}) error {
|
func (u *Discord) Send(msg interface{}) error {
|
||||||
message := msg.([]byte)
|
message := msg.([]byte)
|
||||||
req, _ := http.NewRequest("POST", discorder.GetValue("host"), bytes.NewBuffer(message))
|
req, _ := http.NewRequest("POST", discorder.GetValue("host"), bytes.NewBuffer(message))
|
||||||
|
@ -73,15 +74,18 @@ func (u *Discord) Select() *notifier.Notification {
|
||||||
return u.Notification
|
return u.Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnFailure will trigger failing service
|
||||||
func (u *Discord) OnFailure(s *types.Service, f *types.Failure) {
|
func (u *Discord) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
msg := fmt.Sprintf(`{"content": "Your service '%v' is currently failing! Reason: %v"}`, s.Name, f.Issue)
|
msg := fmt.Sprintf(`{"content": "Your service '%v' is currently failing! Reason: %v"}`, s.Name, f.Issue)
|
||||||
u.AddQueue(msg)
|
u.AddQueue(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnSuccess will trigger successful service
|
||||||
func (u *Discord) OnSuccess(s *types.Service) {
|
func (u *Discord) OnSuccess(s *types.Service) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnSave triggers when this notifier has been saved
|
||||||
func (u *Discord) OnSave() error {
|
func (u *Discord) OnSave() error {
|
||||||
msg := fmt.Sprintf(`{"content": "The Discord notifier on Statup was just updated."}`)
|
msg := fmt.Sprintf(`{"content": "The Discord notifier on Statup was just updated."}`)
|
||||||
u.AddQueue(msg)
|
u.AddQueue(msg)
|
||||||
|
|
|
@ -85,6 +85,7 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send will send the SMTP email with your authentication It accepts type: *EmailOutgoing
|
||||||
func (u *Email) Send(msg interface{}) error {
|
func (u *Email) Send(msg interface{}) error {
|
||||||
email := msg.(*EmailOutgoing)
|
email := msg.(*EmailOutgoing)
|
||||||
err := u.dialSend(email)
|
err := u.dialSend(email)
|
||||||
|
@ -117,7 +118,7 @@ type EmailOutgoing struct {
|
||||||
Sent bool
|
Sent bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE FAILURE, DO YOUR OWN FUNCTIONS
|
// OnFailure will trigger failing service
|
||||||
func (u *Email) OnFailure(s *types.Service, f *types.Failure) {
|
func (u *Email) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
email := &EmailOutgoing{
|
email := &EmailOutgoing{
|
||||||
To: emailer.GetValue("var2"),
|
To: emailer.GetValue("var2"),
|
||||||
|
@ -129,7 +130,7 @@ func (u *Email) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
u.AddQueue(email)
|
u.AddQueue(email)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE SUCCESS, DO YOUR OWN FUNCTIONS
|
// OnSuccess will trigger successful service
|
||||||
func (u *Email) OnSuccess(s *types.Service) {
|
func (u *Email) OnSuccess(s *types.Service) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -138,7 +139,7 @@ func (u *Email) Select() *notifier.Notification {
|
||||||
return u.Notification
|
return u.Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SAVE OR UPDATE OF THE NOTIFIER FORM
|
// OnSave triggers when this notifier has been saved
|
||||||
func (u *Email) OnSave() error {
|
func (u *Email) OnSave() error {
|
||||||
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
||||||
// Do updating stuff here
|
// Do updating stuff here
|
||||||
|
|
|
@ -55,6 +55,7 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send will send a HTTP Post with the Authorization to the notify-api.line.me server. It accepts type: string
|
||||||
func (u *LineNotify) Send(msg interface{}) error {
|
func (u *LineNotify) Send(msg interface{}) error {
|
||||||
message := msg.(string)
|
message := msg.(string)
|
||||||
client := new(http.Client)
|
client := new(http.Client)
|
||||||
|
@ -75,18 +76,18 @@ func (u *LineNotify) Select() *notifier.Notification {
|
||||||
return u.Notification
|
return u.Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE FAILURE, DO YOUR OWN FUNCTIONS
|
// OnFailure will trigger failing service
|
||||||
func (u *LineNotify) OnFailure(s *types.Service, f *types.Failure) {
|
func (u *LineNotify) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
|
msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
|
||||||
u.AddQueue(msg)
|
u.AddQueue(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE SUCCESS, DO YOUR OWN FUNCTIONS
|
// OnSuccess will trigger successful service
|
||||||
func (u *LineNotify) OnSuccess(s *types.Service) {
|
func (u *LineNotify) OnSuccess(s *types.Service) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SAVE OR UPDATE OF THE NOTIFIER FORM
|
// OnSave triggers when this notifier has been saved
|
||||||
func (u *LineNotify) OnSave() error {
|
func (u *LineNotify) OnSave() error {
|
||||||
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
||||||
// Do updating stuff here
|
// Do updating stuff here
|
||||||
|
|
|
@ -81,6 +81,7 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send will send a HTTP Post to the Slack Webhook API. It accepts type: string
|
||||||
func (u *Slack) Send(msg interface{}) error {
|
func (u *Slack) Send(msg interface{}) error {
|
||||||
message := msg.(string)
|
message := msg.(string)
|
||||||
client := new(http.Client)
|
client := new(http.Client)
|
||||||
|
@ -105,7 +106,7 @@ func (u *Slack) OnTest(n notifier.Notification) (bool, error) {
|
||||||
return true, err
|
return true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE FAILURE, DO YOUR OWN FUNCTIONS
|
// OnFailure will trigger failing service
|
||||||
func (u *Slack) OnFailure(s *types.Service, f *types.Failure) {
|
func (u *Slack) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
message := SlackMessage{
|
message := SlackMessage{
|
||||||
Service: s,
|
Service: s,
|
||||||
|
@ -115,12 +116,12 @@ func (u *Slack) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
parseSlackMessage(FAILING_TEMPLATE, message)
|
parseSlackMessage(FAILING_TEMPLATE, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE SUCCESS, DO YOUR OWN FUNCTIONS
|
// OnSuccess will trigger successful service
|
||||||
func (u *Slack) OnSuccess(s *types.Service) {
|
func (u *Slack) OnSuccess(s *types.Service) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SAVE OR UPDATE OF THE NOTIFIER FORM
|
// OnSave triggers when this notifier has been saved
|
||||||
func (u *Slack) OnSave() error {
|
func (u *Slack) OnSave() error {
|
||||||
message := fmt.Sprintf("Notification %v is receiving updated information.", u.Method)
|
message := fmt.Sprintf("Notification %v is receiving updated information.", u.Method)
|
||||||
u.AddQueue(message)
|
u.AddQueue(message)
|
||||||
|
|
|
@ -30,29 +30,29 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TWILIO_METHOD = "twilio"
|
twilioMethod = "twilioNotifier"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Twilio struct {
|
type twilio struct {
|
||||||
*notifier.Notification
|
*notifier.Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
var twilio = &Twilio{¬ifier.Notification{
|
var twilioNotifier = &twilio{¬ifier.Notification{
|
||||||
Method: TWILIO_METHOD,
|
Method: twilioMethod,
|
||||||
Title: "Twilio",
|
Title: "twilioNotifier",
|
||||||
Description: "Receive SMS text messages directly to your cellphone when a service is offline. You can use a Twilio test account with limits. This notifier uses the <a href=\"https://www.twilio.com/docs/usage/api\">Twilio API</a>.",
|
Description: "Receive SMS text messages directly to your cellphone when a service is offline. You can use a twilioNotifier test account with limits. This notifier uses the <a href=\"https://www.twilioNotifier.com/docs/usage/api\">twilioNotifier API</a>.",
|
||||||
Author: "Hunter Long",
|
Author: "Hunter Long",
|
||||||
AuthorUrl: "https://github.com/hunterlong",
|
AuthorUrl: "https://github.com/hunterlong",
|
||||||
Delay: time.Duration(10 * time.Second),
|
Delay: time.Duration(10 * time.Second),
|
||||||
Form: []notifier.NotificationForm{{
|
Form: []notifier.NotificationForm{{
|
||||||
Type: "text",
|
Type: "text",
|
||||||
Title: "Account Sid",
|
Title: "Account Sid",
|
||||||
Placeholder: "Insert your Twilio Account Sid",
|
Placeholder: "Insert your twilioNotifier Account Sid",
|
||||||
DbField: "api_key",
|
DbField: "api_key",
|
||||||
}, {
|
}, {
|
||||||
Type: "text",
|
Type: "text",
|
||||||
Title: "Account Token",
|
Title: "Account Token",
|
||||||
Placeholder: "Insert your Twilio Account Token",
|
Placeholder: "Insert your twilioNotifier Account Token",
|
||||||
DbField: "api_secret",
|
DbField: "api_secret",
|
||||||
}, {
|
}, {
|
||||||
Type: "text",
|
Type: "text",
|
||||||
|
@ -69,19 +69,20 @@ var twilio = &Twilio{¬ifier.Notification{
|
||||||
|
|
||||||
// DEFINE YOUR NOTIFICATION HERE.
|
// DEFINE YOUR NOTIFICATION HERE.
|
||||||
func init() {
|
func init() {
|
||||||
err := notifier.AddNotifier(twilio)
|
err := notifier.AddNotifier(twilioNotifier)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *Twilio) Select() *notifier.Notification {
|
func (u *twilio) Select() *notifier.Notification {
|
||||||
return u.Notification
|
return u.Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *Twilio) Send(msg interface{}) error {
|
// Send will send a HTTP Post to the Twilio SMS API. It accepts type: string
|
||||||
|
func (u *twilio) Send(msg interface{}) error {
|
||||||
message := msg.(string)
|
message := msg.(string)
|
||||||
twilioUrl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%v/Messages.json", u.GetValue("api_key"))
|
twilioUrl := fmt.Sprintf("https://api.twilioNotifier.com/2010-04-01/Accounts/%v/Messages.json", u.GetValue("api_key"))
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
v.Set("To", "+"+u.Var1)
|
v.Set("To", "+"+u.Var1)
|
||||||
|
@ -100,24 +101,24 @@ func (u *Twilio) Send(msg interface{}) error {
|
||||||
contents, _ := ioutil.ReadAll(res.Body)
|
contents, _ := ioutil.ReadAll(res.Body)
|
||||||
success, twilioRes := twilioSuccess(contents)
|
success, twilioRes := twilioSuccess(contents)
|
||||||
if !success {
|
if !success {
|
||||||
return errors.New(fmt.Sprintf("twilio didn't receive the expected status of 'enque' from API got: %v", twilioRes))
|
return errors.New(fmt.Sprintf("twilioNotifier didn't receive the expected status of 'enque' from API got: %v", twilioRes))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE FAILURE, DO YOUR OWN FUNCTIONS
|
// OnFailure will trigger failing service
|
||||||
func (u *Twilio) OnFailure(s *types.Service, f *types.Failure) {
|
func (u *twilio) OnFailure(s *types.Service, f *types.Failure) {
|
||||||
msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
|
msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
|
||||||
u.AddQueue(msg)
|
u.AddQueue(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SERVICE SUCCESS, DO YOUR OWN FUNCTIONS
|
// OnSuccess will trigger successful service
|
||||||
func (u *Twilio) OnSuccess(s *types.Service) {
|
func (u *twilio) OnSuccess(s *types.Service) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ON SAVE OR UPDATE OF THE NOTIFIER FORM
|
// OnSave triggers when this notifier has been saved
|
||||||
func (u *Twilio) OnSave() error {
|
func (u *twilio) OnSave() error {
|
||||||
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
|
||||||
|
|
||||||
// Do updating stuff here
|
// Do updating stuff here
|
||||||
|
|
|
@ -13,54 +13,54 @@ var (
|
||||||
TWILIO_SECRET = os.Getenv("TWILIO_SECRET")
|
TWILIO_SECRET = os.Getenv("TWILIO_SECRET")
|
||||||
TWILIO_FROM = os.Getenv("TWILIO_FROM")
|
TWILIO_FROM = os.Getenv("TWILIO_FROM")
|
||||||
TWILIO_TO = os.Getenv("TWILIO_TO")
|
TWILIO_TO = os.Getenv("TWILIO_TO")
|
||||||
twilioMessage = "The Twilio notifier on Statup has been tested!"
|
twilioMessage = "The twilioNotifier notifier on Statup has been tested!"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
twilio.ApiKey = TWILIO_SID
|
twilioNotifier.ApiKey = TWILIO_SID
|
||||||
twilio.ApiSecret = TWILIO_SECRET
|
twilioNotifier.ApiSecret = TWILIO_SECRET
|
||||||
twilio.Var1 = TWILIO_TO
|
twilioNotifier.Var1 = TWILIO_TO
|
||||||
twilio.Var2 = TWILIO_FROM
|
twilioNotifier.Var2 = TWILIO_FROM
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTwilioNotifier(t *testing.T) {
|
func TestTwilioNotifier(t *testing.T) {
|
||||||
if TWILIO_SID == "" || TWILIO_SECRET == "" || TWILIO_FROM == "" {
|
if TWILIO_SID == "" || TWILIO_SECRET == "" || TWILIO_FROM == "" {
|
||||||
t.Log("Twilio notifier testing skipped, missing TWILIO_SID environment variable")
|
t.Log("twilioNotifier notifier testing skipped, missing TWILIO_SID environment variable")
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
currentCount = CountNotifiers()
|
currentCount = CountNotifiers()
|
||||||
|
|
||||||
t.Run("Load Twilio", func(t *testing.T) {
|
t.Run("Load twilioNotifier", func(t *testing.T) {
|
||||||
twilio.ApiKey = TWILIO_SID
|
twilioNotifier.ApiKey = TWILIO_SID
|
||||||
twilio.Delay = time.Duration(100 * time.Millisecond)
|
twilioNotifier.Delay = time.Duration(100 * time.Millisecond)
|
||||||
err := notifier.AddNotifier(twilio)
|
err := notifier.AddNotifier(twilioNotifier)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, "Hunter Long", twilio.Author)
|
assert.Equal(t, "Hunter Long", twilioNotifier.Author)
|
||||||
assert.Equal(t, TWILIO_SID, twilio.ApiKey)
|
assert.Equal(t, TWILIO_SID, twilioNotifier.ApiKey)
|
||||||
assert.Equal(t, currentCount+1, CountNotifiers())
|
assert.Equal(t, currentCount+1, CountNotifiers())
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Load Twilio Notifier", func(t *testing.T) {
|
t.Run("Load twilioNotifier Notifier", func(t *testing.T) {
|
||||||
count := notifier.Load()
|
count := notifier.Load()
|
||||||
assert.Equal(t, currentCount+1, len(count))
|
assert.Equal(t, currentCount+1, len(count))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Twilio Within Limits", func(t *testing.T) {
|
t.Run("twilioNotifier Within Limits", func(t *testing.T) {
|
||||||
ok, err := twilio.WithinLimits()
|
ok, err := twilioNotifier.WithinLimits()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Twilio Send", func(t *testing.T) {
|
t.Run("twilioNotifier Send", func(t *testing.T) {
|
||||||
err := twilio.Send(twilioMessage)
|
err := twilioNotifier.Send(twilioMessage)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Twilio Queue", func(t *testing.T) {
|
t.Run("twilioNotifier Queue", func(t *testing.T) {
|
||||||
go notifier.Queue(twilio)
|
go notifier.Queue(twilioNotifier)
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
assert.Equal(t, TWILIO_SID, twilio.ApiKey)
|
assert.Equal(t, TWILIO_SID, twilioNotifier.ApiKey)
|
||||||
assert.Equal(t, 0, len(twilio.Queue))
|
assert.Equal(t, 0, len(twilioNotifier.Queue))
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue