mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-31 15:19:45 +07:00
feat: support config file
This commit is contained in:
@ -10,8 +10,12 @@ import (
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/v2rayA/dae/common/consts"
|
||||
"github.com/v2rayA/dae/component/outbound/dialer"
|
||||
"github.com/v2rayA/dae/config"
|
||||
"github.com/v2rayA/dae/pkg/config_parser"
|
||||
"golang.org/x/net/proxy"
|
||||
"log"
|
||||
"net"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type DialerSelectionPolicy struct {
|
||||
@ -19,6 +23,51 @@ type DialerSelectionPolicy struct {
|
||||
FixedIndex int
|
||||
}
|
||||
|
||||
func NewDialerSelectionPolicyFromGroupParam(param *config.GroupParam) (policy *DialerSelectionPolicy, err error) {
|
||||
switch val := param.Policy.(type) {
|
||||
case string:
|
||||
switch consts.DialerSelectionPolicy(val) {
|
||||
case consts.DialerSelectionPolicy_Random,
|
||||
consts.DialerSelectionPolicy_MinAverage10Latencies,
|
||||
consts.DialerSelectionPolicy_MinLastLatency:
|
||||
return &DialerSelectionPolicy{
|
||||
Policy: consts.DialerSelectionPolicy(val),
|
||||
}, nil
|
||||
case consts.DialerSelectionPolicy_Fixed:
|
||||
return nil, fmt.Errorf("%v need to specify node index", val)
|
||||
default:
|
||||
return nil, fmt.Errorf("unexpected policy: %v", val)
|
||||
}
|
||||
case []*config_parser.Function:
|
||||
if len(val) > 1 || len(val) == 0 {
|
||||
logrus.Debugf("%@", val)
|
||||
return nil, fmt.Errorf("policy should be exact 1 function: got %v", len(val))
|
||||
}
|
||||
f := val[0]
|
||||
switch consts.DialerSelectionPolicy(f.Name) {
|
||||
case consts.DialerSelectionPolicy_Fixed:
|
||||
// Should be like:
|
||||
// policy: fixed(0)
|
||||
if len(f.Params) > 1 || f.Params[0].Key != "" {
|
||||
return nil, fmt.Errorf(`invalid "%v" param format`, f.Name)
|
||||
}
|
||||
strIndex := f.Params[0].Val
|
||||
index, err := strconv.Atoi(strIndex)
|
||||
if len(f.Params) > 1 || f.Params[0].Key != "" {
|
||||
return nil, fmt.Errorf(`invalid "%v" param format: %w`, f.Name, err)
|
||||
}
|
||||
return &DialerSelectionPolicy{
|
||||
Policy: consts.DialerSelectionPolicy(f.Name),
|
||||
FixedIndex: index,
|
||||
}, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("unexpected policy func: %v", f.Name)
|
||||
}
|
||||
default:
|
||||
return nil, fmt.Errorf("unexpected param.Policy.(type): %T", val)
|
||||
}
|
||||
}
|
||||
|
||||
type DialerGroup struct {
|
||||
proxy.Dialer
|
||||
block *dialer.Dialer
|
||||
@ -34,9 +83,9 @@ type DialerGroup struct {
|
||||
selectionPolicy *DialerSelectionPolicy
|
||||
}
|
||||
|
||||
func NewDialerGroup(log *logrus.Logger, name string, dialers []*dialer.Dialer, p DialerSelectionPolicy) *DialerGroup {
|
||||
func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer.Dialer, p DialerSelectionPolicy) *DialerGroup {
|
||||
var registeredAliveDialerSet bool
|
||||
a := dialer.NewAliveDialerSet(log, p.Policy, dialers, true)
|
||||
a := dialer.NewAliveDialerSet(option.Log, p.Policy, dialers, true)
|
||||
|
||||
switch p.Policy {
|
||||
case consts.DialerSelectionPolicy_Random,
|
||||
@ -56,10 +105,10 @@ func NewDialerGroup(log *logrus.Logger, name string, dialers []*dialer.Dialer, p
|
||||
}
|
||||
|
||||
return &DialerGroup{
|
||||
log: log,
|
||||
log: option.Log,
|
||||
Name: name,
|
||||
Dialers: dialers,
|
||||
block: dialer.NewBlockDialer(log),
|
||||
block: dialer.NewBlockDialer(option),
|
||||
AliveDialerSet: a,
|
||||
registeredAliveDialerSet: registeredAliveDialerSet,
|
||||
selectionPolicy: &p,
|
||||
@ -121,5 +170,6 @@ func (g *DialerGroup) Dial(network string, addr string) (c net.Conn, err error)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
g.log.Tracef("Group [%v] dial using [%v]", g.Name, d.Name())
|
||||
return d.Dial(network, addr)
|
||||
}
|
||||
|
Reference in New Issue
Block a user