diff --git a/core/checker.go b/core/checker.go
index 628b5049..bf08bcca 100644
--- a/core/checker.go
+++ b/core/checker.go
@@ -21,7 +21,7 @@ func CheckServices() {
for _, ser := range CoreApp.Services {
s := ser.ToService()
//go obj.StartCheckins()
- s.StopRoutine = make(chan struct{})
+ s.Start()
go CheckQueue(s)
}
}
@@ -32,6 +32,7 @@ func CheckQueue(s *types.Service) {
case <-s.StopRoutine:
return
default:
+ s = SelectService(s.Id).ToService()
ServiceCheck(s)
}
time.Sleep(time.Duration(s.Interval) * time.Second)
diff --git a/core/services.go b/core/services.go
index 0194d296..6f96f1d0 100644
--- a/core/services.go
+++ b/core/services.go
@@ -220,16 +220,17 @@ func DeleteService(u *types.Service) error {
return err
}
-func UpdateService(u *types.Service) *types.Service {
- u.CreatedAt = time.Now()
- res := serviceCol().Find("id", u.Id)
- err := res.Update(u)
+func UpdateService(service *types.Service) *types.Service {
+ service.CreatedAt = time.Now()
+ res := serviceCol().Find("id", service.Id)
+ err := res.Update(service)
if err != nil {
- utils.Log(3, fmt.Sprintf("Failed to update service %v. %v", u.Name, err))
+ utils.Log(3, fmt.Sprintf("Failed to update service %v. %v", service.Name, err))
+ return service
}
- updateService(u)
- OnUpdateService(u)
- return u
+ CoreApp.Services, _ = SelectAllServices()
+ OnUpdateService(service)
+ return service
}
func updateService(u *types.Service) {
@@ -251,7 +252,7 @@ func CreateService(u *types.Service) (int64, error) {
return 0, err
}
u.Id = uuid.(int64)
- u.StopRoutine = make(chan struct{})
+ u.StopRoutine = make(chan bool)
CoreApp.Services = append(CoreApp.Services, &Service{u})
return uuid.(int64), err
}
diff --git a/handlers/handlers_test.go b/handlers/handlers_test.go
index 930d44a9..9d2408fb 100644
--- a/handlers/handlers_test.go
+++ b/handlers/handlers_test.go
@@ -1,6 +1,7 @@
package handlers
import (
+ "fmt"
"github.com/hunterlong/statup/core"
"github.com/hunterlong/statup/source"
"github.com/hunterlong/statup/utils"
@@ -8,6 +9,7 @@ import (
"net/http"
"net/http/httptest"
"net/url"
+ "os"
"strings"
"testing"
)
@@ -17,6 +19,25 @@ func init() {
source.Assets()
}
+func IsRouteAuthenticated(req *http.Request) bool {
+ os.Setenv("GO_ENV", "production")
+ req, err := http.NewRequest(req.Method, req.URL.String(), req.Body)
+ if err != nil {
+ os.Setenv("GO_ENV", "test")
+ return false
+ }
+ rr := httptest.NewRecorder()
+ Router().ServeHTTP(rr, req)
+ fmt.Println(req.URL.String(), rr.Code)
+ code := rr.Code
+ if code != 303 {
+ os.Setenv("GO_ENV", "test")
+ return false
+ }
+ os.Setenv("GO_ENV", "test")
+ return true
+}
+
func TestIndexHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/", nil)
assert.Nil(t, err)
@@ -152,6 +173,7 @@ func TestServicesHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "
Statup | Services")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestCreateUserHandler(t *testing.T) {
@@ -166,6 +188,7 @@ func TestCreateUserHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestEditUserHandler(t *testing.T) {
@@ -183,6 +206,7 @@ func TestEditUserHandler(t *testing.T) {
assert.Contains(t, body, "admin | ")
assert.Contains(t, body, "changedusername | ")
assert.Equal(t, 200, rr.Code)
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestDeleteUserHandler(t *testing.T) {
@@ -191,6 +215,7 @@ func TestDeleteUserHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestUsersHandler(t *testing.T) {
@@ -204,6 +229,7 @@ func TestUsersHandler(t *testing.T) {
assert.Contains(t, body, "admin | ")
assert.NotContains(t, body, "changedusername | ")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestUsersEditHandler(t *testing.T) {
@@ -218,6 +244,7 @@ func TestUsersEditHandler(t *testing.T) {
assert.Contains(t, body, "value=\"info@statup.io\"")
assert.Contains(t, body, "value=\"##########\"")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestSettingsHandler(t *testing.T) {
@@ -229,6 +256,7 @@ func TestSettingsHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "Statup | Settings")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestHelpHandler(t *testing.T) {
@@ -240,6 +268,7 @@ func TestHelpHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "Statup | Help")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestCreateHTTPServiceHandler(t *testing.T) {
@@ -259,7 +288,8 @@ func TestCreateHTTPServiceHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestCreateTCPerviceHandler(t *testing.T) {
@@ -279,7 +309,8 @@ func TestCreateTCPerviceHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestServicesHandler2(t *testing.T) {
@@ -293,6 +324,7 @@ func TestServicesHandler2(t *testing.T) {
assert.Contains(t, body, "Crystal Castles - Kept")
assert.Contains(t, body, "Local Postgres")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestViewHTTPServicesHandler(t *testing.T) {
@@ -322,7 +354,7 @@ func TestServicesDeleteFailuresHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
}
func TestServicesUpdateHandler(t *testing.T) {
@@ -352,7 +384,7 @@ func TestDeleteServiceHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
}
func TestLogsHandler(t *testing.T) {
@@ -388,7 +420,7 @@ func TestSaveSettingsHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
}
func TestViewSettingsHandler(t *testing.T) {
@@ -401,6 +433,7 @@ func TestViewSettingsHandler(t *testing.T) {
assert.Contains(t, body, "Statup | Settings")
assert.Contains(t, body, "Awesome Status")
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestSaveAssetsHandler(t *testing.T) {
@@ -408,7 +441,7 @@ func TestSaveAssetsHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
assert.FileExists(t, utils.Directory+"/assets/css/base.css")
assert.FileExists(t, utils.Directory+"/assets/js/main.js")
assert.DirExists(t, utils.Directory+"/assets")
@@ -420,7 +453,7 @@ func TestDeleteAssetsHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
assert.False(t, source.UsingAssets)
}
@@ -452,7 +485,7 @@ func TestSaveNotificationHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
- assert.Equal(t, 303, rr.Code)
+ assert.Equal(t, 200, rr.Code)
}
func TestViewNotificationSettingsHandler(t *testing.T) {
@@ -471,6 +504,7 @@ func TestViewNotificationSettingsHandler(t *testing.T) {
assert.Contains(t, body, `value="7" id="limits_per_hour_email"`)
assert.Contains(t, body, `id="switch-email" checked`)
assert.Contains(t, body, "Statup made with ❤️")
+ assert.True(t, IsRouteAuthenticated(req))
}
func TestError404Handler(t *testing.T) {
diff --git a/handlers/services.go b/handlers/services.go
index 8c9b0758..bac7517f 100644
--- a/handlers/services.go
+++ b/handlers/services.go
@@ -62,7 +62,7 @@ func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
go core.CheckQueue(service)
core.OnNewService(service)
- http.Redirect(w, r, "/services", http.StatusSeeOther)
+ ExecuteResponse(w, r, "services.html", core.CoreApp.Services)
}
func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
@@ -74,7 +74,7 @@ func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
serv := core.SelectService(utils.StringInt(vars["id"]))
service := serv.ToService()
core.DeleteService(service)
- http.Redirect(w, r, "/services", http.StatusSeeOther)
+ ExecuteResponse(w, r, "services.html", core.CoreApp.Services)
}
func ServicesViewHandler(w http.ResponseWriter, r *http.Request) {
@@ -120,6 +120,8 @@ func ServicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
Timeout: timeout,
}
service = core.UpdateService(serviceUpdate)
+ core.CoreApp.Services, _ = core.SelectAllServices()
+
serv = core.SelectService(service.Id)
ExecuteResponse(w, r, "service.html", serv)
}
@@ -134,7 +136,7 @@ func ServicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
service := serv.ToService()
core.DeleteFailures(service)
core.CoreApp.Services, _ = core.SelectAllServices()
- http.Redirect(w, r, "/services", http.StatusSeeOther)
+ ExecuteResponse(w, r, "services.html", core.CoreApp.Services)
}
func CheckinCreateUpdateHandler(w http.ResponseWriter, r *http.Request) {
diff --git a/handlers/settings.go b/handlers/settings.go
index cd33fa61..0b8fffce 100644
--- a/handlers/settings.go
+++ b/handlers/settings.go
@@ -47,7 +47,7 @@ func SaveSettingsHandler(w http.ResponseWriter, r *http.Request) {
core.CoreApp.UseCdn = (r.PostForm.Get("enable_cdn") == "on")
core.CoreApp, _ = core.UpdateCore(core.CoreApp)
core.OnSettingsSaved(core.CoreApp.ToCore())
- http.Redirect(w, r, "/settings", http.StatusSeeOther)
+ ExecuteResponse(w, r, "settings.html", core.CoreApp)
}
func SaveSASSHandler(w http.ResponseWriter, r *http.Request) {
@@ -61,7 +61,7 @@ func SaveSASSHandler(w http.ResponseWriter, r *http.Request) {
source.SaveAsset(theme, ".", "scss/base.scss")
source.SaveAsset(variables, ".", "scss/variables.scss")
source.CompileSASS(".")
- http.Redirect(w, r, "/settings", http.StatusSeeOther)
+ ExecuteResponse(w, r, "settings.html", core.CoreApp)
}
func SaveAssetsHandler(w http.ResponseWriter, r *http.Request) {
@@ -77,18 +77,18 @@ func SaveAssetsHandler(w http.ResponseWriter, r *http.Request) {
utils.Log(2, "Default 'base.css' was insert because SASS did not work.")
}
source.UsingAssets = true
- http.Redirect(w, r, "/settings", http.StatusSeeOther)
+ ExecuteResponse(w, r, "settings.html", core.CoreApp)
}
-func DeleteAssetsHandler(w http.ResponseWriter, req *http.Request) {
- if !IsAuthenticated(req) {
- http.Redirect(w, req, "/", http.StatusSeeOther)
+func DeleteAssetsHandler(w http.ResponseWriter, r *http.Request) {
+ if !IsAuthenticated(r) {
+ http.Redirect(w, r, "/", http.StatusSeeOther)
return
}
source.DeleteAllAssets(".")
source.UsingAssets = false
- LocalizedAssets(r)
- http.Redirect(w, req, "/settings", http.StatusSeeOther)
+ LocalizedAssets(Router())
+ ExecuteResponse(w, r, "settings.html", core.CoreApp)
}
func SaveNotificationHandler(w http.ResponseWriter, r *http.Request) {
@@ -158,5 +158,5 @@ func SaveNotificationHandler(w http.ResponseWriter, r *http.Request) {
utils.Log(1, fmt.Sprintf("Notifier saved: %v", notifer))
- http.Redirect(w, r, "/settings", http.StatusSeeOther)
+ ExecuteResponse(w, r, "settings.html", core.CoreApp)
}
diff --git a/types/service.go b/types/service.go
new file mode 100644
index 00000000..9b380012
--- /dev/null
+++ b/types/service.go
@@ -0,0 +1,40 @@
+package types
+
+import "time"
+
+type Service struct {
+ Id int64 `db:"id,omitempty" json:"id"`
+ Name string `db:"name" json:"name"`
+ Domain string `db:"domain" json:"domain"`
+ Expected string `db:"expected" json:"expected"`
+ ExpectedStatus int `db:"expected_status" json:"expected_status"`
+ Interval int `db:"check_interval" json:"check_interval"`
+ Type string `db:"check_type" json:"type"`
+ Method string `db:"method" json:"method"`
+ PostData string `db:"post_data" json:"post_data"`
+ Port int `db:"port" json:"port"`
+ CreatedAt time.Time `db:"created_at" json:"created_at"`
+ Timeout int `db:"timeout" json:"timeout"`
+ Order int `db:"order_id" json:"order_id"`
+ Online bool `json:"online"`
+ Latency float64 `json:"latency"`
+ Online24Hours float32 `json:"24_hours_online"`
+ AvgResponse string `json:"avg_response"`
+ TotalUptime string `json:"uptime"`
+ OrderId int64 `json:"order_id"`
+ Failures []*Failure `json:"failures"`
+ Checkins []*Checkin `json:"checkins"`
+ StopRoutine chan bool `json:"-"`
+ LastResponse string
+ LastStatusCode int
+ LastOnline time.Time
+ DnsLookup float64 `json:"dns_lookup_time"`
+}
+
+func (s *Service) Start() {
+ s.StopRoutine = make(chan bool)
+}
+
+func (s *Service) Close() {
+ s.StopRoutine <- true
+}
diff --git a/types/types.go b/types/types.go
index d3167c12..cf410ec7 100644
--- a/types/types.go
+++ b/types/types.go
@@ -67,35 +67,6 @@ type Core struct {
Started time.Time
}
-type Service struct {
- Id int64 `db:"id,omitempty" json:"id"`
- Name string `db:"name" json:"name"`
- Domain string `db:"domain" json:"domain"`
- Expected string `db:"expected" json:"expected"`
- ExpectedStatus int `db:"expected_status" json:"expected_status"`
- Interval int `db:"check_interval" json:"check_interval"`
- Type string `db:"check_type" json:"type"`
- Method string `db:"method" json:"method"`
- PostData string `db:"post_data" json:"post_data"`
- Port int `db:"port" json:"port"`
- CreatedAt time.Time `db:"created_at" json:"created_at"`
- Timeout int `db:"timeout" json:"timeout"`
- Order int `db:"order_id" json:"order_id"`
- Online bool `json:"online"`
- Latency float64 `json:"latency"`
- Online24Hours float32 `json:"24_hours_online"`
- AvgResponse string `json:"avg_response"`
- TotalUptime string `json:"uptime"`
- OrderId int64 `json:"order_id"`
- Failures []*Failure `json:"failures"`
- Checkins []*Checkin `json:"checkins"`
- StopRoutine chan struct{} `json:"-"`
- LastResponse string
- LastStatusCode int
- LastOnline time.Time
- DnsLookup float64 `json:"dns_lookup_time"`
-}
-
type User struct {
Id int64 `db:"id,omitempty" json:"id"`
Username string `db:"username" json:"username"`