From 2358ed8a1f0eb3f1647dd398895912ff408e3124 Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 08:30:10 +0800 Subject: [PATCH 1/6] fix hy counter --- core/hy/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/hy/user.go b/core/hy/user.go index 30cb651..7aa2dda 100644 --- a/core/hy/user.go +++ b/core/hy/user.go @@ -23,9 +23,9 @@ func (h *Hy) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) s := v.(*Server) auth := base64.StdEncoding.EncodeToString([]byte(uuid)) up = s.counter.getCounters(auth).UpCounter.Load() - down = s.counter.getCounters(uuid).DownCounter.Load() + down = s.counter.getCounters(auth).DownCounter.Load() if reset { - s.counter.Reset(uuid) + s.counter.Reset(auth) } return } From 2232bf46e5300b7df7aa45fa66d55fb5051ced0e Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 08:34:59 +0800 Subject: [PATCH 2/6] fix hy server type --- core/hy/node.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/hy/node.go b/core/hy/node.go index f97aa97..5cdf889 100644 --- a/core/hy/node.go +++ b/core/hy/node.go @@ -6,7 +6,6 @@ import ( "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/limiter" - "github.com/apernet/hysteria/core/cs" ) func (h *Hy) AddNode(tag string, info *panel.NodeInfo, c *conf.ControllerConfig) error { @@ -32,7 +31,7 @@ func (h *Hy) AddNode(tag string, info *panel.NodeInfo, c *conf.ControllerConfig) func (h *Hy) DelNode(tag string) error { if s, e := h.servers.Load(tag); e { - err := s.(*cs.Server).Close() + err := s.(*Server).Close() if err != nil { return err } From 82c1753672e2a21d8e770e11666dc659af2d0ab5 Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 09:24:05 +0800 Subject: [PATCH 3/6] fix node change --- node/controller.go | 2 +- node/task.go | 133 +++++++++++++++++++++++---------------------- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/node/controller.go b/node/controller.go index cd64eaf..e633832 100644 --- a/node/controller.go +++ b/node/controller.go @@ -83,7 +83,7 @@ func (c *Controller) Start() error { if err != nil { return fmt.Errorf("add users error: %s", err) } - log.Printf("[%s: %d] Added %d new users", c.nodeInfo.Type, c.nodeInfo.Id, added) + log.Printf("[%s] Added %d new users", c.Tag, added) c.initTask() return nil } diff --git a/node/task.go b/node/task.go index 59d3ee2..713c023 100644 --- a/node/task.go +++ b/node/task.go @@ -41,50 +41,44 @@ func (c *Controller) initTask() { } func (c *Controller) nodeInfoMonitor() (err error) { - // First fetch Node Info + // get node info newNodeInfo, err := c.apiClient.GetNodeInfo() if err != nil { - log.Print(err) + log.Printf("[%s] Get node info error: %s", c.Tag, err) + return nil + } + // get user info + newUserInfo, err := c.apiClient.GetUserList() + if err != nil { + log.Printf("[%s] Get user list error: %s", c.Tag, err) return nil } - var nodeInfoChanged = false - // If nodeInfo changed if newNodeInfo != nil { + // nodeInfo changed // Remove old tag - oldTag := c.Tag - err := c.server.DelNode(oldTag) + err = c.server.DelNode(c.Tag) if err != nil { - log.Print(err) + log.Printf("[%s] Del node error: %s", c.Tag, err) return nil } // Remove Old limiter - limiter.DeleteLimiter(oldTag) - // Add new tag - c.nodeInfo = newNodeInfo + limiter.DeleteLimiter(c.Tag) + // Add new Limiter c.Tag = c.buildNodeTag() - err = c.server.AddNode(c.Tag, newNodeInfo, c.ControllerConfig) - if err != nil { - log.Print(err) - return nil - } - if c.nodeInfo.Tls || c.nodeInfo.Type == "hysteria" { + l := limiter.AddLimiter(c.Tag, &c.LimitConfig, newUserInfo) + // check cert + if newNodeInfo.Tls || newNodeInfo.Type == "hysteria" { err = c.requestCert() if err != nil { - return fmt.Errorf("request cert error: %s", err) + log.Printf("[%s] Request cert error: %s", c.Tag, err) } } - nodeInfoChanged = true - } - // Update User - newUserInfo, err := c.apiClient.GetUserList() - if err != nil { - log.Print(err) - return nil - } - if nodeInfoChanged { - c.userList = newUserInfo - // Add new Limiter - l := limiter.AddLimiter(c.Tag, &c.LimitConfig, newUserInfo) + // add new node + err = c.server.AddNode(c.Tag, newNodeInfo, c.ControllerConfig) + if err != nil { + log.Printf("[%s] Add node error: %s", c.Tag, err) + return nil + } _, err = c.server.AddUsers(&vCore.AddUsersParams{ Tag: c.Tag, Config: c.ControllerConfig, @@ -92,12 +86,12 @@ func (c *Controller) nodeInfoMonitor() (err error) { NodeInfo: newNodeInfo, }) if err != nil { - log.Print(err) + log.Printf("[%s] Add users error: %s", c.Tag, err) return nil } err = l.UpdateRule(newNodeInfo.Rules) if err != nil { - log.Printf("Update Rule error: %s", err) + log.Printf("[%s] Update Rule error: %s", c.Tag, err) } // Check interval if c.nodeInfoMonitorPeriodic.Interval != newNodeInfo.PullInterval && @@ -112,42 +106,49 @@ func (c *Controller) nodeInfoMonitor() (err error) { c.userReportPeriodic.Close() _ = c.userReportPeriodic.Start(false) } - } else { - deleted, added := compareUserList(c.userList, newUserInfo) - if len(deleted) > 0 { - deletedEmail := make([]string, len(deleted)) - for i := range deleted { - deletedEmail[i] = fmt.Sprintf("%s|%s|%d", - c.Tag, - (deleted)[i].Uuid, - (deleted)[i].Id) - } - err := c.server.DelUsers(deletedEmail, c.Tag) - if err != nil { - log.Print(err) - } - } - if len(added) > 0 { - _, err := c.server.AddUsers(&vCore.AddUsersParams{ - Tag: c.Tag, - Config: c.ControllerConfig, - UserInfo: added, - NodeInfo: c.nodeInfo, - }) - if err != nil { - log.Print(err) - } - } - if len(added) > 0 || len(deleted) > 0 { - // Update Limiter - err = limiter.UpdateLimiter(c.Tag, added, deleted) - if err != nil { - log.Print("update limiter:", err) - } - } - log.Printf("[%s: %d] %d user deleted, %d user added", c.nodeInfo.Type, c.nodeInfo.Id, - len(deleted), len(added)) + c.nodeInfo = newNodeInfo c.userList = newUserInfo + // exit + return nil } + + // node no changed, check users + deleted, added := compareUserList(c.userList, newUserInfo) + if len(deleted) > 0 { + // have deleted users + deletedEmail := make([]string, len(deleted)) + for i := range deleted { + deletedEmail[i] = fmt.Sprintf("%s|%s|%d", + c.Tag, + (deleted)[i].Uuid, + (deleted)[i].Id) + } + err = c.server.DelUsers(deletedEmail, c.Tag) + if err != nil { + log.Printf("[%s] Del users error: %s", c.Tag, err) + } + } + if len(added) > 0 { + // have added users + _, err = c.server.AddUsers(&vCore.AddUsersParams{ + Tag: c.Tag, + Config: c.ControllerConfig, + UserInfo: added, + NodeInfo: c.nodeInfo, + }) + if err != nil { + log.Printf("[%s] Add users error: %s", c.Tag, err) + } + } + if len(added) > 0 || len(deleted) > 0 { + // update Limiter + err = limiter.UpdateLimiter(c.Tag, added, deleted) + if err != nil { + log.Printf("[%s] Update limiter error: %s", c.Tag, err) + } + } + c.userList = newUserInfo + log.Printf("[%s] %d user deleted, %d user added", c.Tag, + len(deleted), len(added)) return nil } From d3fe0c8afec23dc00e3b0d66e19ce7656465dc65 Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 09:33:20 +0800 Subject: [PATCH 4/6] del no need option --- conf/node.go | 16 +++++++--------- node/controller.go | 6 ++---- node/user.go | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/conf/node.go b/conf/node.go index ac1b134..074f738 100644 --- a/conf/node.go +++ b/conf/node.go @@ -15,15 +15,13 @@ type ApiConfig struct { } type ControllerConfig struct { - DisableUploadTraffic bool `yaml:"DisableUploadTraffic"` - DisableGetRule bool `yaml:"DisableGetRule"` - ListenIP string `yaml:"ListenIP"` - SendIP string `yaml:"SendIP"` - EnableProxyProtocol bool `yaml:"EnableProxyProtocol"` - XrayOptions XrayOptions `yaml:"XrayOptions"` - HyOptions HyOptions `yaml:"HyOptions"` - LimitConfig LimitConfig `yaml:"LimitConfig"` - CertConfig *CertConfig `yaml:"CertConfig"` + ListenIP string `yaml:"ListenIP"` + SendIP string `yaml:"SendIP"` + EnableProxyProtocol bool `yaml:"EnableProxyProtocol"` + XrayOptions XrayOptions `yaml:"XrayOptions"` + HyOptions HyOptions `yaml:"HyOptions"` + LimitConfig LimitConfig `yaml:"LimitConfig"` + CertConfig *CertConfig `yaml:"CertConfig"` } type XrayOptions struct { diff --git a/node/controller.go b/node/controller.go index e633832..85b0b4a 100644 --- a/node/controller.go +++ b/node/controller.go @@ -58,10 +58,8 @@ func (c *Controller) Start() error { // add limiter l := limiter.AddLimiter(c.Tag, &c.LimitConfig, c.userList) // add rule limiter - if !c.DisableGetRule { - if err = l.UpdateRule(c.nodeInfo.Rules); err != nil { - return fmt.Errorf("update rule error: %s", err) - } + if err = l.UpdateRule(c.nodeInfo.Rules); err != nil { + return fmt.Errorf("update rule error: %s", err) } if c.nodeInfo.Tls || c.nodeInfo.Type == "hysteria" { err = c.requestCert() diff --git a/node/user.go b/node/user.go index 25b1318..d832b09 100644 --- a/node/user.go +++ b/node/user.go @@ -22,7 +22,7 @@ func (c *Controller) reportUserTrafficTask() (err error) { Download: down}) } } - if len(userTraffic) > 0 && !c.DisableUploadTraffic { + if len(userTraffic) > 0 { err = c.apiClient.ReportUserTraffic(userTraffic) if err != nil { log.Printf("Report user traffic faild: %s", err) From a729b2ec003d70765591dd174caa1a46fa1a2cf7 Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 09:47:03 +0800 Subject: [PATCH 5/6] update example --- example/config.yml.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/config.yml.example b/example/config.yml.example index b27f79e..58f0141 100644 --- a/example/config.yml.example +++ b/example/config.yml.example @@ -1,5 +1,5 @@ CoreConfig: - Type: "xray" # Core type. if you need many cores, use " " to split + Type: "xray" # Core type, default support "xray" and "hy". If you need many cores, use " " to split XrayConfig: Log: Level: warning # Log level: none, error, warning, info, debug @@ -39,7 +39,7 @@ Nodes: Alpn: # Alpn, Empty for any Path: # HTTP PATH, Empty for any Dest: 80 # Required, Destination of fallback, check https://xtls.github.io/config/features/fallback.html for details. - ProxyProtocolVer: 0 # Send PROXY protocol version, 0 for dsable + ProxyProtocolVer: 0 # Send PROXY protocol version, 0 for disable HyOptions: Resolver: "udp://1.1.1.1:53" # DNS resolver address ResolvePreference: 64 # DNS IPv4/IPv6 preference. Available options: "64" (IPv6 first, fallback to IPv4), "46" (IPv4 first, fallback to IPv6), "6" (IPv6 only), "4" (IPv4 only) From adf5c60c2a42ecad2f1bd506c05d7cca7b2ed76c Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 19 Jun 2023 09:56:18 +0800 Subject: [PATCH 6/6] fix misspell --- core/core.go | 2 +- core/{selecter.go => selector.go} | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) rename core/{selecter.go => selector.go} (78%) diff --git a/core/core.go b/core/core.go index ad00877..825cac8 100644 --- a/core/core.go +++ b/core/core.go @@ -26,7 +26,7 @@ func NewCore(c *conf.CoreConfig) (Core, error) { } cs = append(cs, core1) } - return &Selecter{ + return &Selector{ cores: cs, }, nil } diff --git a/core/selecter.go b/core/selector.go similarity index 78% rename from core/selecter.go rename to core/selector.go index 38127a9..03c25c7 100644 --- a/core/selecter.go +++ b/core/selector.go @@ -9,12 +9,12 @@ import ( "github.com/hashicorp/go-multierror" ) -type Selecter struct { +type Selector struct { cores []Core nodes sync.Map } -func (s *Selecter) Start() error { +func (s *Selector) Start() error { for i := range s.cores { err := s.cores[i].Start() return err @@ -22,7 +22,7 @@ func (s *Selecter) Start() error { return nil } -func (s *Selecter) Close() error { +func (s *Selector) Close() error { var errs error for i := range s.cores { errs = multierror.Append(errs, s.cores[i].Close()) @@ -39,7 +39,7 @@ func isSupported(protocol string, protocols []string) bool { return false } -func (s *Selecter) AddNode(tag string, info *panel.NodeInfo, config *conf.ControllerConfig) error { +func (s *Selector) AddNode(tag string, info *panel.NodeInfo, config *conf.ControllerConfig) error { for i := range s.cores { if !isSupported(info.Type, s.cores[i].Protocols()) { continue @@ -53,7 +53,7 @@ func (s *Selecter) AddNode(tag string, info *panel.NodeInfo, config *conf.Contro return errors.New("the node type is not support") } -func (s *Selecter) DelNode(tag string) error { +func (s *Selector) DelNode(tag string) error { if t, e := s.nodes.Load(tag); e { err := s.cores[t.(int)].DelNode(tag) if err != nil { @@ -65,7 +65,7 @@ func (s *Selecter) DelNode(tag string) error { return errors.New("the node is not have") } -func (s *Selecter) AddUsers(p *AddUsersParams) (added int, err error) { +func (s *Selector) AddUsers(p *AddUsersParams) (added int, err error) { t, e := s.nodes.Load(p.Tag) if !e { return 0, errors.New("the node is not have") @@ -73,7 +73,7 @@ func (s *Selecter) AddUsers(p *AddUsersParams) (added int, err error) { return s.cores[t.(int)].AddUsers(p) } -func (s *Selecter) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) { +func (s *Selector) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) { t, e := s.nodes.Load(tag) if !e { return 0, 0 @@ -81,7 +81,7 @@ func (s *Selecter) GetUserTraffic(tag, uuid string, reset bool) (up int64, down return s.cores[t.(int)].GetUserTraffic(tag, uuid, reset) } -func (s *Selecter) DelUsers(users []string, tag string) error { +func (s *Selector) DelUsers(users []string, tag string) error { t, e := s.nodes.Load(tag) if !e { return errors.New("the node is not have") @@ -89,7 +89,7 @@ func (s *Selecter) DelUsers(users []string, tag string) error { return s.cores[t.(int)].DelUsers(users, tag) } -func (s *Selecter) Protocols() []string { +func (s *Selector) Protocols() []string { protocols := make([]string, 0) for i := range s.cores { protocols = append(protocols, s.cores[i].Protocols()...)