|
@@ -92,6 +92,8 @@ type Release struct {
|
|
|
type ServerService struct {
|
|
|
xrayService XrayService
|
|
|
inboundService InboundService
|
|
|
+ cachedIPv4 string
|
|
|
+ cachedIPv6 string
|
|
|
}
|
|
|
|
|
|
func getPublicIP(url string) string {
|
|
@@ -120,6 +122,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
T: now,
|
|
|
}
|
|
|
|
|
|
+ // CPU stats
|
|
|
percents, err := cpu.Percent(0, false)
|
|
|
if err != nil {
|
|
|
logger.Warning("get cpu percent failed:", err)
|
|
@@ -133,22 +136,17 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
}
|
|
|
|
|
|
status.LogicalPro = runtime.NumCPU()
|
|
|
- if p != nil && p.IsRunning() {
|
|
|
- status.AppStats.Uptime = p.GetUptime()
|
|
|
- } else {
|
|
|
- status.AppStats.Uptime = 0
|
|
|
- }
|
|
|
|
|
|
cpuInfos, err := cpu.Info()
|
|
|
if err != nil {
|
|
|
logger.Warning("get cpu info failed:", err)
|
|
|
} else if len(cpuInfos) > 0 {
|
|
|
- cpuInfo := cpuInfos[0]
|
|
|
- status.CpuSpeedMhz = cpuInfo.Mhz // setting CPU speed in MHz
|
|
|
+ status.CpuSpeedMhz = cpuInfos[0].Mhz
|
|
|
} else {
|
|
|
logger.Warning("could not find cpu info")
|
|
|
}
|
|
|
|
|
|
+ // Uptime
|
|
|
upTime, err := host.Uptime()
|
|
|
if err != nil {
|
|
|
logger.Warning("get uptime failed:", err)
|
|
@@ -156,6 +154,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
status.Uptime = upTime
|
|
|
}
|
|
|
|
|
|
+ // Memory stats
|
|
|
memInfo, err := mem.VirtualMemory()
|
|
|
if err != nil {
|
|
|
logger.Warning("get virtual memory failed:", err)
|
|
@@ -172,14 +171,16 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
status.Swap.Total = swapInfo.Total
|
|
|
}
|
|
|
|
|
|
- distInfo, err := disk.Usage("/")
|
|
|
+ // Disk stats
|
|
|
+ diskInfo, err := disk.Usage("/")
|
|
|
if err != nil {
|
|
|
- logger.Warning("get dist usage failed:", err)
|
|
|
+ logger.Warning("get disk usage failed:", err)
|
|
|
} else {
|
|
|
- status.Disk.Current = distInfo.Used
|
|
|
- status.Disk.Total = distInfo.Total
|
|
|
+ status.Disk.Current = diskInfo.Used
|
|
|
+ status.Disk.Total = diskInfo.Total
|
|
|
}
|
|
|
|
|
|
+ // Load averages
|
|
|
avgState, err := load.Avg()
|
|
|
if err != nil {
|
|
|
logger.Warning("get load avg failed:", err)
|
|
@@ -187,6 +188,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
status.Loads = []float64{avgState.Load1, avgState.Load5, avgState.Load15}
|
|
|
}
|
|
|
|
|
|
+ // Network stats
|
|
|
ioStats, err := net.IOCounters(false)
|
|
|
if err != nil {
|
|
|
logger.Warning("get io counters failed:", err)
|
|
@@ -207,6 +209,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
logger.Warning("can not find io counters")
|
|
|
}
|
|
|
|
|
|
+ // TCP/UDP connections
|
|
|
status.TcpCount, err = sys.GetTCPCount()
|
|
|
if err != nil {
|
|
|
logger.Warning("get tcp connections failed:", err)
|
|
@@ -217,9 +220,15 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
logger.Warning("get udp connections failed:", err)
|
|
|
}
|
|
|
|
|
|
- status.PublicIP.IPv4 = getPublicIP("https://api.ipify.org")
|
|
|
- status.PublicIP.IPv6 = getPublicIP("https://api6.ipify.org")
|
|
|
+ // IP fetching with caching
|
|
|
+ if s.cachedIPv4 == "" || s.cachedIPv6 == "" {
|
|
|
+ s.cachedIPv4 = getPublicIP("https://api.ipify.org")
|
|
|
+ s.cachedIPv6 = getPublicIP("https://api6.ipify.org")
|
|
|
+ }
|
|
|
+ status.PublicIP.IPv4 = s.cachedIPv4
|
|
|
+ status.PublicIP.IPv6 = s.cachedIPv6
|
|
|
|
|
|
+ // Xray status
|
|
|
if s.xrayService.IsXrayRunning() {
|
|
|
status.Xray.State = Running
|
|
|
status.Xray.ErrorMsg = ""
|
|
@@ -233,9 +242,10 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status {
|
|
|
status.Xray.ErrorMsg = s.xrayService.GetXrayResult()
|
|
|
}
|
|
|
status.Xray.Version = s.xrayService.GetXrayVersion()
|
|
|
+
|
|
|
+ // Application stats
|
|
|
var rtm runtime.MemStats
|
|
|
runtime.ReadMemStats(&rtm)
|
|
|
-
|
|
|
status.AppStats.Mem = rtm.Sys
|
|
|
status.AppStats.Threads = uint32(runtime.NumGoroutine())
|
|
|
if p != nil && p.IsRunning() {
|