improve cmd
This commit is contained in:
parent
a0ee8bc45c
commit
1e613fc2e6
105
cmd/gost/cmd.go
105
cmd/gost/cmd.go
@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -50,9 +51,49 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
nodeConfig.Name = "node-0"
|
nodeConfig.Name = "node-0"
|
||||||
|
|
||||||
|
md := metadata.MapMetadata(nodeConfig.Connector.Metadata)
|
||||||
|
if v := metadata.GetString(md, "bypass"); v != "" {
|
||||||
|
bypassCfg := &config.BypassConfig{
|
||||||
|
Name: fmt.Sprintf("bypass-%d", len(cfg.Bypasses)),
|
||||||
|
}
|
||||||
|
if v[0] == '~' {
|
||||||
|
bypassCfg.Reverse = true
|
||||||
|
v = v[1:]
|
||||||
|
}
|
||||||
|
for _, s := range strings.Split(v, ",") {
|
||||||
|
if s == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bypassCfg.Matchers = append(bypassCfg.Matchers, s)
|
||||||
|
}
|
||||||
|
nodeConfig.Bypass = bypassCfg.Name
|
||||||
|
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
||||||
|
md.Del("bypass")
|
||||||
|
}
|
||||||
|
|
||||||
|
var nodes []*config.NodeConfig
|
||||||
|
if v := metadata.GetString(md, "ip"); v != "" {
|
||||||
|
_, port, err := net.SplitHostPort(nodeConfig.Addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ips := parseIP(v, port)
|
||||||
|
for i := range ips {
|
||||||
|
nodeCfg := &config.NodeConfig{}
|
||||||
|
*nodeCfg = *nodeConfig
|
||||||
|
nodeCfg.Name = fmt.Sprintf("node-%d", i)
|
||||||
|
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: []*config.NodeConfig{nodeConfig},
|
Nodes: nodes,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +118,24 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
cfg.Services = append(cfg.Services, service)
|
cfg.Services = append(cfg.Services, service)
|
||||||
|
|
||||||
md := metadata.MapMetadata(service.Handler.Metadata)
|
md := metadata.MapMetadata(service.Handler.Metadata)
|
||||||
|
if v := metadata.GetString(md, "bypass"); v != "" {
|
||||||
|
bypassCfg := &config.BypassConfig{
|
||||||
|
Name: fmt.Sprintf("bypass-%d", len(cfg.Bypasses)),
|
||||||
|
}
|
||||||
|
if v[0] == '~' {
|
||||||
|
bypassCfg.Reverse = true
|
||||||
|
v = v[1:]
|
||||||
|
}
|
||||||
|
for _, s := range strings.Split(v, ",") {
|
||||||
|
if s == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bypassCfg.Matchers = append(bypassCfg.Matchers, s)
|
||||||
|
}
|
||||||
|
service.Handler.Bypass = bypassCfg.Name
|
||||||
|
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
||||||
|
md.Del("bypass")
|
||||||
|
}
|
||||||
if v := metadata.GetString(md, "resolver"); v != "" {
|
if v := metadata.GetString(md, "resolver"); v != "" {
|
||||||
resolverCfg := &config.ResolverConfig{
|
resolverCfg := &config.ResolverConfig{
|
||||||
Name: fmt.Sprintf("resolver-%d", len(cfg.Resolvers)),
|
Name: fmt.Sprintf("resolver-%d", len(cfg.Resolvers)),
|
||||||
@ -96,6 +155,27 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
||||||
md.Del("resolver")
|
md.Del("resolver")
|
||||||
}
|
}
|
||||||
|
if v := metadata.GetString(md, "hosts"); v != "" {
|
||||||
|
hostsCfg := &config.HostsConfig{
|
||||||
|
Name: fmt.Sprintf("hosts-%d", len(cfg.Hosts)),
|
||||||
|
}
|
||||||
|
for _, s := range strings.Split(v, ",") {
|
||||||
|
ss := strings.SplitN(s, ":", 2)
|
||||||
|
if len(ss) != 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hostsCfg.Entries = append(
|
||||||
|
hostsCfg.Entries,
|
||||||
|
config.HostConfig{
|
||||||
|
IP: ss[0],
|
||||||
|
Hostname: ss[1],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
service.Handler.Hosts = hostsCfg.Name
|
||||||
|
cfg.Hosts = append(cfg.Hosts, hostsCfg)
|
||||||
|
md.Del("hosts")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +365,7 @@ func normCmd(s string) (*url.URL, error) {
|
|||||||
return nil, ErrInvalidCmd
|
return nil, ErrInvalidCmd
|
||||||
}
|
}
|
||||||
|
|
||||||
if s[0] == ':' {
|
if s[0] == ':' || !strings.Contains(s, "://") {
|
||||||
s = "auto://" + s
|
s = "auto://" + s
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,3 +398,24 @@ func parseAuthFromCmd(sa string) (*config.AuthConfig, error) {
|
|||||||
Password: cs[n+1:],
|
Password: cs[n+1:],
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseIP(s, port string) (ips []string) {
|
||||||
|
if s == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if port == "" {
|
||||||
|
port = "8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range strings.Split(s, ",") {
|
||||||
|
if v == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, _, err := net.SplitHostPort(v); err != nil {
|
||||||
|
v = net.JoinHostPort(v, port) // assume the port is missing
|
||||||
|
}
|
||||||
|
ips = append(ips, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -73,7 +73,7 @@ type ResolverConfig struct {
|
|||||||
type HostConfig struct {
|
type HostConfig struct {
|
||||||
IP string
|
IP string
|
||||||
Hostname string
|
Hostname string
|
||||||
Aliases []string
|
Aliases []string `yaml:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type HostsConfig struct {
|
type HostsConfig struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user