mirror of https://github.com/statping/statping
upgrades - plugins
parent
077d1a5900
commit
808a2b60f1
|
@ -54,7 +54,7 @@ func (s *Service) Check() {
|
||||||
|
|
||||||
func (s *Service) Record(response *http.Response) {
|
func (s *Service) Record(response *http.Response) {
|
||||||
db.QueryRow("INSERT INTO hits(service,latency,created_at) VALUES($1,$2,NOW()) returning id;", s.Id, s.Latency).Scan()
|
db.QueryRow("INSERT INTO hits(service,latency,created_at) VALUES($1,$2,NOW()) returning id;", s.Id, s.Latency).Scan()
|
||||||
OnHit(s)
|
OnSuccess(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) Failure(issue string) {
|
func (s *Service) Failure(issue string) {
|
||||||
|
|
15
core.go
15
core.go
|
@ -6,13 +6,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Core struct {
|
type Core struct {
|
||||||
Name string
|
Name string
|
||||||
Config string
|
Config string
|
||||||
Key string
|
Key string
|
||||||
Secret string
|
Secret string
|
||||||
Version string
|
Version string
|
||||||
Plugins []plugin.Info
|
Plugins []plugin.Info
|
||||||
Repos []PluginJSON
|
Repos []PluginJSON
|
||||||
|
PluginFields []PluginSelect
|
||||||
}
|
}
|
||||||
|
|
||||||
func SelectCore() (*Core, error) {
|
func SelectCore() (*Core, error) {
|
||||||
|
|
|
@ -2,9 +2,9 @@ package main
|
||||||
|
|
||||||
import "github.com/hunterlong/statup/plugin"
|
import "github.com/hunterlong/statup/plugin"
|
||||||
|
|
||||||
func OnHit(s *Service) {
|
func OnSuccess(s *Service) {
|
||||||
for _, p := range allPlugins {
|
for _, p := range allPlugins {
|
||||||
p.OnHit(s.ToP())
|
p.OnSuccess(s.ToP())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,26 +48,26 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ range .Plugins }}
|
{{ range .Plugins }}
|
||||||
|
|
||||||
<div class="tab-pane fade" id="v-pills-{{.Name}}" role="tabpanel" aria-labelledby="v-pills-{{.Name}}-tab">
|
<div class="tab-pane fade" id="v-pills-{{.Name}}" role="tabpanel" aria-labelledby="v-pills-{{.Name}}-tab">
|
||||||
|
|
||||||
<h4 class="text-capitalize">{{ .Name }}</h4>
|
<h4 class="text-capitalize">{{ .Name }}</h4>
|
||||||
<span class="text-muted">{{ .Description }}</span>
|
<span class="text-muted">{{ .Description }}</span>
|
||||||
|
|
||||||
<form class="mt-3" method="POST" action="/plugins/{{.Name}}/save">
|
<form class="mt-3" method="POST" action="/plugins/{{.Name}}/save">
|
||||||
{{ range .Form }}
|
{{ range .Form }}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="input_{{ .SQLValue }}" class="text-capitalize">{{ .Name }}</label>
|
<label for="input_{{ .InputName }}" class="text-capitalize">{{ .Name }}</label>
|
||||||
<input type="text" class="form-control" name="{{ .SQLValue }}" value="{{ .Val }}" id="input_{{ .SQLValue }}" placeholder="Example input" aria-describedby="help_{{ .SQLValue }}">
|
<input type="text" class="form-control" name="{{ .InputName }}" value="{{ .Value }}" id="input_{{ .InputName }}" placeholder="Example input" aria-describedby="help_{{ .InputName }}">
|
||||||
|
{{ if .Description }}
|
||||||
{{ if .Description }}
|
<small id="help_{{ .InputName }}" class="form-text text-muted">
|
||||||
<small id="help_{{ .SQLValue }}" class="form-text text-muted">
|
{{ .Description }}
|
||||||
{{ .Description }}
|
</small>
|
||||||
</small>
|
{{ end }}
|
||||||
{{ end }}
|
</div>
|
||||||
</div>
|
{{ end }}
|
||||||
{{ end }}
|
<button type="submit" class="btn btn-primary">Save</button>
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
</form>
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
|
138
main.go
138
main.go
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/hunterlong/statup/plugin"
|
"github.com/hunterlong/statup/plugin"
|
||||||
_ "github.com/lib/pq"
|
_ "github.com/lib/pq"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
@ -70,6 +71,135 @@ func (c *Core) FetchPluginRepo() []PluginJSON {
|
||||||
return pk
|
return pk
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DownloadFile(filepath string, url string) error {
|
||||||
|
out, err := os.Create(filepath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer out.Close()
|
||||||
|
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(out, resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func SelectSettings(p plugin.Info) map[string]string {
|
||||||
|
|
||||||
|
data := make(map[string]string)
|
||||||
|
var tableInput []string
|
||||||
|
|
||||||
|
for _, v := range p.Form {
|
||||||
|
val := fmt.Sprintf("%v", v.InputName)
|
||||||
|
tableInput = append(tableInput, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
ins := strings.Join(tableInput, ", ")
|
||||||
|
|
||||||
|
sql := fmt.Sprintf("SELECT %v FROM settings_%v LIMIT 1", ins, p.Name)
|
||||||
|
rows, err := db.Query(sql)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("SQL ERROR: ", err)
|
||||||
|
return map[string]string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
count := len(p.Form)
|
||||||
|
valuePtrs := make([]interface{}, count)
|
||||||
|
values := make([]interface{}, count)
|
||||||
|
|
||||||
|
for rows.Next() {
|
||||||
|
|
||||||
|
for i, _ := range p.Form {
|
||||||
|
valuePtrs[i] = &values[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
err = rows.Scan(valuePtrs...)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, col := range p.Form {
|
||||||
|
|
||||||
|
val := values[i]
|
||||||
|
|
||||||
|
b, _ := val.([]byte)
|
||||||
|
|
||||||
|
realVal := string(b)
|
||||||
|
|
||||||
|
//col.ChangeVal(realVal)
|
||||||
|
|
||||||
|
fmt.Println(col.Value, realVal)
|
||||||
|
|
||||||
|
data[col.InputName] = realVal
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateSettingsTable(p plugin.Info) string {
|
||||||
|
var tableValues []string
|
||||||
|
tableValues = append(tableValues, "plugin text")
|
||||||
|
tableValues = append(tableValues, "enabled bool")
|
||||||
|
for _, v := range p.Form {
|
||||||
|
tb := fmt.Sprintf("%v %v", v.InputName, v.InputType)
|
||||||
|
tableValues = append(tableValues, tb)
|
||||||
|
}
|
||||||
|
vals := strings.Join(tableValues, ", ")
|
||||||
|
out := fmt.Sprintf("CREATE TABLE settings_%v (%v);", p.Name, vals)
|
||||||
|
smtp, _ := db.Prepare(out)
|
||||||
|
_, _ = smtp.Exec()
|
||||||
|
InitalSettings(p)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitalSettings(p plugin.Info) {
|
||||||
|
var tableValues []string
|
||||||
|
var tableInput []string
|
||||||
|
|
||||||
|
tableValues = append(tableValues, "plugin")
|
||||||
|
tableInput = append(tableInput, fmt.Sprintf("'%v'", p.Name))
|
||||||
|
|
||||||
|
tableValues = append(tableValues, "enabled")
|
||||||
|
tableInput = append(tableInput, "false")
|
||||||
|
|
||||||
|
for _, v := range p.Form {
|
||||||
|
val := fmt.Sprintf("'%v'", v.Value)
|
||||||
|
tableValues = append(tableValues, v.InputName)
|
||||||
|
tableInput = append(tableInput, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
vals := strings.Join(tableValues, ",")
|
||||||
|
ins := strings.Join(tableInput, ",")
|
||||||
|
sql := fmt.Sprintf("INSERT INTO settings_%v(%v) VALUES(%v);", p.Name, vals, ins)
|
||||||
|
smtp, _ := db.Prepare(sql)
|
||||||
|
_, _ = smtp.Exec()
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateSettings(p plugin.Info, data map[string]string) {
|
||||||
|
var tableInput []string
|
||||||
|
|
||||||
|
for _, v := range p.Form {
|
||||||
|
newValue := data[v.InputName]
|
||||||
|
val := fmt.Sprintf("%v='%v'", v.InputName, newValue)
|
||||||
|
tableInput = append(tableInput, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
ins := strings.Join(tableInput, ", ")
|
||||||
|
sql := fmt.Sprintf("UPDATE settings_%v SET %v WHERE plugin='%v';", p.Name, ins, p.Name)
|
||||||
|
smtp, _ := db.Prepare(sql)
|
||||||
|
_, _ = smtp.Exec()
|
||||||
|
}
|
||||||
|
|
||||||
//func DownloadPlugin(name string) {
|
//func DownloadPlugin(name string) {
|
||||||
// plugin := SelectPlugin(name)
|
// plugin := SelectPlugin(name)
|
||||||
// var _, err = os.Stat("plugins/" + plugin.Namespace)
|
// var _, err = os.Stat("plugins/" + plugin.Namespace)
|
||||||
|
@ -119,7 +249,7 @@ func mainProcess() {
|
||||||
DbConnection()
|
DbConnection()
|
||||||
core, err = SelectCore()
|
core, err = SelectCore()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
throw(err)
|
||||||
}
|
}
|
||||||
go CheckServices()
|
go CheckServices()
|
||||||
if !setupMode {
|
if !setupMode {
|
||||||
|
@ -128,6 +258,11 @@ func mainProcess() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func throw(err error) {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
func ForEachPlugin() {
|
func ForEachPlugin() {
|
||||||
if len(core.Plugins) > 0 {
|
if len(core.Plugins) > 0 {
|
||||||
//for _, p := range core.Plugins {
|
//for _, p := range core.Plugins {
|
||||||
|
@ -162,6 +297,7 @@ func LoadPlugins() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
symPlugin, err := plug.Lookup("Plugin")
|
symPlugin, err := plug.Lookup("Plugin")
|
||||||
|
|
||||||
var plugActions plugin.PluginActions
|
var plugActions plugin.PluginActions
|
||||||
plugActions, ok := symPlugin.(plugin.PluginActions)
|
plugActions, ok := symPlugin.(plugin.PluginActions)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
47
main_test.go
47
main_test.go
|
@ -2,16 +2,25 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestInit(t *testing.T) {
|
||||||
|
VERSION = "1.1.1"
|
||||||
|
RenderBoxes()
|
||||||
|
}
|
||||||
|
|
||||||
func TestMakeConfig(t *testing.T) {
|
func TestMakeConfig(t *testing.T) {
|
||||||
config := &DbConfig{
|
config := &DbConfig{
|
||||||
"postgres",
|
"postgres",
|
||||||
"localhost",
|
os.Getenv("DB_HOST"),
|
||||||
"travis",
|
os.Getenv("DB_USER"),
|
||||||
"",
|
os.Getenv("DB_PASS"),
|
||||||
"postgres",
|
os.Getenv("DB_DATABASE"),
|
||||||
5432,
|
5432,
|
||||||
"Testing",
|
"Testing",
|
||||||
"admin",
|
"admin",
|
||||||
|
@ -21,8 +30,30 @@ func TestMakeConfig(t *testing.T) {
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func TestSetConfig(t *testing.T) {
|
||||||
|
configs = LoadConfig()
|
||||||
assert.Equal(t, "", "")
|
}
|
||||||
|
|
||||||
|
func TestRun(t *testing.T) {
|
||||||
|
configs = LoadConfig()
|
||||||
|
go mainProcess()
|
||||||
|
time.Sleep(15 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServiceUrl(t *testing.T) {
|
||||||
|
req, err := http.NewRequest("GET", "/service/1", nil)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
Router().ServeHTTP(rr, req)
|
||||||
|
|
||||||
|
assert.Equal(t, 3305, len(rr.Body.Bytes()), "should be balance")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
req, err := http.NewRequest("GET", "/dashboard", nil)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
Router().ServeHTTP(rr, req)
|
||||||
|
|
||||||
|
assert.Equal(t, 2048, len(rr.Body.Bytes()), "should be balance")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,64 @@
|
||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//
|
||||||
|
// STATUP PLUGIN INTERFACE
|
||||||
|
//
|
||||||
|
// v0.1
|
||||||
|
//
|
||||||
|
// https://statup.io
|
||||||
|
//
|
||||||
|
|
||||||
|
var (
|
||||||
|
DB *sql.DB
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetDatabase(database *sql.DB) {
|
||||||
|
DB = database
|
||||||
|
}
|
||||||
|
|
||||||
|
func Throw(err error) {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type PluginInfo struct {
|
||||||
|
Info Info
|
||||||
|
PluginActions
|
||||||
|
}
|
||||||
|
|
||||||
type PluginActions interface {
|
type PluginActions interface {
|
||||||
GetInfo() Info
|
GetInfo() Info
|
||||||
|
SetInfo(map[string]string) Info
|
||||||
Routes() []Routing
|
Routes() []Routing
|
||||||
OnSave(map[string]string)
|
OnSave(map[string]string)
|
||||||
|
OnFailure(*Service)
|
||||||
|
OnSuccess(*Service)
|
||||||
|
OnSettingsSaved(map[string]string)
|
||||||
|
OnNewUser(*User)
|
||||||
|
OnNewService(*Service)
|
||||||
|
OnUpdatedService(*Service)
|
||||||
|
OnDeletedService(*Service)
|
||||||
OnInstall()
|
OnInstall()
|
||||||
OnUninstall()
|
OnUninstall()
|
||||||
OnFailure(*Service)
|
|
||||||
OnHit(*Service)
|
|
||||||
OnSettingsSaved()
|
|
||||||
OnNewUser()
|
|
||||||
OnNewService()
|
|
||||||
OnShutdown()
|
OnShutdown()
|
||||||
OnLoad()
|
OnLoad()
|
||||||
OnBeforeRequest()
|
OnBeforeRequest()
|
||||||
OnAfterRequest()
|
OnAfterRequest()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Id int64
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
Email string
|
||||||
|
}
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
Id int64
|
Id int64
|
||||||
Name string
|
Name string
|
||||||
|
@ -49,11 +86,6 @@ type Failure struct {
|
||||||
Ago string
|
Ago string
|
||||||
}
|
}
|
||||||
|
|
||||||
type PluginInfo struct {
|
|
||||||
Info Info
|
|
||||||
PluginActions
|
|
||||||
}
|
|
||||||
|
|
||||||
type Routing struct {
|
type Routing struct {
|
||||||
URL string
|
URL string
|
||||||
Method string
|
Method string
|
||||||
|
@ -63,13 +95,13 @@ type Routing struct {
|
||||||
type Info struct {
|
type Info struct {
|
||||||
Name string
|
Name string
|
||||||
Description string
|
Description string
|
||||||
Form []FormElement
|
Form []*FormElement
|
||||||
}
|
}
|
||||||
|
|
||||||
type FormElement struct {
|
type FormElement struct {
|
||||||
Name string
|
Name string
|
||||||
Description string
|
Description string
|
||||||
SQLValue string
|
InputName string
|
||||||
SQLType string
|
InputType string
|
||||||
Value interface{}
|
Value string
|
||||||
}
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package plugin
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestInit(t *testing.T) {
|
||||||
|
|
||||||
|
}
|
169
plugin/plugin.go
169
plugin/plugin.go
|
@ -1,169 +0,0 @@
|
||||||
package plugin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"html/template"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
db *sql.DB
|
|
||||||
AllPlugins []Info
|
|
||||||
)
|
|
||||||
|
|
||||||
func CreateSettingsTable(p Info) string {
|
|
||||||
var tableValues []string
|
|
||||||
for _, v := range p.Form {
|
|
||||||
tb := fmt.Sprintf("%v %v", v.SQLValue, v.SQLType)
|
|
||||||
tableValues = append(tableValues, tb)
|
|
||||||
}
|
|
||||||
vals := strings.Join(tableValues, ", ")
|
|
||||||
out := fmt.Sprintf("CREATE TABLE settings_%v (%v);", p.Name, vals)
|
|
||||||
smtp, _ := db.Prepare(out)
|
|
||||||
_, _ = smtp.Exec()
|
|
||||||
InitalSettings(p)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
func InitalSettings(p Info) {
|
|
||||||
var tableValues []string
|
|
||||||
var tableInput []string
|
|
||||||
for _, v := range p.Form {
|
|
||||||
val := fmt.Sprintf("'%v'", "example data")
|
|
||||||
tableValues = append(tableValues, v.SQLValue)
|
|
||||||
tableInput = append(tableInput, val)
|
|
||||||
}
|
|
||||||
vals := strings.Join(tableValues, ",")
|
|
||||||
ins := strings.Join(tableInput, ",")
|
|
||||||
sql := fmt.Sprintf("INSERT INTO settings_%v(%v) VALUES(%v);", p.Name, vals, ins)
|
|
||||||
smtp, _ := db.Prepare(sql)
|
|
||||||
_, _ = smtp.Exec()
|
|
||||||
|
|
||||||
SelectSettings(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f FormElement) Val() string {
|
|
||||||
var v string
|
|
||||||
fmt.Println(f.Value)
|
|
||||||
b, ok := f.Value.([]byte)
|
|
||||||
if ok {
|
|
||||||
v = string(b)
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func SelectSettings(p Info) []*FormElement {
|
|
||||||
|
|
||||||
var newForm []*FormElement
|
|
||||||
|
|
||||||
sql := fmt.Sprintf("SELECT * FROM settings_%v LIMIT 1", p.Name)
|
|
||||||
rows, err := db.Query(sql)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
count := len(p.Form)
|
|
||||||
valuePtrs := make([]interface{}, count)
|
|
||||||
values := make([]interface{}, count)
|
|
||||||
|
|
||||||
for rows.Next() {
|
|
||||||
|
|
||||||
for i, _ := range p.Form {
|
|
||||||
valuePtrs[i] = &values[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
err = rows.Scan(valuePtrs...)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, col := range p.Form {
|
|
||||||
|
|
||||||
var v interface{}
|
|
||||||
|
|
||||||
val := values[i]
|
|
||||||
|
|
||||||
b, ok := val.([]byte)
|
|
||||||
|
|
||||||
if ok {
|
|
||||||
v = string(b)
|
|
||||||
} else {
|
|
||||||
v = val
|
|
||||||
}
|
|
||||||
|
|
||||||
ll := &FormElement{
|
|
||||||
Name: col.Name,
|
|
||||||
Description: col.Description,
|
|
||||||
SQLValue: col.SQLValue,
|
|
||||||
SQLType: col.SQLType,
|
|
||||||
Value: v,
|
|
||||||
}
|
|
||||||
|
|
||||||
newForm = append(newForm, ll)
|
|
||||||
|
|
||||||
fmt.Println(col.SQLValue, v)
|
|
||||||
|
|
||||||
col.Value = v
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return newForm
|
|
||||||
}
|
|
||||||
|
|
||||||
func RunSQL(query string, args ...interface{}) (*sql.Rows, error) {
|
|
||||||
rows, err := db.Query(query, args)
|
|
||||||
return rows, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Info) Template() *template.Template {
|
|
||||||
t := template.New("form")
|
|
||||||
temp, _ := t.Parse("hello nworld")
|
|
||||||
return temp
|
|
||||||
}
|
|
||||||
|
|
||||||
func DownloadFile(filepath string, url string) error {
|
|
||||||
out, err := os.Create(filepath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer out.Close()
|
|
||||||
|
|
||||||
resp, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(out, resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetDatabase(database *sql.DB) {
|
|
||||||
db = database
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PluginInfo) InstallPlugin(w http.ResponseWriter, r *http.Request) {
|
|
||||||
|
|
||||||
//sql := "CREATE TABLE " + p.Name + " (enabled BOOLEAN, api_key text, api_secret text, channel text);"
|
|
||||||
//db.QueryRow(p.InstallSQL()).Scan()
|
|
||||||
|
|
||||||
http.Redirect(w, r, "/plugins", http.StatusSeeOther)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PluginInfo) UninstallPlugin(w http.ResponseWriter, r *http.Request) {
|
|
||||||
http.Redirect(w, r, "/plugins", http.StatusSeeOther)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PluginInfo) SavePlugin(w http.ResponseWriter, r *http.Request) {
|
|
||||||
//values := r.PostForm
|
|
||||||
//p.SaveFunc(values)
|
|
||||||
http.Redirect(w, r, "/plugins", http.StatusSeeOther)
|
|
||||||
}
|
|
Binary file not shown.
BIN
plugins/stack.so
BIN
plugins/stack.so
Binary file not shown.
|
@ -4,6 +4,7 @@ import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/hunterlong/statup/plugin"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
@ -30,6 +31,7 @@ type Service struct {
|
||||||
AvgResponse string
|
AvgResponse string
|
||||||
TotalUptime string
|
TotalUptime string
|
||||||
Failures []*Failure
|
Failures []*Failure
|
||||||
|
plugin.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
func SelectService(id string) *Service {
|
func SelectService(id string) *Service {
|
||||||
|
|
|
@ -3,7 +3,8 @@ CREATE TABLE core (
|
||||||
config text,
|
config text,
|
||||||
api_key text,
|
api_key text,
|
||||||
api_secret text,
|
api_secret text,
|
||||||
version text
|
version text,
|
||||||
|
plugins_enabled text,
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
|
|
36
web.go
36
web.go
|
@ -15,15 +15,11 @@ var (
|
||||||
session *sessions.CookieStore
|
session *sessions.CookieStore
|
||||||
)
|
)
|
||||||
|
|
||||||
func RunHTTPServer() {
|
func Router() *mux.Router {
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
|
|
||||||
fmt.Println("Statup HTTP Server running on http://localhost:8080")
|
|
||||||
r.Handle("/", http.HandlerFunc(IndexHandler))
|
r.Handle("/", http.HandlerFunc(IndexHandler))
|
||||||
|
|
||||||
r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(cssBox.HTTPBox())))
|
r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(cssBox.HTTPBox())))
|
||||||
r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(jsBox.HTTPBox())))
|
r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(jsBox.HTTPBox())))
|
||||||
|
|
||||||
r.Handle("/setup", http.HandlerFunc(SetupHandler))
|
r.Handle("/setup", http.HandlerFunc(SetupHandler))
|
||||||
r.Handle("/setup/save", http.HandlerFunc(ProcessSetupHandler))
|
r.Handle("/setup/save", http.HandlerFunc(ProcessSetupHandler))
|
||||||
r.Handle("/dashboard", http.HandlerFunc(DashboardHandler))
|
r.Handle("/dashboard", http.HandlerFunc(DashboardHandler))
|
||||||
|
@ -41,7 +37,12 @@ func RunHTTPServer() {
|
||||||
r.Handle("/plugins/download/{name}", http.HandlerFunc(PluginsDownloadHandler))
|
r.Handle("/plugins/download/{name}", http.HandlerFunc(PluginsDownloadHandler))
|
||||||
r.Handle("/plugins/{name}/save", http.HandlerFunc(PluginSavedHandler)).Methods("POST")
|
r.Handle("/plugins/{name}/save", http.HandlerFunc(PluginSavedHandler)).Methods("POST")
|
||||||
r.Handle("/help", http.HandlerFunc(HelpHandler))
|
r.Handle("/help", http.HandlerFunc(HelpHandler))
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func RunHTTPServer() {
|
||||||
|
fmt.Println("Statup HTTP Server running on http://localhost:8080")
|
||||||
|
r := Router()
|
||||||
for _, p := range allPlugins {
|
for _, p := range allPlugins {
|
||||||
info := p.GetInfo()
|
info := p.GetInfo()
|
||||||
for _, route := range p.Routes() {
|
for _, route := range p.Routes() {
|
||||||
|
@ -214,6 +215,9 @@ func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func IsAuthenticated(r *http.Request) bool {
|
func IsAuthenticated(r *http.Request) bool {
|
||||||
session, _ := store.Get(r, "apizer_auth")
|
session, _ := store.Get(r, "apizer_auth")
|
||||||
|
if session.Values["authenticated"] == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return session.Values["authenticated"].(bool)
|
return session.Values["authenticated"].(bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,17 +230,26 @@ func PluginsHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
tmpl := ParsePlugins("plugins.html")
|
tmpl := ParsePlugins("plugins.html")
|
||||||
core.FetchPluginRepo()
|
core.FetchPluginRepo()
|
||||||
|
|
||||||
|
var pluginFields []PluginSelect
|
||||||
|
|
||||||
for _, p := range allPlugins {
|
for _, p := range allPlugins {
|
||||||
for _, f := range p.GetInfo().Form {
|
fields := SelectSettings(p.GetInfo())
|
||||||
|
|
||||||
f.Val()
|
pluginFields = append(pluginFields, PluginSelect{p.GetInfo().Name, fields})
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
core.PluginFields = pluginFields
|
||||||
|
|
||||||
|
fmt.Println(&core.PluginFields)
|
||||||
|
|
||||||
tmpl.Execute(w, core)
|
tmpl.Execute(w, core)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PluginSelect struct {
|
||||||
|
Plugin string
|
||||||
|
Params map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
func PluginSavedHandler(w http.ResponseWriter, r *http.Request) {
|
func PluginSavedHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
auth := IsAuthenticated(r)
|
auth := IsAuthenticated(r)
|
||||||
if !auth {
|
if !auth {
|
||||||
|
@ -245,12 +258,13 @@ func PluginSavedHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
plugin := SelectPlugin(vars["name"])
|
plug := SelectPlugin(vars["name"])
|
||||||
data := make(map[string]string)
|
data := make(map[string]string)
|
||||||
for k, v := range r.PostForm {
|
for k, v := range r.PostForm {
|
||||||
data[k] = strings.Join(v, "")
|
data[k] = strings.Join(v, "")
|
||||||
}
|
}
|
||||||
plugin.OnSave(data)
|
UpdateSettings(plug.GetInfo(), data)
|
||||||
|
plug.OnSave(data)
|
||||||
http.Redirect(w, r, "/settings", http.StatusSeeOther)
|
http.Redirect(w, r, "/settings", http.StatusSeeOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue