+
@@ -146,7 +145,6 @@
error: null,
loading: false,
disabled: true,
- passnomatch: false,
setup: {
language: "en",
db_connection: "sqlite",
@@ -188,11 +186,6 @@
canSubmit() {
this.error = null
const s = this.setup
- if (s.confirm_password.length > 0 && s.confirm_password !== s.password) {
- this.passnomatch = true
- } else {
- this.passnomatch = false
- }
if (s.db_connection !== 'sqlite') {
if (!s.db_host || !s.db_port || !s.db_user || !s.db_password || !s.db_database) {
this.disabled = true
diff --git a/frontend/src/routes.js b/frontend/src/routes.js
index ab1ad3c5..be7e8a5c 100644
--- a/frontend/src/routes.js
+++ b/frontend/src/routes.js
@@ -38,7 +38,7 @@ const routes = [
beforeEnter: async (to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
let tk = await Api.token()
- if (to.path !== '/login' && !tk) {
+ if (to.path !== '/login' && !tk.admin) {
next('/login')
return
}
diff --git a/frontend/src/store.js b/frontend/src/store.js
index c8738d22..673724e1 100644
--- a/frontend/src/store.js
+++ b/frontend/src/store.js
@@ -147,9 +147,9 @@ export default new Vuex.Store({
const core = await Api.core()
const token = await Api.token()
context.commit("setCore", core);
- context.commit('setAdmin', token)
+ context.commit('setAdmin', token.admin)
context.commit('setCore', core)
- context.commit('setUser', token!==undefined)
+ context.commit('setUser', token.token!==undefined)
},
async loadRequired(context) {
const groups = await Api.groups()
@@ -170,8 +170,14 @@ export default new Vuex.Store({
const messages = await Api.messages()
context.commit("setMessages", messages)
context.commit("setHasPublicData", true)
- const checkins = await Api.checkins()
- context.commit("setCheckins", checkins);
+ try {
+ const checkins = await Api.checkins()
+ context.commit("setCheckins", checkins);
+ } catch(e) {
+ window.console.error(e)
+ await Api.logout()
+ return
+ }
const notifiers = await Api.notifiers()
context.commit("setNotifiers", notifiers);
const users = await Api.users()
diff --git a/frontend/vue.config.js b/frontend/vue.config.js
index 39d5beb2..8ce147cc 100644
--- a/frontend/vue.config.js
+++ b/frontend/vue.config.js
@@ -3,23 +3,14 @@ module.exports = {
assetsDir: 'assets',
filenameHashing: false,
devServer: {
- disableHostCheck: true,
- proxyTable: {
+ proxy: {
'/api': {
logLevel: 'debug',
- target: 'http://0.0.0.0:8585',
- changeOrigin: true,
- pathRewrite: {
- '^/api': ''
- }
+ target: 'http://0.0.0.0:8585'
},
'/oauth': {
logLevel: 'debug',
- target: 'http://0.0.0.0:8585',
- changeOrigin: true,
- pathRewrite: {
- '^/oauth': ''
- }
+ target: 'http://0.0.0.0:8585/oauth/'
}
}
}
diff --git a/handlers/api.go b/handlers/api.go
index c5acf04e..e04d1777 100644
--- a/handlers/api.go
+++ b/handlers/api.go
@@ -45,19 +45,15 @@ func apiRenewHandler(w http.ResponseWriter, r *http.Request) {
}
func apiUpdateOAuthHandler(w http.ResponseWriter, r *http.Request) {
- var oauth core.OAuth
- if err := DecodeJSON(r, &oauth); err != nil {
+ var c core.OAuth
+ err := DecodeJSON(r, &c)
+ if err != nil {
sendErrorJson(err, w, r)
return
}
-
- core.App.OAuth = oauth
- if err := core.App.Update(); err != nil {
- sendErrorJson(err, w, r)
- return
- }
-
- sendJsonAction(core.App.OAuth, "update", w, r)
+ app := core.App
+ app.OAuth = c
+ sendJsonAction(app.OAuth, "update", w, r)
}
func apiOAuthHandler(r *http.Request) interface{} {
diff --git a/handlers/handlers.go b/handlers/handlers.go
index 93db3860..2bc643b2 100644
--- a/handlers/handlers.go
+++ b/handlers/handlers.go
@@ -19,7 +19,7 @@ const (
)
var (
- jwtKey []byte
+ jwtKey string
httpServer *http.Server
usingSSL bool
mainTmpl = `{{define "main" }} {{ template "base" . }} {{ end }}`
@@ -96,11 +96,7 @@ func IsFullAuthenticated(r *http.Request) bool {
if ok := hasAuthorizationHeader(r); ok {
return true
}
- claim, err := getJwtToken(r)
- if err != nil {
- return false
- }
- return claim.Admin
+ return IsAdmin(r)
}
// ScopeName will show private JSON fields in the API.
diff --git a/handlers/jwt.go b/handlers/jwt.go
index 76a8abc8..797c6e05 100644
--- a/handlers/jwt.go
+++ b/handlers/jwt.go
@@ -33,7 +33,7 @@ func setJwtToken(user *users.User, w http.ResponseWriter) (JwtClaim, string) {
ExpiresAt: expirationTime.Unix(),
}}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwtClaim)
- tokenString, err := token.SignedString(jwtKey)
+ tokenString, err := token.SignedString([]byte(jwtKey))
if err != nil {
log.Errorln("error setting token: ", err)
}
@@ -44,7 +44,6 @@ func setJwtToken(user *users.User, w http.ResponseWriter) (JwtClaim, string) {
Value: tokenString,
Expires: expirationTime,
MaxAge: int(time.Duration(72 * time.Hour).Seconds()),
- Path: "/",
})
return jwtClaim, tokenString
}
@@ -57,12 +56,11 @@ func getJwtToken(r *http.Request) (JwtClaim, error) {
}
return JwtClaim{}, err
}
-
+ tknStr := c.Value
var claims JwtClaim
- tkn, err := jwt.ParseWithClaims(c.Value, &claims, func(token *jwt.Token) (interface{}, error) {
- return jwtKey, nil
+ tkn, err := jwt.ParseWithClaims(tknStr, &claims, func(token *jwt.Token) (interface{}, error) {
+ return []byte(jwtKey), nil
})
-
if err != nil {
if err == jwt.ErrSignatureInvalid {
return JwtClaim{}, err
diff --git a/handlers/notifications.go b/handlers/notifications.go
index b809c7e2..daa82de7 100644
--- a/handlers/notifications.go
+++ b/handlers/notifications.go
@@ -70,7 +70,7 @@ type testNotificationReq struct {
func testNotificationHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
- n, err := notifications.Find(vars["notifier"])
+ _, err := notifications.Find(vars["notifier"])
if err != nil {
sendErrorJson(err, w, r)
return
@@ -82,7 +82,7 @@ func testNotificationHandler(w http.ResponseWriter, r *http.Request) {
return
}
- notif := services.ReturnNotifier(n.Method)
+ notif := services.ReturnNotifier(req.Notification.Method)
var out string
if req.Method == "success" {
diff --git a/handlers/oauth.go b/handlers/oauth.go
index 9aa4119b..3fd38bff 100644
--- a/handlers/oauth.go
+++ b/handlers/oauth.go
@@ -1,20 +1,29 @@
package handlers
import (
+ "encoding/json"
"fmt"
"github.com/gorilla/mux"
"github.com/statping/statping/types/core"
- "github.com/statping/statping/types/errors"
"github.com/statping/statping/types/null"
"github.com/statping/statping/types/users"
+ "github.com/statping/statping/utils"
"golang.org/x/oauth2"
+ "golang.org/x/oauth2/github"
+ "golang.org/x/oauth2/google"
+ "golang.org/x/oauth2/slack"
"net/http"
+ "time"
)
type oAuth struct {
- Email string
- Username string
- *oauth2.Token
+ ID string
+ Email string
+ Username string
+ Token string
+ RefreshToken string
+ Valid bool
+ Type string
}
func oauthHandler(w http.ResponseWriter, r *http.Request) {
@@ -30,10 +39,6 @@ func oauthHandler(w http.ResponseWriter, r *http.Request) {
oauth, err = githubOAuth(r)
case "slack":
oauth, err = slackOAuth(r)
- case "custom":
- oauth, err = customOAuth(r)
- default:
- err = errors.New("unknown oauth provider")
}
if err != nil {
@@ -46,14 +51,122 @@ func oauthHandler(w http.ResponseWriter, r *http.Request) {
}
func oauthLogin(oauth *oAuth, w http.ResponseWriter, r *http.Request) {
+ log.Infoln(oauth)
user := &users.User{
Id: 0,
Username: oauth.Username,
Email: oauth.Email,
Admin: null.NewNullBool(true),
}
- log.Infoln(fmt.Sprintf("OAuth %s User %s logged in from IP %s", oauth.Type(), oauth.Email, r.RemoteAddr))
+ log.Infoln(fmt.Sprintf("OAuth User %s logged in from IP %s", oauth.Email, r.RemoteAddr))
setJwtToken(user, w)
- http.Redirect(w, r, core.App.Domain+"/dashboard", http.StatusPermanentRedirect)
+ //returnJson(user, w, r)
+ http.Redirect(w, r, core.App.Domain, http.StatusPermanentRedirect)
+}
+
+func githubOAuth(r *http.Request) (*oAuth, error) {
+ c := *core.App
+ code := r.URL.Query().Get("code")
+
+ config := &oauth2.Config{
+ ClientID: c.OAuth.GithubClientID,
+ ClientSecret: c.OAuth.GithubClientSecret,
+ Endpoint: github.Endpoint,
+ }
+
+ gg, err := config.Exchange(r.Context(), code)
+ if err != nil {
+ return nil, err
+ }
+
+ return &oAuth{
+ Token: gg.AccessToken,
+ RefreshToken: gg.RefreshToken,
+ Valid: gg.Valid(),
+ }, nil
+}
+
+func googleOAuth(r *http.Request) (*oAuth, error) {
+ c := core.App
+ code := r.URL.Query().Get("code")
+
+ config := &oauth2.Config{
+ ClientID: c.OAuth.GoogleClientID,
+ ClientSecret: c.OAuth.GoogleClientSecret,
+ Endpoint: google.Endpoint,
+ }
+
+ gg, err := config.Exchange(r.Context(), code)
+ if err != nil {
+ return nil, err
+ }
+
+ return &oAuth{
+ Token: gg.AccessToken,
+ RefreshToken: gg.RefreshToken,
+ Valid: gg.Valid(),
+ }, nil
+}
+
+func slackOAuth(r *http.Request) (*oAuth, error) {
+ c := core.App
+ code := r.URL.Query().Get("code")
+
+ config := &oauth2.Config{
+ ClientID: c.OAuth.SlackClientID,
+ ClientSecret: c.OAuth.SlackClientSecret,
+ Endpoint: slack.Endpoint,
+ RedirectURL: c.Domain + basePath + "oauth/slack",
+ Scopes: []string{"identity.basic"},
+ }
+
+ gg, err := config.Exchange(r.Context(), code)
+ if err != nil {
+ return nil, err
+ }
+
+ oauther := &oAuth{
+ Token: gg.AccessToken,
+ RefreshToken: gg.RefreshToken,
+ Valid: gg.Valid(),
+ Type: gg.Type(),
+ }
+
+ return oauther.slackIdentity()
+}
+
+// slackIdentity will query the Slack API to fetch the users ID, username, and email address.
+func (a *oAuth) slackIdentity() (*oAuth, error) {
+ url := fmt.Sprintf("https://slack.com/api/users.identity?token=%s", a.Token)
+ out, resp, err := utils.HttpRequest(url, "GET", "application/x-www-form-urlencoded", nil, nil, 10*time.Second, true, nil)
+ if err != nil {
+ return a, err
+ }
+ defer resp.Body.Close()
+
+ var i *slackIdentity
+ if err := json.Unmarshal(out, &i); err != nil {
+ return a, err
+ }
+ a.Email = i.User.Email
+ a.ID = i.User.ID
+ a.Username = i.User.Name
+ return a, nil
+}
+
+type slackIdentity struct {
+ Ok bool `json:"ok"`
+ User struct {
+ Name string `json:"name"`
+ ID string `json:"id"`
+ Email string `json:"email"`
+ } `json:"user"`
+ Team struct {
+ ID string `json:"id"`
+ } `json:"team"`
+}
+
+func secureToken(w http.ResponseWriter, r *http.Request) {
+
}
diff --git a/handlers/oauth_custom.go b/handlers/oauth_custom.go
deleted file mode 100644
index fb595617..00000000
--- a/handlers/oauth_custom.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package handlers
-
-import (
- "github.com/statping/statping/types/core"
- "github.com/statping/statping/types/errors"
- "golang.org/x/oauth2"
- "net/http"
- "strings"
-)
-
-func customOAuth(r *http.Request) (*oAuth, error) {
- auth := core.App.OAuth
- code := r.URL.Query().Get("code")
-
- scopes := strings.Split(auth.CustomScopes, ",")
-
- config := &oauth2.Config{
- ClientID: auth.CustomClientID,
- ClientSecret: auth.CustomClientSecret,
- Endpoint: oauth2.Endpoint{
- AuthURL: auth.CustomEndpointAuth,
- TokenURL: auth.CustomEndpointToken,
- },
- RedirectURL: core.App.Domain + basePath + "oauth/custom",
- Scopes: scopes,
- }
-
- gg, err := config.Exchange(r.Context(), code)
- if err != nil {
- return nil, err
- }
-
- if !gg.Valid() {
- return nil, errors.New("oauth token is not valid")
- }
-
- return &oAuth{
- Token: gg,
- }, nil
-}
diff --git a/handlers/oauth_github.go b/handlers/oauth_github.go
deleted file mode 100644
index fe753938..00000000
--- a/handlers/oauth_github.go
+++ /dev/null
@@ -1,175 +0,0 @@
-package handlers
-
-import (
- "encoding/json"
- "github.com/statping/statping/types/core"
- "github.com/statping/statping/types/errors"
- "github.com/statping/statping/utils"
- "golang.org/x/oauth2"
- "golang.org/x/oauth2/github"
- "net/http"
- "strings"
- "time"
-)
-
-func githubOAuth(r *http.Request) (*oAuth, error) {
- auth := core.App.OAuth
- code := r.URL.Query().Get("code")
-
- config := &oauth2.Config{
- ClientID: auth.GithubClientID,
- ClientSecret: auth.GithubClientSecret,
- Endpoint: github.Endpoint,
- RedirectURL: core.App.Domain + basePath + "oauth/github",
- }
-
- gg, err := config.Exchange(r.Context(), code)
- if err != nil {
- return nil, err
- }
-
- if !gg.Valid() {
- return nil, errors.New("oauth token is not valid")
- }
-
- user, err := returnGithubUser(gg.AccessToken)
- if err != nil {
- return nil, err
- }
-
- orgs, err := returnGithubOrganizations(gg.AccessToken, user.Login)
- if err != nil {
- return nil, err
- }
-
- if !validateGithub(user, orgs) {
- return nil, errors.New("github user is not allowed to login")
- }
-
- return &oAuth{
- Token: gg,
- Username: strings.ToLower(user.Name),
- Email: strings.ToLower(user.Email),
- }, nil
-}
-
-func returnGithubUser(token string) (githubUser, error) {
- headers := []string{
- "Accept=application/vnd.github.machine-man-preview+json",
- "Authorization=token " + token,
- }
- resp, _, err := utils.HttpRequest("https://api.github.com/user", "GET", nil, headers, nil, 10*time.Second, true, nil)
- if err != nil {
- return githubUser{}, err
- }
- var user githubUser
- if err := json.Unmarshal(resp, &user); err != nil {
- return githubUser{}, err
- }
- return user, nil
-}
-
-func returnGithubOrganizations(token, username string) ([]githubOrgs, error) {
- headers := []string{
- "Accept=application/vnd.github.machine-man-preview+json",
- "Authorization=token " + token,
- }
- resp, _, err := utils.HttpRequest("https://api.github.com/users/"+username+"/orgs", "GET", nil, headers, nil, 10*time.Second, true, nil)
- if err != nil {
- return nil, err
- }
- var orgs []githubOrgs
- if err := json.Unmarshal(resp, &orgs); err != nil {
- return nil, err
- }
- return orgs, nil
-}
-
-func validateGithub(ghUser githubUser, orgs []githubOrgs) bool {
- auth := core.App.OAuth
- if auth.GithubUsers == "" && auth.GithubOrgs == "" {
- return true
- }
-
- if auth.GithubUsers != "" {
- users := strings.Split(auth.GithubUsers, ",")
- for _, u := range users {
- if strings.ToLower(ghUser.Login) == strings.ToLower(u) {
- return true
- }
- }
- }
- if auth.GithubOrgs != "" {
- orgsAllowed := strings.Split(auth.GithubOrgs, ",")
- for _, o := range orgsAllowed {
- for _, org := range orgs {
- if strings.ToLower(o) == strings.ToLower(org.Login) {
- return true
- }
- }
- }
- }
- return false
-}
-
-type githubOrgs struct {
- Login string `json:"login"`
- ID int `json:"id"`
- NodeID string `json:"node_id"`
- URL string `json:"url"`
- ReposURL string `json:"repos_url"`
- EventsURL string `json:"events_url"`
- HooksURL string `json:"hooks_url"`
- IssuesURL string `json:"issues_url"`
- MembersURL string `json:"members_url"`
- PublicMembersURL string `json:"public_members_url"`
- AvatarURL string `json:"avatar_url"`
- Description string `json:"description"`
-}
-
-type githubUser struct {
- Login string `json:"login"`
- ID int `json:"id"`
- NodeID string `json:"node_id"`
- AvatarURL string `json:"avatar_url"`
- GravatarID string `json:"gravatar_id"`
- URL string `json:"url"`
- HTMLURL string `json:"html_url"`
- FollowersURL string `json:"followers_url"`
- FollowingURL string `json:"following_url"`
- GistsURL string `json:"gists_url"`
- StarredURL string `json:"starred_url"`
- SubscriptionsURL string `json:"subscriptions_url"`
- OrganizationsURL string `json:"organizations_url"`
- ReposURL string `json:"repos_url"`
- EventsURL string `json:"events_url"`
- ReceivedEventsURL string `json:"received_events_url"`
- Type string `json:"type"`
- SiteAdmin bool `json:"site_admin"`
- Name string `json:"name"`
- Company string `json:"company"`
- Blog string `json:"blog"`
- Location string `json:"location"`
- Email string `json:"email"`
- Hireable bool `json:"hireable"`
- Bio string `json:"bio"`
- TwitterUsername string `json:"twitter_username"`
- PublicRepos int `json:"public_repos"`
- PublicGists int `json:"public_gists"`
- Followers int `json:"followers"`
- Following int `json:"following"`
- CreatedAt time.Time `json:"created_at"`
- UpdatedAt time.Time `json:"updated_at"`
- PrivateGists int `json:"private_gists"`
- TotalPrivateRepos int `json:"total_private_repos"`
- OwnedPrivateRepos int `json:"owned_private_repos"`
- DiskUsage int `json:"disk_usage"`
- Collaborators int `json:"collaborators"`
- TwoFactorAuthentication bool `json:"two_factor_authentication"`
- Plan struct {
- Name string `json:"name"`
- Space int `json:"space"`
- PrivateRepos int `json:"private_repos"`
- Collaborators int `json:"collaborators"`
- } `json:"plan"`
-}
diff --git a/handlers/oauth_google.go b/handlers/oauth_google.go
deleted file mode 100644
index d3f81edd..00000000
--- a/handlers/oauth_google.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package handlers
-
-import (
- "encoding/json"
- "github.com/statping/statping/types/core"
- "github.com/statping/statping/types/errors"
- "github.com/statping/statping/utils"
- "golang.org/x/oauth2"
- "golang.org/x/oauth2/google"
- "net/http"
- "strings"
- "time"
-)
-
-func googleOAuth(r *http.Request) (*oAuth, error) {
- auth := core.App.OAuth
- code := r.URL.Query().Get("code")
-
- config := &oauth2.Config{
- ClientID: auth.GoogleClientID,
- ClientSecret: auth.GoogleClientSecret,
- Endpoint: google.Endpoint,
- RedirectURL: core.App.Domain + basePath + "oauth/google",
- }
-
- gg, err := config.Exchange(r.Context(), code)
- if err != nil {
- return nil, err
- }
-
- if !gg.Valid() {
- return nil, errors.New("oauth token is not valid")
- }
-
- info, err := returnGoogleInfo(gg.AccessToken)
- if err != nil {
- return nil, err
- }
-
- if !validateGoogle(info) {
- return nil, errors.New("google user is not allowed to login")
- }
-
- return &oAuth{
- Token: gg,
- Username: info.Name,
- Email: info.Email,
- }, nil
-}
-
-func validateGoogle(info googleUserInfo) bool {
- auth := core.App.OAuth
- if auth.GoogleUsers == "" {
- return true
- }
-
- if auth.GoogleUsers != "" {
- users := strings.Split(auth.GoogleUsers, ",")
- for _, u := range users {
- if strings.ToLower(info.Email) == strings.ToLower(u) {
- return true
- }
- if strings.ToLower(info.Hd) == strings.ToLower(u) {
- return true
- }
- }
- }
-
- return false
-}
-
-func returnGoogleInfo(token string) (googleUserInfo, error) {
- resp, _, err := utils.HttpRequest("https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token="+token, "GET", nil, nil, nil, 10*time.Second, true, nil)
- if err != nil {
- return googleUserInfo{}, err
- }
- var user googleUserInfo
- if err := json.Unmarshal(resp, &user); err != nil {
- return googleUserInfo{}, err
- }
- return user, nil
-}
-
-type googleUserInfo struct {
- ID string `json:"id"`
- Email string `json:"email"`
- VerifiedEmail bool `json:"verified_email"`
- Name string `json:"name"`
- GivenName string `json:"given_name"`
- FamilyName string `json:"family_name"`
- Link string `json:"link"`
- Picture string `json:"picture"`
- Gender string `json:"gender"`
- Locale string `json:"locale"`
- Hd string `json:"hd"`
-}
diff --git a/handlers/oauth_slack.go b/handlers/oauth_slack.go
deleted file mode 100644
index bb482f88..00000000
--- a/handlers/oauth_slack.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package handlers
-
-import (
- "encoding/json"
- "fmt"
- "github.com/statping/statping/types/core"
- "github.com/statping/statping/types/errors"
- "github.com/statping/statping/utils"
- "golang.org/x/oauth2"
- "golang.org/x/oauth2/slack"
- "net/http"
- "strings"
- "time"
-)
-
-func slackOAuth(r *http.Request) (*oAuth, error) {
- auth := core.App.OAuth
- code := r.URL.Query().Get("code")
-
- config := &oauth2.Config{
- ClientID: auth.SlackClientID,
- ClientSecret: auth.SlackClientSecret,
- Endpoint: slack.Endpoint,
- RedirectURL: core.App.Domain + basePath + "oauth/slack",
- Scopes: []string{"identity.basic"},
- }
-
- gg, err := config.Exchange(r.Context(), code)
- if err != nil {
- return nil, err
- }
-
- if !gg.Valid() {
- return nil, errors.New("oauth token is not valid")
- }
-
- identity, err := returnSlackIdentity(gg.AccessToken)
- if err != nil {
- return nil, err
- }
-
- if !identity.Ok {
- return nil, errors.New("slack identity is invalid")
- }
-
- if !validateSlack(identity) {
- return nil, errors.New("slack user is not whitelisted")
- }
-
- return &oAuth{
- Token: gg,
- Username: strings.ToLower(identity.User.Name),
- Email: strings.ToLower(identity.User.Email),
- }, nil
-}
-
-func validateSlack(id slackIdentity) bool {
- auth := core.App.OAuth
- if auth.SlackUsers == "" {
- return true
- }
-
- if auth.SlackUsers != "" {
- users := strings.Split(auth.SlackUsers, ",")
- for _, u := range users {
- if strings.ToLower(u) == strings.ToLower(id.User.Email) {
- return true
- }
- if strings.ToLower(u) == strings.ToLower(id.User.Name) {
- return true
- }
- }
- }
-
- return false
-}
-
-// slackIdentity will query the Slack API to fetch the users ID, username, and email address.
-func returnSlackIdentity(token string) (slackIdentity, error) {
- url := fmt.Sprintf("https://slack.com/api/users.identity?token=%s", token)
- out, _, err := utils.HttpRequest(url, "GET", "application/x-www-form-urlencoded", nil, nil, 10*time.Second, true, nil)
- if err != nil {
- return slackIdentity{}, err
- }
-
- var i slackIdentity
- if err := json.Unmarshal(out, &i); err != nil {
- return slackIdentity{}, err
- }
- return i, nil
-}
-
-type slackIdentity struct {
- Ok bool `json:"ok"`
- User struct {
- Name string `json:"name"`
- ID string `json:"id"`
- Email string `json:"email"`
- } `json:"user"`
- Team struct {
- ID string `json:"id"`
- } `json:"team"`
-}
diff --git a/handlers/routes.go b/handlers/routes.go
index 0ff7f3ea..114b0c22 100644
--- a/handlers/routes.go
+++ b/handlers/routes.go
@@ -1,10 +1,12 @@
package handlers
import (
+ "fmt"
sentryhttp "github.com/getsentry/sentry-go/http"
"github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/statping/statping/source"
+ "github.com/statping/statping/types/core"
"github.com/statping/statping/utils"
"net/http"
"net/http/pprof"
@@ -190,5 +192,5 @@ func resetRouter() {
}
func resetCookies() {
- jwtKey = []byte(utils.NewSHA256Hash())
+ jwtKey = fmt.Sprintf("%s_%d", core.App.ApiSecret, utils.Now().Nanosecond())
}
diff --git a/handlers/setup.go b/handlers/setup.go
index 565020ed..b4d618d4 100644
--- a/handlers/setup.go
+++ b/handlers/setup.go
@@ -31,8 +31,10 @@ func processSetupHandler(w http.ResponseWriter, r *http.Request) {
project := r.PostForm.Get("project")
description := r.PostForm.Get("description")
domain := r.PostForm.Get("domain")
- sendNews, _ := strconv.ParseBool(r.PostForm.Get("newsletter"))
- sendReports, _ := strconv.ParseBool(r.PostForm.Get("send_reports"))
+ newsletter := r.PostForm.Get("newsletter")
+ sendNews, _ := strconv.ParseBool(newsletter)
+ reports := r.PostForm.Get("send_reports")
+ sendReports, _ := strconv.ParseBool(reports)
log.WithFields(utils.ToFields(core.App, confgs)).Debugln("new configs posted")
diff --git a/notifiers/command.go b/notifiers/command.go
index 47a6ee4f..6e1e5c68 100644
--- a/notifiers/command.go
+++ b/notifiers/command.go
@@ -49,14 +49,14 @@ func runCommand(app string, cmd ...string) (string, string, error) {
}
// OnSuccess for commandLine will trigger successful service
-func (c *commandLine) OnSuccess(s services.Service) (string, error) {
- tmpl := ReplaceVars(c.SuccessData, s, failures.Failure{})
+func (c *commandLine) OnSuccess(s *services.Service) (string, error) {
+ tmpl := ReplaceVars(c.SuccessData, s, nil)
out, _, err := runCommand(c.Host, tmpl)
return out, err
}
// OnFailure for commandLine will trigger failing service
-func (c *commandLine) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (c *commandLine) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
tmpl := ReplaceVars(c.FailureData, s, f)
_, ouerr, err := runCommand(c.Host, tmpl)
return ouerr, err
diff --git a/notifiers/command_test.go b/notifiers/command_test.go
index b424fb65..4827e73f 100644
--- a/notifiers/command_test.go
+++ b/notifiers/command_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -22,7 +21,6 @@ func TestCommandNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
t.Run("Load Command", func(t *testing.T) {
Command.Host = "/bin/echo"
@@ -42,11 +40,6 @@ func TestCommandNotifier(t *testing.T) {
assert.True(t, Command.CanSend())
})
- t.Run("Command OnSave", func(t *testing.T) {
- _, err := Command.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("Command OnFailure", func(t *testing.T) {
_, err := Command.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/discord.go b/notifiers/discord.go
index 416ab57d..1e6b37f5 100644
--- a/notifiers/discord.go
+++ b/notifiers/discord.go
@@ -51,14 +51,14 @@ func (d *discord) Select() *notifications.Notification {
}
// OnFailure will trigger failing service
-func (d *discord) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (d *discord) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
out, err := d.sendRequest(ReplaceVars(d.FailureData, s, f))
return out, err
}
// OnSuccess will trigger successful service
-func (d *discord) OnSuccess(s services.Service) (string, error) {
- out, err := d.sendRequest(ReplaceVars(d.SuccessData, s, failures.Failure{}))
+func (d *discord) OnSuccess(s *services.Service) (string, error) {
+ out, err := d.sendRequest(ReplaceVars(d.SuccessData, s, nil))
return out, err
}
diff --git a/notifiers/discord_test.go b/notifiers/discord_test.go
index 7d33b3b1..e1648ddc 100644
--- a/notifiers/discord_test.go
+++ b/notifiers/discord_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -27,7 +26,6 @@ func TestDiscordNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
if DISCORD_URL == "" {
t.Log("discord notifier testing skipped, missing DISCORD_URL environment variable")
@@ -49,11 +47,6 @@ func TestDiscordNotifier(t *testing.T) {
assert.True(t, Discorder.CanSend())
})
- t.Run("discord Notifier Tester OnSave", func(t *testing.T) {
- _, err := Discorder.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("discord OnFailure", func(t *testing.T) {
_, err := Discorder.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/email.go b/notifiers/email.go
index d3ec0461..1f7b5d03 100644
--- a/notifiers/email.go
+++ b/notifiers/email.go
@@ -70,7 +70,7 @@ var email = &emailer{¬ifications.Notification{
Type: "switch",
Title: "Disable TLS/SSL",
Placeholder: "",
- SmallText: "Enabling this will set Insecure Skip Verify to true",
+ SmallText: "To Disable TLS/SSL insert 'true'",
DbField: "api_key",
}}},
}
@@ -86,7 +86,7 @@ type emailOutgoing struct {
}
// OnFailure will trigger failing service
-func (e *emailer) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
subject := fmt.Sprintf("Service %s is Offline", s.Name)
tmpl := renderEmail(s, f)
email := &emailOutgoing{
@@ -99,9 +99,9 @@ func (e *emailer) OnFailure(s services.Service, f failures.Failure) (string, err
}
// OnSuccess will trigger successful service
-func (e *emailer) OnSuccess(s services.Service) (string, error) {
+func (e *emailer) OnSuccess(s *services.Service) (string, error) {
subject := fmt.Sprintf("Service %s is Back Online", s.Name)
- tmpl := renderEmail(s, failures.Failure{})
+ tmpl := renderEmail(s, nil)
email := &emailOutgoing{
To: e.Var2,
Subject: subject,
@@ -111,7 +111,7 @@ func (e *emailer) OnSuccess(s services.Service) (string, error) {
return tmpl, e.dialSend(email)
}
-func renderEmail(s services.Service, f failures.Failure) string {
+func renderEmail(s *services.Service, f *failures.Failure) string {
wr := bytes.NewBuffer(nil)
tmpl := template.New("email")
tmpl, err := tmpl.Parse(emailBase)
@@ -121,7 +121,7 @@ func renderEmail(s services.Service, f failures.Failure) string {
}
data := replacer{
- Core: *core.App,
+ Core: core.App,
Service: s,
Failure: f,
Custom: nil,
diff --git a/notifiers/email_test.go b/notifiers/email_test.go
index cbcec63e..8c00cd3d 100644
--- a/notifiers/email_test.go
+++ b/notifiers/email_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -38,7 +37,6 @@ func TestEmailNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
if EMAIL_HOST == "" || EMAIL_USER == "" || EMAIL_PASS == "" {
t.Log("email notifier testing skipped, missing EMAIL_ environment variables")
@@ -65,11 +63,6 @@ func TestEmailNotifier(t *testing.T) {
assert.True(t, ok)
})
- t.Run("email OnSave", func(t *testing.T) {
- _, err := email.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("email OnFailure", func(t *testing.T) {
_, err := email.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/line_notify.go b/notifiers/line_notify.go
index 37d0908d..b432517d 100644
--- a/notifiers/line_notify.go
+++ b/notifiers/line_notify.go
@@ -52,14 +52,14 @@ func (l *lineNotifier) sendMessage(message string) (string, error) {
}
// OnFailure will trigger failing service
-func (l *lineNotifier) OnFailure(s services.Service, f failures.Failure) (string, error) {
- msg := fmt.Sprintf("Your service '%v' is currently offline! %s", s.Name, f.Issue)
+func (l *lineNotifier) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
+ msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
out, err := l.sendMessage(msg)
return out, err
}
// OnSuccess will trigger successful service
-func (l *lineNotifier) OnSuccess(s services.Service) (string, error) {
+func (l *lineNotifier) OnSuccess(s *services.Service) (string, error) {
msg := fmt.Sprintf("Service %s is online!", s.Name)
out, err := l.sendMessage(msg)
return out, err
diff --git a/notifiers/mobile.go b/notifiers/mobile.go
index d3664642..ab05d80f 100644
--- a/notifiers/mobile.go
+++ b/notifiers/mobile.go
@@ -47,14 +47,19 @@ var Mobile = &mobilePush{¬ifications.Notification{
}}},
}
-func dataJson(s services.Service, f failures.Failure) map[string]interface{} {
+func dataJson(s *services.Service, f *failures.Failure) map[string]interface{} {
serviceId := "0"
- serviceId = utils.ToString(s.Id)
+ if s != nil {
+ serviceId = utils.ToString(s.Id)
+ }
online := "online"
if !s.Online {
online = "offline"
}
- issue := f.Issue
+ issue := ""
+ if f != nil {
+ issue = f.Issue
+ }
link := fmt.Sprintf("statping://service?id=%v", serviceId)
out := map[string]interface{}{
"status": online,
@@ -66,7 +71,7 @@ func dataJson(s services.Service, f failures.Failure) map[string]interface{} {
}
// OnFailure will trigger failing service
-func (m *mobilePush) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (m *mobilePush) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
data := dataJson(s, f)
msg := &pushArray{
Message: fmt.Sprintf("Your service '%v' is currently failing! Reason: %v", s.Name, f.Issue),
@@ -77,8 +82,8 @@ func (m *mobilePush) OnFailure(s services.Service, f failures.Failure) (string,
}
// OnSuccess will trigger successful service
-func (m *mobilePush) OnSuccess(s services.Service) (string, error) {
- data := dataJson(s, failures.Failure{})
+func (m *mobilePush) OnSuccess(s *services.Service) (string, error) {
+ data := dataJson(s, nil)
msg := &pushArray{
Message: "Service is Online!",
Title: "Service Online",
diff --git a/notifiers/mobile_test.go b/notifiers/mobile_test.go
index 5268e1e9..ac358327 100644
--- a/notifiers/mobile_test.go
+++ b/notifiers/mobile_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -30,7 +29,6 @@ func TestMobileNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
Mobile.Var1 = mobileToken
if mobileToken == "" {
@@ -54,11 +52,6 @@ func TestMobileNotifier(t *testing.T) {
assert.True(t, Mobile.CanSend())
})
- t.Run("Mobile OnSave", func(t *testing.T) {
- _, err := Mobile.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("Mobile OnFailure", func(t *testing.T) {
_, err := Mobile.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/notifiers.go b/notifiers/notifiers.go
index d1a74a26..4ba59fb2 100644
--- a/notifiers/notifiers.go
+++ b/notifiers/notifiers.go
@@ -13,9 +13,9 @@ import (
var log = utils.Log.WithField("type", "notifier")
type replacer struct {
- Core core.Core
- Service services.Service
- Failure failures.Failure
+ Core *core.Core
+ Service *services.Service
+ Failure *failures.Failure
Custom map[string]string
}
@@ -59,8 +59,8 @@ func Add(notifs ...services.ServiceNotifier) {
}
}
-func ReplaceVars(input string, s services.Service, f failures.Failure) string {
- return ReplaceTemplate(input, replacer{Service: s, Failure: f, Core: *core.App})
+func ReplaceVars(input string, s *services.Service, f *failures.Failure) string {
+ return ReplaceTemplate(input, replacer{Service: s, Failure: f, Core: core.App})
}
var exampleFailure = &failures.Failure{
diff --git a/notifiers/pushover.go b/notifiers/pushover.go
index 623eb0fd..f480a3ad 100644
--- a/notifiers/pushover.go
+++ b/notifiers/pushover.go
@@ -41,7 +41,7 @@ var Pushover = &pushover{¬ifications.Notification{
Form: []notifications.NotificationForm{{
Type: "text",
Title: "User Token",
- Placeholder: "Insert your Pushover User Token",
+ Placeholder: "Insert your device's Pushover Token",
DbField: "api_key",
Required: true,
}, {
@@ -50,51 +50,16 @@ var Pushover = &pushover{¬ifications.Notification{
Placeholder: "Create an Application and insert the API Key here",
DbField: "api_secret",
Required: true,
- }, {
- Type: "list",
- Title: "Priority",
- Placeholder: "Set the notification priority level",
- DbField: "Var1",
- Required: true,
- ListOptions: []string{"Lowest", "Low", "Normal", "High", "Emergency"},
- }, {
- Type: "list",
- Title: "Notification Sound",
- Placeholder: "Choose a sound for this Pushover notification",
- DbField: "Var2",
- Required: true,
- ListOptions: []string{"none", "pushover", "bike", "bugle", "cashregister", "classical", "cosmic", "falling", "gamelan", "incoming", "intermissioon", "magic", "mechanical", "painobar", "siren", "spacealarm", "tugboat", "alien", "climb", "persistent", "echo", "updown"},
},
}},
}
-func priority(val string) string {
- switch strings.ToLower(val) {
- case "lowest":
- return "-2"
- case "low":
- return "-1"
- case "normal":
- return "0"
- case "high":
- return "1"
- case "emergency":
- return "2"
- default:
- return "0"
- }
-}
-
// Send will send a HTTP Post to the Pushover API. It accepts type: string
func (t *pushover) sendMessage(message string) (string, error) {
v := url.Values{}
v.Set("token", t.ApiSecret)
v.Set("user", t.ApiKey)
v.Set("message", message)
- v.Set("priority", priority(t.Var1))
- if t.Var2 != "" {
- v.Set("sound", t.Var2)
- }
rb := strings.NewReader(v.Encode())
content, _, err := utils.HttpRequest(pushoverUrl, "POST", "application/x-www-form-urlencoded", nil, rb, time.Duration(10*time.Second), true, nil)
@@ -105,15 +70,15 @@ func (t *pushover) sendMessage(message string) (string, error) {
}
// OnFailure will trigger failing service
-func (t *pushover) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (t *pushover) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
message := ReplaceVars(t.FailureData, s, f)
out, err := t.sendMessage(message)
return out, err
}
// OnSuccess will trigger successful service
-func (t *pushover) OnSuccess(s services.Service) (string, error) {
- message := ReplaceVars(t.SuccessData, s, failures.Failure{})
+func (t *pushover) OnSuccess(s *services.Service) (string, error) {
+ message := ReplaceVars(t.SuccessData, s, nil)
out, err := t.sendMessage(message)
return out, err
}
diff --git a/notifiers/pushover_test.go b/notifiers/pushover_test.go
index aea799c0..58a52ddd 100644
--- a/notifiers/pushover_test.go
+++ b/notifiers/pushover_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -29,7 +28,6 @@ func TestPushoverNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
if PUSHOVER_TOKEN == "" || PUSHOVER_API == "" {
t.Log("Pushover notifier testing skipped, missing PUSHOVER_TOKEN and PUSHOVER_API environment variable")
@@ -39,8 +37,6 @@ func TestPushoverNotifier(t *testing.T) {
t.Run("Load Pushover", func(t *testing.T) {
Pushover.ApiKey = PUSHOVER_TOKEN
Pushover.ApiSecret = PUSHOVER_API
- Pushover.Var1 = "Normal"
- Pushover.Var2 = "vibrate"
Pushover.Enabled = null.NewNullBool(true)
Add(Pushover)
@@ -54,11 +50,6 @@ func TestPushoverNotifier(t *testing.T) {
assert.True(t, Pushover.CanSend())
})
- t.Run("Pushover OnSave", func(t *testing.T) {
- _, err := Pushover.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("Pushover OnFailure", func(t *testing.T) {
_, err := Pushover.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/slack.go b/notifiers/slack.go
index 8b1bfdd7..3c9eae3a 100644
--- a/notifiers/slack.go
+++ b/notifiers/slack.go
@@ -61,7 +61,7 @@ func (s *slack) sendSlack(msg string) (string, error) {
func (s *slack) OnTest() (string, error) {
example := services.Example(true)
- testMsg := ReplaceVars(s.SuccessData, example, failures.Failure{})
+ testMsg := ReplaceVars(s.SuccessData, example, nil)
contents, resp, err := utils.HttpRequest(s.Host, "POST", "application/json", nil, bytes.NewBuffer([]byte(testMsg)), time.Duration(10*time.Second), true, nil)
if err != nil {
return "", err
@@ -74,15 +74,15 @@ func (s *slack) OnTest() (string, error) {
}
// OnFailure will trigger failing service
-func (s *slack) OnFailure(srv services.Service, f failures.Failure) (string, error) {
+func (s *slack) OnFailure(srv *services.Service, f *failures.Failure) (string, error) {
msg := ReplaceVars(s.FailureData, srv, f)
out, err := s.sendSlack(msg)
return out, err
}
// OnSuccess will trigger successful service
-func (s *slack) OnSuccess(srv services.Service) (string, error) {
- msg := ReplaceVars(s.SuccessData, srv, failures.Failure{})
+func (s *slack) OnSuccess(srv *services.Service) (string, error) {
+ msg := ReplaceVars(s.SuccessData, srv, nil)
out, err := s.sendSlack(msg)
return out, err
}
diff --git a/notifiers/slack_test.go b/notifiers/slack_test.go
index cc05def5..ea21a093 100644
--- a/notifiers/slack_test.go
+++ b/notifiers/slack_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -25,7 +24,6 @@ func TestSlackNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
SLACK_URL = utils.Params.GetString("SLACK_URL")
slacker.Host = SLACK_URL
@@ -50,11 +48,6 @@ func TestSlackNotifier(t *testing.T) {
assert.True(t, ok)
})
- t.Run("slack OnSave", func(t *testing.T) {
- _, err := slacker.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("slack OnFailure", func(t *testing.T) {
_, err := slacker.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/statping_emailer.go b/notifiers/statping_emailer.go
index 81208f20..444ee92c 100644
--- a/notifiers/statping_emailer.go
+++ b/notifiers/statping_emailer.go
@@ -60,17 +60,17 @@ func (s *statpingEmailer) OnTest() (string, error) {
}
type statpingMail struct {
- Email string `json:"email"`
- Core core.Core `json:"core,omitempty"`
- Service services.Service `json:"service,omitempty"`
- Failure failures.Failure `json:"failure,omitempty"`
+ Email string `json:"email"`
+ Core *core.Core `json:"core,omitempty"`
+ Service *services.Service `json:"service,omitempty"`
+ Failure *failures.Failure `json:"failure,omitempty"`
}
// OnFailure will trigger failing service
-func (s *statpingEmailer) OnFailure(srv services.Service, f failures.Failure) (string, error) {
+func (s *statpingEmailer) OnFailure(srv *services.Service, f *failures.Failure) (string, error) {
ee := statpingMail{
Email: s.Host,
- Core: *core.App,
+ Core: core.App,
Service: srv,
Failure: f,
}
@@ -78,12 +78,12 @@ func (s *statpingEmailer) OnFailure(srv services.Service, f failures.Failure) (s
}
// OnSuccess will trigger successful service
-func (s *statpingEmailer) OnSuccess(srv services.Service) (string, error) {
+func (s *statpingEmailer) OnSuccess(srv *services.Service) (string, error) {
ee := statpingMail{
Email: s.Host,
- Core: *core.App,
+ Core: core.App,
Service: srv,
- Failure: failures.Failure{},
+ Failure: nil,
}
return s.sendStatpingEmail(ee)
}
@@ -92,9 +92,9 @@ func (s *statpingEmailer) OnSuccess(srv services.Service) (string, error) {
func (s *statpingEmailer) OnSave() (string, error) {
ee := statpingMail{
Email: s.Host,
- Core: *core.App,
- Service: services.Service{},
- Failure: failures.Failure{},
+ Core: core.App,
+ Service: nil,
+ Failure: nil,
}
out, err := s.sendStatpingEmail(ee)
log.Println("statping emailer response", out)
diff --git a/notifiers/statping_emailer_test.go b/notifiers/statping_emailer_test.go
index 76ebf05f..7155cf24 100644
--- a/notifiers/statping_emailer_test.go
+++ b/notifiers/statping_emailer_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -25,7 +24,6 @@ func TestStatpingEmailerNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
testEmail = utils.Params.GetString("TEST_EMAIL")
statpingMailer.Host = testEmail
@@ -50,11 +48,6 @@ func TestStatpingEmailerNotifier(t *testing.T) {
assert.True(t, ok)
})
- t.Run("statping emailer OnSave", func(t *testing.T) {
- _, err := statpingMailer.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("statping emailer OnFailure", func(t *testing.T) {
_, err := statpingMailer.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/telegram.go b/notifiers/telegram.go
index 8af363b5..bd53cb29 100644
--- a/notifiers/telegram.go
+++ b/notifiers/telegram.go
@@ -45,9 +45,9 @@ var Telegram = &telegram{¬ifications.Notification{
Required: true,
}, {
Type: "text",
- Title: "Channel",
+ Title: "Channel or User",
Placeholder: "@statping_channel",
- SmallText: "Insert your Telegram Channel including the @ symbol. The bot will need to be an administrator of this channel.",
+ SmallText: "Insert your Telegram Channel or User here.",
DbField: "var1",
Required: true,
}}},
@@ -60,8 +60,9 @@ func (t *telegram) sendMessage(message string) (string, error) {
v := url.Values{}
v.Set("chat_id", t.Var1)
v.Set("text", message)
+ rb := *strings.NewReader(v.Encode())
- contents, _, err := utils.HttpRequest(apiEndpoint, "POST", "application/x-www-form-urlencoded", nil, strings.NewReader(v.Encode()), time.Duration(10*time.Second), true, nil)
+ contents, _, err := utils.HttpRequest(apiEndpoint, "GET", "application/x-www-form-urlencoded", nil, &rb, time.Duration(10*time.Second), true, nil)
success, _ := telegramSuccess(contents)
if !success {
@@ -73,29 +74,29 @@ func (t *telegram) sendMessage(message string) (string, error) {
}
// OnFailure will trigger failing service
-func (t *telegram) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (t *telegram) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
msg := ReplaceVars(t.FailureData, s, f)
out, err := t.sendMessage(msg)
return out, err
}
// OnSuccess will trigger successful service
-func (t *telegram) OnSuccess(s services.Service) (string, error) {
- msg := ReplaceVars(t.SuccessData, s, failures.Failure{})
+func (t *telegram) OnSuccess(s *services.Service) (string, error) {
+ msg := ReplaceVars(t.SuccessData, s, nil)
out, err := t.sendMessage(msg)
return out, err
}
// OnTest will test the Twilio SMS messaging
func (t *telegram) OnTest() (string, error) {
- msg := fmt.Sprintf("Testing the Telegram Notifier on your Statping server")
- return t.sendMessage(msg)
+ msg := fmt.Sprintf("Testing the Twilio SMS Notifier on your Statping server")
+ content, err := t.sendMessage(msg)
+ return content, err
}
// OnSave will trigger when this notifier is saved
func (t *telegram) OnSave() (string, error) {
- msg := fmt.Sprintf("The Telegram Notifier on your Statping server was just saved")
- return t.sendMessage(msg)
+ return "", nil
}
func telegramSuccess(res []byte) (bool, telegramResponse) {
diff --git a/notifiers/telegram_test.go b/notifiers/telegram_test.go
index b7895975..571dbd0b 100644
--- a/notifiers/telegram_test.go
+++ b/notifiers/telegram_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -32,7 +31,6 @@ func TestTelegramNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
if telegramToken == "" || telegramChannel == "" {
t.Log("Telegram notifier testing skipped, missing TELEGRAM_TOKEN and TELEGRAM_CHANNEL environment variable")
@@ -56,11 +54,6 @@ func TestTelegramNotifier(t *testing.T) {
assert.True(t, Telegram.CanSend())
})
- t.Run("Telegram OnSave", func(t *testing.T) {
- _, err := Telegram.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("Telegram OnFailure", func(t *testing.T) {
_, err := Telegram.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/twilio.go b/notifiers/twilio.go
index ec46d21a..da4272f3 100644
--- a/notifiers/twilio.go
+++ b/notifiers/twilio.go
@@ -50,13 +50,13 @@ var Twilio = &twilio{¬ifications.Notification{
DbField: "api_secret",
Required: true,
}, {
- Type: "number",
+ Type: "text",
Title: "SMS to Phone Number",
Placeholder: "18555555555",
DbField: "Var1",
Required: true,
}, {
- Type: "number",
+ Type: "text",
Title: "From Phone Number",
Placeholder: "18555555555",
DbField: "Var2",
@@ -90,14 +90,14 @@ func (t *twilio) sendMessage(message string) (string, error) {
}
// OnFailure will trigger failing service
-func (t *twilio) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (t *twilio) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
msg := ReplaceVars(t.FailureData, s, f)
return t.sendMessage(msg)
}
// OnSuccess will trigger successful service
-func (t *twilio) OnSuccess(s services.Service) (string, error) {
- msg := ReplaceVars(t.SuccessData, s, failures.Failure{})
+func (t *twilio) OnSuccess(s *services.Service) (string, error) {
+ msg := ReplaceVars(t.SuccessData, s, nil)
return t.sendMessage(msg)
}
diff --git a/notifiers/twilio_test.go b/notifiers/twilio_test.go
index f7195811..d12a8bfe 100644
--- a/notifiers/twilio_test.go
+++ b/notifiers/twilio_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -30,7 +29,6 @@ func TestTwilioNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
if TWILIO_SID == "" || TWILIO_SECRET == "" {
t.Log("twilio notifier testing skipped, missing TWILIO_SID and TWILIO_SECRET environment variable")
@@ -56,11 +54,6 @@ func TestTwilioNotifier(t *testing.T) {
assert.True(t, Twilio.CanSend())
})
- t.Run("Twilio OnSave", func(t *testing.T) {
- _, err := Twilio.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("Twilio OnFailure", func(t *testing.T) {
_, err := Twilio.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/notifiers/webhook.go b/notifiers/webhook.go
index 8f3d520c..30a43b6e 100644
--- a/notifiers/webhook.go
+++ b/notifiers/webhook.go
@@ -31,9 +31,9 @@ var Webhook = &webhooker{¬ifications.Notification{
Author: "Hunter Long",
AuthorUrl: "https://github.com/hunterlong",
Icon: "fas fa-code-branch",
- Delay: time.Duration(3 * time.Second),
- SuccessData: `{"id": "{{.Service.Id}}", "online": true}`,
- FailureData: `{"id": "{{.Service.Id}}", "online": false}`,
+ Delay: time.Duration(1 * time.Second),
+ SuccessData: `{"id": {{.Service.Id}}, "online": true}`,
+ FailureData: `{"id": {{.Service.Id}}, "online": false}`,
DataType: "json",
Limits: 180,
Form: []notifications.NotificationForm{{
@@ -44,13 +44,12 @@ var Webhook = &webhooker{¬ifications.Notification{
DbField: "Host",
Required: true,
}, {
- Type: "list",
+ Type: "text",
Title: "HTTP Method",
Placeholder: "POST",
SmallText: "Choose a HTTP method for example: GET, POST, DELETE, or PATCH.",
DbField: "Var1",
Required: true,
- ListOptions: []string{"GET", "POST", "PATCH", "DELETE"},
}, {
Type: "text",
Title: "Content Type",
@@ -83,7 +82,8 @@ func (w *webhooker) sendHttpWebhook(body string) (*http.Response, error) {
utils.Log.Infoln(fmt.Sprintf("sending body: '%v' to %v as a %v request", body, w.Host, w.Var1))
client := new(http.Client)
client.Timeout = time.Duration(10 * time.Second)
- buf := bytes.NewBuffer(nil)
+ var buf *bytes.Buffer
+ buf = bytes.NewBuffer(nil)
if w.Var2 != "" {
buf = bytes.NewBuffer([]byte(body))
}
@@ -102,7 +102,6 @@ func (w *webhooker) sendHttpWebhook(body string) (*http.Response, error) {
req.Header.Add("Content-Type", w.ApiKey)
}
req.Header.Set("User-Agent", "Statping")
- req.Header.Set("Statping-Version", utils.Version)
resp, err := client.Do(req)
if err != nil {
return nil, err
@@ -127,7 +126,7 @@ func (w *webhooker) OnTest() (string, error) {
}
// OnFailure will trigger failing service
-func (w *webhooker) OnFailure(s services.Service, f failures.Failure) (string, error) {
+func (w *webhooker) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
msg := ReplaceVars(w.FailureData, s, f)
resp, err := w.sendHttpWebhook(msg)
if err != nil {
@@ -139,8 +138,8 @@ func (w *webhooker) OnFailure(s services.Service, f failures.Failure) (string, e
}
// OnSuccess will trigger successful service
-func (w *webhooker) OnSuccess(s services.Service) (string, error) {
- msg := ReplaceVars(w.SuccessData, s, failures.Failure{})
+func (w *webhooker) OnSuccess(s *services.Service) (string, error) {
+ msg := ReplaceVars(w.SuccessData, s, nil)
resp, err := w.sendHttpWebhook(msg)
if err != nil {
return "", err
diff --git a/notifiers/webhook_test.go b/notifiers/webhook_test.go
index bb70d8bc..eb5fcbfa 100644
--- a/notifiers/webhook_test.go
+++ b/notifiers/webhook_test.go
@@ -2,7 +2,6 @@ package notifiers
import (
"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"
@@ -28,7 +27,6 @@ func TestWebhookNotifier(t *testing.T) {
require.Nil(t, err)
db.AutoMigrate(¬ifications.Notification{})
notifications.SetDB(db)
- core.Example()
t.Run("Load webhooker", func(t *testing.T) {
Webhook.Host = webhookTestUrl
@@ -48,11 +46,6 @@ func TestWebhookNotifier(t *testing.T) {
assert.True(t, Webhook.CanSend())
})
- t.Run("webhooker OnSave", func(t *testing.T) {
- _, err := Webhook.OnSave()
- assert.Nil(t, err)
- })
-
t.Run("webhooker OnFailure", func(t *testing.T) {
_, err := Webhook.OnFailure(services.Example(false), failures.Example())
assert.Nil(t, err)
diff --git a/types/configs/configs_form.go b/types/configs/configs_form.go
index a2c9da12..6de6c5d7 100644
--- a/types/configs/configs_form.go
+++ b/types/configs/configs_form.go
@@ -43,9 +43,6 @@ func LoadConfigForm(r *http.Request) (*DbConfig, error) {
p.Set("DESCRIPTION", description)
p.Set("LANGUAGE", language)
p.Set("ALLOW_REPORTS", reports)
- p.Set("ADMIN_USER", username)
- p.Set("ADMIN_PASSWORD", password)
- p.Set("ADMIN_EMAIL", email)
confg := &DbConfig{
DbConn: dbConn,
diff --git a/types/configs/connection.go b/types/configs/connection.go
index 92b632a5..c32c4fe2 100644
--- a/types/configs/connection.go
+++ b/types/configs/connection.go
@@ -75,9 +75,10 @@ func initModels(db database.Database) {
}
func CreateAdminUser(c *DbConfig) error {
+ log.Infoln(fmt.Sprintf("Default Admininstrator user does not exist, creating now! (admin/admin)"))
+
adminUser := utils.Params.GetString("ADMIN_USER")
adminPass := utils.Params.GetString("ADMIN_PASSWORD")
- adminEmail := utils.Params.GetString("ADMIN_EMAIL")
if adminUser == "" || adminPass == "" {
adminUser = "admin"
@@ -87,7 +88,7 @@ func CreateAdminUser(c *DbConfig) error {
admin := &users.User{
Username: adminUser,
Password: adminPass,
- Email: adminEmail,
+ Email: "info@admin.com",
Admin: null.NewNullBool(true),
}
diff --git a/types/core/samples.go b/types/core/samples.go
index 15810248..f11cb798 100644
--- a/types/core/samples.go
+++ b/types/core/samples.go
@@ -5,22 +5,6 @@ import (
"github.com/statping/statping/utils"
)
-func Example() *Core {
- core := &Core{
- Name: "Statping Testing",
- Description: "This is a instance that runs for tests",
- ApiSecret: "exampleapisecret",
- Domain: "http://localhost:8080",
- CreatedAt: utils.Now(),
- UseCdn: null.NewNullBool(false),
- Footer: null.NewNullString(""),
- MigrationId: utils.Now().Unix(),
- Language: "en",
- }
- App = core
- return App
-}
-
func Samples() error {
apiSecret := utils.Params.GetString("API_SECRET")
@@ -28,8 +12,6 @@ func Samples() error {
apiSecret = utils.RandomString(32)
}
- oauth := OAuth{Providers: "local"}
-
core := &Core{
Name: utils.Params.GetString("NAME"),
Description: utils.Params.GetString("DESCRIPTION"),
@@ -40,7 +22,6 @@ func Samples() error {
Footer: null.NewNullString(""),
MigrationId: utils.Now().Unix(),
Language: utils.Params.GetString("LANGUAGE"),
- OAuth: oauth,
}
return core.Create()
diff --git a/types/core/struct.go b/types/core/struct.go
index 88334f3b..6f52a482 100644
--- a/types/core/struct.go
+++ b/types/core/struct.go
@@ -43,24 +43,15 @@ type Core struct {
}
type OAuth struct {
- Providers string `gorm:"column:oauth_providers;" json:"oauth_providers"`
- GithubClientID string `gorm:"column:gh_client_id" json:"gh_client_id"`
- GithubClientSecret string `gorm:"column:gh_client_secret" json:"gh_client_secret" scope:"admin"`
- GithubUsers string `gorm:"column:gh_users" json:"gh_users" scope:"admin"`
- GithubOrgs string `gorm:"column:gh_orgs" json:"gh_orgs" scope:"admin"`
- GoogleClientID string `gorm:"column:google_client_id" json:"google_client_id"`
- GoogleClientSecret string `gorm:"column:google_client_secret" json:"google_client_secret" scope:"admin"`
- GoogleUsers string `gorm:"column:google_users" json:"google_users" scope:"admin"`
- SlackClientID string `gorm:"column:slack_client_id" json:"slack_client_id"`
- SlackClientSecret string `gorm:"column:slack_client_secret" json:"slack_client_secret" scope:"admin"`
- SlackTeam string `gorm:"column:slack_team" json:"slack_team" scope:"admin"`
- SlackUsers string `gorm:"column:slack_users" json:"slack_users" scope:"admin"`
- CustomName string `gorm:"column:custom_name" json:"custom_name"`
- CustomClientID string `gorm:"column:custom_client_id" json:"custom_client_id"`
- CustomClientSecret string `gorm:"column:custom_client_secret" json:"custom_client_secret" scope:"admin"`
- CustomEndpointAuth string `gorm:"column:custom_endpoint_auth" json:"custom_endpoint_auth"`
- CustomEndpointToken string `gorm:"column:custom_endpoint_token" json:"custom_endpoint_token" scope:"admin"`
- CustomScopes string `gorm:"column:custom_scopes" json:"custom_scopes"`
+ Domains string `gorm:"column:oauth_domains" json:"oauth_domains" scope:"admin"`
+ Providers string `gorm:"column:oauth_providers;" json:"oauth_providers"`
+ GithubClientID string `gorm:"column:gh_client_id" json:"gh_client_id"`
+ GithubClientSecret string `gorm:"column:gh_client_secret" json:"gh_client_secret" scope:"admin"`
+ GoogleClientID string `gorm:"column:google_client_id" json:"google_client_id"`
+ GoogleClientSecret string `gorm:"column:google_client_secret" json:"google_client_secret" scope:"admin"`
+ SlackClientID string `gorm:"column:slack_client_id" json:"slack_client_id"`
+ SlackClientSecret string `gorm:"column:slack_client_secret" json:"slack_client_secret" scope:"admin"`
+ SlackTeam string `gorm:"column:slack_team" json:"slack_team"`
}
// AllNotifiers contains all the Notifiers loaded
diff --git a/types/failures/database.go b/types/failures/database.go
index e3aad286..e2cd7d1b 100644
--- a/types/failures/database.go
+++ b/types/failures/database.go
@@ -28,6 +28,7 @@ func (f *Failure) AfterDelete() {
}
func (f *Failure) AfterCreate() {
+ metrics.Inc("failure", f.Service)
metrics.Query("failure", "create")
}
diff --git a/types/failures/samples.go b/types/failures/samples.go
index cd03f296..57fa4737 100644
--- a/types/failures/samples.go
+++ b/types/failures/samples.go
@@ -12,8 +12,8 @@ var (
log = utils.Log.WithField("type", "failure")
)
-func Example() Failure {
- return Failure{
+func Example() *Failure {
+ return &Failure{
Id: 48533,
Issue: "Response did not response a 200 status code",
Method: "",
diff --git a/types/hits/database.go b/types/hits/database.go
index 5c3ce19f..3268279f 100644
--- a/types/hits/database.go
+++ b/types/hits/database.go
@@ -27,6 +27,7 @@ func (h *Hit) AfterDelete() {
}
func (h *Hit) AfterCreate() {
+ metrics.Inc("success", h.Service)
metrics.Query("hit", "create")
}
diff --git a/types/metrics/services.go b/types/metrics/services.go
index a0b43439..24f5908b 100644
--- a/types/metrics/services.go
+++ b/types/metrics/services.go
@@ -10,7 +10,7 @@ var (
Name: "service_online",
Help: "If service is online",
},
- []string{"service", "type"},
+ []string{"service", "name", "type"},
)
// service failures
diff --git a/types/notifications/methods.go b/types/notifications/methods.go
index b17b12ea..71c82337 100644
--- a/types/notifications/methods.go
+++ b/types/notifications/methods.go
@@ -7,15 +7,16 @@ import (
"time"
)
-func (n Notification) Name() string {
+func (n *Notification) Name() string {
newName := strings.ToLower(n.Method)
newName = strings.ReplaceAll(newName, " ", "_")
return newName
}
// LastSent returns a time.Duration of the last sent notification for the notifier
-func (n Notification) LastSent() time.Duration {
- return time.Since(n.lastSent)
+func (n *Notification) LastSent() time.Duration {
+ since := time.Since(n.lastSent)
+ return since
}
func (n *Notification) CanSend() bool {
diff --git a/types/notifier/interface.go b/types/notifier/interface.go
index 2f84d2d0..405bb927 100644
--- a/types/notifier/interface.go
+++ b/types/notifier/interface.go
@@ -7,8 +7,8 @@ import (
// Notifier interface is required to create a new Notifier
type Notifier interface {
- OnSuccess(services.Service) (string, error) // OnSuccess is triggered when a service is successful
- OnFailure(services.Service, failures.Failure) (string, error) // OnFailure is triggered when a service is failing
- OnTest() (string, error) // OnTest is triggered for testing
- OnSave() (string, error) // OnSave is triggered for when saved
+ OnSuccess(*services.Service) (string, error) // OnSuccess is triggered when a service is successful
+ OnFailure(*services.Service, *failures.Failure) (string, error) // OnFailure is triggered when a service is failing
+ OnTest() (string, error) // OnTest is triggered for testing
+ OnSave() (string, error) // OnSave is triggered for when saved
}
diff --git a/types/services/failures.go b/types/services/failures.go
index 36027249..d670f58a 100644
--- a/types/services/failures.go
+++ b/types/services/failures.go
@@ -20,14 +20,15 @@ func (s *Service) FailuresSince(t time.Time) failures.Failurer {
return failures.Since(t, s)
}
-func (s Service) DowntimeAgo() string {
- if s.LastOnline.IsZero() {
+func (s *Service) DowntimeAgo() string {
+ last := s.LastOnline
+ if last.IsZero() {
return "Never been online"
}
- return humanize.Time(s.LastOnline)
+ return humanize.Time(last)
}
-func (s Service) DowntimeText() string {
+func (s *Service) DowntimeText() string {
last := s.AllFailures().Last()
if last == nil {
return ""
diff --git a/types/services/methods.go b/types/services/methods.go
index 54ee3bff..60132b72 100644
--- a/types/services/methods.go
+++ b/types/services/methods.go
@@ -61,12 +61,12 @@ func (s *Service) LoadTLSCert() (*tls.Config, error) {
return config, nil
}
-func (s Service) Duration() time.Duration {
+func (s *Service) Duration() time.Duration {
return time.Duration(s.Interval) * time.Second
}
// Start will create a channel for the service checking go routine
-func (s Service) UptimeData(hits []*hits.Hit, fails []*failures.Failure) (*UptimeSeries, error) {
+func (s *Service) UptimeData(hits []*hits.Hit, fails []*failures.Failure) (*UptimeSeries, error) {
if len(hits) == 0 {
return nil, errors.New("service does not have any successful hits")
}
@@ -291,12 +291,12 @@ func (s *Service) UpdateStats() *Service {
}
// AvgTime will return the average amount of time for a service to response back successfully
-func (s Service) AvgTime() int64 {
+func (s *Service) AvgTime() int64 {
return s.AllHits().Avg()
}
// OnlineDaysPercent returns the service's uptime percent within last 24 hours
-func (s Service) OnlineDaysPercent(days int) float32 {
+func (s *Service) OnlineDaysPercent(days int) float32 {
ago := utils.Now().Add(-time.Duration(days) * types.Day)
return s.OnlineSince(ago)
}
@@ -326,12 +326,12 @@ func (s *Service) OnlineSince(ago time.Time) float32 {
return s.Online24Hours
}
-func (s Service) Uptime() utils.Duration {
+func (s *Service) Uptime() utils.Duration {
return utils.Duration{Duration: utils.Now().Sub(s.LastOffline)}
}
// Downtime returns the amount of time of a offline service
-func (s Service) Downtime() utils.Duration {
+func (s *Service) Downtime() utils.Duration {
return utils.Duration{Duration: utils.Now().Sub(s.LastOnline)}
}
diff --git a/types/services/notifier.go b/types/services/notifier.go
index a51b9a62..5a822078 100644
--- a/types/services/notifier.go
+++ b/types/services/notifier.go
@@ -26,9 +26,9 @@ func FindNotifier(method string) *notifications.Notification {
}
type ServiceNotifier interface {
- OnSuccess(Service) (string, error) // OnSuccess is triggered when a service is successful
- OnFailure(Service, failures.Failure) (string, error) // OnFailure is triggered when a service is failing
- OnTest() (string, error) // OnTest is triggered for testing
- OnSave() (string, error) // OnSave is triggered for testing
- Select() *notifications.Notification // OnTest is triggered for testing
+ OnSuccess(*Service) (string, error) // OnSuccess is triggered when a service is successful
+ OnFailure(*Service, *failures.Failure) (string, error) // OnFailure is triggered when a service is failing
+ OnTest() (string, error) // OnTest is triggered for testing
+ OnSave() (string, error) // OnSave is triggered for testing
+ Select() *notifications.Notification // OnTest is triggered for testing
}
diff --git a/types/services/routine.go b/types/services/routine.go
index db70dea0..3162d641 100644
--- a/types/services/routine.go
+++ b/types/services/routine.go
@@ -88,7 +88,7 @@ func isIPv6(address string) bool {
// checkIcmp will send a ICMP ping packet to the service
func CheckIcmp(s *Service, record bool) (*Service, error) {
defer s.updateLastCheck()
- timer := prometheus.NewTimer(metrics.ServiceTimer(s.Name))
+ timer := prometheus.NewTimer(metrics.ServiceTimer(s.Id))
defer timer.ObserveDuration()
if err := utils.Ping(s.Domain, s.Timeout); err != nil {
@@ -105,7 +105,7 @@ func CheckIcmp(s *Service, record bool) (*Service, error) {
// CheckGrpc will check a gRPC service
func CheckGrpc(s *Service, record bool) (*Service, error) {
defer s.updateLastCheck()
- timer := prometheus.NewTimer(metrics.ServiceTimer(s.Name))
+ timer := prometheus.NewTimer(metrics.ServiceTimer(s.Id))
defer timer.ObserveDuration()
dnsLookup, err := dnsCheck(s)
@@ -152,7 +152,7 @@ func CheckGrpc(s *Service, record bool) (*Service, error) {
// checkTcp will check a TCP service
func CheckTcp(s *Service, record bool) (*Service, error) {
defer s.updateLastCheck()
- timer := prometheus.NewTimer(metrics.ServiceTimer(s.Name))
+ timer := prometheus.NewTimer(metrics.ServiceTimer(s.Id))
defer timer.ObserveDuration()
dnsLookup, err := dnsCheck(s)
@@ -219,7 +219,7 @@ func (s *Service) updateLastCheck() {
// checkHttp will check a HTTP service
func CheckHttp(s *Service, record bool) (*Service, error) {
defer s.updateLastCheck()
- timer := prometheus.NewTimer(metrics.ServiceTimer(s.Name))
+ timer := prometheus.NewTimer(metrics.ServiceTimer(s.Id))
defer timer.ObserveDuration()
dnsLookup, err := dnsCheck(s)
@@ -285,7 +285,7 @@ func CheckHttp(s *Service, record bool) (*Service, error) {
s.LastResponse = string(content)
s.LastStatusCode = res.StatusCode
- metrics.Gauge("status_code", float64(res.StatusCode), s.Name)
+ metrics.Gauge("status_code", float64(res.StatusCode), s.Id)
if s.Expected.String != "" {
match, err := regexp.MatchString(s.Expected.String, string(content))
@@ -329,8 +329,7 @@ func recordSuccess(s *Service) {
fmt.Sprintf("Service #%d '%v' Successful Response: %s | Lookup in: %s | Online: %v | Interval: %d seconds", s.Id, s.Name, humanMicro(hit.Latency), humanMicro(hit.PingTime), s.Online, s.Interval))
s.LastLookupTime = hit.PingTime
s.LastLatency = hit.Latency
- metrics.Gauge("online", 1., s.Name, s.Type)
- metrics.Inc("success", s.Name)
+ metrics.Gauge("online", 1., s.Id, s.Name, s.Type)
sendSuccess(s)
s.SuccessNotified = true
}
@@ -353,7 +352,7 @@ func sendSuccess(s *Service) {
notif := n.Select()
if notif.CanSend() {
log.Infof("Sending notification to: %s!", notif.Method)
- if _, err := n.OnSuccess(*s); err != nil {
+ if _, err := n.OnSuccess(s); err != nil {
notif.Logger().Errorln(err)
}
s.UserNotified = true
@@ -384,8 +383,7 @@ func recordFailure(s *Service, issue string) {
s.Online = false
s.SuccessNotified = false
s.DownText = s.DowntimeText()
- metrics.Gauge("online", 0., s.Name, s.Type)
- metrics.Inc("failure", s.Name)
+ metrics.Gauge("online", 0., s.Id, s.Name, s.Type)
sendFailure(s, fail)
}
@@ -405,7 +403,7 @@ func sendFailure(s *Service, f *failures.Failure) {
notif := n.Select()
if notif.CanSend() {
log.Infof("Sending Failure notification to: %s!", notif.Method)
- if _, err := n.OnFailure(*s, *f); err != nil {
+ if _, err := n.OnFailure(s, f); err != nil {
notif.Logger().WithField("failure", f.Issue).Errorln(err)
}
s.UserNotified = true
diff --git a/types/services/samples.go b/types/services/samples.go
index c979ac8c..aaed0904 100644
--- a/types/services/samples.go
+++ b/types/services/samples.go
@@ -6,8 +6,8 @@ import (
"time"
)
-func Example(online bool) Service {
- return Service{
+func Example(online bool) *Service {
+ return &Service{
Id: 6283,
Name: "Statping Example",
Domain: "https://statping.com",
diff --git a/utils/env.go b/utils/env.go
index 3e54141c..295760c9 100644
--- a/utils/env.go
+++ b/utils/env.go
@@ -24,7 +24,7 @@ func InitEnvs() {
Log.Errorln(err)
defaultDir = "."
}
- Params.Set("VERSION", Version)
+ Params.Set("VERSION", version)
Params.SetDefault("DISABLE_HTTP", false)
Params.SetDefault("STATPING_DIR", defaultDir)
Params.SetDefault("GO_ENV", "production")
@@ -35,7 +35,6 @@ func InitEnvs() {
Params.SetDefault("BASE_PATH", "")
Params.SetDefault("ADMIN_USER", "admin")
Params.SetDefault("ADMIN_PASSWORD", "admin")
- Params.SetDefault("ADMIN_EMAIL", "info@admin.com")
Params.SetDefault("MAX_OPEN_CONN", 25)
Params.SetDefault("MAX_IDLE_CONN", 25)
Params.SetDefault("MAX_LIFE_CONN", 5*time.Minute)
diff --git a/utils/log.go b/utils/log.go
index 35da0913..a6aaf5ea 100644
--- a/utils/log.go
+++ b/utils/log.go
@@ -21,7 +21,7 @@ var (
LastLines []*logRow
LockLines sync.Mutex
VerboseMode int
- Version string
+ version string
allowReports bool
)
@@ -36,7 +36,7 @@ func SentryInit(v *string, allow bool) {
if *v == "" {
*v = "development"
}
- Version = *v
+ version = *v
}
goEnv := Params.GetString("GO_ENV")
allowReports := Params.GetBool("ALLOW_REPORTS")
@@ -44,7 +44,7 @@ func SentryInit(v *string, allow bool) {
if err := sentry.Init(sentry.ClientOptions{
Dsn: errorReporter,
Environment: goEnv,
- Release: Version,
+ Release: version,
AttachStacktrace: true,
}); err != nil {
Log.Errorln(err)
@@ -63,7 +63,7 @@ func SentryErr(err error) {
func SentryLogEntry(entry *Logger.Entry) {
e := sentry.NewEvent()
e.Message = entry.Message
- e.Release = Version
+ e.Release = version
e.Contexts = entry.Data
sentry.CaptureEvent(e)
}
diff --git a/utils/utils.go b/utils/utils.go
index 353c4be7..bd293b37 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -217,10 +217,6 @@ func HttpRequest(url, method string, content interface{}, headers []string, body
}
}
}
-
- req.Header.Set("User-Agent", "Statping")
- req.Header.Set("Statping-Version", Version)
-
var resp *http.Response
dialer := &net.Dialer{
diff --git a/version.txt b/version.txt
index 2e31fdc9..74094774 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-0.90.56
+0.90.55