mirror of https://github.com/statping/statping
				
				
				
			new
							parent
							
								
									dbb73f7651
								
							
						
					
					
						commit
						8d8f25ea23
					
				
							
								
								
									
										4
									
								
								api.go
								
								
								
								
							
							
						
						
									
										4
									
								
								api.go
								
								
								
								
							| 
						 | 
				
			
			@ -20,13 +20,13 @@ func ApiCheckinHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
 | 
			
		||||
func ApiServiceHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	json.NewEncoder(w).Encode(service)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ApiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
 | 
			
		||||
	var s Service
 | 
			
		||||
	decoder := json.NewDecoder(r.Body)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
package comms
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"gopkg.in/gomail.v2"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	mailer *gomail.Dialer
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewMailer() {
 | 
			
		||||
	mailer = gomail.NewDialer(os.Getenv("HOST"), 587, os.Getenv("USER"), os.Getenv("PASS"))
 | 
			
		||||
	mailer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
 | 
			
		||||
 | 
			
		||||
	source := EmailTemplate("comms/templates/error.html", "this is coooool")
 | 
			
		||||
 | 
			
		||||
	fmt.Println("source: ", source)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func EmailTemplate(tmpl string, data interface{}) string {
 | 
			
		||||
	t := template.New("error.html")
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	t, err = t.ParseFiles(tmpl)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tpl bytes.Buffer
 | 
			
		||||
	if err := t.Execute(&tpl, data); err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result := tpl.String()
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SendEmail(to, subject, body string) {
 | 
			
		||||
	m := gomail.NewMessage()
 | 
			
		||||
	m.SetHeader("From", "info@email.com")
 | 
			
		||||
	m.SetHeader("To", to)
 | 
			
		||||
	m.SetHeader("Subject", subject)
 | 
			
		||||
	m.SetBody("text/html", body)
 | 
			
		||||
	if err := mailer.DialAndSend(m); err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 | 
			
		||||
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<p>
 | 
			
		||||
    <strong>Hello {{.}}</strong>
 | 
			
		||||
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,80 @@
 | 
			
		|||
package main
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	Communications []*Communication
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Communication struct {
 | 
			
		||||
	Id        int64     `db:"id,omitempty" json:"id"`
 | 
			
		||||
	Method    string    `db:"method" json:"method"`
 | 
			
		||||
	Host      string    `db:"host" json:"host"`
 | 
			
		||||
	Port      int64     `db:"port" json:"port"`
 | 
			
		||||
	User      string    `db:"user" json:"user"`
 | 
			
		||||
	Password  string    `db:"password" json:"-"`
 | 
			
		||||
	Var1      string    `db:"var1" json:"var1"`
 | 
			
		||||
	Var2      string    `db:"var2" json:"var2"`
 | 
			
		||||
	ApiKey    string    `db:"api_key" json:"api_key"`
 | 
			
		||||
	ApiSecret string    `db:"api_secret" json:"api_secret"`
 | 
			
		||||
	Enabled   bool      `db:"enabled" json:"enabled"`
 | 
			
		||||
	Limits    int64     `db:"limits" json:"limits"`
 | 
			
		||||
	Removable bool      `db:"removable" json:"removable"`
 | 
			
		||||
	CreatedAt time.Time `db:"created_at" json:"created_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func OnCommunicate() {
 | 
			
		||||
	for _, c := range Communications {
 | 
			
		||||
		if c.Enabled {
 | 
			
		||||
			c.Run()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Communication) Run() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SelectAllCommunications() ([]*Communication, error) {
 | 
			
		||||
	var c []*Communication
 | 
			
		||||
	col := dbSession.Collection("communication").Find()
 | 
			
		||||
	err := col.All(&c)
 | 
			
		||||
	Communications = c
 | 
			
		||||
	return c, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Communication) Create() (int64, error) {
 | 
			
		||||
	c.CreatedAt = time.Now()
 | 
			
		||||
	uuid, err := dbSession.Collection("communication").Insert(c)
 | 
			
		||||
	if uuid == nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	c.Id = uuid.(int64)
 | 
			
		||||
	Communications = append(Communications, c)
 | 
			
		||||
	return uuid.(int64), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Communication) Disable() {
 | 
			
		||||
	c.Enabled = false
 | 
			
		||||
	c.Update()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Communication) Enable() {
 | 
			
		||||
	c.Enabled = true
 | 
			
		||||
	c.Update()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Communication) Update() *Communication {
 | 
			
		||||
	col := dbSession.Collection("communication").Find("id", c.Id)
 | 
			
		||||
	col.Update(c)
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SelectCommunication(id int64) *Communication {
 | 
			
		||||
	for _, c := range Communications {
 | 
			
		||||
		if c.Id == id {
 | 
			
		||||
			return c
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								core.go
								
								
								
								
							
							
						
						
									
										1
									
								
								core.go
								
								
								
								
							| 
						 | 
				
			
			@ -13,6 +13,7 @@ type Core struct {
 | 
			
		|||
	ApiSecret    string `db:"api_secret"`
 | 
			
		||||
	Style        string `db:"style"`
 | 
			
		||||
	Footer       string `db:"footer"`
 | 
			
		||||
	Domain       string `db:"domain"`
 | 
			
		||||
	Version      string `db:"version"`
 | 
			
		||||
	Plugins      []plugin.Info
 | 
			
		||||
	Repos        []PluginJSON
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,11 +27,11 @@ func (s *Service) CreateFailure(data FailureData) (int64, error) {
 | 
			
		|||
	return uuid.(int64), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Service) SelectAllFailures() ([]*Failure, error) {
 | 
			
		||||
func (s *Service) SelectAllFailures() []*Failure {
 | 
			
		||||
	var fails []*Failure
 | 
			
		||||
	col := dbSession.Collection("failures").Find("service", s.Id).OrderBy("-id")
 | 
			
		||||
	err := col.All(&fails)
 | 
			
		||||
	return fails, err
 | 
			
		||||
	col.All(&fails)
 | 
			
		||||
	return fails
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (u *Service) DeleteFailures() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -116,8 +116,8 @@
 | 
			
		|||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="form-group row">
 | 
			
		||||
                    <label for="service_url" class="col-sm-12 col-form-label">Application Endpoint (URL)</label>
 | 
			
		||||
                    <div class="col-12">
 | 
			
		||||
                    <label for="service_url" class="col-sm-4 col-form-label">Application Endpoint (URL)</label>
 | 
			
		||||
                    <div class="col-sm-8">
 | 
			
		||||
                        <input type="text" name="domain" class="form-control" id="service_url" value="{{.Domain}}" placeholder="https://google.com">
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -194,20 +194,10 @@
 | 
			
		|||
                label: 'Response Time (Milliseconds)',
 | 
			
		||||
                data: {{js .GraphData}},
 | 
			
		||||
                backgroundColor: [
 | 
			
		||||
                    'rgba(255, 99, 132, 0.2)',
 | 
			
		||||
                    'rgba(54, 162, 235, 0.2)',
 | 
			
		||||
                    'rgba(255, 206, 86, 0.2)',
 | 
			
		||||
                    'rgba(75, 192, 192, 0.2)',
 | 
			
		||||
                    'rgba(153, 102, 255, 0.2)',
 | 
			
		||||
                    'rgba(255, 159, 64, 0.2)'
 | 
			
		||||
                    'rgba(47, 206, 30, 0.92)'
 | 
			
		||||
                ],
 | 
			
		||||
                borderColor: [
 | 
			
		||||
                    'rgba(255,99,132,1)',
 | 
			
		||||
                    'rgba(54, 162, 235, 1)',
 | 
			
		||||
                    'rgba(255, 206, 86, 1)',
 | 
			
		||||
                    'rgba(75, 192, 192, 1)',
 | 
			
		||||
                    'rgba(153, 102, 255, 1)',
 | 
			
		||||
                    'rgba(255, 159, 64, 1)'
 | 
			
		||||
                    'rgb(47, 171, 34)'
 | 
			
		||||
                ],
 | 
			
		||||
                borderWidth: 1
 | 
			
		||||
            }]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,8 +64,8 @@
 | 
			
		|||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="form-group row">
 | 
			
		||||
                    <label for="service_url" class="col-sm-12 col-form-label">Application Endpoint (URL)</label>
 | 
			
		||||
                    <div class="col-12">
 | 
			
		||||
                    <label for="service_url" class="col-sm-4 col-form-label">Application Endpoint (URL)</label>
 | 
			
		||||
                    <div class="col-sm-8">
 | 
			
		||||
                        <input type="text" name="domain" class="form-control" id="service_url" placeholder="https://google.com">
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								main.go
								
								
								
								
							
							
						
						
									
										4
									
								
								main.go
								
								
								
								
							| 
						 | 
				
			
			@ -6,6 +6,7 @@ import (
 | 
			
		|||
	"github.com/GeertJohan/go.rice"
 | 
			
		||||
	"github.com/go-yaml/yaml"
 | 
			
		||||
	"github.com/gorilla/sessions"
 | 
			
		||||
	"github.com/hunterlong/statup/comms"
 | 
			
		||||
	"github.com/hunterlong/statup/plugin"
 | 
			
		||||
	"golang.org/x/crypto/bcrypt"
 | 
			
		||||
	"io"
 | 
			
		||||
| 
						 | 
				
			
			@ -124,6 +125,9 @@ func DownloadFile(filepath string, url string) error {
 | 
			
		|||
func main() {
 | 
			
		||||
	var err error
 | 
			
		||||
	fmt.Printf("Starting Statup v%v\n", VERSION)
 | 
			
		||||
 | 
			
		||||
	comms.NewMailer()
 | 
			
		||||
 | 
			
		||||
	RenderBoxes()
 | 
			
		||||
	configs, err = LoadConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										34
									
								
								main_test.go
								
								
								
								
							
							
						
						
									
										34
									
								
								main_test.go
								
								
								
								
							| 
						 | 
				
			
			@ -140,8 +140,8 @@ func TestUser_Create(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestOneService_Check(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	assert.Equal(t, "Google", service.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,32 +161,30 @@ func TestService_Create(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestService_Check(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(2)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(2)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	assert.Equal(t, "Statup.io", service.Name)
 | 
			
		||||
	out := service.Check()
 | 
			
		||||
	assert.Equal(t, true, out.Online)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestService_AvgTime(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	avg := service.AvgUptime()
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Equal(t, "100", avg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestService_Online24(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	online := service.Online24()
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Equal(t, float32(100), online)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestService_GraphData(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	data := service.GraphData()
 | 
			
		||||
	assert.NotEmpty(t, data)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -207,22 +205,22 @@ func TestBadService_Create(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestBadService_Check(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(4)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(4)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	assert.Equal(t, "Github Failing Check", service.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestService_Hits(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	hits, err := service.Hits()
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Equal(t, 20, len(hits))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestService_LimitedHits(t *testing.T) {
 | 
			
		||||
	service, err := SelectService(1)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	service := SelectService(1)
 | 
			
		||||
	assert.NotNil(t, service)
 | 
			
		||||
	hits, err := service.LimitedHits()
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Equal(t, 20, len(hits))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								services.go
								
								
								
								
							
							
						
						
									
										38
									
								
								services.go
								
								
								
								
							| 
						 | 
				
			
			@ -23,6 +23,7 @@ type Service struct {
 | 
			
		|||
	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"`
 | 
			
		||||
	Online         bool       `json:"online"`
 | 
			
		||||
| 
						 | 
				
			
			@ -30,30 +31,34 @@ type Service struct {
 | 
			
		|||
	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"`
 | 
			
		||||
	runRoutine     bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func serviceCol() db.Collection {
 | 
			
		||||
	return dbSession.Collection("services")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SelectService(id int64) (*Service, error) {
 | 
			
		||||
	var service *Service
 | 
			
		||||
	res := serviceCol().Find("id", id)
 | 
			
		||||
	err := res.One(&service)
 | 
			
		||||
	service.Checkins = service.SelectAllCheckins()
 | 
			
		||||
	return service, err
 | 
			
		||||
func SelectService(id int64) *Service {
 | 
			
		||||
	for _, s := range services {
 | 
			
		||||
		if s.Id == id {
 | 
			
		||||
			return s
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SelectAllServices() ([]*Service, error) {
 | 
			
		||||
	var services []*Service
 | 
			
		||||
	var srvcs []*Service
 | 
			
		||||
	col := serviceCol().Find()
 | 
			
		||||
	err := col.All(&services)
 | 
			
		||||
	for _, s := range services {
 | 
			
		||||
	err := col.All(&srvcs)
 | 
			
		||||
	for _, s := range srvcs {
 | 
			
		||||
		s.Checkins = s.SelectAllCheckins()
 | 
			
		||||
		s.Failures = s.SelectAllFailures()
 | 
			
		||||
	}
 | 
			
		||||
	return services, err
 | 
			
		||||
	return srvcs, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Service) AvgTime() float64 {
 | 
			
		||||
| 
						 | 
				
			
			@ -132,9 +137,21 @@ func (s *Service) AvgUptime() string {
 | 
			
		|||
	return s.TotalUptime
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (u *Service) RemoveArray() []*Service {
 | 
			
		||||
	var srvcs []*Service
 | 
			
		||||
	for _, s := range services {
 | 
			
		||||
		if s.Id != u.Id {
 | 
			
		||||
			srvcs = append(srvcs, s)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	services = srvcs
 | 
			
		||||
	return srvcs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (u *Service) Delete() error {
 | 
			
		||||
	res := serviceCol().Find("id", u.Id)
 | 
			
		||||
	err := res.Delete()
 | 
			
		||||
	u.RemoveArray()
 | 
			
		||||
	OnDeletedService(u)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -151,6 +168,7 @@ func (u *Service) Create() (int64, error) {
 | 
			
		|||
	}
 | 
			
		||||
	u.Id = uuid.(int64)
 | 
			
		||||
	services = append(services, u)
 | 
			
		||||
	go u.CheckQueue()
 | 
			
		||||
	OnNewService(u)
 | 
			
		||||
	return uuid.(int64), err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								setup.go
								
								
								
								
							
							
						
						
									
										17
									
								
								setup.go
								
								
								
								
							| 
						 | 
				
			
			@ -26,6 +26,10 @@ type DbConfig struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func ProcessSetupHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if core.ApiKey != "" {
 | 
			
		||||
		http.Redirect(w, r, "/", http.StatusSeeOther)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	r.ParseForm()
 | 
			
		||||
	dbHost := r.PostForm.Get("db_host")
 | 
			
		||||
	dbUser := r.PostForm.Get("db_user")
 | 
			
		||||
| 
						 | 
				
			
			@ -77,9 +81,12 @@ func ProcessSetupHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
	admin := &User{
 | 
			
		||||
		Username: config.Username,
 | 
			
		||||
		Password: config.Password,
 | 
			
		||||
		Admin:    true,
 | 
			
		||||
	}
 | 
			
		||||
	admin.Create()
 | 
			
		||||
 | 
			
		||||
	InsertDefaultComms()
 | 
			
		||||
 | 
			
		||||
	if sample == "on" {
 | 
			
		||||
		go LoadSampleData()
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +96,15 @@ func ProcessSetupHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
	mainProcess()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InsertDefaultComms() {
 | 
			
		||||
	emailer := &Communication{
 | 
			
		||||
		Method:    "email",
 | 
			
		||||
		Removable: false,
 | 
			
		||||
		Enabled:   false,
 | 
			
		||||
	}
 | 
			
		||||
	emailer.Create()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteConfig() {
 | 
			
		||||
	err := os.Remove("./config.yml")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -145,6 +161,7 @@ func (c *DbConfig) Save() error {
 | 
			
		|||
		NewSHA1Hash(10),
 | 
			
		||||
		"",
 | 
			
		||||
		"",
 | 
			
		||||
		"",
 | 
			
		||||
		VERSION,
 | 
			
		||||
		[]plugin.Info{},
 | 
			
		||||
		[]PluginJSON{},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,4 +3,5 @@ DROP table hits;
 | 
			
		|||
DROP table failures;
 | 
			
		||||
DROP table users;
 | 
			
		||||
DROP table checkins;
 | 
			
		||||
DROP table services;
 | 
			
		||||
DROP table services;
 | 
			
		||||
DROP table communication;
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ CREATE TABLE core (
 | 
			
		|||
    api_secret VARCHAR(50),
 | 
			
		||||
    style text,
 | 
			
		||||
    footer text,
 | 
			
		||||
    domain text,
 | 
			
		||||
    version VARCHAR(50)
 | 
			
		||||
);
 | 
			
		||||
CREATE TABLE users (
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +16,7 @@ CREATE TABLE users (
 | 
			
		|||
    email text,
 | 
			
		||||
    api_key VARCHAR(50),
 | 
			
		||||
    api_secret VARCHAR(50),
 | 
			
		||||
    admin bool,
 | 
			
		||||
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
    INDEX (id)
 | 
			
		||||
);
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +30,8 @@ CREATE TABLE services (
 | 
			
		|||
    expected text,
 | 
			
		||||
    expected_status INT(6),
 | 
			
		||||
    check_interval int(11),
 | 
			
		||||
    post_data text,
 | 
			
		||||
    order_id integer,
 | 
			
		||||
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
    INDEX (id)
 | 
			
		||||
);
 | 
			
		||||
| 
						 | 
				
			
			@ -55,4 +59,20 @@ CREATE TABLE checkins (
 | 
			
		|||
    created_at TIMESTAMP,
 | 
			
		||||
    INDEX (id, service),
 | 
			
		||||
    FOREIGN KEY (service) REFERENCES services(id)
 | 
			
		||||
);
 | 
			
		||||
CREATE TABLE communication (
 | 
			
		||||
    id SERIAL PRIMARY KEY,
 | 
			
		||||
    method text,
 | 
			
		||||
    host text,
 | 
			
		||||
    port integer,
 | 
			
		||||
    user text,
 | 
			
		||||
    password text,
 | 
			
		||||
    var1 text,
 | 
			
		||||
    var2 text,
 | 
			
		||||
    api_key text,
 | 
			
		||||
    api_secret text,
 | 
			
		||||
    enabled boolean,
 | 
			
		||||
    removable boolean,
 | 
			
		||||
    limits integer,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ CREATE TABLE core (
 | 
			
		|||
    api_secret text,
 | 
			
		||||
    style text,
 | 
			
		||||
    footer text,
 | 
			
		||||
    domain text,
 | 
			
		||||
    version text
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +17,7 @@ CREATE TABLE users (
 | 
			
		|||
    email text,
 | 
			
		||||
    api_key text,
 | 
			
		||||
    api_secret text,
 | 
			
		||||
    admin bool,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +31,8 @@ CREATE TABLE services (
 | 
			
		|||
    expected text,
 | 
			
		||||
    expected_status integer,
 | 
			
		||||
    check_interval integer,
 | 
			
		||||
    post_data text,
 | 
			
		||||
    order_id integer,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +59,23 @@ CREATE TABLE checkins (
 | 
			
		|||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
CREATE TABLE communication (
 | 
			
		||||
    id SERIAL PRIMARY KEY,
 | 
			
		||||
    method text,
 | 
			
		||||
    host text,
 | 
			
		||||
    port integer,
 | 
			
		||||
    user text,
 | 
			
		||||
    password text,
 | 
			
		||||
    var1 text,
 | 
			
		||||
    var2 text,
 | 
			
		||||
    api_key text,
 | 
			
		||||
    api_secret text,
 | 
			
		||||
    enabled boolean,
 | 
			
		||||
    removable boolean,
 | 
			
		||||
    limits integer,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CREATE INDEX idx_hits ON hits(service);
 | 
			
		||||
CREATE INDEX idx_failures ON failures(service);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ CREATE TABLE core (
 | 
			
		|||
    api_secret text,
 | 
			
		||||
    style text,
 | 
			
		||||
    footer text,
 | 
			
		||||
    domain text,
 | 
			
		||||
    version text
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +17,7 @@ CREATE TABLE users (
 | 
			
		|||
    email text,
 | 
			
		||||
    api_key text,
 | 
			
		||||
    api_secret text,
 | 
			
		||||
    admin bool,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +31,8 @@ CREATE TABLE services (
 | 
			
		|||
    expected text,
 | 
			
		||||
    expected_status integer,
 | 
			
		||||
    check_interval integer,
 | 
			
		||||
    post_data text,
 | 
			
		||||
    order_id integer,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +58,24 @@ CREATE TABLE checkins (
 | 
			
		|||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
CREATE TABLE communication (
 | 
			
		||||
    id SERIAL PRIMARY KEY,
 | 
			
		||||
    method text,
 | 
			
		||||
    host text,
 | 
			
		||||
    port integer,
 | 
			
		||||
    user text,
 | 
			
		||||
    password text,
 | 
			
		||||
    var1 text,
 | 
			
		||||
    var2 text,
 | 
			
		||||
    api_key text,
 | 
			
		||||
    api_secret text,
 | 
			
		||||
    enabled boolean,
 | 
			
		||||
    removable boolean,
 | 
			
		||||
    limits integer,
 | 
			
		||||
    created_at TIMESTAMP
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CREATE INDEX idx_hits ON hits(service);
 | 
			
		||||
CREATE INDEX idx_failures ON failures(service);
 | 
			
		||||
CREATE INDEX idx_checkins ON checkins(service);
 | 
			
		||||
							
								
								
									
										1
									
								
								users.go
								
								
								
								
							
							
						
						
									
										1
									
								
								users.go
								
								
								
								
							| 
						 | 
				
			
			@ -12,6 +12,7 @@ type User struct {
 | 
			
		|||
	Email     string    `db:"email" json:"-"`
 | 
			
		||||
	ApiKey    string    `db:"api_key" json:"api_key"`
 | 
			
		||||
	ApiSecret string    `db:"api_secret" json:"-"`
 | 
			
		||||
	Admin     bool      `db:"admin" json:"admin"`
 | 
			
		||||
	CreatedAt time.Time `db:"created_at" json:"created_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								web.go
								
								
								
								
							
							
						
						
									
										17
									
								
								web.go
								
								
								
								
							| 
						 | 
				
			
			@ -48,7 +48,6 @@ func Router() *mux.Router {
 | 
			
		|||
	r.Handle("/plugins/download/{name}", http.HandlerFunc(PluginsDownloadHandler))
 | 
			
		||||
	r.Handle("/plugins/{name}/save", http.HandlerFunc(PluginSavedHandler)).Methods("POST")
 | 
			
		||||
	r.Handle("/help", http.HandlerFunc(HelpHandler))
 | 
			
		||||
 | 
			
		||||
	r.Handle("/api", http.HandlerFunc(ApiIndexHandler))
 | 
			
		||||
	r.Handle("/api/checkin/{api}", http.HandlerFunc(ApiCheckinHandler))
 | 
			
		||||
	r.Handle("/api/services", http.HandlerFunc(ApiAllServicesHandler))
 | 
			
		||||
| 
						 | 
				
			
			@ -151,6 +150,10 @@ func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func SetupHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if core.ApiKey != "" {
 | 
			
		||||
		http.Redirect(w, r, "/", http.StatusSeeOther)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ExecuteResponse(w, r, "setup.html", nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -209,10 +212,8 @@ func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service.Delete()
 | 
			
		||||
	services, _ = SelectAllServices()
 | 
			
		||||
	http.Redirect(w, r, "/services", http.StatusSeeOther)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -223,7 +224,7 @@ func ServicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
 | 
			
		||||
	service.DeleteFailures()
 | 
			
		||||
	services, _ = SelectAllServices()
 | 
			
		||||
| 
						 | 
				
			
			@ -345,7 +346,7 @@ func CheckinCreateUpdateHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
	}
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	interval := StringInt(r.PostForm.Get("interval"))
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	checkin := &Checkin{
 | 
			
		||||
		Service:  service.Id,
 | 
			
		||||
		Interval: interval,
 | 
			
		||||
| 
						 | 
				
			
			@ -365,7 +366,7 @@ func ServicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
 | 
			
		||||
func ServicesBadgeHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
 | 
			
		||||
	var badge []byte
 | 
			
		||||
	if service.Online {
 | 
			
		||||
| 
						 | 
				
			
			@ -388,7 +389,7 @@ func ServicesViewHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	service, _ := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	service := SelectService(StringInt(vars["id"]))
 | 
			
		||||
	ExecuteResponse(w, r, "service.html", service)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue