Skip to content

Commit 97f53ed

Browse files
committed
Update.
1 parent 68ba218 commit 97f53ed

File tree

3 files changed

+93
-29
lines changed

3 files changed

+93
-29
lines changed

service/singleton/api.go

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package singleton
22

33
import (
4+
"log"
45
"sync"
56
"time"
67

@@ -113,6 +114,12 @@ func (s *ServerAPIService) GetStatusByIDList(idList []uint64) *ServerStatusRespo
113114
if server == nil {
114115
continue
115116
}
117+
118+
// 确保host不为空
119+
if server.Host == nil {
120+
continue
121+
}
122+
116123
ipv4, ipv6, validIP := utils.SplitIPAddr(server.Host.IP)
117124
info := CommonServerInfo{
118125
ID: server.ID,
@@ -126,22 +133,24 @@ func (s *ServerAPIService) GetStatusByIDList(idList []uint64) *ServerStatusRespo
126133
HideForGuest: server.HideForGuest,
127134
}
128135

129-
// 如果服务器离线但有最后状态,使用最后状态
130-
var statusData *StatusResponse
131-
if !server.IsOnline && server.LastStateBeforeOffline != nil {
132-
statusData = &StatusResponse{
133-
CommonServerInfo: info,
134-
Host: server.Host,
135-
Status: server.LastStateBeforeOffline,
136-
}
137-
} else {
138-
statusData = &StatusResponse{
139-
CommonServerInfo: info,
140-
Host: server.Host,
141-
Status: server.State,
136+
// 确保状态数据不为空
137+
if server.State == nil {
138+
// 如果状态为空但有历史状态,使用历史状态
139+
if server.LastStateBeforeOffline != nil {
140+
server.State = server.LastStateBeforeOffline
141+
log.Printf("NG>> 服务器 %s API返回使用了历史状态数据", server.Name)
142+
} else {
143+
continue
142144
}
143145
}
144146

147+
// 构建状态响应
148+
statusData := &StatusResponse{
149+
CommonServerInfo: info,
150+
Host: server.Host,
151+
Status: server.State,
152+
}
153+
145154
res.Result = append(res.Result, statusData)
146155
}
147156
res.CommonResponse = CommonResponse{
@@ -162,12 +171,26 @@ func (s *ServerAPIService) GetAllStatus() *ServerStatusResponse {
162171
res.Result = make([]*StatusResponse, 0)
163172
ServerLock.RLock()
164173
defer ServerLock.RUnlock()
174+
165175
for _, v := range ServerList {
176+
// 确保host不为空
166177
host := v.Host
167-
state := v.State
168-
if host == nil || state == nil {
178+
if host == nil {
169179
continue
170180
}
181+
182+
// 确保状态数据不为空
183+
state := v.State
184+
if state == nil {
185+
// 如果状态为空但有历史状态,使用历史状态
186+
if v.LastStateBeforeOffline != nil {
187+
state = v.LastStateBeforeOffline
188+
log.Printf("NG>> 服务器 %s GetAllStatus使用了历史状态数据", v.Name)
189+
} else {
190+
continue
191+
}
192+
}
193+
171194
ipv4, ipv6, validIP := utils.SplitIPAddr(host.IP)
172195
info := CommonServerInfo{
173196
ID: v.ID,
@@ -181,18 +204,10 @@ func (s *ServerAPIService) GetAllStatus() *ServerStatusResponse {
181204
HideForGuest: v.HideForGuest,
182205
}
183206

184-
// 如果服务器离线但有最后状态,使用最后状态
185-
var status *model.HostState
186-
if !v.IsOnline && v.LastStateBeforeOffline != nil {
187-
status = v.LastStateBeforeOffline
188-
} else {
189-
status = v.State
190-
}
191-
192207
res.Result = append(res.Result, &StatusResponse{
193208
CommonServerInfo: info,
194209
Host: v.Host,
195-
Status: status,
210+
Status: state,
196211
})
197212
}
198213
res.CommonResponse = CommonResponse{

service/singleton/server.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"sort"
66
"sync"
77

8+
"github.com/jinzhu/copier"
89
"github.com/xos/serverstatus/model"
910
"github.com/xos/serverstatus/pkg/utils"
1011
)
@@ -43,14 +44,22 @@ func loadServers() {
4344
if innerS.LastStateJSON != "" {
4445
lastState := &model.HostState{}
4546
if err := utils.Json.Unmarshal([]byte(innerS.LastStateJSON), lastState); err == nil {
47+
// 设置离线前的最后状态
4648
innerS.LastStateBeforeOffline = lastState
4749

48-
// 将保存的流量数据初始化到State中,确保显示流量数据
49-
if innerS.State != nil {
50-
innerS.State.NetInTransfer = innerS.CumulativeNetInTransfer
51-
innerS.State.NetOutTransfer = innerS.CumulativeNetOutTransfer
50+
// 重要:同时设置当前状态为离线前的最后状态,确保API返回正确数据
51+
// 深拷贝lastState到State,避免引用同一个对象
52+
stateCopy := &model.HostState{}
53+
if copyErr := copier.Copy(stateCopy, lastState); copyErr == nil {
54+
innerS.State = stateCopy
55+
} else {
56+
log.Printf("NG>> 复制服务器 %s 的状态数据失败: %v", innerS.Name, copyErr)
5257
}
5358

59+
// 将保存的流量数据初始化到State中,确保显示流量数据
60+
innerS.State.NetInTransfer = innerS.CumulativeNetInTransfer
61+
innerS.State.NetOutTransfer = innerS.CumulativeNetOutTransfer
62+
5463
log.Printf("NG>> 服务器 %s 加载了离线前的最后状态,累计流量入站: %d, 出站: %d",
5564
innerS.Name, innerS.CumulativeNetInTransfer, innerS.CumulativeNetOutTransfer)
5665
} else {

service/singleton/singleton.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ func InitTimezoneAndCache() {
3636
func LoadSingleton() {
3737
loadNotifications() // 加载通知服务
3838
loadServers() // 加载服务器列表
39-
loadCronTasks() // 加载定时任务
39+
40+
// 打印调试信息
41+
debugServersStatus()
42+
43+
loadCronTasks() // 加载定时任务
4044
loadAPI()
4145
initNAT()
4246
initDDNS()
@@ -45,6 +49,42 @@ func LoadSingleton() {
4549
Cron.AddFunc("*/1 * * * *", CheckServerOnlineStatus)
4650
}
4751

52+
// debugServersStatus 输出服务器状态加载情况的调试信息
53+
func debugServersStatus() {
54+
log.Println("NG>> ==================== 服务器状态加载情况 ====================")
55+
for id, server := range ServerList {
56+
log.Printf("NG>> 服务器 #%d [%s] 状态:", id, server.Name)
57+
log.Printf("NG>> - IsOnline: %v", server.IsOnline)
58+
59+
if server.LastStateBeforeOffline != nil {
60+
log.Printf("NG>> - LastStateBeforeOffline: 有")
61+
log.Printf("NG>> - CPU: %.2f%%", server.LastStateBeforeOffline.CPU)
62+
log.Printf("NG>> - 内存: %d/%d", server.LastStateBeforeOffline.MemUsed, server.Host.MemTotal)
63+
log.Printf("NG>> - 流量统计: 入站 %d / 出站 %d",
64+
server.LastStateBeforeOffline.NetInTransfer,
65+
server.LastStateBeforeOffline.NetOutTransfer)
66+
} else {
67+
log.Printf("NG>> - LastStateBeforeOffline: 无")
68+
}
69+
70+
if server.State != nil {
71+
log.Printf("NG>> - State: 有")
72+
log.Printf("NG>> - CPU: %.2f%%", server.State.CPU)
73+
log.Printf("NG>> - 内存: %d/%d", server.State.MemUsed, server.Host.MemTotal)
74+
log.Printf("NG>> - 流量统计: 入站 %d / 出站 %d",
75+
server.State.NetInTransfer,
76+
server.State.NetOutTransfer)
77+
} else {
78+
log.Printf("NG>> - State: 无")
79+
}
80+
81+
log.Printf("NG>> - 累计流量: 入站 %d / 出站 %d",
82+
server.CumulativeNetInTransfer,
83+
server.CumulativeNetOutTransfer)
84+
}
85+
log.Println("NG>> ==========================================================")
86+
}
87+
4888
// InitConfigFromPath 从给出的文件路径中加载配置
4989
func InitConfigFromPath(path string) {
5090
Conf = &model.Config{}

0 commit comments

Comments
 (0)