Merge pull request #77 from Yuzuki616/dev

Sync
This commit is contained in:
Yuzuki
2023-06-19 10:00:36 +08:00
committed by GitHub
9 changed files with 93 additions and 97 deletions

View File

@@ -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 {

View File

@@ -26,7 +26,7 @@ func NewCore(c *conf.CoreConfig) (Core, error) {
}
cs = append(cs, core1)
}
return &Selecter{
return &Selector{
cores: cs,
}, nil
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()...)

View File

@@ -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)

View File

@@ -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()
@@ -83,7 +81,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
}

View File

@@ -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
}

View File

@@ -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)