@@ -2209,3 +2209,152 @@ func (s *Service) ClearOperationLogs() (int64, error) {
22092209 }
22102210 return rows , nil
22112211}
2212+
2213+ // ResetTunnelTraffic 重置隧道的流量统计信息
2214+ func (s * Service ) ResetTunnelTraffic (tunnelID int64 ) error {
2215+ log .Infof ("[API] 重置隧道流量统计: tunnelID=%d" , tunnelID )
2216+
2217+ // 获取隧道和端点信息
2218+ var tunnel struct {
2219+ InstanceID string
2220+ EndpointID int64
2221+ Name string
2222+ }
2223+ var endpoint struct {
2224+ URL string
2225+ APIPath string
2226+ APIKey string
2227+ }
2228+
2229+ // 先调用 NodePass API 重置流量统计
2230+ npClient := nodepass .NewClient (endpoint .URL , endpoint .APIPath , endpoint .APIKey , nil )
2231+ if err := npClient .ResetInstanceTraffic (tunnel .InstanceID ); err != nil {
2232+ // 检查是否为 404 错误(旧版本 NodePass 不支持)
2233+ if strings .Contains (err .Error (), "404" ) || strings .Contains (err .Error (), "Not Found" ) {
2234+ log .Warnf ("[API] NodePass API 不支持重置流量功能(可能是旧版本): %v" , err )
2235+ return errors .New ("当前实例不支持重置流量功能" )
2236+ } else {
2237+ log .Errorf ("[API] NodePass API 重置流量失败: %v" , err )
2238+ return fmt .Errorf ("NodePass API 重置流量失败: %v" , err )
2239+ }
2240+ }
2241+
2242+ // 只有 NodePass API 调用成功后才更新数据库
2243+ _ , err := s .db .Exec (`
2244+ UPDATE "Tunnel"
2245+ SET
2246+ tcpRx = 0,
2247+ tcpTx = 0,
2248+ udpRx = 0,
2249+ udpTx = 0,
2250+ pool = NULL,
2251+ ping = NULL,
2252+ updatedAt = ?
2253+ WHERE id = ?
2254+ ` , time .Now (), tunnelID )
2255+ if err != nil {
2256+ log .Errorf ("[API] 数据库重置流量统计失败: %v" , err )
2257+ return fmt .Errorf ("数据库重置流量统计失败: %v" , err )
2258+ }
2259+
2260+ // 记录操作日志
2261+ _ , err = s .db .Exec (`
2262+ INSERT INTO "TunnelOperationLog" (
2263+ tunnelId, tunnelName, action, status, message
2264+ ) VALUES (?, ?, ?, ?, ?)
2265+ ` ,
2266+ tunnelID ,
2267+ tunnel .Name ,
2268+ "reset_traffic" ,
2269+ "success" ,
2270+ "重置流量统计信息" ,
2271+ )
2272+ if err != nil {
2273+ log .Errorf ("[API] 记录重置流量日志失败: %v" , err )
2274+ // 不返回错误,因为主要操作已经成功
2275+ }
2276+
2277+ log .Infof ("[API] 隧道流量统计重置成功: tunnelID=%d, name=%s" , tunnelID , tunnel .Name )
2278+ return nil
2279+ }
2280+
2281+ // ResetTunnelTrafficByInstanceID 根据实例ID重置隧道的流量统计信息
2282+ func (s * Service ) ResetTunnelTrafficByInstanceID (instanceID string ) error {
2283+ log .Infof ("[API] 根据实例ID重置隧道流量统计: instanceID=%s" , instanceID )
2284+
2285+ // 获取隧道和端点信息
2286+ var tunnel struct {
2287+ ID int64
2288+ Name string
2289+ EndpointID int64
2290+ }
2291+ var endpoint struct {
2292+ URL string
2293+ APIPath string
2294+ APIKey string
2295+ }
2296+
2297+ err := s .db .QueryRow (`
2298+ SELECT t.id, t.name, t.endpointId, e.url, e.apiPath, e.apiKey
2299+ FROM "Tunnel" t
2300+ JOIN "Endpoint" e ON t.endpointId = e.id
2301+ WHERE t.instanceId = ?
2302+ ` , instanceID ).Scan (& tunnel .ID , & tunnel .Name , & tunnel .EndpointID , & endpoint .URL , & endpoint .APIPath , & endpoint .APIKey )
2303+ if err != nil {
2304+ if err == sql .ErrNoRows {
2305+ return errors .New ("隧道不存在" )
2306+ }
2307+ return fmt .Errorf ("查询隧道失败: %v" , err )
2308+ }
2309+
2310+ // 先调用 NodePass API 重置流量统计
2311+ npClient := nodepass .NewClient (endpoint .URL , endpoint .APIPath , endpoint .APIKey , nil )
2312+ if err := npClient .ResetInstanceTraffic (instanceID ); err != nil {
2313+ // 检查是否为 404 错误(旧版本 NodePass 不支持)
2314+ if strings .Contains (err .Error (), "404" ) || strings .Contains (err .Error (), "Not Found" ) {
2315+ log .Warnf ("[API] NodePass API 不支持重置流量功能(可能是旧版本): %v" , err )
2316+ return errors .New ("当前实例不支持重置流量功能" )
2317+ } else {
2318+ log .Errorf ("[API] NodePass API 重置流量失败: %v" , err )
2319+ return fmt .Errorf ("NodePass API 重置流量失败: %v" , err )
2320+ }
2321+ }
2322+
2323+ // 只有 NodePass API 调用成功后才更新数据库
2324+ _ , err = s .db .Exec (`
2325+ UPDATE "Tunnel"
2326+ SET
2327+ tcpRx = 0,
2328+ tcpTx = 0,
2329+ udpRx = 0,
2330+ udpTx = 0,
2331+ pool = NULL,
2332+ ping = NULL,
2333+ updatedAt = ?
2334+ WHERE instanceId = ?
2335+ ` , time .Now (), instanceID )
2336+ if err != nil {
2337+ log .Errorf ("[API] 数据库重置流量统计失败: %v" , err )
2338+ return fmt .Errorf ("数据库重置流量统计失败: %v" , err )
2339+ }
2340+
2341+ // 记录操作日志
2342+ _ , err = s .db .Exec (`
2343+ INSERT INTO "TunnelOperationLog" (
2344+ tunnelId, tunnelName, action, status, message
2345+ ) VALUES (?, ?, ?, ?, ?)
2346+ ` ,
2347+ tunnel .ID ,
2348+ tunnel .Name ,
2349+ "reset_traffic" ,
2350+ "success" ,
2351+ "重置流量统计信息" ,
2352+ )
2353+ if err != nil {
2354+ log .Errorf ("[API] 记录重置流量日志失败: %v" , err )
2355+ // 不返回错误,因为主要操作已经成功
2356+ }
2357+
2358+ log .Infof ("[API] 隧道流量统计重置成功: instanceID=%s, name=%s" , instanceID , tunnel .Name )
2359+ return nil
2360+ }
0 commit comments