add config

This commit is contained in:
ginuerzh
2021-10-29 13:35:44 +08:00
parent 3351aa5974
commit 16ddfba1d1
36 changed files with 1024 additions and 207 deletions

View File

@ -1,6 +1,7 @@
package chain
type Chain struct {
Name string
groups []*NodeGroup
}

View File

@ -7,5 +7,6 @@ import (
// Connector is responsible for connecting to the destination address.
type Connector interface {
Init(Metadata) error
Connect(ctx context.Context, conn net.Conn, network, address string, opts ...ConnectOption) (net.Conn, error)
}

View File

@ -12,18 +12,19 @@ import (
"github.com/go-gost/gost/pkg/components/connector"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ connector.Connector = (*Connector)(nil)
)
func init() {
registry.RegiserConnector("http", NewConnector)
}
type Connector struct {
md metadata
logger logger.Logger
}
func NewConnector(opts ...connector.Option) *Connector {
func NewConnector(opts ...connector.Option) connector.Connector {
options := &connector.Options{}
for _, opt := range opts {
opt(options)

View File

@ -6,18 +6,19 @@ import (
"github.com/go-gost/gost/pkg/components/connector"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ connector.Connector = (*Connector)(nil)
)
func init() {
registry.RegiserConnector("ss", NewConnector)
}
type Connector struct {
md metadata
logger logger.Logger
}
func NewConnector(opts ...connector.Option) *Connector {
func NewConnector(opts ...connector.Option) connector.Connector {
options := &connector.Options{}
for _, opt := range opts {
opt(options)

View File

@ -7,6 +7,7 @@ import (
// Transporter is responsible for dialing to the proxy server.
type Dialer interface {
Init(Metadata) error
Dial(ctx context.Context, addr string, opts ...DialOption) (net.Conn, error)
}

View File

@ -6,18 +6,19 @@ import (
"github.com/go-gost/gost/pkg/components/dialer"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ dialer.Dialer = (*Dialer)(nil)
)
func init() {
registry.RegisterDialer("tcp", NewDialer)
}
type Dialer struct {
md metadata
logger logger.Logger
}
func NewDialer(opts ...dialer.Option) *Dialer {
func NewDialer(opts ...dialer.Option) dialer.Dialer {
options := &dialer.Options{}
for _, opt := range opts {
opt(options)

View File

@ -6,5 +6,6 @@ import (
)
type Handler interface {
Init(Metadata) error
Handle(context.Context, net.Conn)
}

View File

@ -9,11 +9,12 @@ import (
"github.com/go-gost/gost/pkg/chain"
"github.com/go-gost/gost/pkg/components/handler"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ handler.Handler = (*Handler)(nil)
)
func init() {
registry.RegisterHandler("http", NewHandler)
}
type Handler struct {
chain *chain.Chain
@ -21,7 +22,7 @@ type Handler struct {
md metadata
}
func NewHandler(opts ...handler.Option) *Handler {
func NewHandler(opts ...handler.Option) handler.Handler {
options := &handler.Options{}
for _, opt := range opts {
opt(options)

View File

@ -0,0 +1 @@
package http

View File

@ -9,20 +9,21 @@ import (
"github.com/go-gost/gosocks5"
"github.com/go-gost/gost/pkg/components/handler"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/shadowsocks/go-shadowsocks2/core"
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
)
var (
_ handler.Handler = (*Handler)(nil)
)
func init() {
registry.RegisterHandler("ss", NewHandler)
}
type Handler struct {
logger logger.Logger
md metadata
}
func NewHandler(opts ...handler.Option) *Handler {
func NewHandler(opts ...handler.Option) handler.Handler {
options := &handler.Options{}
for _, opt := range opts {
opt(options)

View File

@ -7,20 +7,21 @@ import (
"github.com/go-gost/gost/pkg/components/handler"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/shadowsocks/go-shadowsocks2/core"
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
)
var (
_ handler.Handler = (*Handler)(nil)
)
func init() {
registry.RegisterHandler("ssu", NewHandler)
}
type Handler struct {
logger logger.Logger
md metadata
}
func NewHandler(opts ...handler.Option) *Handler {
func NewHandler(opts ...handler.Option) handler.Handler {
options := &handler.Options{}
for _, opt := range opts {
opt(options)

View File

@ -8,12 +8,13 @@ import (
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/tcpraw"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("ftcp", NewListener)
}
type Listener struct {
md metadata
@ -24,7 +25,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -10,12 +10,13 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"golang.org/x/net/http2"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("h2", NewListener)
}
type Listener struct {
net.Listener
@ -26,7 +27,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -9,12 +9,13 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"golang.org/x/net/http2"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("http2", NewListener)
}
type Listener struct {
md metadata
@ -25,7 +26,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -8,14 +8,15 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/kcp-go/v5"
"github.com/xtaci/smux"
"github.com/xtaci/tcpraw"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("kcp", NewListener)
}
type Listener struct {
md metadata
@ -25,7 +26,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -11,6 +11,7 @@ var (
// Listener is a server listener, just like a net.Listener.
type Listener interface {
Init(Metadata) error
net.Listener
}

View File

@ -9,11 +9,12 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("obfs-http", NewListener)
}
type Listener struct {
md metadata
@ -21,7 +22,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -9,11 +9,12 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("obfs-tls", NewListener)
}
type Listener struct {
md metadata
@ -21,7 +22,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -5,11 +5,18 @@ import (
)
type Options struct {
Addr string
Logger logger.Logger
}
type Option func(opts *Options)
func AddrOption(addr string) Option {
return func(opts *Options) {
opts.Addr = addr
}
}
func LoggerOption(logger logger.Logger) Option {
return func(opts *Options) {
opts.Logger = logger

View File

@ -8,12 +8,13 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/lucas-clemente/quic-go"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("quic", NewListener)
}
type Listener struct {
md metadata
@ -23,7 +24,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -1,7 +1,6 @@
package tcp
import (
"errors"
"net"
"strconv"
"time"
@ -9,24 +8,27 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("tcp", NewListener)
}
type Listener struct {
md metadata
addr string
md metadata
net.Listener
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)
}
return &Listener{
addr: options.Addr,
logger: options.Logger,
}
}
@ -37,7 +39,7 @@ func (l *Listener) Init(md listener.Metadata) (err error) {
return
}
laddr, err := net.ResolveTCPAddr("tcp", l.md.addr)
laddr, err := net.ResolveTCPAddr("tcp", l.addr)
if err != nil {
return
}
@ -59,13 +61,6 @@ func (l *Listener) Init(md listener.Metadata) (err error) {
}
func (l *Listener) parseMetadata(md listener.Metadata) (m metadata, err error) {
if val, ok := md[addr]; ok {
m.addr = val
} else {
err = errors.New("missing address")
return
}
m.keepAlive = true
if val, ok := md[keepAlive]; ok {
m.keepAlive, _ = strconv.ParseBool(val)

View File

@ -3,7 +3,6 @@ package tcp
import "time"
const (
addr = "addr"
keepAlive = "keepAlive"
keepAlivePeriod = "keepAlivePeriod"
)
@ -13,7 +12,6 @@ const (
)
type metadata struct {
addr string
keepAlive bool
keepAlivePeriod time.Duration
}

View File

@ -9,11 +9,12 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("tls", NewListener)
}
type Listener struct {
md metadata
@ -21,7 +22,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -8,12 +8,13 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/smux"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("mtls", NewListener)
}
type Listener struct {
md metadata
@ -23,7 +24,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -8,11 +8,12 @@ import (
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("udp", NewListener)
}
type Listener struct {
md metadata
@ -23,7 +24,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -9,12 +9,14 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/gorilla/websocket"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("ws", NewListener)
registry.RegisterListener("wss", NewListener)
}
type Listener struct {
md metadata
@ -26,7 +28,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

View File

@ -9,13 +9,15 @@ import (
"github.com/go-gost/gost/pkg/components/internal/utils"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/logger"
"github.com/go-gost/gost/pkg/registry"
"github.com/gorilla/websocket"
"github.com/xtaci/smux"
)
var (
_ listener.Listener = (*Listener)(nil)
)
func init() {
registry.RegisterListener("mws", NewListener)
registry.RegisterListener("mwss", NewListener)
}
type Listener struct {
md metadata
@ -27,7 +29,7 @@ type Listener struct {
logger logger.Logger
}
func NewListener(opts ...listener.Option) *Listener {
func NewListener(opts ...listener.Option) listener.Listener {
options := &listener.Options{}
for _, opt := range opts {
opt(options)

106
pkg/config/config.go Normal file
View File

@ -0,0 +1,106 @@
package config
import (
"io"
"github.com/spf13/viper"
)
var (
v = viper.GetViper()
)
func init() {
v.SetConfigName("gost")
v.AddConfigPath("/etc/gost/")
v.AddConfigPath("$HOME/.gost/")
v.AddConfigPath(".")
}
type LogConfig struct {
Level string
Format string
}
type LoadbalancingConfig struct {
Strategy string
Filters []string
}
type ListenerConfig struct {
Type string
Metadata map[string]string
}
type HandlerConfig struct {
Type string
Metadata map[string]string
}
type DialerConfig struct {
Type string
Metadata map[string]string
}
type ConnectorConfig struct {
Type string
Metadata map[string]string
}
type ServiceConfig struct {
URL string
Addr string
Listener *ListenerConfig
Handler *HandlerConfig
Chain string
}
type ChainConfig struct {
Name string
LB *LoadbalancingConfig
Hops []HopConfig
}
type HopConfig struct {
Name string
LB *LoadbalancingConfig
Nodes []NodeConfig
}
type NodeConfig struct {
Name string
URL string
Addr string
Dialer *DialerConfig
Connector *ConnectorConfig
}
type Config struct {
Log *LogConfig
Services []ServiceConfig
Chains []ChainConfig
}
func (c *Config) Load() error {
if err := v.ReadInConfig(); err != nil {
return err
}
return v.Unmarshal(c)
}
func (c *Config) Read(r io.Reader) error {
if err := v.ReadConfig(r); err != nil {
return err
}
return v.Unmarshal(c)
}
func (c *Config) ReadFile(file string) error {
v.SetConfigFile(file)
if err := v.ReadInConfig(); err != nil {
return err
}
return v.Unmarshal(c)
}

View File

@ -29,7 +29,7 @@ func newLogger(name string) *logger {
// EnableJSONOutput enables JSON formatted output log.
func (l *logger) EnableJSONOutput(enabled bool) {
l.logger.Logger.SetFormatter(&logrus.JSONFormatter{})
}
// SetOutputLevel sets log output level
@ -45,44 +45,44 @@ func (l *logger) WithFields(fields map[string]interface{}) Logger {
}
}
// Info logs a message at level Info.
func (l *logger) Info(args ...interface{}) {
l.logger.Log(logrus.InfoLevel, args...)
}
// Infof logs a message at level Info.
func (l *logger) Infof(format string, args ...interface{}) {
l.logger.Logf(logrus.InfoLevel, format, args...)
}
// Debug logs a message at level Debug.
func (l *logger) Debug(args ...interface{}) {
l.logger.Log(logrus.DebugLevel, args...)
l.logger.Debug(args...)
}
// Debugf logs a message at level Debug.
func (l *logger) Debugf(format string, args ...interface{}) {
l.logger.Logf(logrus.DebugLevel, format, args...)
l.logger.Debugf(format, args...)
}
// Info logs a message at level Info.
func (l *logger) Info(args ...interface{}) {
l.logger.Info(args...)
}
// Infof logs a message at level Info.
func (l *logger) Infof(format string, args ...interface{}) {
l.logger.Infof(format, args...)
}
// Warn logs a message at level Warn.
func (l *logger) Warn(args ...interface{}) {
l.logger.Log(logrus.WarnLevel, args...)
l.logger.Warn(args...)
}
// Warnf logs a message at level Warn.
func (l *logger) Warnf(format string, args ...interface{}) {
l.logger.Logf(logrus.WarnLevel, format, args...)
l.logger.Warnf(format, args...)
}
// Error logs a message at level Error.
func (l *logger) Error(args ...interface{}) {
l.logger.Log(logrus.ErrorLevel, args...)
l.logger.Error(args...)
}
// Errorf logs a message at level Error.
func (l *logger) Errorf(format string, args ...interface{}) {
l.logger.Logf(logrus.ErrorLevel, format, args...)
l.logger.Errorf(format, args...)
}
// Fatal logs a message at level Fatal then the process will exit with status set to 1.

52
pkg/registry/registry.go Normal file
View File

@ -0,0 +1,52 @@
package registry
import (
"github.com/go-gost/gost/pkg/components/connector"
"github.com/go-gost/gost/pkg/components/dialer"
"github.com/go-gost/gost/pkg/components/handler"
"github.com/go-gost/gost/pkg/components/listener"
)
type NewListener func(opts ...listener.Option) listener.Listener
type NewHandler func(opts ...handler.Option) handler.Handler
type NewDialer func(opts ...dialer.Option) dialer.Dialer
type NewConnector func(opts ...connector.Option) connector.Connector
var (
listeners = make(map[string]NewListener)
handlers = make(map[string]NewHandler)
dialers = make(map[string]NewDialer)
connectors = make(map[string]NewConnector)
)
func RegisterListener(name string, newf NewListener) {
listeners[name] = newf
}
func GetListener(name string) NewListener {
return listeners[name]
}
func RegisterHandler(name string, newf NewHandler) {
handlers[name] = newf
}
func GetHandler(name string) NewHandler {
return handlers[name]
}
func RegisterDialer(name string, newf NewDialer) {
dialers[name] = newf
}
func GetDialer(name string) NewDialer {
return dialers[name]
}
func RegiserConnector(name string, newf NewConnector) {
connectors[name] = newf
}
func GetConnector(name string) NewConnector {
return connectors[name]
}