diff --git a/.gitignore b/.gitignore index 5a576a9..dc2701d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ main/.lego main/cert main/config.yml ./vscode -.idea/* \ No newline at end of file +.idea/* +.DS_Store \ No newline at end of file diff --git a/api/apimodel.go b/api/apimodel.go index ba05fc8..db32c73 100644 --- a/api/apimodel.go +++ b/api/apimodel.go @@ -25,7 +25,7 @@ type NodeStatus struct { CPU float64 Mem float64 Disk float64 - Uptime int + Uptime uint64 } type NodeInfo struct { @@ -33,7 +33,7 @@ type NodeInfo struct { NodeID int Port int SpeedLimit uint64 // Bps - AlterID int + AlterID uint16 TransportProtocol string FakeType string Host string @@ -59,7 +59,7 @@ type UserInfo struct { Obfs string ObfsParam string UUID string - AlterID int + AlterID uint16 } type OnlineUser struct { diff --git a/api/pmpanel/model.go b/api/pmpanel/model.go index 382fd55..9a2d5ce 100644 --- a/api/pmpanel/model.go +++ b/api/pmpanel/model.go @@ -10,7 +10,7 @@ type NodeInfoResponse struct { TrafficRate float64 `json:"trafficRate"` RawServerString string `json:"outServer"` Port int `json:"outPort"` - AlterId int `json:"alterId"` + AlterId uint16 `json:"alterId"` Network string `json:"network"` Security string `json:"security"` Host string `json:"host"` diff --git a/api/proxypanel/model.go b/api/proxypanel/model.go index 146baa0..42dfa2b 100644 --- a/api/proxypanel/model.go +++ b/api/proxypanel/model.go @@ -19,7 +19,7 @@ type V2rayNodeInfo struct { Key string `json:"key"` Cert string `json:"pem"` V2License string `json:"v2_license"` - V2AlterID int `json:"v2_alter_id"` + V2AlterID uint16 `json:"v2_alter_id"` V2Port int `json:"v2_port"` V2Method string `json:"v2_method"` V2Net string `json:"v2_net"` diff --git a/api/proxypanel/proxypanel.go b/api/proxypanel/proxypanel.go index baf1a02..c096104 100644 --- a/api/proxypanel/proxypanel.go +++ b/api/proxypanel/proxypanel.go @@ -238,7 +238,7 @@ func (c *APIClient) ReportNodeStatus(nodeStatus *api.NodeStatus) (err error) { } systemload := NodeStatus{ - Uptime: nodeStatus.Uptime, + Uptime: int(nodeStatus.Uptime), CPU: fmt.Sprintf("%d%%", int(nodeStatus.CPU)), Mem: fmt.Sprintf("%d%%", int(nodeStatus.Mem)), Disk: fmt.Sprintf("%d%%", int(nodeStatus.Disk)), diff --git a/api/sspanel/sspanel.go b/api/sspanel/sspanel.go index 61a0fa1..e7f2f27 100644 --- a/api/sspanel/sspanel.go +++ b/api/sspanel/sspanel.go @@ -239,7 +239,7 @@ func (c *APIClient) GetUserList() (UserList *[]api.UserInfo, err error) { func (c *APIClient) ReportNodeStatus(nodeStatus *api.NodeStatus) (err error) { path := fmt.Sprintf("/mod_mu/nodes/%d/info", c.NodeID) systemload := SystemLoad{ - Uptime: strconv.Itoa(nodeStatus.Uptime), + Uptime: strconv.FormatUint(nodeStatus.Uptime, 10), Load: fmt.Sprintf("%.2f %.2f %.2f", nodeStatus.CPU/100, nodeStatus.CPU/100, nodeStatus.CPU/100), } @@ -386,10 +386,13 @@ func (c *APIClient) ParseV2rayNodeResponse(nodeInfoResponse *NodeInfoResponse) ( if err != nil { return nil, err } - alterID, err := strconv.Atoi(serverConf[2]) + + parsedAlterID, err := strconv.ParseInt(serverConf[2], 10, 16) if err != nil { return nil, err } + alterID := uint16(parsedAlterID) + // Compatible with more node types config for _, value := range serverConf[3:5] { switch value { @@ -727,7 +730,7 @@ func (c *APIClient) ParseSSPanelNodeInfo(nodeInfoResponse *NodeInfoResponse) (*a var speedlimit uint64 = 0 var EnableTLS, EnableVless bool - var AlterID int = 0 + var AlterID uint16 = 0 var TLSType, transportProtocol string nodeConfig := new(CustomConfig) @@ -751,9 +754,12 @@ func (c *APIClient) ParseSSPanelNodeInfo(nodeInfoResponse *NodeInfoResponse) (*a if c.NodeType == "V2ray" { transportProtocol = nodeConfig.Network TLSType = nodeConfig.Security - if AlterID, err = strconv.Atoi(nodeConfig.AlterID); err != nil { + if parsedAlterID, err := strconv.ParseInt(nodeConfig.AlterID, 10, 16); err != nil { return nil, err + } else { + AlterID = uint16(parsedAlterID) } + if TLSType == "tls" || TLSType == "xtls" { EnableTLS = true } diff --git a/api/v2board/v2board.go b/api/v2board/v2board.go index 1c134d0..aea3e4d 100644 --- a/api/v2board/v2board.go +++ b/api/v2board/v2board.go @@ -226,7 +226,7 @@ func (c *APIClient) GetUserList() (UserList *[]api.UserInfo, err error) { case "V2ray": user.UUID = response.Get("data").GetIndex(i).Get("v2ray_user").Get("uuid").MustString() user.Email = response.Get("data").GetIndex(i).Get("v2ray_user").Get("email").MustString() - user.AlterID = response.Get("data").GetIndex(i).Get("v2ray_user").Get("alter_id").MustInt() + user.AlterID = uint16(response.Get("data").GetIndex(i).Get("v2ray_user").Get("alter_id").MustUint64()) } userList[i] = user } @@ -355,7 +355,7 @@ func (c *APIClient) ParseV2rayNodeResponse(nodeInfoResponse *simplejson.Json) (* var path, host, serviceName string var header json.RawMessage var enableTLS bool - var alterID int = 0 + var alterID uint16 = 0 if c.EnableXTLS { TLSType = "xtls" } diff --git a/common/serverstatus/serverstatus.go b/common/serverstatus/serverstatus.go index f6a2fb8..a343360 100644 --- a/common/serverstatus/serverstatus.go +++ b/common/serverstatus/serverstatus.go @@ -3,39 +3,51 @@ package serverstatus import ( "fmt" - "time" - "github.com/shirou/gopsutil/cpu" - "github.com/shirou/gopsutil/disk" - "github.com/shirou/gopsutil/mem" + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/disk" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/mem" ) // GetSystemInfo get the system info of a given periodic -func GetSystemInfo() (Cpu float64, Mem float64, Disk float64, Uptime int, err error) { +func GetSystemInfo() (Cpu float64, Mem float64, Disk float64, Uptime uint64, err error) { + + error_string := "" - upTime := time.Now() cpuPercent, err := cpu.Percent(0, false) // Check if cpuPercent is empty - if len(cpuPercent) > 0 { + if len(cpuPercent) > 0 && err == nil { Cpu = cpuPercent[0] } else { Cpu = 0 - } - - if err != nil { - return 0, 0, 0, 0, fmt.Errorf("get cpu usage failed: %s", err) + error_string += fmt.Sprintf("get cpu usage failed: %s ", err) } memUsage, err := mem.VirtualMemory() if err != nil { - return 0, 0, 0, 0, fmt.Errorf("get mem usage failed: %s", err) + error_string += fmt.Sprintf("get mem usage failed: %s ", err) + } else { + Mem = memUsage.UsedPercent } diskUsage, err := disk.Usage("/") if err != nil { - return 0, 0, 0, 0, fmt.Errorf("et disk usage failed: %s", err) + error_string += fmt.Sprintf("get disk usage failed: %s ", err) + } else { + Disk = diskUsage.UsedPercent } - Uptime = int(time.Since(upTime).Seconds()) - return Cpu, memUsage.UsedPercent, diskUsage.UsedPercent, Uptime, nil + uptime, err := host.Uptime() + if err != nil { + error_string += fmt.Sprintf("get uptime failed: %s ", err) + } else { + Uptime = uptime + } + + if error_string != "" { + err = fmt.Errorf(error_string) + } + + return Cpu, Mem, Disk, Uptime, err } diff --git a/go.mod b/go.mod index 360554f..83f076b 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/imdario/mergo v0.3.13 github.com/juju/ratelimit v1.0.1 github.com/r3labs/diff/v2 v2.15.1 - github.com/shirou/gopsutil v3.21.11+incompatible + github.com/shirou/gopsutil/v3 v3.22.7 github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 github.com/tklauser/go-sysconf v0.3.10 // indirect @@ -87,6 +87,7 @@ require ( github.com/liquidweb/liquidweb-cli v0.6.10 // indirect github.com/liquidweb/liquidweb-go v1.6.3 // indirect github.com/lucas-clemente/quic-go v0.28.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect @@ -117,6 +118,7 @@ require ( github.com/pires/go-proxyproto v0.6.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/pquerna/otp v1.3.0 // indirect github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2 // indirect github.com/refraction-networking/utls v1.1.0 // indirect diff --git a/go.sum b/go.sum index 6b8450d..301273b 100644 --- a/go.sum +++ b/go.sum @@ -491,6 +491,8 @@ github.com/liquidweb/liquidweb-go v1.6.3 h1:NVHvcnX3eb3BltiIoA+gLYn15nOpkYkdizOE github.com/liquidweb/liquidweb-go v1.6.3/go.mod h1:SuXXp+thr28LnjEw18AYtWwIbWMHSUiajPQs8T9c/Rc= github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -628,6 +630,8 @@ github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs= github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -681,8 +685,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb h1:XfLJSPIOUX+osiMraVgIrMR27uMXnRJWGm1+GL8/63U= github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.7 h1:flKnuCMfUUrO+oAvwAd6GKZgnPzr098VA/UJ14nhJd4= +github.com/shirou/gopsutil/v3 v3.22.7/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -1050,6 +1054,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/service/controller/controller.go b/service/controller/controller.go index 27c4322..7533e10 100644 --- a/service/controller/controller.go +++ b/service/controller/controller.go @@ -3,7 +3,6 @@ package controller import ( "fmt" "log" - "math" "reflect" "time" @@ -346,19 +345,14 @@ func (c *Controller) addNewUser(userInfo *[]api.UserInfo, nodeInfo *api.NodeInfo if nodeInfo.EnableVless { users = c.buildVlessUser(userInfo) } else { - alterID := 0 + var alterID uint16 = 0 if c.panelType == "V2board" { // use latest userInfo alterID = (*userInfo)[0].AlterID } else { alterID = nodeInfo.AlterID } - if alterID >= 0 && alterID < math.MaxUint16 { - users = c.buildVmessUser(userInfo, uint16(alterID)) - } else { - users = c.buildVmessUser(userInfo, 0) - return fmt.Errorf("AlterID should between 0 to 1<<16 - 1, set it to 0 for now") - } + users = c.buildVmessUser(userInfo, alterID) } } else if nodeInfo.NodeType == "Trojan" { users = c.buildTrojanUser(userInfo) diff --git a/service/controller/controller_test.go b/service/controller/controller_test.go index b9ea237..d5d1cd2 100644 --- a/service/controller/controller_test.go +++ b/service/controller/controller_test.go @@ -62,7 +62,7 @@ func TestController(t *testing.T) { NodeType: "V2ray", } apiclient := sspanel.New(apiConfig) - c := New(server, apiclient, controlerconfig) + c := New(server, apiclient, controlerconfig, "SSpanel") fmt.Println("Sleep 1s") err = c.Start() if err != nil { diff --git a/service/controller/inboundbuilder_test.go b/service/controller/inboundbuilder_test.go index b0cb9d7..5614d39 100644 --- a/service/controller/inboundbuilder_test.go +++ b/service/controller/inboundbuilder_test.go @@ -29,7 +29,7 @@ func TestBuildV2ray(t *testing.T) { config := &Config{ CertConfig: certConfig, } - _, err := InboundBuilder(config, nodeInfo) + _, err := InboundBuilder(config, nodeInfo, "test_tag") if err != nil { t.Error(err) } @@ -61,7 +61,7 @@ func TestBuildTrojan(t *testing.T) { config := &Config{ CertConfig: certConfig, } - _, err := InboundBuilder(config, nodeInfo) + _, err := InboundBuilder(config, nodeInfo, "test_tag") if err != nil { t.Error(err) } @@ -93,7 +93,7 @@ func TestBuildSS(t *testing.T) { config := &Config{ CertConfig: certConfig, } - _, err := InboundBuilder(config, nodeInfo) + _, err := InboundBuilder(config, nodeInfo, "test_tag") if err != nil { t.Error(err) }