improve cmd
This commit is contained in:
@ -7,6 +7,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/go-gost/gost/pkg/config"
|
"github.com/go-gost/gost/pkg/config"
|
||||||
"github.com/go-gost/gost/pkg/metadata"
|
"github.com/go-gost/gost/pkg/metadata"
|
||||||
@ -72,28 +73,21 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var nodes []*config.NodeConfig
|
var nodes []*config.NodeConfig
|
||||||
if v := metadata.GetString(md, "ip"); v != "" {
|
for _, host := range strings.Split(nodeConfig.Addr, ",") {
|
||||||
_, port, err := net.SplitHostPort(nodeConfig.Addr)
|
if host == "" {
|
||||||
if err != nil {
|
continue
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
ips := parseIP(v, port)
|
nodeCfg := &config.NodeConfig{}
|
||||||
for i := range ips {
|
*nodeCfg = *nodeConfig
|
||||||
nodeCfg := &config.NodeConfig{}
|
nodeCfg.Name = fmt.Sprintf("node-%d", len(nodes))
|
||||||
*nodeCfg = *nodeConfig
|
nodeCfg.Addr = host
|
||||||
nodeCfg.Name = fmt.Sprintf("node-%d", i)
|
nodes = append(nodes, nodeCfg)
|
||||||
nodeCfg.Addr = ips[i]
|
|
||||||
nodes = append(nodes, nodeCfg)
|
|
||||||
}
|
|
||||||
md.Del("ip")
|
|
||||||
}
|
|
||||||
if len(nodes) == 0 {
|
|
||||||
nodes = append(nodes, nodeConfig)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
chain.Hops = append(chain.Hops, &config.HopConfig{
|
chain.Hops = append(chain.Hops, &config.HopConfig{
|
||||||
Name: fmt.Sprintf("hop-%d", i),
|
Name: fmt.Sprintf("hop-%d", i),
|
||||||
Nodes: nodes,
|
Selector: parseSelector(md),
|
||||||
|
Nodes: nodes,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,6 +259,10 @@ func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) {
|
|||||||
md.Set("dns", strings.Split(v, ","))
|
md.Set("dns", strings.Split(v, ","))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if svc.Forwarder != nil {
|
||||||
|
svc.Forwarder.Selector = parseSelector(md)
|
||||||
|
}
|
||||||
|
|
||||||
svc.Handler = &config.HandlerConfig{
|
svc.Handler = &config.HandlerConfig{
|
||||||
Type: handler,
|
Type: handler,
|
||||||
Auths: auths,
|
Auths: auths,
|
||||||
@ -399,6 +397,34 @@ func parseAuthFromCmd(sa string) (*config.AuthConfig, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseSelector(md metadata.MapMetadata) *config.SelectorConfig {
|
||||||
|
strategy := metadata.GetString(md, "strategy")
|
||||||
|
maxFails := metadata.GetInt(md, "maxFails")
|
||||||
|
failTimeout := metadata.GetDuration(md, "failTimeout")
|
||||||
|
if strategy == "" && maxFails <= 0 && failTimeout <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if strategy == "" {
|
||||||
|
strategy = "round"
|
||||||
|
}
|
||||||
|
if maxFails <= 0 {
|
||||||
|
maxFails = 1
|
||||||
|
}
|
||||||
|
if failTimeout <= 0 {
|
||||||
|
failTimeout = time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
md.Del("strategy")
|
||||||
|
md.Del("maxFails")
|
||||||
|
md.Del("failTimeout")
|
||||||
|
|
||||||
|
return &config.SelectorConfig{
|
||||||
|
Strategy: strategy,
|
||||||
|
MaxFails: maxFails,
|
||||||
|
FailTimeout: failTimeout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func parseIP(s, port string) (ips []string) {
|
func parseIP(s, port string) (ips []string) {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return nil
|
return nil
|
||||||
|
@ -74,9 +74,12 @@ func (r *Router) resolve(ctx context.Context, addr string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
host, port, err := net.SplitHostPort(addr)
|
host, port, err := net.SplitHostPort(addr)
|
||||||
if err != nil || host == "" {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
if host == "" {
|
||||||
|
return addr, nil
|
||||||
|
}
|
||||||
|
|
||||||
if r.Hosts != nil {
|
if r.Hosts != nil {
|
||||||
if ips, _ := r.Hosts.Lookup("ip", host); len(ips) > 0 {
|
if ips, _ := r.Hosts.Lookup("ip", host); len(ips) > 0 {
|
||||||
|
@ -93,6 +93,10 @@ func GetDuration(md Metadata, key string) (v time.Duration) {
|
|||||||
return time.Duration(vv) * time.Second
|
return time.Duration(vv) * time.Second
|
||||||
case string:
|
case string:
|
||||||
v, _ = time.ParseDuration(vv)
|
v, _ = time.ParseDuration(vv)
|
||||||
|
if v == 0 {
|
||||||
|
n, _ := strconv.Atoi(vv)
|
||||||
|
v = time.Duration(n) * time.Second
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user