diff --git a/README.md b/README.md index 095a7ff..6bad5cb 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
LOGO designed by 熊大 .

-    +   

:trollface: 哪吒监控 一站式轻监控轻运维系统。支持系统状态、HTTP(SSL 证书变更、即将到期、到期)、TCP、Ping 监控报警,计划任务和在线终端。

diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 6abacc5..b8f0da4 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -3,7 +3,6 @@ package main import ( "context" "crypto/tls" - "encoding/json" "errors" "fmt" "io" @@ -402,7 +401,7 @@ func handleTerminalTask(task *pb.Task) { return } var terminal model.TerminalTask - err := json.Unmarshal([]byte(task.GetData()), &terminal) + err := utils.Json.Unmarshal([]byte(task.GetData()), &terminal) if err != nil { println("Terminal 任务解析错误:", err) return @@ -470,7 +469,7 @@ func handleTerminalTask(task *pb.Task) { case 0: io.Copy(tty, reader) case 1: - decoder := json.NewDecoder(reader) + decoder := utils.Json.NewDecoder(reader) var resizeMessage WindowSize err := decoder.Decode(&resizeMessage) if err != nil { diff --git a/cmd/agent/monitor/myip.go b/cmd/agent/monitor/myip.go index 9ede603..c41b774 100644 --- a/cmd/agent/monitor/myip.go +++ b/cmd/agent/monitor/myip.go @@ -1,7 +1,6 @@ package monitor import ( - "encoding/json" "fmt" "io/ioutil" "net/http" @@ -69,7 +68,7 @@ func fetchGeoIP(servers []string, isV6 bool) geoIP { continue } resp.Body.Close() - err = json.Unmarshal(body, &ip) + err = utils.Json.Unmarshal(body, &ip) if err != nil { continue } diff --git a/cmd/dashboard/controller/common_page.go b/cmd/dashboard/controller/common_page.go index c79150e..6594d04 100644 --- a/cmd/dashboard/controller/common_page.go +++ b/cmd/dashboard/controller/common_page.go @@ -1,7 +1,6 @@ package controller import ( - "encoding/json" "errors" "fmt" "log" @@ -16,6 +15,7 @@ import ( "github.com/naiba/nezha/model" "github.com/naiba/nezha/pkg/mygin" + "github.com/naiba/nezha/pkg/utils" "github.com/naiba/nezha/proto" "github.com/naiba/nezha/service/singleton" ) @@ -140,16 +140,23 @@ func (cp *commonPage) ws(c *gin.Context) { return } defer conn.Close() - var servers []*model.Server + var bytesToWrite []byte count := 0 for { singleton.SortedServerLock.RLock() - servers = singleton.SortedServerList - singleton.SortedServerLock.RUnlock() - err = conn.WriteJSON(Data{ + bytesToWrite, err = utils.Json.Marshal(Data{ Now: time.Now().Unix() * 1000, - Servers: servers, + Servers: singleton.SortedServerList, }) + singleton.SortedServerLock.RUnlock() + if err != nil { + break + } + writer, err := conn.NextWriter(websocket.TextMessage) + if err != nil { + break + } + _, err = writer.Write(bytesToWrite) if err != nil { break } @@ -241,7 +248,7 @@ func (cp *commonPage) terminal(c *gin.Context) { return } - terminalData, _ := json.Marshal(&model.TerminalTask{ + terminalData, _ := utils.Json.Marshal(&model.TerminalTask{ Host: terminal.host, UseSSL: terminal.useSSL, Session: terminalID, diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index f9298da..126f0d1 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -2,7 +2,6 @@ package controller import ( "bytes" - "encoding/json" "errors" "fmt" "net/http" @@ -281,7 +280,7 @@ func (ma *memberAPI) addOrEditCron(c *gin.Context) { cr.PushSuccessful = cf.PushSuccessful == "on" cr.ID = cf.ID cr.Cover = cf.Cover - err = json.Unmarshal([]byte(cf.ServersRaw), &cr.Servers) + err = utils.Json.Unmarshal([]byte(cf.ServersRaw), &cr.Servers) } tx := singleton.DB.Begin() if err == nil { @@ -433,7 +432,7 @@ func (ma *memberAPI) addOrEditAlertRule(c *gin.Context) { var r model.AlertRule err := c.ShouldBindJSON(&arf) if err == nil { - err = json.Unmarshal([]byte(arf.RulesRaw), &r.Rules) + err = utils.Json.Unmarshal([]byte(arf.RulesRaw), &r.Rules) } if err == nil { if len(r.Rules) == 0 { diff --git a/go.mod b/go.mod index 000b0f8..e2c595d 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/hashicorp/go-uuid v1.0.2 github.com/iamacarpet/go-winpty v1.0.2 + github.com/json-iterator/go v1.1.12 github.com/ory/graceful v0.1.2 github.com/p14yground/go-github-selfupdate v0.0.0-20220205132106-76a6d59b925b github.com/patrickmn/go-cache v2.1.0+incompatible @@ -47,7 +48,6 @@ require ( github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.4 // indirect - github.com/json-iterator/go v1.1.12 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.5 // indirect diff --git a/model/alertrule.go b/model/alertrule.go index 8d9140d..b0a6230 100644 --- a/model/alertrule.go +++ b/model/alertrule.go @@ -1,9 +1,9 @@ package model import ( - "encoding/json" "time" + "github.com/naiba/nezha/pkg/utils" "gorm.io/gorm" ) @@ -27,7 +27,7 @@ type AlertRule struct { } func (r *AlertRule) BeforeSave(tx *gorm.DB) error { - data, err := json.Marshal(r.Rules) + data, err := utils.Json.Marshal(r.Rules) if err != nil { return err } @@ -36,7 +36,7 @@ func (r *AlertRule) BeforeSave(tx *gorm.DB) error { } func (r *AlertRule) AfterFind(tx *gorm.DB) error { - return json.Unmarshal([]byte(r.RulesRaw), &r.Rules) + return utils.Json.Unmarshal([]byte(r.RulesRaw), &r.Rules) } func (r *AlertRule) Enabled() bool { diff --git a/model/cron.go b/model/cron.go index 043199f..ff1aa11 100644 --- a/model/cron.go +++ b/model/cron.go @@ -1,9 +1,9 @@ package model import ( - "encoding/json" "time" + "github.com/naiba/nezha/pkg/utils" "github.com/robfig/cron/v3" "gorm.io/gorm" ) @@ -29,5 +29,5 @@ type Cron struct { } func (c *Cron) AfterFind(tx *gorm.DB) error { - return json.Unmarshal([]byte(c.ServersRaw), &c.Servers) + return utils.Json.Unmarshal([]byte(c.ServersRaw), &c.Servers) } diff --git a/model/monitor.go b/model/monitor.go index cb8dd19..b10a5a9 100644 --- a/model/monitor.go +++ b/model/monitor.go @@ -1,9 +1,9 @@ package model import ( - "encoding/json" "fmt" + "github.com/naiba/nezha/pkg/utils" pb "github.com/naiba/nezha/proto" "github.com/robfig/cron/v3" "gorm.io/gorm" @@ -66,7 +66,7 @@ func (m *Monitor) CronSpec() string { func (m *Monitor) AfterFind(tx *gorm.DB) error { var skipServers []uint64 - if err := json.Unmarshal([]byte(m.SkipServersRaw), &skipServers); err != nil { + if err := utils.Json.Unmarshal([]byte(m.SkipServersRaw), &skipServers); err != nil { return err } m.SkipServers = make(map[uint64]bool) @@ -82,7 +82,7 @@ func IsServiceSentinelNeeded(t uint64) bool { func (m *Monitor) InitSkipServers() error { var skipServers []uint64 - if err := json.Unmarshal([]byte(m.SkipServersRaw), &skipServers); err != nil { + if err := utils.Json.Unmarshal([]byte(m.SkipServersRaw), &skipServers); err != nil { return err } m.SkipServers = make(map[uint64]bool) diff --git a/model/notification.go b/model/notification.go index 21d5577..3ea2a9e 100644 --- a/model/notification.go +++ b/model/notification.go @@ -2,7 +2,6 @@ package model import ( "crypto/tls" - "encoding/json" "errors" "fmt" "io/ioutil" @@ -10,6 +9,8 @@ import ( "net/url" "strings" "time" + + "github.com/naiba/nezha/pkg/utils" ) const ( @@ -58,12 +59,12 @@ func (n *Notification) reqBody(message string) (string, error) { switch n.RequestType { case NotificationRequestTypeJSON: return replaceParamsInString(n.RequestBody, message, func(msg string) string { - msgBytes, _ := json.Marshal(msg) + msgBytes, _ := utils.Json.Marshal(msg) return string(msgBytes)[1 : len(msgBytes)-1] }), nil case NotificationRequestTypeForm: var data map[string]string - if err := json.Unmarshal([]byte(n.RequestBody), &data); err != nil { + if err := utils.Json.Unmarshal([]byte(n.RequestBody), &data); err != nil { return "", err } params := url.Values{} @@ -91,7 +92,7 @@ func (n *Notification) setRequestHeader(req *http.Request) error { return nil } var m map[string]string - if err := json.Unmarshal([]byte(n.RequestHeader), &m); err != nil { + if err := utils.Json.Unmarshal([]byte(n.RequestHeader), &m); err != nil { return err } for k, v := range m { diff --git a/model/server.go b/model/server.go index c1ebdca..c2c62b5 100644 --- a/model/server.go +++ b/model/server.go @@ -1,11 +1,11 @@ package model import ( - "encoding/json" "fmt" "html/template" "time" + "github.com/naiba/nezha/pkg/utils" pb "github.com/naiba/nezha/proto" ) @@ -39,9 +39,9 @@ func (s *Server) CopyFromRunningServer(old *Server) { } func (s Server) Marshal() template.JS { - name, _ := json.Marshal(s.Name) - tag, _ := json.Marshal(s.Tag) - note, _ := json.Marshal(s.Note) - secret, _ := json.Marshal(s.Secret) + name, _ := utils.Json.Marshal(s.Name) + tag, _ := utils.Json.Marshal(s.Tag) + note, _ := utils.Json.Marshal(s.Note) + secret, _ := utils.Json.Marshal(s.Secret) return template.JS(fmt.Sprintf(`{"ID":%d,"Name":%s,"Secret":%s,"DisplayIndex":%d,"Tag":%s,"Note":%s}`, s.ID, name, secret, s.DisplayIndex, tag, note)) // #nosec } diff --git a/model/server_test.go b/model/server_test.go index 6fa5abd..9fa80dd 100644 --- a/model/server_test.go +++ b/model/server_test.go @@ -1,9 +1,9 @@ package model import ( - "encoding/json" "testing" + "github.com/naiba/nezha/pkg/utils" "github.com/stretchr/testify/assert" ) @@ -21,7 +21,7 @@ func TestServerMarshal(t *testing.T) { } serverStr := string(server.Marshal()) var serverRestore Server - assert.Nil(t, json.Unmarshal([]byte(serverStr), &serverRestore)) + assert.Nil(t, utils.Json.Unmarshal([]byte(serverStr), &serverRestore)) assert.Equal(t, server, serverRestore) } } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 1c4590c..5989423 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -8,8 +8,12 @@ import ( "regexp" "time" "unsafe" + + jsoniter "github.com/json-iterator/go" ) +var Json = jsoniter.ConfigCompatibleWithStandardLibrary + const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" const ( letterIdxBits = 6 // 6 bits to represent a letter index diff --git a/service/singleton/singleton.go b/service/singleton/singleton.go index 14a9654..3a1a2df 100644 --- a/service/singleton/singleton.go +++ b/service/singleton/singleton.go @@ -14,7 +14,7 @@ import ( pb "github.com/naiba/nezha/proto" ) -var Version = "v0.12.12" // !!记得修改 README 中的 badge 版本!! +var Version = "v0.12.13" // !!记得修改 README 中的 badge 版本!! var ( Conf *model.Config