From be8bd4e22c812a73ecda52e5dd42a73918de160f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rouzbeh=E2=80=A0?= <78313022+rqzbeh@users.noreply.github.com> Date: Tue, 9 Jun 2026 01:26:30 +0200 Subject: [PATCH] fix: propagate inbound traffic reset to nodes (#5103) Co-authored-by: Rqzbeh --- web/runtime/local.go | 4 ++++ web/runtime/remote.go | 5 +++++ web/runtime/runtime.go | 1 + web/service/inbound.go | 30 ++++++++++++++++++++++++++++-- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/web/runtime/local.go b/web/runtime/local.go index 9b78966cc..3a972940e 100644 --- a/web/runtime/local.go +++ b/web/runtime/local.go @@ -159,3 +159,7 @@ func (l *Local) ResetClientTraffic(_ context.Context, _ *model.Inbound, _ string func (l *Local) ResetAllTraffics(_ context.Context) error { return nil } + +func (l *Local) ResetInboundTraffic(_ context.Context, _ *model.Inbound) error { + return nil +} diff --git a/web/runtime/remote.go b/web/runtime/remote.go index fc18c2a2c..d7895091d 100644 --- a/web/runtime/remote.go +++ b/web/runtime/remote.go @@ -399,6 +399,11 @@ func (r *Remote) ResetAllTraffics(ctx context.Context) error { return err } +func (r *Remote) ResetInboundTraffic(ctx context.Context, ib *model.Inbound) error { + _, err := r.do(ctx, http.MethodPost, fmt.Sprintf("panel/api/inbounds/%d/resetTraffic", ib.Id), nil) + return err +} + type TrafficSnapshot struct { Inbounds []*model.Inbound OnlineEmails []string diff --git a/web/runtime/runtime.go b/web/runtime/runtime.go index 7c7c60c93..5f83374aa 100644 --- a/web/runtime/runtime.go +++ b/web/runtime/runtime.go @@ -26,5 +26,6 @@ type Runtime interface { RestartXray(ctx context.Context) error ResetClientTraffic(ctx context.Context, ib *model.Inbound, email string) error + ResetInboundTraffic(ctx context.Context, ib *model.Inbound) error ResetAllTraffics(ctx context.Context) error } diff --git a/web/service/inbound.go b/web/service/inbound.go index b49aacfc1..ba6e2dc0b 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -3142,15 +3142,41 @@ func (s *InboundService) resetAllTrafficsLocked() error { return err } + nodes, err := (&NodeService{}).GetAll() + if err == nil { + for _, node := range nodes { + if rt, err := runtime.GetManager().RuntimeFor(&node.Id); err == nil { + if e := rt.ResetAllTraffics(context.Background()); e != nil { + logger.Warning("ResetAllTraffics: remote propagation to", rt.Name(), "failed:", e) + } + } + } + } + return nil } func (s *InboundService) ResetInboundTraffic(id int) error { return submitTrafficWrite(func() error { db := database.GetDB() - return db.Model(model.Inbound{}). + if err := db.Model(model.Inbound{}). Where("id = ?", id). - Updates(map[string]any{"up": 0, "down": 0}).Error + Updates(map[string]any{"up": 0, "down": 0}).Error; err != nil { + return err + } + + inbound, err := s.GetInbound(id) + if err == nil && inbound != nil && inbound.NodeID != nil { + if rt, rterr := s.runtimeFor(inbound); rterr == nil { + if e := rt.ResetInboundTraffic(context.Background(), inbound); e != nil { + logger.Warning("ResetInboundTraffic: remote propagation to", rt.Name(), "failed:", e) + } + } else { + logger.Warning("ResetInboundTraffic: runtime lookup failed:", rterr) + } + } + + return nil }) }