fix metadata
This commit is contained in:
parent
f45dc93e92
commit
37e77bdce5
@ -8,6 +8,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"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/registry"
|
"github.com/go-gost/gost/pkg/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -67,8 +68,12 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
service.Name = fmt.Sprintf("service-%d", i)
|
service.Name = fmt.Sprintf("service-%d", i)
|
||||||
if chain != nil {
|
if chain != nil {
|
||||||
|
if service.Listener.Type == "rtcp" || service.Listener.Type == "rudp" {
|
||||||
|
service.Listener.Chain = chain.Name
|
||||||
|
} else {
|
||||||
service.Handler.Chain = chain.Name
|
service.Handler.Chain = chain.Name
|
||||||
}
|
}
|
||||||
|
}
|
||||||
cfg.Services = append(cfg.Services, service)
|
cfg.Services = append(cfg.Services, service)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,37 +130,30 @@ func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) {
|
|||||||
auths = append(auths, auth)
|
auths = append(auths, auth)
|
||||||
}
|
}
|
||||||
|
|
||||||
md := make(map[string]interface{})
|
md := metadata.MapMetadata{}
|
||||||
for k, v := range url.Query() {
|
for k, v := range url.Query() {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
md[k] = v[0]
|
md[k] = v[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sauth := md["auth"]; sauth != nil {
|
|
||||||
if sa, _ := sauth.(string); sa != "" {
|
if sa := metadata.GetString(md, "auth"); sa != "" {
|
||||||
au, err := parseAuthFromCmd(sa)
|
au, err := parseAuthFromCmd(sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
auths = append(auths, au)
|
auths = append(auths, au)
|
||||||
}
|
}
|
||||||
}
|
md.Del("auth")
|
||||||
delete(md, "auth")
|
|
||||||
|
|
||||||
var tlsConfig *config.TLSConfig
|
tlsConfig := &config.TLSConfig{
|
||||||
if certs := md["cert"]; certs != nil {
|
Cert: metadata.GetString(md, "cert"),
|
||||||
cert, _ := certs.(string)
|
Key: metadata.GetString(md, "key"),
|
||||||
key, _ := md["key"].(string)
|
CA: metadata.GetString(md, "ca"),
|
||||||
ca, _ := md["ca"].(string)
|
|
||||||
tlsConfig = &config.TLSConfig{
|
|
||||||
Cert: cert,
|
|
||||||
Key: key,
|
|
||||||
CA: ca,
|
|
||||||
}
|
}
|
||||||
}
|
md.Del("cert")
|
||||||
delete(md, "cert")
|
md.Del("key")
|
||||||
delete(md, "key")
|
md.Del("ca")
|
||||||
delete(md, "ca")
|
|
||||||
|
|
||||||
svc.Handler = &config.HandlerConfig{
|
svc.Handler = &config.HandlerConfig{
|
||||||
Type: handler,
|
Type: handler,
|
||||||
@ -205,45 +203,33 @@ func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) {
|
|||||||
auth.Password, _ = url.User.Password()
|
auth.Password, _ = url.User.Password()
|
||||||
}
|
}
|
||||||
|
|
||||||
md := make(map[string]interface{})
|
md := metadata.MapMetadata{}
|
||||||
for k, v := range url.Query() {
|
for k, v := range url.Query() {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
md[k] = v[0]
|
md[k] = v[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
md["serverName"] = url.Host
|
|
||||||
|
|
||||||
if sauth := md["auth"]; sauth != nil && auth == nil {
|
if sauth := metadata.GetString(md, "auth"); sauth != "" && auth == nil {
|
||||||
if sa, _ := sauth.(string); sa != "" {
|
au, err := parseAuthFromCmd(sauth)
|
||||||
au, err := parseAuthFromCmd(sa)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
auth = au
|
auth = au
|
||||||
}
|
}
|
||||||
}
|
md.Del("auth")
|
||||||
delete(md, "auth")
|
|
||||||
|
|
||||||
var tlsConfig *config.TLSConfig
|
tlsConfig := &config.TLSConfig{
|
||||||
if certs := md["cert"]; certs != nil {
|
CA: metadata.GetString(md, "ca"),
|
||||||
cert, _ := certs.(string)
|
Secure: metadata.GetBool(md, "secure"),
|
||||||
key, _ := md["key"].(string)
|
ServerName: metadata.GetString(md, "serverName"),
|
||||||
ca, _ := md["ca"].(string)
|
|
||||||
secure, _ := md["secure"].(bool)
|
|
||||||
serverName, _ := md["serverName"].(string)
|
|
||||||
tlsConfig = &config.TLSConfig{
|
|
||||||
Cert: cert,
|
|
||||||
Key: key,
|
|
||||||
CA: ca,
|
|
||||||
Secure: secure,
|
|
||||||
ServerName: serverName,
|
|
||||||
}
|
}
|
||||||
|
if tlsConfig.ServerName == "" {
|
||||||
|
tlsConfig.ServerName = url.Hostname()
|
||||||
}
|
}
|
||||||
delete(md, "cert")
|
md.Del("ca")
|
||||||
delete(md, "key")
|
md.Del("secure")
|
||||||
delete(md, "ca")
|
md.Del("serverName")
|
||||||
delete(md, "secure")
|
|
||||||
delete(md, "serverName")
|
|
||||||
|
|
||||||
node.Connector = &config.ConnectorConfig{
|
node.Connector = &config.ConnectorConfig{
|
||||||
Type: connector,
|
Type: connector,
|
||||||
|
@ -56,8 +56,15 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, svc := range cfg.Services {
|
for _, svc := range cfg.Services {
|
||||||
if svc.Listener == nil || svc.Handler == nil {
|
if svc.Listener == nil {
|
||||||
continue
|
svc.Listener = &config.ListenerConfig{
|
||||||
|
Type: "tcp",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if svc.Handler == nil {
|
||||||
|
svc.Handler = &config.HandlerConfig{
|
||||||
|
Type: "auto",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
serviceLogger := log.WithFields(map[string]interface{}{
|
serviceLogger := log.WithFields(map[string]interface{}{
|
||||||
"kind": "service",
|
"kind": "service",
|
||||||
@ -89,10 +96,6 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
|||||||
listener.LoggerOption(listenerLogger),
|
listener.LoggerOption(listenerLogger),
|
||||||
)
|
)
|
||||||
|
|
||||||
if chainable, ok := ln.(chain.Chainable); ok {
|
|
||||||
chainable.WithChain(chains[svc.Listener.Chain])
|
|
||||||
}
|
|
||||||
|
|
||||||
if svc.Listener.Metadata == nil {
|
if svc.Listener.Metadata == nil {
|
||||||
svc.Listener.Metadata = make(map[string]interface{})
|
svc.Listener.Metadata = make(map[string]interface{})
|
||||||
}
|
}
|
||||||
@ -292,9 +295,9 @@ func logFromConfig(cfg *config.LogConfig) logger.Logger {
|
|||||||
switch cfg.Output {
|
switch cfg.Output {
|
||||||
case "none":
|
case "none":
|
||||||
return logger.Nop()
|
return logger.Nop()
|
||||||
case "stdout", "":
|
case "stdout":
|
||||||
out = os.Stdout
|
out = os.Stdout
|
||||||
case "stderr":
|
case "stderr", "":
|
||||||
out = os.Stderr
|
out = os.Stderr
|
||||||
default:
|
default:
|
||||||
f, err := os.OpenFile(cfg.Output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
f, err := os.OpenFile(cfg.Output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
package chain
|
package chain
|
||||||
|
|
||||||
type Chainable interface {
|
|
||||||
WithChain(chain *Chain)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Chain struct {
|
type Chain struct {
|
||||||
groups []*NodeGroup
|
groups []*NodeGroup
|
||||||
}
|
}
|
||||||
|
@ -31,11 +31,11 @@ type ProfilingConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TLSConfig struct {
|
type TLSConfig struct {
|
||||||
Cert string
|
Cert string `yaml:",omitempty"`
|
||||||
Key string
|
Key string `yaml:",omitempty"`
|
||||||
CA string `yaml:",omitempty"`
|
CA string `yaml:",omitempty"`
|
||||||
Secure bool `yaml:",omitempty"`
|
Secure bool `yaml:",omitempty"`
|
||||||
ServerName string `yaml:",omitempty"`
|
ServerName string `yaml:"serverName,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AuthConfig struct {
|
type AuthConfig struct {
|
||||||
@ -59,7 +59,7 @@ type NameserverConfig struct {
|
|||||||
Addr string
|
Addr string
|
||||||
Chain string
|
Chain string
|
||||||
Prefer string
|
Prefer string
|
||||||
ClientIP string
|
ClientIP string `yaml:"clientIP"`
|
||||||
Hostname string
|
Hostname string
|
||||||
TTL time.Duration
|
TTL time.Duration
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
|
@ -20,14 +20,17 @@ type metadata struct {
|
|||||||
|
|
||||||
func (l *dnsListener) parseMetadata(md mdata.Metadata) (err error) {
|
func (l *dnsListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||||
const (
|
const (
|
||||||
|
backlog = "backlog"
|
||||||
mode = "mode"
|
mode = "mode"
|
||||||
readBufferSize = "readBufferSize"
|
readBufferSize = "readBufferSize"
|
||||||
|
readTimeout = "readTimeout"
|
||||||
backlog = "backlog"
|
writeTimeout = "writeTimeout"
|
||||||
)
|
)
|
||||||
|
|
||||||
l.md.mode = mdata.GetString(md, mode)
|
l.md.mode = mdata.GetString(md, mode)
|
||||||
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
|
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
|
||||||
|
l.md.readTimeout = mdata.GetDuration(md, readTimeout)
|
||||||
|
l.md.writeTimeout = mdata.GetDuration(md, writeTimeout)
|
||||||
|
|
||||||
l.md.backlog = mdata.GetInt(md, backlog)
|
l.md.backlog = mdata.GetInt(md, backlog)
|
||||||
if l.md.backlog <= 0 {
|
if l.md.backlog <= 0 {
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package http2
|
package http2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
mdata "github.com/go-gost/gost/pkg/metadata"
|
mdata "github.com/go-gost/gost/pkg/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -12,23 +9,11 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type metadata struct {
|
type metadata struct {
|
||||||
path string
|
|
||||||
handshakeTimeout time.Duration
|
|
||||||
readHeaderTimeout time.Duration
|
|
||||||
readBufferSize int
|
|
||||||
writeBufferSize int
|
|
||||||
enableCompression bool
|
|
||||||
responseHeader http.Header
|
|
||||||
backlog int
|
backlog int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *http2Listener) parseMetadata(md mdata.Metadata) (err error) {
|
func (l *http2Listener) parseMetadata(md mdata.Metadata) (err error) {
|
||||||
const (
|
const (
|
||||||
path = "path"
|
|
||||||
handshakeTimeout = "handshakeTimeout"
|
|
||||||
readHeaderTimeout = "readHeaderTimeout"
|
|
||||||
readBufferSize = "readBufferSize"
|
|
||||||
writeBufferSize = "writeBufferSize"
|
|
||||||
backlog = "backlog"
|
backlog = "backlog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
|
"github.com/go-gost/gost/pkg/chain"
|
||||||
"github.com/go-gost/gost/pkg/logger"
|
"github.com/go-gost/gost/pkg/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ type Options struct {
|
|||||||
Addr string
|
Addr string
|
||||||
Auths []*url.Userinfo
|
Auths []*url.Userinfo
|
||||||
TLSConfig *tls.Config
|
TLSConfig *tls.Config
|
||||||
|
Chain *chain.Chain
|
||||||
Logger logger.Logger
|
Logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,6 +36,12 @@ func TLSConfigOption(tlsConfig *tls.Config) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ChainOption(chain *chain.Chain) Option {
|
||||||
|
return func(opts *Options) {
|
||||||
|
opts.Chain = chain
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func LoggerOption(logger logger.Logger) Option {
|
func LoggerOption(logger logger.Logger) Option {
|
||||||
return func(opts *Options) {
|
return func(opts *Options) {
|
||||||
opts.Logger = logger
|
opts.Logger = logger
|
||||||
|
@ -17,47 +17,42 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type rtcpListener struct {
|
type rtcpListener struct {
|
||||||
addr string
|
|
||||||
laddr net.Addr
|
laddr net.Addr
|
||||||
chain *chain.Chain
|
|
||||||
ln net.Listener
|
ln net.Listener
|
||||||
md metadata
|
md metadata
|
||||||
router *chain.Router
|
router *chain.Router
|
||||||
logger logger.Logger
|
logger logger.Logger
|
||||||
closed chan struct{}
|
closed chan struct{}
|
||||||
|
options listener.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListener(opts ...listener.Option) listener.Listener {
|
func NewListener(opts ...listener.Option) listener.Listener {
|
||||||
options := &listener.Options{}
|
options := listener.Options{}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(options)
|
opt(&options)
|
||||||
}
|
}
|
||||||
return &rtcpListener{
|
return &rtcpListener{
|
||||||
addr: options.Addr,
|
|
||||||
closed: make(chan struct{}),
|
closed: make(chan struct{}),
|
||||||
router: &chain.Router{
|
|
||||||
Logger: options.Logger,
|
|
||||||
},
|
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
|
options: options,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// implements chain.Chainable interface
|
|
||||||
func (l *rtcpListener) WithChain(chain *chain.Chain) {
|
|
||||||
l.router.Chain = chain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *rtcpListener) Init(md md.Metadata) (err error) {
|
func (l *rtcpListener) Init(md md.Metadata) (err error) {
|
||||||
if err = l.parseMetadata(md); err != nil {
|
if err = l.parseMetadata(md); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
laddr, err := net.ResolveTCPAddr("tcp", l.addr)
|
laddr, err := net.ResolveTCPAddr("tcp", l.options.Addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
l.laddr = laddr
|
l.laddr = laddr
|
||||||
|
l.router = &chain.Router{
|
||||||
|
Chain: l.options.Chain,
|
||||||
|
Logger: l.logger,
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -12,24 +12,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type metadata struct {
|
type metadata struct {
|
||||||
enableMux bool
|
|
||||||
backlog int
|
|
||||||
retryCount int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *rtcpListener) parseMetadata(md mdata.Metadata) (err error) {
|
func (l *rtcpListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||||
const (
|
|
||||||
enableMux = "mux"
|
|
||||||
backlog = "backlog"
|
|
||||||
retryCount = "retry"
|
|
||||||
)
|
|
||||||
|
|
||||||
l.md.enableMux = mdata.GetBool(md, enableMux)
|
|
||||||
l.md.retryCount = mdata.GetInt(md, retryCount)
|
|
||||||
|
|
||||||
l.md.backlog = mdata.GetInt(md, backlog)
|
|
||||||
if l.md.backlog <= 0 {
|
|
||||||
l.md.backlog = defaultBacklog
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -17,47 +17,42 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type rudpListener struct {
|
type rudpListener struct {
|
||||||
addr string
|
|
||||||
laddr *net.UDPAddr
|
laddr *net.UDPAddr
|
||||||
chain *chain.Chain
|
|
||||||
ln net.Listener
|
ln net.Listener
|
||||||
md metadata
|
|
||||||
router *chain.Router
|
router *chain.Router
|
||||||
logger logger.Logger
|
|
||||||
closed chan struct{}
|
closed chan struct{}
|
||||||
|
logger logger.Logger
|
||||||
|
md metadata
|
||||||
|
options listener.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListener(opts ...listener.Option) listener.Listener {
|
func NewListener(opts ...listener.Option) listener.Listener {
|
||||||
options := &listener.Options{}
|
options := listener.Options{}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(options)
|
opt(&options)
|
||||||
}
|
}
|
||||||
return &rudpListener{
|
return &rudpListener{
|
||||||
addr: options.Addr,
|
|
||||||
closed: make(chan struct{}),
|
closed: make(chan struct{}),
|
||||||
router: &chain.Router{
|
|
||||||
Logger: options.Logger,
|
|
||||||
},
|
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
|
options: options,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// implements chain.Chainable interface
|
|
||||||
func (l *rudpListener) WithChain(chain *chain.Chain) {
|
|
||||||
l.router.Chain = chain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *rudpListener) Init(md md.Metadata) (err error) {
|
func (l *rudpListener) Init(md md.Metadata) (err error) {
|
||||||
if err = l.parseMetadata(md); err != nil {
|
if err = l.parseMetadata(md); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
laddr, err := net.ResolveUDPAddr("udp", l.addr)
|
laddr, err := net.ResolveUDPAddr("udp", l.options.Addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
l.laddr = laddr
|
l.laddr = laddr
|
||||||
|
l.router = &chain.Router{
|
||||||
|
Chain: l.options.Chain,
|
||||||
|
Logger: l.logger,
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -15,22 +15,22 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type tunListener struct {
|
type tunListener struct {
|
||||||
saddr string
|
|
||||||
addr net.Addr
|
addr net.Addr
|
||||||
cqueue chan net.Conn
|
cqueue chan net.Conn
|
||||||
closed chan struct{}
|
closed chan struct{}
|
||||||
logger logger.Logger
|
logger logger.Logger
|
||||||
md metadata
|
md metadata
|
||||||
|
options listener.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListener(opts ...listener.Option) listener.Listener {
|
func NewListener(opts ...listener.Option) listener.Listener {
|
||||||
options := &listener.Options{}
|
options := listener.Options{}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(options)
|
opt(&options)
|
||||||
}
|
}
|
||||||
return &tunListener{
|
return &tunListener{
|
||||||
saddr: options.Addr,
|
|
||||||
logger: options.Logger,
|
logger: options.Logger,
|
||||||
|
options: options,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ func (l *tunListener) Init(md md.Metadata) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
l.addr, err = net.ResolveUDPAddr("udp", l.saddr)
|
l.addr, err = net.ResolveUDPAddr("udp", l.options.Addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,10 @@ func (m MapMetadata) Get(key string) interface{} {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m MapMetadata) Del(key string) {
|
||||||
|
delete(m, key)
|
||||||
|
}
|
||||||
|
|
||||||
func GetBool(md Metadata, key string) (v bool) {
|
func GetBool(md Metadata, key string) (v bool) {
|
||||||
if md == nil || !md.IsExists(key) {
|
if md == nil || !md.IsExists(key) {
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user