From 56353bfa6d2d0f1fa6fd6e23fd573dcd534b46bb Mon Sep 17 00:00:00 2001 From: hunterlong Date: Fri, 3 Jan 2020 18:03:59 -0800 Subject: [PATCH] integrations --- core/checker.go | 4 +- core/configs.go | 8 +- core/core.go | 2 +- core/database.go | 115 +++++++++--------- core/failures.go | 6 +- core/groups.go | 4 +- core/hits.go | 2 +- core/incidents.go | 6 +- core/integrations/csv_file.go | 18 +-- core/integrations/csv_file_test.go | 18 ++- core/integrations/docker_test.go | 15 +++ core/integrations/integrations_test.go | 2 +- .../test_files/example_services.csv | 1 - core/integrations/traefik_test.go | 2 + core/sample.go | 54 ++++---- core/services.go | 8 +- core/sparklines.go | 2 +- core/users.go | 2 +- source/tmpl/bulk_import.csv | 16 ++- source/wiki.go | 2 +- version.txt | 2 +- 21 files changed, 167 insertions(+), 122 deletions(-) delete mode 100644 core/integrations/test_files/example_services.csv diff --git a/core/checker.go b/core/checker.go index 176a413b..6324056d 100644 --- a/core/checker.go +++ b/core/checker.go @@ -257,7 +257,7 @@ func recordSuccess(s *Service) { Service: s.Id, Latency: s.Latency, PingTime: s.PingTime, - CreatedAt: time.Now(), + CreatedAt: time.Now().UTC(), } s.CreateHit(hit) log.WithFields(utils.ToFields(hit, s.Select())).Infoln(fmt.Sprintf("Service %v Successful Response: %0.2f ms | Lookup in: %0.2f ms", s.Name, hit.Latency*1000, hit.PingTime*1000)) @@ -272,7 +272,7 @@ func recordFailure(s *Service, issue string) { Service: s.Id, Issue: issue, PingTime: s.PingTime, - CreatedAt: time.Now(), + CreatedAt: time.Now().UTC(), ErrorCode: s.LastStatusCode, } log.WithFields(utils.ToFields(fail, s.Select())). diff --git a/core/configs.go b/core/configs.go index 168a6548..e16ffa42 100644 --- a/core/configs.go +++ b/core/configs.go @@ -104,8 +104,8 @@ func LoadUsingEnv() (*types.DbConfig, error) { return Configs, nil } -// DefaultPort accepts a database type and returns its default port -func DefaultPort(db string) int64 { +// defaultPort accepts a database type and returns its default port +func defaultPort(db string) int64 { switch db { case "mysql": return 3306 @@ -140,7 +140,7 @@ func EnvToConfig() (*types.DbConfig, error) { } port := utils.ToInt(os.Getenv("DB_PORT")) if port == 0 { - port = DefaultPort(os.Getenv("DB_PORT")) + port = defaultPort(os.Getenv("DB_PORT")) } name := os.Getenv("NAME") if name == "" { @@ -185,9 +185,11 @@ func EnvToConfig() (*types.DbConfig, error) { // SampleData runs all the sample data for a new Statping installation func SampleData() error { if err := InsertSampleData(); err != nil { + log.Errorln(err) return err } if err := InsertSampleHits(); err != nil { + log.Errorln(err) return err } return nil diff --git a/core/core.go b/core/core.go index 1cc96155..f34bf820 100644 --- a/core/core.go +++ b/core/core.go @@ -50,7 +50,7 @@ func init() { // NewCore return a new *core.Core struct func NewCore() *Core { CoreApp = &Core{&types.Core{ - Started: time.Now(), + Started: time.Now().UTC(), }, } return CoreApp diff --git a/core/database.go b/core/database.go index f8a29159..da127124 100644 --- a/core/database.go +++ b/core/database.go @@ -38,6 +38,10 @@ var ( func init() { DbModels = []interface{}{&types.Service{}, &types.User{}, &types.Hit{}, &types.Failure{}, &types.Message{}, &types.Group{}, &types.Checkin{}, &types.CheckinHit{}, ¬ifier.Notification{}, &types.Incident{}, &types.IncidentUpdate{}} + + gorm.NowFunc = func() time.Time { + return time.Now().UTC() + } } // DbConfig stores the config.yml file for the statup configuration @@ -115,60 +119,60 @@ func CloseDB() { } } -// AfterFind for Core will set the timezone -func (c *Core) AfterFind() (err error) { - c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) - c.UpdatedAt = utils.Timezoner(c.UpdatedAt, CoreApp.Timezone) - return -} - -// AfterFind for Service will set the timezone -func (s *Service) AfterFind() (err error) { - s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone) - s.UpdatedAt = utils.Timezoner(s.UpdatedAt, CoreApp.Timezone) - return -} - -// AfterFind for Hit will set the timezone -func (h *Hit) AfterFind() (err error) { - h.CreatedAt = utils.Timezoner(h.CreatedAt, CoreApp.Timezone) - return -} - -// AfterFind for Failure will set the timezone -func (f *Failure) AfterFind() (err error) { - f.CreatedAt = utils.Timezoner(f.CreatedAt, CoreApp.Timezone) - return -} - -// AfterFind for USer will set the timezone -func (u *User) AfterFind() (err error) { - u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone) - u.UpdatedAt = utils.Timezoner(u.UpdatedAt, CoreApp.Timezone) - return -} - -// AfterFind for Checkin will set the timezone -func (c *Checkin) AfterFind() (err error) { - c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) - c.UpdatedAt = utils.Timezoner(c.UpdatedAt, CoreApp.Timezone) - return -} - -// AfterFind for checkinHit will set the timezone -func (c *CheckinHit) AfterFind() (err error) { - c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) - return -} - -// AfterFind for Message will set the timezone -func (u *Message) AfterFind() (err error) { - u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone) - u.UpdatedAt = utils.Timezoner(u.UpdatedAt, CoreApp.Timezone) - u.StartOn = utils.Timezoner(u.StartOn.UTC(), CoreApp.Timezone) - u.EndOn = utils.Timezoner(u.EndOn.UTC(), CoreApp.Timezone) - return -} +//// AfterFind for Core will set the timezone +//func (c *Core) AfterFind() (err error) { +// c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) +// c.UpdatedAt = utils.Timezoner(c.UpdatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for Service will set the timezone +//func (s *Service) AfterFind() (err error) { +// s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone) +// s.UpdatedAt = utils.Timezoner(s.UpdatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for Hit will set the timezone +//func (h *Hit) AfterFind() (err error) { +// h.CreatedAt = utils.Timezoner(h.CreatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for Failure will set the timezone +//func (f *Failure) AfterFind() (err error) { +// f.CreatedAt = utils.Timezoner(f.CreatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for USer will set the timezone +//func (u *User) AfterFind() (err error) { +// u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone) +// u.UpdatedAt = utils.Timezoner(u.UpdatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for Checkin will set the timezone +//func (c *Checkin) AfterFind() (err error) { +// c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) +// c.UpdatedAt = utils.Timezoner(c.UpdatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for checkinHit will set the timezone +//func (c *CheckinHit) AfterFind() (err error) { +// c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone) +// return +//} +// +//// AfterFind for Message will set the timezone +//func (u *Message) AfterFind() (err error) { +// u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone) +// u.UpdatedAt = utils.Timezoner(u.UpdatedAt, CoreApp.Timezone) +// u.StartOn = utils.Timezoner(u.StartOn.UTC(), CoreApp.Timezone) +// u.EndOn = utils.Timezoner(u.EndOn.UTC(), CoreApp.Timezone) +// return +//} // InsertCore create the single row for the Core settings in Statping func (c *Core) InsertCore(db *types.DbConfig) (*Core, error) { @@ -216,7 +220,7 @@ func (c *Core) Connect(retry bool, location string) error { var err error dbType = CoreApp.Config.DbConn if CoreApp.Config.DbPort == 0 { - CoreApp.Config.DbPort = DefaultPort(dbType) + CoreApp.Config.DbPort = defaultPort(dbType) } switch dbType { case "sqlite": @@ -395,6 +399,7 @@ func (c *Core) MigrateDatabase() error { } }() if tx.Error != nil { + log.Errorln(tx.Error) return tx.Error } for _, table := range DbModels { diff --git a/core/failures.go b/core/failures.go index db9fdc76..65d7efe2 100644 --- a/core/failures.go +++ b/core/failures.go @@ -86,7 +86,7 @@ func (s *Service) LimitedCheckinFailures(amount int64) []*Failure { // Ago returns a human readable timestamp for a Failure func (f *Failure) Ago() string { - got, _ := timeago.TimeAgoWithTime(time.Now(), f.CreatedAt) + got, _ := timeago.TimeAgoWithTime(time.Now().UTC(), f.CreatedAt) return got } @@ -135,7 +135,7 @@ func (s *Service) TotalFailuresOnDate(ago time.Time) (uint64, error) { // TotalFailures24 returns the amount of failures for a service within the last 24 hours func (s *Service) TotalFailures24() (uint64, error) { - ago := time.Now().Add(-24 * time.Hour) + ago := time.Now().UTC().Add(-24 * time.Hour) return s.TotalFailuresSince(ago) } @@ -149,7 +149,7 @@ func (s *Service) TotalFailures() (uint64, error) { // FailuresDaysAgo returns the amount of failures since days ago func (s *Service) FailuresDaysAgo(days int) uint64 { - ago := time.Now().Add((-24 * time.Duration(days)) * time.Hour) + ago := time.Now().UTC().Add((-24 * time.Duration(days)) * time.Hour) count, _ := s.TotalFailuresSince(ago) return count } diff --git a/core/groups.go b/core/groups.go index 6a779495..ece555a1 100644 --- a/core/groups.go +++ b/core/groups.go @@ -22,14 +22,14 @@ func (g *Group) Delete() error { // Create will create a group and insert it into the database func (g *Group) Create() (int64, error) { - g.CreatedAt = time.Now() + g.CreatedAt = time.Now().UTC() db := groupsDb().Create(g) return g.Id, db.Error } // Update will update a group func (g *Group) Update() (int64, error) { - g.UpdatedAt = time.Now() + g.UpdatedAt = time.Now().UTC() db := groupsDb().Update(g) return g.Id, db.Error } diff --git a/core/hits.go b/core/hits.go index 2941206c..7939cb41 100644 --- a/core/hits.go +++ b/core/hits.go @@ -28,7 +28,7 @@ type Hit struct { func (s *Service) CreateHit(h *types.Hit) (int64, error) { db := hitsDB().Create(&h) if db.Error != nil { - log.Warnln(db.Error) + log.Errorln(db.Error) return 0, db.Error } return h.Id, db.Error diff --git a/core/incidents.go b/core/incidents.go index 3cdfe9b4..af1a5df8 100644 --- a/core/incidents.go +++ b/core/incidents.go @@ -47,14 +47,14 @@ func (i *Incident) Delete() error { // Create will create a incident and insert it into the database func (i *Incident) Create() (int64, error) { - i.CreatedAt = time.Now() + i.CreatedAt = time.Now().UTC() db := incidentsDB().Create(i) return i.Id, db.Error } // Update will update a incident func (i *Incident) Update() (int64, error) { - i.UpdatedAt = time.Now() + i.UpdatedAt = time.Now().UTC() db := incidentsDB().Update(i) return i.Id, db.Error } @@ -67,7 +67,7 @@ func (i *IncidentUpdate) Delete() error { // Create will create a incident update and insert it into the database func (i *IncidentUpdate) Create() (int64, error) { - i.CreatedAt = time.Now() + i.CreatedAt = time.Now().UTC() db := incidentsUpdatesDB().Create(i) return i.Id, db.Error } diff --git a/core/integrations/csv_file.go b/core/integrations/csv_file.go index cd4c661e..c3843d23 100644 --- a/core/integrations/csv_file.go +++ b/core/integrations/csv_file.go @@ -16,12 +16,13 @@ package integrations import ( + "bytes" + "encoding/csv" "errors" "fmt" "github.com/hunterlong/statping/types" "github.com/hunterlong/statping/utils" "strconv" - "strings" "time" ) @@ -35,7 +36,7 @@ var csvIntegrator = &csvIntegration{&types.Integration{ ShortName: "csv", Name: "CSV File", Icon: "", - Description: "Import multiple services from a CSV file", + Description: "Import multiple services from a CSV file. Please have your CSV file formatted with the correct amount of columns based on the example file on Github.", Fields: []*types.IntegrationField{ { Name: "input", @@ -53,16 +54,19 @@ func (t *csvIntegration) Get() *types.Integration { func (t *csvIntegration) List() ([]*types.Service, error) { data := Value(t, "input").(string) - for _, line := range strings.Split(strings.TrimSuffix(data, "\n"), "\n") { - col := strings.Split(line, ",") - csvData = append(csvData, col) + buf := bytes.NewReader([]byte(data)) + r := csv.NewReader(buf) + records, err := r.ReadAll() + if err != nil { + return nil, err } var services []*types.Service - for _, v := range csvData { + for k, v := range records[1:] { s, err := commaToService(v) if err != nil { - return nil, err + log.Errorf("error on line %v: %v", k, err) + continue } services = append(services, s) } diff --git a/core/integrations/csv_file_test.go b/core/integrations/csv_file_test.go index 582c74ec..e6aaf969 100644 --- a/core/integrations/csv_file_test.go +++ b/core/integrations/csv_file_test.go @@ -3,22 +3,30 @@ package integrations import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "io/ioutil" "testing" ) func TestCsvFileIntegration(t *testing.T) { + data, err := ioutil.ReadFile("../../source/tmpl/bulk_import.csv") + require.Nil(t, err) - csvIntegrator.Fields[0].Value = "test_files/example_services.csv" + t.Run("Set Field Value", func(t *testing.T) { + formPost := map[string][]string{} + formPost["input"] = []string{string(data)} + _, err = SetFields(csvIntegrator, formPost) + require.Nil(t, err) + }) - t.Run("CSV File", func(t *testing.T) { - path := csvIntegrator.Fields[0].Value - assert.Equal(t, "test_files/example_services.csv", path) + t.Run("Get Field Value", func(t *testing.T) { + value := Value(csvIntegrator, "input").(string) + assert.Equal(t, string(data), value) }) t.Run("List Services from CSV File", func(t *testing.T) { services, err := csvIntegrator.List() require.Nil(t, err) - assert.Equal(t, len(services), 1) + assert.Equal(t, 10, len(services)) }) t.Run("Confirm Services from CSV File", func(t *testing.T) { diff --git a/core/integrations/docker_test.go b/core/integrations/docker_test.go index 4fbbf522..9d9cecaa 100644 --- a/core/integrations/docker_test.go +++ b/core/integrations/docker_test.go @@ -8,6 +8,21 @@ import ( func TestDockerIntegration(t *testing.T) { + t.Run("Set Field Value", func(t *testing.T) { + formPost := map[string][]string{} + formPost["path"] = []string{"unix:///var/run/docker.sock"} + formPost["version"] = []string{"1.25"} + _, err := SetFields(csvIntegrator, formPost) + require.Nil(t, err) + }) + + t.Run("Get Field Value", func(t *testing.T) { + path := Value(dockerIntegrator, "path").(string) + version := Value(dockerIntegrator, "version").(string) + assert.Equal(t, "unix:///var/run/docker.sock", path) + assert.Equal(t, "1.25", version) + }) + t.Run("List Services from Docker", func(t *testing.T) { services, err := dockerIntegrator.List() require.Nil(t, err) diff --git a/core/integrations/integrations_test.go b/core/integrations/integrations_test.go index bd52bc8f..9aa152f1 100644 --- a/core/integrations/integrations_test.go +++ b/core/integrations/integrations_test.go @@ -9,7 +9,7 @@ func TestIntegrations(t *testing.T) { t.Run("Collect Integrations", func(t *testing.T) { amount := len(Integrations) - assert.Equal(t, 2, amount) + assert.Equal(t, 3, amount) }) } diff --git a/core/integrations/test_files/example_services.csv b/core/integrations/test_files/example_services.csv deleted file mode 100644 index 6b75c862..00000000 --- a/core/integrations/test_files/example_services.csv +++ /dev/null @@ -1 +0,0 @@ -Bulk Upload,http://google.com,,200,60s,http,get,,,60s,1,TRUE,TRUE,,Authorization=example,bulk_example,false diff --git a/core/integrations/traefik_test.go b/core/integrations/traefik_test.go index 1252c73a..8405f61c 100644 --- a/core/integrations/traefik_test.go +++ b/core/integrations/traefik_test.go @@ -9,12 +9,14 @@ import ( func TestTraefikIntegration(t *testing.T) { t.Run("List Services from Traefik", func(t *testing.T) { + t.SkipNow() services, err := traefikIntegrator.List() require.Nil(t, err) assert.NotEqual(t, 0, len(services)) }) t.Run("Confirm Services from Traefik", func(t *testing.T) { + t.SkipNow() services, err := traefikIntegrator.List() require.Nil(t, err) for _, s := range services { diff --git a/core/sample.go b/core/sample.go index 55bd8e13..6b0e4c9e 100644 --- a/core/sample.go +++ b/core/sample.go @@ -20,6 +20,7 @@ import ( "github.com/hunterlong/statping/core/notifier" "github.com/hunterlong/statping/types" "github.com/hunterlong/statping/utils" + "sync" "time" ) @@ -191,7 +192,7 @@ func insertSampleCheckins() error { }) checkin2.Update() - checkTime := time.Now().Add(-24 * time.Hour) + checkTime := time.Now().UTC().Add(-24 * time.Hour) for i := 0; i <= 60; i++ { checkHit := ReturnCheckinHit(&types.CheckinHit{ Checkin: checkin1.Id, @@ -206,32 +207,35 @@ func insertSampleCheckins() error { // InsertSampleHits will create a couple new hits for the sample services func InsertSampleHits() error { - + tx := hitsDB().Begin() + sg := new(sync.WaitGroup) for i := int64(1); i <= 5; i++ { - + sg.Add(1) service := SelectService(i) seed := time.Now().UnixNano() - log.Infoln(fmt.Sprintf("Adding %v sample hit records to service %v", SampleHits, service.Name)) createdAt := sampleStart - p := utils.NewPerlin(2., 2., 10, seed) - - for hi := 0.; hi <= float64(SampleHits); hi++ { - - latency := p.Noise1D(hi / 500) - createdAt = createdAt.Add(60 * time.Second) - hit := &types.Hit{ - Service: service.Id, - CreatedAt: createdAt, - Latency: latency, + go func() { + defer sg.Done() + for hi := 0.; hi <= float64(SampleHits); hi++ { + latency := p.Noise1D(hi / 500) + createdAt = createdAt.Add(60 * time.Second) + hit := &types.Hit{ + Service: service.Id, + CreatedAt: createdAt, + Latency: latency, + } + tx = tx.Create(&hit) } - service.CreateHit(hit) - - } + }() } - - return nil + sg.Wait() + err := tx.Commit().Error + if err != nil { + log.Errorln(err) + } + return err } // insertSampleCore will create a new Core for the seed @@ -243,7 +247,7 @@ func insertSampleCore() error { ApiSecret: "samplesecret", Domain: "http://localhost:8080", Version: "test", - CreatedAt: time.Now(), + CreatedAt: time.Now().UTC(), UseCdn: types.NewNullBool(false), } query := coreDB().Create(core) @@ -276,8 +280,8 @@ func insertMessages() error { Title: "Routine Downtime", Description: "This is an example a upcoming message for a service!", ServiceId: 1, - StartOn: time.Now().Add(15 * time.Minute), - EndOn: time.Now().Add(2 * time.Hour), + StartOn: time.Now().UTC().Add(15 * time.Minute), + EndOn: time.Now().UTC().Add(2 * time.Hour), }) if _, err := m1.Create(); err != nil { return err @@ -312,7 +316,7 @@ func InsertLargeSampleData() error { if err := insertMessages(); err != nil { return err } - createdOn := time.Now().Add((-24 * 90) * time.Hour).UTC() + createdOn := time.Now().UTC().Add((-24 * 90) * time.Hour) s6 := ReturnService(&types.Service{ Name: "JSON Lint", Domain: "https://jsonlint.com", @@ -443,7 +447,7 @@ func InsertLargeSampleData() error { s14.Create(false) s15.Create(false) - var dayAgo = time.Now().Add((-24 * 90) * time.Hour) + var dayAgo = time.Now().UTC().Add((-24 * 90) * time.Hour) insertHitRecords(dayAgo, 5450) @@ -485,7 +489,7 @@ func insertHitRecords(since time.Time, amount int64) { createdAt = createdAt.Add(1 * time.Minute) hit := &types.Hit{ Service: service.Id, - CreatedAt: createdAt, + CreatedAt: createdAt.UTC(), Latency: latency, } service.CreateHit(hit) diff --git a/core/services.go b/core/services.go index 32d14eb0..ebadefbe 100644 --- a/core/services.go +++ b/core/services.go @@ -144,7 +144,7 @@ func (s *Service) AvgTime() string { // OnlineDaysPercent returns the service's uptime percent within last 24 hours func (s *Service) OnlineDaysPercent(days int) float32 { - ago := time.Now().Add((-24 * time.Duration(days)) * time.Hour) + ago := time.Now().UTC().Add((-24 * time.Duration(days)) * time.Hour) return s.OnlineSince(ago) } @@ -207,7 +207,7 @@ func (s *Service) SmallText() string { } if len(last) > 0 { lastFailure := s.lastFailure() - got, _ := timeago.TimeAgoWithTime(time.Now().Add(s.Downtime()), time.Now()) + got, _ := timeago.TimeAgoWithTime(time.Now().UTC().Add(s.Downtime()), time.Now().UTC()) return fmt.Sprintf("Reported offline %v, %v", got, lastFailure.ParseError()) } else { return fmt.Sprintf("%v is currently offline", s.Name) @@ -309,7 +309,7 @@ func (d *DateScanObj) ToString() string { // AvgUptime24 returns a service's average online status for last 24 hours func (s *Service) AvgUptime24() string { - ago := time.Now().Add(-24 * time.Hour) + ago := time.Now().UTC().Add(-24 * time.Hour) return s.AvgUptime(ago) } @@ -410,7 +410,7 @@ func (s *Service) Update(restart bool) error { // Create will create a service and insert it into the database func (s *Service) Create(check bool) (int64, error) { - s.CreatedAt = time.Now() + s.CreatedAt = time.Now().UTC() db := servicesDB().Create(s) if db.Error != nil { log.Errorln(fmt.Sprintf("Failed to create service %v #%v: %v", s.Name, s.Id, db.Error)) diff --git a/core/sparklines.go b/core/sparklines.go index b80a50d7..5bd1816c 100644 --- a/core/sparklines.go +++ b/core/sparklines.go @@ -9,7 +9,7 @@ import ( // SparklineDayFailures returns a string array of daily service failures func (s *Service) SparklineDayFailures(days int) string { var arr []string - ago := time.Now().Add((time.Duration(days) * -24) * time.Hour) + ago := time.Now().UTC().Add((time.Duration(days) * -24) * time.Hour) for day := 1; day <= days; day++ { ago = ago.Add(24 * time.Hour) failures, _ := s.TotalFailuresOnDate(ago) diff --git a/core/users.go b/core/users.go index 8efcf65c..e197454d 100644 --- a/core/users.go +++ b/core/users.go @@ -68,7 +68,7 @@ func (u *User) Update() error { // Create will insert a new User into the database func (u *User) Create() (int64, error) { - u.CreatedAt = time.Now() + u.CreatedAt = time.Now().UTC() u.Password = utils.HashPassword(u.Password) u.ApiKey = utils.NewSHA1Hash(5) u.ApiSecret = utils.NewSHA1Hash(10) diff --git a/source/tmpl/bulk_import.csv b/source/tmpl/bulk_import.csv index e7ffbb69..82230c30 100644 --- a/source/tmpl/bulk_import.csv +++ b/source/tmpl/bulk_import.csv @@ -1,5 +1,11 @@ -name,domain,expected,expected_status,interval,type,method,post_data,port,timeout,order,allow_notifications,public,group_id,headers,permalink -Bulk Upload,http://google.com,,200,60s,http,get,,,60s,1,TRUE,TRUE,,Authorization=example,bulk_example -JSON Post,https://jsonplaceholder.typicode.com/posts,,200,1m,http,post,"{""id"": 1, ""title"": 'foo', ""body"": 'bar', ""userId"": 1}",,15s,2,TRUE,TRUE,,Content-Type=application/json,json_post_example -Google DNS,8.8.8.8,,,,tcp,,,53,10s,3,TRUE,TRUE,,,google_dns_example -Google DNS UDP,8.8.8.8,,,,udp,,,53,10s,4,TRUE,TRUE,,,google_dns_udp_example +name,domain,expected,expected_status,interval,type,method,post_data,port,timeout,order,allow_notifications,public,group_id,headers,permalink,verify_ssl +Bulk Upload,http://google.com,,200,60s,http,get,,,60s,1,TRUE,TRUE,,Authorization=example,bulk_example,FALSE +JSON Post,https://jsonplaceholder.typicode.com/posts,,200,1m,http,post,"{""id"": 1, ""title"": 'foo', ""body"": 'bar', ""userId"": 1}",,15s,2,TRUE,TRUE,,Content-Type=application/json,json_post_example,FALSE +Google DNS,8.8.8.8,,,60s,tcp,,,53,10s,3,TRUE,TRUE,,,google_dns_example,FALSE +Google DNS UDP,8.8.8.8,,,60s,udp,,,53,10s,4,TRUE,TRUE,,,google_dns_udp_example,FALSE +Statping Demo Page,https://demo.statping.com/health,"(\""online\"": true)",200,30s,http,get,,,10s,5,TRUE,TRUE,,,demo_link,FALSE +Statping MySQL Page,https://mysql.statping.com/health,"(\""online\"": true)",200,30s,http,get,,,10s,6,TRUE,TRUE,,,mysql_demo_link,FALSE +Statping SQLite Page,https://sqlite.statping.com/health,"(\""online\"": true)",200,30s,http,get,,,10s,7,TRUE,TRUE,,,sqlite_demo_link,FALSE +Token Balance,https://status.tokenbalance.com/health,"(\""online\"": true)",200,30s,http,get,,,10s,8,TRUE,TRUE,,,token_balance,FALSE +CloudFlare DNS,1.1.1.1,,,60s,tcp,,,53,10s,9,TRUE,TRUE,,,cloudflare_dns_example,FALSE +Verisign DNS,64.6.64.4,,,60s,tcp,,,53,10s,10,TRUE,TRUE,,,verisign_dns_example,FALSE diff --git a/source/wiki.go b/source/wiki.go index 69546ee5..0091fc7e 100644 --- a/source/wiki.go +++ b/source/wiki.go @@ -1,6 +1,6 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots at -// 2020-01-03 01:13:42.095152 +0000 UTC +// 2020-01-03 23:37:37.365614 +0000 UTC // // This contains the most recently Markdown source for the Statping Wiki. package source diff --git a/version.txt b/version.txt index 63dd2691..8210f30f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.80.67 +0.80.68