mirror of
https://github.com/wyx2685/V2bX.git
synced 2026-02-04 04:30:08 +00:00
add run many core at the same time
This commit is contained in:
19
core/core.go
19
core/core.go
@@ -12,6 +12,25 @@ var (
|
||||
)
|
||||
|
||||
func NewCore(c *conf.CoreConfig) (Core, error) {
|
||||
// multi core
|
||||
if types := strings.Split(c.Type, " "); len(types) > 1 {
|
||||
var cs []Core
|
||||
for _, t := range types {
|
||||
f, ok := cores[strings.ToLower(c.Type)]
|
||||
if !ok {
|
||||
return nil, errors.New("unknown core type: " + t)
|
||||
}
|
||||
core1, err := f(c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cs = append(cs, core1)
|
||||
}
|
||||
return &Selecter{
|
||||
cores: cs,
|
||||
}, nil
|
||||
}
|
||||
// one core
|
||||
if f, ok := cores[strings.ToLower(c.Type)]; ok {
|
||||
return f(c)
|
||||
} else {
|
||||
|
||||
@@ -2,10 +2,11 @@ package hy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/Yuzuki616/V2bX/conf"
|
||||
vCore "github.com/Yuzuki616/V2bX/core"
|
||||
"github.com/hashicorp/go-multierror"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -40,3 +41,9 @@ func (h *Hy) Close() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Hy) Protocols() []string {
|
||||
return []string{
|
||||
"hysteria",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,4 +19,5 @@ type Core interface {
|
||||
AddUsers(p *AddUsersParams) (added int, err error)
|
||||
GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64)
|
||||
DelUsers(users []string, tag string) error
|
||||
Protocols() []string
|
||||
}
|
||||
|
||||
98
core/selecter.go
Normal file
98
core/selecter.go
Normal file
@@ -0,0 +1,98 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
|
||||
"github.com/Yuzuki616/V2bX/api/panel"
|
||||
"github.com/Yuzuki616/V2bX/conf"
|
||||
"github.com/hashicorp/go-multierror"
|
||||
)
|
||||
|
||||
type Selecter struct {
|
||||
cores []Core
|
||||
nodes sync.Map
|
||||
}
|
||||
|
||||
func (s *Selecter) Start() error {
|
||||
for i := range s.cores {
|
||||
err := s.cores[i].Start()
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Selecter) Close() error {
|
||||
var errs error
|
||||
for i := range s.cores {
|
||||
errs = multierror.Append(errs, s.cores[i].Close())
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
func isSupported(protocol string, protocols []string) bool {
|
||||
for i := range protocols {
|
||||
if protocol == protocols[i] {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *Selecter) AddNode(tag string, info *panel.NodeInfo, config *conf.ControllerConfig) error {
|
||||
for i := range s.cores {
|
||||
if !isSupported(info.Type, s.cores[i].Protocols()) {
|
||||
continue
|
||||
}
|
||||
err := s.cores[i].AddNode(tag, info, config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.nodes.Store(tag, i)
|
||||
}
|
||||
return errors.New("the node type is not support")
|
||||
}
|
||||
|
||||
func (s *Selecter) DelNode(tag string) error {
|
||||
if t, e := s.nodes.Load(tag); e {
|
||||
err := s.cores[t.(int)].DelNode(tag)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.nodes.Delete(tag)
|
||||
return nil
|
||||
}
|
||||
return errors.New("the node is not have")
|
||||
}
|
||||
|
||||
func (s *Selecter) 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")
|
||||
}
|
||||
return s.cores[t.(int)].AddUsers(p)
|
||||
}
|
||||
|
||||
func (s *Selecter) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) {
|
||||
t, e := s.nodes.Load(tag)
|
||||
if !e {
|
||||
return 0, 0
|
||||
}
|
||||
return s.cores[t.(int)].GetUserTraffic(tag, uuid, reset)
|
||||
}
|
||||
|
||||
func (s *Selecter) DelUsers(users []string, tag string) error {
|
||||
t, e := s.nodes.Load(tag)
|
||||
if !e {
|
||||
return errors.New("the node is not have")
|
||||
}
|
||||
return s.cores[t.(int)].DelUsers(users, tag)
|
||||
}
|
||||
|
||||
func (s *Selecter) Protocols() []string {
|
||||
protocols := make([]string, 0)
|
||||
for i := range s.cores {
|
||||
protocols = append(protocols, s.cores[i].Protocols()...)
|
||||
}
|
||||
return protocols
|
||||
}
|
||||
@@ -53,6 +53,7 @@ func parseConnectionConfig(c *conf.ConnectionConfig) (policy *coreConf.Policy) {
|
||||
}
|
||||
|
||||
func getCore(c *conf.XrayConfig) *core.Instance {
|
||||
os.Setenv("XRAY_LOCATION_ASSET", c.AssetPath)
|
||||
// Log Config
|
||||
coreLogConfig := &coreConf.LogConfig{}
|
||||
coreLogConfig.LogLevel = c.LogConfig.Level
|
||||
@@ -183,3 +184,11 @@ func (c *Core) Close() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Core) Protocols() []string {
|
||||
return []string{
|
||||
"v2ray",
|
||||
"shadowsocks",
|
||||
"trojan",
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user