mirror of https://github.com/statping/statping
parent
0a0614c2b0
commit
a49397c6be
|
@ -1,6 +1,6 @@
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
ENV VERSION=v0.4
|
ENV VERSION=v0.41
|
||||||
|
|
||||||
RUN apk --no-cache add libstdc++ ca-certificates
|
RUN apk --no-cache add libstdc++ ca-certificates
|
||||||
RUN wget -q https://github.com/hunterlong/statup/releases/download/$VERSION/statup-linux-alpine.tar.gz && \
|
RUN wget -q https://github.com/hunterlong/statup/releases/download/$VERSION/statup-linux-alpine.tar.gz && \
|
||||||
|
|
|
@ -3,7 +3,6 @@ package main
|
||||||
import (
|
import (
|
||||||
"github.com/rendon/testcli"
|
"github.com/rendon/testcli"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"os"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -52,9 +51,6 @@ func TestAssetsCLI(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSassCLI(t *testing.T) {
|
func TestSassCLI(t *testing.T) {
|
||||||
if os.Getenv("IS_DOCKER") == "true" {
|
|
||||||
os.Setenv("SASS", "/usr/local/bin/sass")
|
|
||||||
}
|
|
||||||
run := CatchCLI([]string{"statup", "sass"})
|
run := CatchCLI([]string{"statup", "sass"})
|
||||||
assert.Nil(t, run)
|
assert.Nil(t, run)
|
||||||
assert.FileExists(t, dir+"/assets/css/base.css")
|
assert.FileExists(t, dir+"/assets/css/base.css")
|
||||||
|
|
|
@ -45,7 +45,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(3, err)
|
utils.Log(3, err)
|
||||||
core.SetupMode = true
|
core.SetupMode = true
|
||||||
handlers.RunHTTPServer()
|
handlers.RunHTTPServer("localhost", 8080)
|
||||||
}
|
}
|
||||||
mainProcess()
|
mainProcess()
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func mainProcess() {
|
||||||
|
|
||||||
if !core.SetupMode {
|
if !core.SetupMode {
|
||||||
LoadPlugins(false)
|
LoadPlugins(false)
|
||||||
handlers.RunHTTPServer()
|
handlers.RunHTTPServer("localhost", 8080)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -454,6 +454,7 @@ func RunPrometheusHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
t.Log(rr.Body.String())
|
t.Log(rr.Body.String())
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 6"))
|
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 6"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunFailingPrometheusHandler(t *testing.T) {
|
func RunFailingPrometheusHandler(t *testing.T) {
|
||||||
|
@ -461,7 +462,8 @@ func RunFailingPrometheusHandler(t *testing.T) {
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 401, rr.Result().StatusCode)
|
assert.Equal(t, 303, rr.Result().StatusCode)
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunLoginHandler(t *testing.T) {
|
func RunLoginHandler(t *testing.T) {
|
||||||
|
@ -474,6 +476,7 @@ func RunLoginHandler(t *testing.T) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 303, rr.Result().StatusCode)
|
assert.Equal(t, 303, rr.Result().StatusCode)
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunDashboardHandler(t *testing.T) {
|
func RunDashboardHandler(t *testing.T) {
|
||||||
|
@ -483,6 +486,7 @@ func RunDashboardHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Dashboard</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Dashboard</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunUsersHandler(t *testing.T) {
|
func RunUsersHandler(t *testing.T) {
|
||||||
|
@ -492,6 +496,7 @@ func RunUsersHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunUserViewHandler(t *testing.T) {
|
func RunUserViewHandler(t *testing.T) {
|
||||||
|
@ -501,6 +506,7 @@ func RunUserViewHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunServicesHandler(t *testing.T) {
|
func RunServicesHandler(t *testing.T) {
|
||||||
|
@ -510,6 +516,7 @@ func RunServicesHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Services</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Services</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunHelpHandler(t *testing.T) {
|
func RunHelpHandler(t *testing.T) {
|
||||||
|
@ -519,6 +526,7 @@ func RunHelpHandler(t *testing.T) {
|
||||||
route.ServeHTTP(rr, req)
|
route.ServeHTTP(rr, req)
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Help</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Help</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunSettingsHandler(t *testing.T) {
|
func RunSettingsHandler(t *testing.T) {
|
||||||
|
@ -529,6 +537,7 @@ func RunSettingsHandler(t *testing.T) {
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Settings</title>"))
|
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Settings</title>"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "Theme Editor"))
|
assert.True(t, strings.Contains(rr.Body.String(), "Theme Editor"))
|
||||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||||
|
assert.True(t, handlers.IsAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func fileExists(file string) bool {
|
func fileExists(file string) bool {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/hunterlong/statup/notifiers"
|
"github.com/hunterlong/statup/notifiers"
|
||||||
"github.com/hunterlong/statup/source"
|
"github.com/hunterlong/statup/source"
|
||||||
"github.com/hunterlong/statup/types"
|
"github.com/hunterlong/statup/types"
|
||||||
|
"github.com/hunterlong/statup/utils"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
@ -79,21 +80,21 @@ func (c Core) SassVars() string {
|
||||||
if !source.UsingAssets {
|
if !source.UsingAssets {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return source.OpenAsset(".", "scss/variables.scss")
|
return source.OpenAsset(utils.Directory, "scss/variables.scss")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Core) BaseSASS() string {
|
func (c Core) BaseSASS() string {
|
||||||
if !source.UsingAssets {
|
if !source.UsingAssets {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return source.OpenAsset(".", "scss/base.scss")
|
return source.OpenAsset(utils.Directory, "scss/base.scss")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Core) MobileSASS() string {
|
func (c Core) MobileSASS() string {
|
||||||
if !source.UsingAssets {
|
if !source.UsingAssets {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return source.OpenAsset(".", "scss/mobile.scss")
|
return source.OpenAsset(utils.Directory, "scss/mobile.scss")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Core) AllOnline() bool {
|
func (c Core) AllOnline() bool {
|
||||||
|
|
|
@ -21,9 +21,9 @@ var (
|
||||||
Store *sessions.CookieStore
|
Store *sessions.CookieStore
|
||||||
)
|
)
|
||||||
|
|
||||||
func RunHTTPServer() {
|
func RunHTTPServer(ip string, port int) error {
|
||||||
utils.Log(1, "Statup HTTP Server running on http://localhost:8080")
|
host := fmt.Sprintf("%v:%v", ip, port)
|
||||||
r := Router()
|
utils.Log(1, "Statup HTTP Server running on http://"+host)
|
||||||
for _, p := range core.CoreApp.AllPlugins {
|
for _, p := range core.CoreApp.AllPlugins {
|
||||||
info := p.GetInfo()
|
info := p.GetInfo()
|
||||||
for _, route := range p.Routes() {
|
for _, route := range p.Routes() {
|
||||||
|
@ -33,16 +33,13 @@ func RunHTTPServer() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Addr: "0.0.0.0:8080",
|
Addr: host,
|
||||||
WriteTimeout: time.Second * 15,
|
WriteTimeout: time.Second * 15,
|
||||||
ReadTimeout: time.Second * 15,
|
ReadTimeout: time.Second * 15,
|
||||||
IdleTimeout: time.Second * 60,
|
IdleTimeout: time.Second * 60,
|
||||||
Handler: r,
|
Handler: Router(),
|
||||||
}
|
|
||||||
err := srv.ListenAndServe()
|
|
||||||
if err != nil {
|
|
||||||
utils.Log(4, err)
|
|
||||||
}
|
}
|
||||||
|
return srv.ListenAndServe()
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsAuthenticated(r *http.Request) bool {
|
func IsAuthenticated(r *http.Request) bool {
|
||||||
|
@ -118,4 +115,9 @@ func ExecuteJSResponse(w http.ResponseWriter, r *http.Request, file string, data
|
||||||
t.Execute(w, data)
|
t.Execute(w, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Error404Handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
|
ExecuteResponse(w, r, "error_404.html", nil)
|
||||||
|
}
|
||||||
|
|
||||||
type DbConfig types.DbConfig
|
type DbConfig types.DbConfig
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/hunterlong/statup/core"
|
"github.com/hunterlong/statup/core"
|
||||||
"github.com/hunterlong/statup/source"
|
"github.com/hunterlong/statup/source"
|
||||||
"github.com/hunterlong/statup/utils"
|
"github.com/hunterlong/statup/utils"
|
||||||
|
@ -21,16 +20,11 @@ func init() {
|
||||||
|
|
||||||
func IsRouteAuthenticated(req *http.Request) bool {
|
func IsRouteAuthenticated(req *http.Request) bool {
|
||||||
os.Setenv("GO_ENV", "production")
|
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()
|
rr := httptest.NewRecorder()
|
||||||
|
req.Header.Set("Authorization", "badkey")
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
fmt.Println(req.URL.String(), rr.Code)
|
|
||||||
code := rr.Code
|
code := rr.Code
|
||||||
if code != 303 {
|
if code == 200 {
|
||||||
os.Setenv("GO_ENV", "test")
|
os.Setenv("GO_ENV", "test")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -38,6 +32,11 @@ func IsRouteAuthenticated(req *http.Request) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFailedHTTPServer(t *testing.T) {
|
||||||
|
err := RunHTTPServer("missinghost", 0)
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestIndexHandler(t *testing.T) {
|
func TestIndexHandler(t *testing.T) {
|
||||||
req, err := http.NewRequest("GET", "/", nil)
|
req, err := http.NewRequest("GET", "/", nil)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
@ -386,6 +385,7 @@ func TestDeleteServiceHandler(t *testing.T) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogsHandler(t *testing.T) {
|
func TestLogsHandler(t *testing.T) {
|
||||||
|
@ -397,6 +397,7 @@ func TestLogsHandler(t *testing.T) {
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
assert.Contains(t, body, "<title>Statup | Logs</title>")
|
assert.Contains(t, body, "<title>Statup | Logs</title>")
|
||||||
assert.Contains(t, body, "Statup made with ❤️")
|
assert.Contains(t, body, "Statup made with ❤️")
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogsLineHandler(t *testing.T) {
|
func TestLogsLineHandler(t *testing.T) {
|
||||||
|
@ -408,6 +409,7 @@ func TestLogsLineHandler(t *testing.T) {
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
t.Log(body)
|
t.Log(body)
|
||||||
assert.NotEmpty(t, body)
|
assert.NotEmpty(t, body)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSaveSettingsHandler(t *testing.T) {
|
func TestSaveSettingsHandler(t *testing.T) {
|
||||||
|
@ -420,6 +422,7 @@ func TestSaveSettingsHandler(t *testing.T) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestViewSettingsHandler(t *testing.T) {
|
func TestViewSettingsHandler(t *testing.T) {
|
||||||
|
@ -445,6 +448,7 @@ func TestSaveAssetsHandler(t *testing.T) {
|
||||||
assert.FileExists(t, utils.Directory+"/assets/js/main.js")
|
assert.FileExists(t, utils.Directory+"/assets/js/main.js")
|
||||||
assert.DirExists(t, utils.Directory+"/assets")
|
assert.DirExists(t, utils.Directory+"/assets")
|
||||||
assert.True(t, source.UsingAssets)
|
assert.True(t, source.UsingAssets)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteAssetsHandler(t *testing.T) {
|
func TestDeleteAssetsHandler(t *testing.T) {
|
||||||
|
@ -454,6 +458,7 @@ func TestDeleteAssetsHandler(t *testing.T) {
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
assert.False(t, source.UsingAssets)
|
assert.False(t, source.UsingAssets)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrometheusHandler(t *testing.T) {
|
func TestPrometheusHandler(t *testing.T) {
|
||||||
|
@ -465,6 +470,7 @@ func TestPrometheusHandler(t *testing.T) {
|
||||||
body := rr.Body.String()
|
body := rr.Body.String()
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
assert.Contains(t, body, "statup_total_services 6")
|
assert.Contains(t, body, "statup_total_services 6")
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSaveNotificationHandler(t *testing.T) {
|
func TestSaveNotificationHandler(t *testing.T) {
|
||||||
|
@ -485,6 +491,7 @@ func TestSaveNotificationHandler(t *testing.T) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestViewNotificationSettingsHandler(t *testing.T) {
|
func TestViewNotificationSettingsHandler(t *testing.T) {
|
||||||
|
@ -515,6 +522,7 @@ func TestSaveFooterHandler(t *testing.T) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 200, rr.Code)
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
|
|
||||||
req, err = http.NewRequest("GET", "/", nil)
|
req, err = http.NewRequest("GET", "/", nil)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
@ -540,3 +548,32 @@ func TestLogoutHandler(t *testing.T) {
|
||||||
Router().ServeHTTP(rr, req)
|
Router().ServeHTTP(rr, req)
|
||||||
assert.Equal(t, 303, rr.Code)
|
assert.Equal(t, 303, rr.Code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBuildAssetsHandler(t *testing.T) {
|
||||||
|
req, err := http.NewRequest("GET", "/settings/build", nil)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
Router().ServeHTTP(rr, req)
|
||||||
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
|
assert.FileExists(t, "../assets/scss/base.scss")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSaveSassHandler(t *testing.T) {
|
||||||
|
base := source.OpenAsset(utils.Directory, "scss/base.scss")
|
||||||
|
vars := source.OpenAsset(utils.Directory, "scss/variables.scss")
|
||||||
|
|
||||||
|
form := url.Values{}
|
||||||
|
form.Add("theme", base+"\n .test_design { color: $test-design; }")
|
||||||
|
form.Add("variables", vars+"\n $test-design: #ffffff; ")
|
||||||
|
req, err := http.NewRequest("POST", "/settings/css", strings.NewReader(form.Encode()))
|
||||||
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
assert.Nil(t, err)
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
Router().ServeHTTP(rr, req)
|
||||||
|
assert.Equal(t, 200, rr.Code)
|
||||||
|
assert.True(t, IsRouteAuthenticated(req))
|
||||||
|
|
||||||
|
newBase := source.OpenAsset(utils.Directory, "css/base.css")
|
||||||
|
assert.Contains(t, newBase, ".test_design {")
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
package handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Error404Handler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(http.StatusNotFound)
|
|
||||||
ExecuteResponse(w, r, "error_404.html", nil)
|
|
||||||
}
|
|
|
@ -21,7 +21,7 @@ import (
|
||||||
func PrometheusHandler(w http.ResponseWriter, r *http.Request) {
|
func PrometheusHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.Log(1, fmt.Sprintf("Prometheus /metrics Request From IP: %v\n", r.RemoteAddr))
|
utils.Log(1, fmt.Sprintf("Prometheus /metrics Request From IP: %v\n", r.RemoteAddr))
|
||||||
if !isAuthorized(r) {
|
if !isAuthorized(r) {
|
||||||
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
metrics := []string{}
|
metrics := []string{}
|
||||||
|
|
|
@ -58,9 +58,9 @@ func SaveSASSHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
theme := r.PostForm.Get("theme")
|
theme := r.PostForm.Get("theme")
|
||||||
variables := r.PostForm.Get("variables")
|
variables := r.PostForm.Get("variables")
|
||||||
source.SaveAsset(theme, ".", "scss/base.scss")
|
source.SaveAsset([]byte(theme), utils.Directory, "scss/base.scss")
|
||||||
source.SaveAsset(variables, ".", "scss/variables.scss")
|
source.SaveAsset([]byte(variables), utils.Directory, "scss/variables.scss")
|
||||||
source.CompileSASS(".")
|
source.CompileSASS(utils.Directory)
|
||||||
ExecuteResponse(w, r, "settings.html", core.CoreApp)
|
ExecuteResponse(w, r, "settings.html", core.CoreApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,8 +70,12 @@ func SaveAssetsHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dir := utils.Directory
|
dir := utils.Directory
|
||||||
source.CreateAllAssets(dir)
|
err := source.CreateAllAssets(dir)
|
||||||
err := source.CompileSASS(dir)
|
if err != nil {
|
||||||
|
utils.Log(3, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = source.CompileSASS(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
source.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css")
|
source.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css")
|
||||||
utils.Log(2, "Default 'base.css' was insert because SASS did not work.")
|
utils.Log(2, "Default 'base.css' was insert because SASS did not work.")
|
||||||
|
|
|
@ -104,12 +104,14 @@ func HasAssets(folder string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func SaveAsset(data, folder, file string) {
|
func SaveAsset(data []byte, folder, file string) error {
|
||||||
utils.Log(1, fmt.Sprintf("Saving %v/%v into assets folder", folder, file))
|
utils.Log(1, fmt.Sprintf("Saving %v/%v into assets folder", folder, file))
|
||||||
err := ioutil.WriteFile(folder+"/assets/"+file, []byte(data), 0644)
|
err := ioutil.WriteFile(folder+"/assets/"+file, data, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(3, fmt.Sprintf("Failed to save %v/%v, %v", folder, file, err))
|
utils.Log(3, fmt.Sprintf("Failed to save %v/%v, %v", folder, file, err))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func OpenAsset(folder, file string) string {
|
func OpenAsset(folder, file string) string {
|
||||||
|
@ -155,27 +157,32 @@ func DeleteAllAssets(folder string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func CopyToPublic(box *rice.Box, folder, file string) {
|
func CopyToPublic(box *rice.Box, folder, file string) error {
|
||||||
assetFolder := fmt.Sprintf("%v/%v", folder, file)
|
assetFolder := fmt.Sprintf("%v/%v", folder, file)
|
||||||
utils.Log(1, fmt.Sprintf("Copying %v to %v", file, assetFolder))
|
utils.Log(1, fmt.Sprintf("Copying %v to %v", file, assetFolder))
|
||||||
base, err := box.String(file)
|
base, err := box.String(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(3, fmt.Sprintf("Failed to copy %v to %v, %v.", file, assetFolder, err))
|
utils.Log(3, fmt.Sprintf("Failed to copy %v to %v, %v.", file, assetFolder, err))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile(assetFolder, []byte(base), 0644)
|
err = ioutil.WriteFile(assetFolder, []byte(base), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(3, fmt.Sprintf("Failed to write file %v to %v, %v.", file, assetFolder, err))
|
utils.Log(3, fmt.Sprintf("Failed to write file %v to %v, %v.", file, assetFolder, err))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakePublicFolder(folder string) {
|
func MakePublicFolder(folder string) error {
|
||||||
utils.Log(1, fmt.Sprintf("Creating folder '%v'", folder))
|
utils.Log(1, fmt.Sprintf("Creating folder '%v'", folder))
|
||||||
if _, err := os.Stat(folder); os.IsNotExist(err) {
|
if _, err := os.Stat(folder); os.IsNotExist(err) {
|
||||||
err = os.MkdirAll(folder, 0755)
|
err = os.MkdirAll(folder, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(3, fmt.Sprintf("Failed to created %v directory, %v", folder, err))
|
utils.Log(3, fmt.Sprintf("Failed to created %v directory, %v", folder, err))
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
|
func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
|
||||||
|
@ -199,7 +206,5 @@ func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
|
||||||
return out, err
|
return out, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// never reached
|
|
||||||
panic(true)
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,29 @@ func TestCreateAssets(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCompileSASS(t *testing.T) {
|
func TestCompileSASS(t *testing.T) {
|
||||||
if os.Getenv("IS_DOCKER") == "true" {
|
|
||||||
os.Setenv("SASS", "/usr/local/bin/sass")
|
|
||||||
}
|
|
||||||
assert.Nil(t, CompileSASS(dir))
|
assert.Nil(t, CompileSASS(dir))
|
||||||
assert.True(t, HasAssets(dir))
|
assert.True(t, HasAssets(dir))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSaveAsset(t *testing.T) {
|
||||||
|
data := []byte("BODY { color: black; }")
|
||||||
|
asset := SaveAsset(data, dir, "scss/theme.scss")
|
||||||
|
assert.Nil(t, asset)
|
||||||
|
assert.FileExists(t, dir+"/assets/scss/theme.scss")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOpenAsset(t *testing.T) {
|
||||||
|
asset := OpenAsset(dir, "scss/theme.scss")
|
||||||
|
assert.NotEmpty(t, asset)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDeleteAssets(t *testing.T) {
|
func TestDeleteAssets(t *testing.T) {
|
||||||
assert.Nil(t, DeleteAllAssets(dir))
|
assert.Nil(t, DeleteAllAssets(dir))
|
||||||
assert.False(t, HasAssets(dir))
|
assert.False(t, HasAssets(dir))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCopyToPluginFailed(t *testing.T) {
|
||||||
|
|
||||||
|
assert.Nil(t, DeleteAllAssets(dir))
|
||||||
|
assert.False(t, HasAssets(dir))
|
||||||
|
}
|
||||||
|
|
18
utils/log.go
18
utils/log.go
|
@ -17,23 +17,29 @@ var (
|
||||||
LastLine interface{}
|
LastLine interface{}
|
||||||
)
|
)
|
||||||
|
|
||||||
func InitLogs() error {
|
func createLog(dir string) error {
|
||||||
var err error
|
var err error
|
||||||
_, err = os.Stat(Directory + "/logs")
|
_, err = os.Stat(dir + "/logs")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
os.Mkdir(Directory+"/logs", 0777)
|
os.Mkdir(dir+"/logs", 0777)
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(err)
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file, err := os.Create(dir + "/logs/statup.log")
|
||||||
file, err := os.Create(Directory + "/logs/statup.log")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitLogs() error {
|
||||||
|
err := createLog(Directory)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
logFile, err = os.OpenFile(Directory+"/logs/statup.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
|
logFile, err = os.OpenFile(Directory+"/logs/statup.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("ERROR opening file: %v", err)
|
log.Printf("ERROR opening file: %v", err)
|
||||||
|
|
|
@ -72,20 +72,14 @@ func UnderScoreString(str string) string {
|
||||||
return newStr
|
return newStr
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteFile(file string) bool {
|
func DeleteFile(file string) error {
|
||||||
err := os.Remove(file)
|
err := os.Remove(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Log(3, err)
|
return err
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteDirectory(directory string) bool {
|
func DeleteDirectory(directory string) error {
|
||||||
err := os.RemoveAll(directory)
|
return os.RemoveAll(directory)
|
||||||
if err != nil {
|
|
||||||
Log(3, err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,14 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestCreateLog(t *testing.T) {
|
||||||
|
err := createLog(Directory)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestInitLogs(t *testing.T) {
|
func TestInitLogs(t *testing.T) {
|
||||||
assert.Nil(t, InitLogs())
|
assert.Nil(t, InitLogs())
|
||||||
|
assert.FileExists(t, "../logs/statup.log")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDir(t *testing.T) {
|
func TestDir(t *testing.T) {
|
||||||
|
@ -25,12 +31,12 @@ func TestLog(t *testing.T) {
|
||||||
assert.Nil(t, Log(5, errors.New("this is a 5 level error")))
|
assert.Nil(t, Log(5, errors.New("this is a 5 level error")))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogFileCreation(t *testing.T) {
|
func TestDeleteFile(t *testing.T) {
|
||||||
assert.FileExists(t, "../logs/statup.log")
|
assert.Nil(t, DeleteFile(Directory+"/logs/statup.log"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteFile(t *testing.T) {
|
func TestFailedDeleteFile(t *testing.T) {
|
||||||
assert.True(t, DeleteFile(Directory+"/logs/statup.log"))
|
assert.Error(t, DeleteFile(Directory+"/missingfilehere.txt"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogHTTP(t *testing.T) {
|
func TestLogHTTP(t *testing.T) {
|
||||||
|
@ -73,5 +79,5 @@ func TestSha256(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteDirectory(t *testing.T) {
|
func TestDeleteDirectory(t *testing.T) {
|
||||||
assert.True(t, DeleteDirectory(Directory+"/logs"))
|
assert.Nil(t, DeleteDirectory(Directory+"/logs"))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue