完善节点筛选机制
This commit is contained in:
@@ -40,6 +40,10 @@ type channelServer struct {
|
||||
}
|
||||
|
||||
func (s *channelServer) CreateChannels(source netip.Addr, resourceNo string, authWhitelist bool, authPassword bool, count int, edgeFilter *EdgeFilter) ([]*m.Channel, error) {
|
||||
if edgeFilter == nil {
|
||||
edgeFilter = &EdgeFilter{}
|
||||
}
|
||||
|
||||
var area *m.Area
|
||||
if edgeFilter.AreaID != nil {
|
||||
var err error
|
||||
@@ -265,8 +269,8 @@ func persistChannelCreate(ctx *channelCreateContext, channels []*m.Channel) erro
|
||||
BatchNo: ctx.BatchNo,
|
||||
Count: int32(ctx.Count),
|
||||
ISP: u.X(ctx.Filter.Isp.String()),
|
||||
Prov: prov,
|
||||
City: city,
|
||||
Prov: u.Ternary(ctx.Filter.AreaID != nil, prov, nil),
|
||||
City: u.Ternary(ctx.Filter.AreaID != nil, city, nil),
|
||||
IP: orm.Inet{Addr: ctx.Source},
|
||||
Time: ctx.Now,
|
||||
}); err != nil {
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
q "platform/web/queries"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
)
|
||||
|
||||
type channelGostProvider struct{}
|
||||
@@ -37,7 +37,7 @@ func (s *channelGostProvider) prepareCreate(ctx *channelCreateContext) (*channel
|
||||
serviceName := gostServiceName(ctx.BatchNo, port)
|
||||
channel := newBaseChannel(ctx, port)
|
||||
channel.EdgeID = u.P(edge.ID)
|
||||
channel.EdgeRef = u.P(serviceName)
|
||||
channel.EdgeRef = u.P(edge.Mac)
|
||||
channel.IP = u.P(edge.IP)
|
||||
|
||||
service := &g.GostServiceConfig{
|
||||
@@ -141,40 +141,34 @@ func (s *channelGostProvider) selectEdge(filter *EdgeFilter, area *m.Area, count
|
||||
filter = &EdgeFilter{}
|
||||
}
|
||||
|
||||
conds := []gen.Condition{
|
||||
do := q.Edge.Where(
|
||||
q.Edge.Type.Eq(int(m.EdgeTypeGostChain)),
|
||||
q.Edge.Status.Eq(int(m.EdgeStatusNormal)),
|
||||
)
|
||||
if filter.Isp != nil {
|
||||
do = do.Where(q.Edge.ISP.In(int(m.EdgeISPUnknown), int(*filter.Isp)))
|
||||
}
|
||||
if isp := u.X(filter.Isp.String()); isp != nil {
|
||||
conds = append(conds, q.Edge.ISP.Eq(int(*filter.Isp)))
|
||||
}
|
||||
|
||||
query := q.Edge.Where(conds...)
|
||||
if area != nil {
|
||||
switch area.Level {
|
||||
case m.AreaLevelProvince:
|
||||
edgeArea := q.Area.As("EdgeArea")
|
||||
query = query.
|
||||
Join(edgeArea, edgeArea.ID.EqCol(q.Edge.AreaID)).
|
||||
Where(edgeArea.ParentID.Eq(area.ID))
|
||||
do = do.
|
||||
Where(edgeArea.ParentID.Eq(area.ID)).
|
||||
Join(edgeArea, edgeArea.ID.EqCol(q.Edge.AreaID))
|
||||
case m.AreaLevelCity:
|
||||
query = query.Where(q.Edge.AreaID.Eq(area.ID))
|
||||
do = do.Where(q.Edge.AreaID.Eq(area.ID))
|
||||
default:
|
||||
return nil, core.NewBizErr("地区层级不支持")
|
||||
}
|
||||
}
|
||||
|
||||
edges, err := query.
|
||||
Order(q.Edge.ID).
|
||||
edges, err := do.
|
||||
Order(field.NewUnsafeFieldRaw("random()")).
|
||||
Limit(count).
|
||||
Find()
|
||||
if err != nil {
|
||||
return nil, core.NewBizErr("查询可用节点失败", err)
|
||||
}
|
||||
return expandGostEdges(edges, count)
|
||||
}
|
||||
|
||||
func expandGostEdges(edges []*m.Edge, count int) ([]*m.Edge, error) {
|
||||
if len(edges) == 0 {
|
||||
return nil, core.NewBizErr("地区可用节点数量不足")
|
||||
}
|
||||
@@ -183,6 +177,7 @@ func expandGostEdges(edges []*m.Edge, count int) ([]*m.Edge, error) {
|
||||
for i := range count {
|
||||
result[i] = edges[i%len(edges)]
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user