From 315d8520872ce1d19b7e7498f7e52a085f3273db Mon Sep 17 00:00:00 2001 From: mhsanaei Date: Wed, 12 Mar 2025 19:20:13 +0100 Subject: [PATCH] fix - public IP #2763 --- web/service/server.go | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/web/service/server.go b/web/service/server.go index db604bc9..aa2909fe 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -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() {