fix(subscribe): enhance server tag handling in subscription logic
This commit is contained in:
parent
9a1942f8cf
commit
c5b0507187
@ -177,27 +177,28 @@ func (l *SubscribeLogic) getRules() ([]*server.RuleGroup, error) {
|
|||||||
func (l *SubscribeLogic) buildClientConfig(req *types.SubscribeRequest, userSub *user.Subscribe, servers []*server.Server, rules []*server.RuleGroup) ([]byte, string, error) {
|
func (l *SubscribeLogic) buildClientConfig(req *types.SubscribeRequest, userSub *user.Subscribe, servers []*server.Server, rules []*server.RuleGroup) ([]byte, string, error) {
|
||||||
tags := make(map[string][]*server.Server)
|
tags := make(map[string][]*server.Server)
|
||||||
|
|
||||||
groups, err := l.svc.ServerModel.QueryAllGroup(l.ctx)
|
serverTags, err := l.svc.ServerModel.FindServerTags(l.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Errorw("[Generate Subscribe]find group error: %v", logger.Field("error", err.Error()))
|
l.Errorw("[Generate Subscribe]find server tags error: %v", logger.Field("error", err.Error()))
|
||||||
return nil, "", errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find group error: %v", err.Error())
|
return nil, "", errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find server tags error: %v", err.Error())
|
||||||
}
|
}
|
||||||
for _, group := range groups {
|
// Deduplicate tags
|
||||||
total, servers, err := l.svc.ServerModel.FindServerListByFilter(l.ctx, &server.ServerFilter{
|
serverTags = tool.RemoveDuplicateElements(serverTags...)
|
||||||
Tags: []string{group.Name},
|
for _, tag := range serverTags {
|
||||||
})
|
s, err := l.svc.ServerModel.FindServersByTag(l.ctx.Request.Context(), tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
l.Errorw("[Generate Subscribe]find servers by tag error: %v", logger.Field("error", err.Error()))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if total > 0 {
|
if len(s) > 0 {
|
||||||
tags[group.Name] = servers
|
tags[tag] = s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
proxyManager := adapter.NewAdapter(&adapter.Config{
|
proxyManager := adapter.NewAdapter(&adapter.Config{
|
||||||
Nodes: servers,
|
Nodes: servers,
|
||||||
Rules: rules,
|
Rules: rules,
|
||||||
Tags: make(map[string][]*server.Server),
|
Tags: tags,
|
||||||
})
|
})
|
||||||
clientType := l.getClientType(req)
|
clientType := l.getClientType(req)
|
||||||
var resp []byte
|
var resp []byte
|
||||||
|
|||||||
@ -12,25 +12,36 @@ import (
|
|||||||
"github.com/perfect-panel/server/pkg/adapter/surfboard"
|
"github.com/perfect-panel/server/pkg/adapter/surfboard"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Nodes []*server.Server
|
||||||
|
Rules []*server.RuleGroup
|
||||||
|
Tags map[string][]*server.Server
|
||||||
|
}
|
||||||
|
|
||||||
type Adapter struct {
|
type Adapter struct {
|
||||||
proxy.Adapter
|
proxy.Adapter
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAdapter(nodes []*server.Server, rules []*server.RuleGroup) *Adapter {
|
func NewAdapter(cfg *Config) *Adapter {
|
||||||
// 转换服务器列表
|
// 转换服务器列表
|
||||||
proxies := adapterProxies(nodes)
|
proxies := adapterProxies(cfg.Nodes)
|
||||||
// 生成代理组
|
// 生成代理组
|
||||||
proxyGroup, region := generateProxyGroup(proxies)
|
proxyGroup, region := generateProxyGroup(proxies)
|
||||||
|
|
||||||
// 转换规则组
|
// 转换规则组
|
||||||
g, r := adapterRules(rules)
|
g, r := adapterRules(cfg.Rules)
|
||||||
|
|
||||||
// 加入兜底节点
|
// 加入兜底节点
|
||||||
for i, group := range g {
|
for i, group := range g {
|
||||||
if len(group.Proxies) == 0 {
|
if len(group.Proxies) == 0 {
|
||||||
g[i].Proxies = append([]string{"DIRECT"}, region...)
|
g[i].Proxies = append([]string{"DIRECT"}, region...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 合并代理组
|
// 合并代理组
|
||||||
proxyGroup = RemoveEmptyGroup(append(proxyGroup, g...))
|
proxyGroup = RemoveEmptyGroup(append(proxyGroup, g...))
|
||||||
|
// 处理标签
|
||||||
|
proxyGroup = adapterTags(cfg.Tags, proxyGroup)
|
||||||
return &Adapter{
|
return &Adapter{
|
||||||
Adapter: proxy.Adapter{
|
Adapter: proxy.Adapter{
|
||||||
Proxies: proxies,
|
Proxies: proxies,
|
||||||
|
|||||||
@ -109,6 +109,18 @@ func adapterRules(groups []*server.RuleGroup) (proxyGroup []proxy.Group, rules [
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func adapterTags(tags map[string][]*server.Server, group []proxy.Group) (proxyGroup []proxy.Group) {
|
||||||
|
for tag, servers := range tags {
|
||||||
|
proxies := adapterProxies(servers)
|
||||||
|
if len(proxies) != 0 {
|
||||||
|
for _, p := range proxies {
|
||||||
|
group = addProxyToGroup(p.Name, tag, group)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return group
|
||||||
|
}
|
||||||
|
|
||||||
func generateProxyGroup(servers []proxy.Proxy) (proxyGroup []proxy.Group, region []string) {
|
func generateProxyGroup(servers []proxy.Proxy) (proxyGroup []proxy.Group, region []string) {
|
||||||
// 设置手动选择分组
|
// 设置手动选择分组
|
||||||
proxyGroup = append(proxyGroup, []proxy.Group{
|
proxyGroup = append(proxyGroup, []proxy.Group{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user