add pkgs from core

This commit is contained in:
ginuerzh
2022-04-04 12:44:35 +08:00
parent 7eb3687e0e
commit a3346ad246
188 changed files with 6084 additions and 283 deletions

View File

@ -13,7 +13,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
"github.com/miekg/dns"
)

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -27,12 +28,12 @@ func (l *dnsListener) parseMetadata(md mdata.Metadata) (err error) {
writeTimeout = "writeTimeout"
)
l.md.mode = mdata.GetString(md, mode)
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
l.md.readTimeout = mdata.GetDuration(md, readTimeout)
l.md.writeTimeout = mdata.GetDuration(md, writeTimeout)
l.md.mode = mdx.GetString(md, mode)
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
l.md.readTimeout = mdx.GetDuration(md, readTimeout)
l.md.writeTimeout = mdx.GetDuration(md, writeTimeout)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
"github.com/xtaci/tcpraw"
)

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -29,21 +30,21 @@ func (l *ftcpListener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.ttl = mdata.GetDuration(md, ttl)
l.md.ttl = mdx.GetDuration(md, ttl)
if l.md.ttl <= 0 {
l.md.ttl = defaultTTL
}
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
if l.md.readBufferSize <= 0 {
l.md.readBufferSize = defaultReadBufferSize
}
l.md.readQueueSize = mdata.GetInt(md, readQueueSize)
l.md.readQueueSize = mdx.GetInt(md, readQueueSize)
if l.md.readQueueSize <= 0 {
l.md.readQueueSize = defaultReadQueueSize
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -8,8 +8,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
pb "github.com/go-gost/x/internal/util/grpc/proto"
"github.com/go-gost/x/registry"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)

View File

@ -2,6 +2,7 @@ package grpc
import (
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -19,11 +20,11 @@ func (l *grpcListener) parseMetadata(md mdata.Metadata) (err error) {
insecure = "grpcInsecure"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.insecure = mdata.GetBool(md, insecure)
l.md.insecure = mdx.GetBool(md, insecure)
return
}

View File

@ -12,7 +12,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
)

View File

@ -2,6 +2,7 @@ package h2
import (
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -19,11 +20,11 @@ func (l *h2Listener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.path = mdata.GetString(md, path)
l.md.path = mdx.GetString(md, path)
return
}

View File

@ -10,7 +10,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
mdx "github.com/go-gost/x/metadata"
"github.com/go-gost/x/registry"
"golang.org/x/net/http2"
)
@ -111,10 +112,10 @@ func (l *http2Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
laddr: l.addr,
raddr: raddr,
closed: make(chan struct{}),
md: md.MapMetadata{
md: mdx.NewMetadata(map[string]any{
"r": r,
"w": w,
},
}),
}
select {
case l.cqueue <- conn:

View File

@ -2,6 +2,7 @@ package http2
import (
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -17,7 +18,7 @@ func (l *http2Listener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -7,8 +7,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
pht_util "github.com/go-gost/x/internal/util/pht"
"github.com/go-gost/x/registry"
"github.com/lucas-clemente/quic-go"
)

View File

@ -4,6 +4,7 @@ import (
"strings"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -29,20 +30,20 @@ func (l *http3Listener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.authorizePath = mdata.GetString(md, authorizePath)
l.md.authorizePath = mdx.GetString(md, authorizePath)
if !strings.HasPrefix(l.md.authorizePath, "/") {
l.md.authorizePath = defaultAuthorizePath
}
l.md.pushPath = mdata.GetString(md, pushPath)
l.md.pushPath = mdx.GetString(md, pushPath)
if !strings.HasPrefix(l.md.pushPath, "/") {
l.md.pushPath = defaultPushPath
}
l.md.pullPath = mdata.GetString(md, pullPath)
l.md.pullPath = mdx.GetString(md, pullPath)
if !strings.HasPrefix(l.md.pullPath, "/") {
l.md.pullPath = defaultPullPath
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -9,8 +9,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
icmp_pkg "github.com/go-gost/x/internal/util/icmp"
"github.com/go-gost/x/registry"
"github.com/lucas-clemente/quic-go"
"golang.org/x/net/icmp"
)

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -28,14 +29,14 @@ func (l *icmpListener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.keepAlive = mdata.GetBool(md, keepAlive)
l.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
l.md.maxIdleTimeout = mdata.GetDuration(md, maxIdleTimeout)
l.md.keepAlive = mdx.GetBool(md, keepAlive)
l.md.handshakeTimeout = mdx.GetDuration(md, handshakeTimeout)
l.md.maxIdleTimeout = mdx.GetDuration(md, maxIdleTimeout)
return
}

View File

@ -9,8 +9,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
kcp_util "github.com/go-gost/x/internal/util/kcp"
"github.com/go-gost/x/registry"
"github.com/xtaci/kcp-go/v5"
"github.com/xtaci/smux"
"github.com/xtaci/tcpraw"

View File

@ -5,6 +5,7 @@ import (
mdata "github.com/go-gost/core/metadata"
kcp_util "github.com/go-gost/x/internal/util/kcp"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -22,7 +23,7 @@ func (l *kcpListener) parseMetadata(md mdata.Metadata) (err error) {
config = "config"
)
if m := mdata.GetStringMap(md, config); len(m) > 0 {
if m := mdx.GetStringMap(md, config); len(m) > 0 {
b, err := json.Marshal(m)
if err != nil {
return err
@ -38,7 +39,7 @@ func (l *kcpListener) parseMetadata(md mdata.Metadata) (err error) {
l.md.config = kcp_util.DefaultConfig
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -9,7 +9,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
"github.com/xtaci/smux"
)

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -33,17 +34,17 @@ func (l *mtlsListener) parseMetadata(md mdata.Metadata) (err error) {
muxMaxStreamBuffer = "muxMaxStreamBuffer"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.muxKeepAliveDisabled = mdata.GetBool(md, muxKeepAliveDisabled)
l.md.muxKeepAliveInterval = mdata.GetDuration(md, muxKeepAliveInterval)
l.md.muxKeepAliveTimeout = mdata.GetDuration(md, muxKeepAliveTimeout)
l.md.muxMaxFrameSize = mdata.GetInt(md, muxMaxFrameSize)
l.md.muxMaxReceiveBuffer = mdata.GetInt(md, muxMaxReceiveBuffer)
l.md.muxMaxStreamBuffer = mdata.GetInt(md, muxMaxStreamBuffer)
l.md.muxKeepAliveDisabled = mdx.GetBool(md, muxKeepAliveDisabled)
l.md.muxKeepAliveInterval = mdx.GetDuration(md, muxKeepAliveInterval)
l.md.muxKeepAliveTimeout = mdx.GetDuration(md, muxKeepAliveTimeout)
l.md.muxMaxFrameSize = mdx.GetInt(md, muxMaxFrameSize)
l.md.muxMaxReceiveBuffer = mdx.GetInt(md, muxMaxReceiveBuffer)
l.md.muxMaxStreamBuffer = mdx.GetInt(md, muxMaxStreamBuffer)
return
}

View File

@ -11,8 +11,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
ws_util "github.com/go-gost/x/internal/util/ws"
"github.com/go-gost/x/registry"
"github.com/gorilla/websocket"
"github.com/xtaci/smux"
)

View File

@ -5,6 +5,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -51,30 +52,30 @@ func (l *mwsListener) parseMetadata(md mdata.Metadata) (err error) {
muxMaxStreamBuffer = "muxMaxStreamBuffer"
)
l.md.path = mdata.GetString(md, path)
l.md.path = mdx.GetString(md, path)
if l.md.path == "" {
l.md.path = defaultPath
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
l.md.readHeaderTimeout = mdata.GetDuration(md, readHeaderTimeout)
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
l.md.writeBufferSize = mdata.GetInt(md, writeBufferSize)
l.md.enableCompression = mdata.GetBool(md, enableCompression)
l.md.handshakeTimeout = mdx.GetDuration(md, handshakeTimeout)
l.md.readHeaderTimeout = mdx.GetDuration(md, readHeaderTimeout)
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
l.md.writeBufferSize = mdx.GetInt(md, writeBufferSize)
l.md.enableCompression = mdx.GetBool(md, enableCompression)
l.md.muxKeepAliveDisabled = mdata.GetBool(md, muxKeepAliveDisabled)
l.md.muxKeepAliveInterval = mdata.GetDuration(md, muxKeepAliveInterval)
l.md.muxKeepAliveTimeout = mdata.GetDuration(md, muxKeepAliveTimeout)
l.md.muxMaxFrameSize = mdata.GetInt(md, muxMaxFrameSize)
l.md.muxMaxReceiveBuffer = mdata.GetInt(md, muxMaxReceiveBuffer)
l.md.muxMaxStreamBuffer = mdata.GetInt(md, muxMaxStreamBuffer)
l.md.muxKeepAliveDisabled = mdx.GetBool(md, muxKeepAliveDisabled)
l.md.muxKeepAliveInterval = mdx.GetDuration(md, muxKeepAliveInterval)
l.md.muxKeepAliveTimeout = mdx.GetDuration(md, muxKeepAliveTimeout)
l.md.muxMaxFrameSize = mdx.GetInt(md, muxMaxFrameSize)
l.md.muxMaxReceiveBuffer = mdx.GetInt(md, muxMaxReceiveBuffer)
l.md.muxMaxStreamBuffer = mdx.GetInt(md, muxMaxStreamBuffer)
if mm := mdata.GetStringMapString(md, header); len(mm) > 0 {
if mm := mdx.GetStringMapString(md, header); len(mm) > 0 {
hd := http.Header{}
for k, v := range mm {
hd.Add(k, v)

View File

@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
)
func init() {

View File

@ -4,6 +4,7 @@ import (
"net/http"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
type metadata struct {
@ -15,7 +16,7 @@ func (l *obfsListener) parseMetadata(md mdata.Metadata) (err error) {
header = "header"
)
if mm := mdata.GetStringMapString(md, header); len(mm) > 0 {
if mm := mdx.GetStringMapString(md, header); len(mm) > 0 {
hd := http.Header{}
for k, v := range mm {
hd.Add(k, v)

View File

@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
)
func init() {

View File

@ -9,8 +9,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
pht_util "github.com/go-gost/x/internal/util/pht"
"github.com/go-gost/x/registry"
)
func init() {

View File

@ -4,6 +4,7 @@ import (
"strings"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -29,20 +30,20 @@ func (l *phtListener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
l.md.authorizePath = mdata.GetString(md, authorizePath)
l.md.authorizePath = mdx.GetString(md, authorizePath)
if !strings.HasPrefix(l.md.authorizePath, "/") {
l.md.authorizePath = defaultAuthorizePath
}
l.md.pushPath = mdata.GetString(md, pushPath)
l.md.pushPath = mdx.GetString(md, pushPath)
if !strings.HasPrefix(l.md.pushPath, "/") {
l.md.pushPath = defaultPushPath
}
l.md.pullPath = mdata.GetString(md, pullPath)
l.md.pullPath = mdx.GetString(md, pullPath)
if !strings.HasPrefix(l.md.pullPath, "/") {
l.md.pullPath = defaultPullPath
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -8,8 +8,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
quic_util "github.com/go-gost/x/internal/util/quic"
"github.com/go-gost/x/registry"
"github.com/lucas-clemente/quic-go"
)

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -29,18 +30,18 @@ func (l *quicListener) parseMetadata(md mdata.Metadata) (err error) {
cipherKey = "cipherKey"
)
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
if key := mdata.GetString(md, cipherKey); key != "" {
if key := mdx.GetString(md, cipherKey); key != "" {
l.md.cipherKey = []byte(key)
}
l.md.keepAlive = mdata.GetBool(md, keepAlive)
l.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
l.md.maxIdleTimeout = mdata.GetDuration(md, maxIdleTimeout)
l.md.keepAlive = mdx.GetBool(md, keepAlive)
l.md.handshakeTimeout = mdx.GetDuration(md, handshakeTimeout)
l.md.maxIdleTimeout = mdx.GetDuration(md, maxIdleTimeout)
return
}

View File

@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
)
func init() {

View File

@ -2,6 +2,7 @@ package tcp
import (
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
type metadata struct {
@ -12,6 +13,6 @@ func (l *redirectListener) parseMetadata(md mdata.Metadata) (err error) {
const (
tproxy = "tproxy"
)
l.md.tproxy = mdata.GetBool(md, tproxy)
l.md.tproxy = mdx.GetBool(md, tproxy)
return
}

View File

@ -7,7 +7,7 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
"github.com/go-gost/x/registry"
)
func init() {

View File

@ -4,6 +4,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -22,12 +23,12 @@ func (l *redirectListener) parseMetadata(md mdata.Metadata) (err error) {
readBufferSize = "readBufferSize"
)
l.md.ttl = mdata.GetDuration(md, ttl)
l.md.ttl = mdx.GetDuration(md, ttl)
if l.md.ttl <= 0 {
l.md.ttl = defaultTTL
}
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
if l.md.readBufferSize <= 0 {
l.md.readBufferSize = defaultReadBufferSize
}

102
listener/rtcp/listener.go Normal file
View File

@ -0,0 +1,102 @@
package rtcp
import (
"context"
"net"
"github.com/go-gost/core/chain"
"github.com/go-gost/core/connector"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/x/registry"
)
func init() {
registry.ListenerRegistry().Register("rtcp", NewListener)
}
type rtcpListener struct {
laddr net.Addr
ln net.Listener
md metadata
router *chain.Router
logger logger.Logger
closed chan struct{}
options listener.Options
}
func NewListener(opts ...listener.Option) listener.Listener {
options := listener.Options{}
for _, opt := range opts {
opt(&options)
}
return &rtcpListener{
closed: make(chan struct{}),
logger: options.Logger,
options: options,
}
}
func (l *rtcpListener) Init(md md.Metadata) (err error) {
if err = l.parseMetadata(md); err != nil {
return
}
laddr, err := net.ResolveTCPAddr("tcp", l.options.Addr)
if err != nil {
return
}
l.laddr = laddr
l.router = (&chain.Router{}).
WithChain(l.options.Chain).
WithLogger(l.logger)
return
}
func (l *rtcpListener) Accept() (conn net.Conn, err error) {
select {
case <-l.closed:
return nil, net.ErrClosed
default:
}
if l.ln == nil {
l.ln, err = l.router.Bind(
context.Background(), "tcp", l.laddr.String(),
connector.MuxBindOption(true),
)
if err != nil {
return nil, listener.NewAcceptError(err)
}
l.ln = metrics.WrapListener(l.options.Service, l.ln)
}
conn, err = l.ln.Accept()
if err != nil {
l.ln.Close()
l.ln = nil
return nil, listener.NewAcceptError(err)
}
return
}
func (l *rtcpListener) Addr() net.Addr {
return l.laddr
}
func (l *rtcpListener) Close() error {
select {
case <-l.closed:
default:
close(l.closed)
if l.ln != nil {
l.ln.Close()
l.ln = nil
}
}
return nil
}

11
listener/rtcp/metadata.go Normal file
View File

@ -0,0 +1,11 @@
package rtcp
import (
mdata "github.com/go-gost/core/metadata"
)
type metadata struct{}
func (l *rtcpListener) parseMetadata(md mdata.Metadata) (err error) {
return
}

109
listener/rudp/listener.go Normal file
View File

@ -0,0 +1,109 @@
package rudp
import (
"context"
"net"
"github.com/go-gost/core/chain"
"github.com/go-gost/core/connector"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/x/registry"
)
func init() {
registry.ListenerRegistry().Register("rudp", NewListener)
}
type rudpListener struct {
laddr net.Addr
ln net.Listener
router *chain.Router
closed chan struct{}
logger logger.Logger
md metadata
options listener.Options
}
func NewListener(opts ...listener.Option) listener.Listener {
options := listener.Options{}
for _, opt := range opts {
opt(&options)
}
return &rudpListener{
closed: make(chan struct{}),
logger: options.Logger,
options: options,
}
}
func (l *rudpListener) Init(md md.Metadata) (err error) {
if err = l.parseMetadata(md); err != nil {
return
}
laddr, err := net.ResolveUDPAddr("udp", l.options.Addr)
if err != nil {
return
}
l.laddr = laddr
l.router = (&chain.Router{}).
WithChain(l.options.Chain).
WithLogger(l.logger)
return
}
func (l *rudpListener) Accept() (conn net.Conn, err error) {
select {
case <-l.closed:
return nil, net.ErrClosed
default:
}
if l.ln == nil {
l.ln, err = l.router.Bind(
context.Background(), "udp", l.laddr.String(),
connector.BacklogBindOption(l.md.backlog),
connector.UDPConnTTLBindOption(l.md.ttl),
connector.UDPDataBufferSizeBindOption(l.md.readBufferSize),
connector.UDPDataQueueSizeBindOption(l.md.readQueueSize),
)
if err != nil {
return nil, listener.NewAcceptError(err)
}
}
conn, err = l.ln.Accept()
if err != nil {
l.ln.Close()
l.ln = nil
return nil, listener.NewAcceptError(err)
}
if pc, ok := conn.(net.PacketConn); ok {
conn = metrics.WrapUDPConn(l.options.Service, pc)
}
return
}
func (l *rudpListener) Addr() net.Addr {
return l.laddr
}
func (l *rudpListener) Close() error {
select {
case <-l.closed:
default:
close(l.closed)
if l.ln != nil {
l.ln.Close()
l.ln = nil
}
}
return nil
}

52
listener/rudp/metadata.go Normal file
View File

@ -0,0 +1,52 @@
package rudp
import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
defaultTTL = 5 * time.Second
defaultReadBufferSize = 1500
defaultReadQueueSize = 128
defaultBacklog = 128
)
type metadata struct {
ttl time.Duration
readBufferSize int
readQueueSize int
backlog int
}
func (l *rudpListener) parseMetadata(md mdata.Metadata) (err error) {
const (
ttl = "ttl"
readBufferSize = "readBufferSize"
readQueueSize = "readQueueSize"
backlog = "backlog"
)
l.md.ttl = mdx.GetDuration(md, ttl)
if l.md.ttl <= 0 {
l.md.ttl = defaultTTL
}
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
if l.md.readBufferSize <= 0 {
l.md.readBufferSize = defaultReadBufferSize
}
l.md.readQueueSize = mdx.GetInt(md, readQueueSize)
if l.md.readQueueSize <= 0 {
l.md.readQueueSize = defaultReadQueueSize
}
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
return
}

View File

@ -10,8 +10,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
ssh_util "github.com/go-gost/x/internal/util/ssh"
"github.com/go-gost/x/registry"
"golang.org/x/crypto/ssh"
)

View File

@ -3,9 +3,9 @@ package ssh
import (
"io/ioutil"
tls_util "github.com/go-gost/core/common/util/tls"
mdata "github.com/go-gost/core/metadata"
ssh_util "github.com/go-gost/x/internal/util/ssh"
mdx "github.com/go-gost/x/metadata"
"golang.org/x/crypto/ssh"
)
@ -27,13 +27,13 @@ func (l *sshListener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
if key := mdata.GetString(md, privateKeyFile); key != "" {
if key := mdx.GetString(md, privateKeyFile); key != "" {
data, err := ioutil.ReadFile(key)
if err != nil {
return err
}
pp := mdata.GetString(md, passphrase)
pp := mdx.GetString(md, passphrase)
if pp == "" {
l.md.signer, err = ssh.ParsePrivateKey(data)
} else {
@ -44,14 +44,14 @@ func (l *sshListener) parseMetadata(md mdata.Metadata) (err error) {
}
}
if l.md.signer == nil {
signer, err := ssh.NewSignerFromKey(tls_util.DefaultConfig.Clone().Certificates[0].PrivateKey)
signer, err := ssh.NewSignerFromKey(l.options.TLSConfig.Certificates[0].PrivateKey)
if err != nil {
return err
}
l.md.signer = signer
}
if name := mdata.GetString(md, authorizedKeys); name != "" {
if name := mdx.GetString(md, authorizedKeys); name != "" {
m, err := ssh_util.ParseAuthorizedKeysFile(name)
if err != nil {
return err
@ -59,7 +59,7 @@ func (l *sshListener) parseMetadata(md mdata.Metadata) (err error) {
l.md.authorizedKeys = m
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -12,9 +12,9 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
ssh_util "github.com/go-gost/x/internal/util/ssh"
sshd_util "github.com/go-gost/x/internal/util/sshd"
"github.com/go-gost/x/registry"
"golang.org/x/crypto/ssh"
)

View File

@ -3,9 +3,9 @@ package ssh
import (
"io/ioutil"
tls_util "github.com/go-gost/core/common/util/tls"
mdata "github.com/go-gost/core/metadata"
ssh_util "github.com/go-gost/x/internal/util/ssh"
mdx "github.com/go-gost/x/metadata"
"golang.org/x/crypto/ssh"
)
@ -27,13 +27,13 @@ func (l *sshdListener) parseMetadata(md mdata.Metadata) (err error) {
backlog = "backlog"
)
if key := mdata.GetString(md, privateKeyFile); key != "" {
if key := mdx.GetString(md, privateKeyFile); key != "" {
data, err := ioutil.ReadFile(key)
if err != nil {
return err
}
pp := mdata.GetString(md, passphrase)
pp := mdx.GetString(md, passphrase)
if pp == "" {
l.md.signer, err = ssh.ParsePrivateKey(data)
} else {
@ -44,14 +44,14 @@ func (l *sshdListener) parseMetadata(md mdata.Metadata) (err error) {
}
}
if l.md.signer == nil {
signer, err := ssh.NewSignerFromKey(tls_util.DefaultConfig.Clone().Certificates[0].PrivateKey)
signer, err := ssh.NewSignerFromKey(l.options.TLSConfig.Certificates[0].PrivateKey)
if err != nil {
return err
}
l.md.signer = signer
}
if name := mdata.GetString(md, authorizedKeys); name != "" {
if name := mdx.GetString(md, authorizedKeys); name != "" {
m, err := ssh_util.ParseAuthorizedKeysFile(name)
if err != nil {
return err
@ -59,7 +59,7 @@ func (l *sshdListener) parseMetadata(md mdata.Metadata) (err error) {
l.md.authorizedKeys = m
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}

View File

@ -7,7 +7,8 @@ import (
"github.com/go-gost/core/logger"
mdata "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
mdx "github.com/go-gost/x/metadata"
"github.com/go-gost/x/registry"
)
func init() {
@ -73,9 +74,9 @@ func (l *tapListener) Init(md mdata.Metadata) (err error) {
raddr: &net.IPAddr{IP: ip},
}
c = metrics.WrapConn(l.options.Service, c)
c = withMetadata(mdata.MapMetadata{
c = withMetadata(mdx.NewMetadata(map[string]any{
"config": l.md.config,
}, c)
}), c)
l.cqueue <- c

View File

@ -3,6 +3,7 @@ package tap
import (
mdata "github.com/go-gost/core/metadata"
tap_util "github.com/go-gost/x/internal/util/tap"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -23,16 +24,16 @@ func (l *tapListener) parseMetadata(md mdata.Metadata) (err error) {
)
config := &tap_util.Config{
Name: mdata.GetString(md, name),
Net: mdata.GetString(md, netKey),
MTU: mdata.GetInt(md, mtu),
Gateway: mdata.GetString(md, gateway),
Name: mdx.GetString(md, name),
Net: mdx.GetString(md, netKey),
MTU: mdx.GetInt(md, mtu),
Gateway: mdx.GetString(md, gateway),
}
if config.MTU <= 0 {
config.MTU = DefaultMTU
}
for _, s := range mdata.GetStrings(md, routes) {
for _, s := range mdx.GetStrings(md, routes) {
if s != "" {
config.Routes = append(config.Routes, s)
}

60
listener/tcp/listener.go Normal file
View File

@ -0,0 +1,60 @@
package tcp
import (
"net"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/x/registry"
)
func init() {
registry.ListenerRegistry().Register("tcp", NewListener)
}
type tcpListener struct {
ln net.Listener
logger logger.Logger
md metadata
options listener.Options
}
func NewListener(opts ...listener.Option) listener.Listener {
options := listener.Options{}
for _, opt := range opts {
opt(&options)
}
return &tcpListener{
logger: options.Logger,
options: options,
}
}
func (l *tcpListener) Init(md md.Metadata) (err error) {
if err = l.parseMetadata(md); err != nil {
return
}
ln, err := net.Listen("tcp", l.options.Addr)
if err != nil {
return
}
l.ln = metrics.WrapListener(l.options.Service, ln)
return
}
func (l *tcpListener) Accept() (conn net.Conn, err error) {
return l.ln.Accept()
}
func (l *tcpListener) Addr() net.Addr {
return l.ln.Addr()
}
func (l *tcpListener) Close() error {
return l.ln.Close()
}

12
listener/tcp/metadata.go Normal file
View File

@ -0,0 +1,12 @@
package tcp
import (
md "github.com/go-gost/core/metadata"
)
type metadata struct {
}
func (l *tcpListener) parseMetadata(md md.Metadata) (err error) {
return
}

64
listener/tls/listener.go Normal file
View File

@ -0,0 +1,64 @@
package tls
import (
"crypto/tls"
"net"
admission "github.com/go-gost/core/admission/wrapper"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/x/registry"
)
func init() {
registry.ListenerRegistry().Register("tls", NewListener)
}
type tlsListener struct {
ln net.Listener
logger logger.Logger
md metadata
options listener.Options
}
func NewListener(opts ...listener.Option) listener.Listener {
options := listener.Options{}
for _, opt := range opts {
opt(&options)
}
return &tlsListener{
logger: options.Logger,
options: options,
}
}
func (l *tlsListener) Init(md md.Metadata) (err error) {
if err = l.parseMetadata(md); err != nil {
return
}
ln, err := net.Listen("tcp", l.options.Addr)
if err != nil {
return
}
ln = metrics.WrapListener(l.options.Service, ln)
ln = admission.WrapListener(l.options.Admission, ln)
l.ln = tls.NewListener(ln, l.options.TLSConfig)
return
}
func (l *tlsListener) Accept() (conn net.Conn, err error) {
return l.ln.Accept()
}
func (l *tlsListener) Addr() net.Addr {
return l.ln.Addr()
}
func (l *tlsListener) Close() error {
return l.ln.Close()
}

12
listener/tls/metadata.go Normal file
View File

@ -0,0 +1,12 @@
package tls
import (
mdata "github.com/go-gost/core/metadata"
)
type metadata struct {
}
func (l *tlsListener) parseMetadata(md mdata.Metadata) (err error) {
return
}

View File

@ -7,7 +7,8 @@ import (
"github.com/go-gost/core/logger"
mdata "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
mdx "github.com/go-gost/x/metadata"
"github.com/go-gost/x/registry"
)
func init() {
@ -71,9 +72,9 @@ func (l *tunListener) Init(md mdata.Metadata) (err error) {
raddr: &net.IPAddr{IP: ip},
}
c = metrics.WrapConn(l.options.Service, c)
c = withMetadata(mdata.MapMetadata{
c = withMetadata(mdx.NewMetadata(map[string]any{
"config": l.md.config,
}, c)
}), c)
l.cqueue <- c

View File

@ -6,6 +6,7 @@ import (
mdata "github.com/go-gost/core/metadata"
tun_util "github.com/go-gost/x/internal/util/tun"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -27,11 +28,11 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
)
config := &tun_util.Config{
Name: mdata.GetString(md, name),
Net: mdata.GetString(md, netKey),
Peer: mdata.GetString(md, peer),
MTU: mdata.GetInt(md, mtu),
Gateway: mdata.GetString(md, gateway),
Name: mdx.GetString(md, name),
Net: mdx.GetString(md, netKey),
Peer: mdx.GetString(md, peer),
MTU: mdx.GetInt(md, mtu),
Gateway: mdx.GetString(md, gateway),
}
if config.MTU <= 0 {
config.MTU = DefaultMTU
@ -39,7 +40,7 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
gw := net.ParseIP(config.Gateway)
for _, s := range mdata.GetStrings(md, routes) {
for _, s := range mdx.GetStrings(md, routes) {
ss := strings.SplitN(s, " ", 2)
if len(ss) == 2 {
var route tun_util.Route

74
listener/udp/listener.go Normal file
View File

@ -0,0 +1,74 @@
package udp
import (
"net"
"github.com/go-gost/core/common/net/udp"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/x/registry"
)
func init() {
registry.ListenerRegistry().Register("udp", NewListener)
}
type udpListener struct {
ln net.Listener
logger logger.Logger
md metadata
options listener.Options
}
func NewListener(opts ...listener.Option) listener.Listener {
options := listener.Options{}
for _, opt := range opts {
opt(&options)
}
return &udpListener{
logger: options.Logger,
options: options,
}
}
func (l *udpListener) Init(md md.Metadata) (err error) {
if err = l.parseMetadata(md); err != nil {
return
}
laddr, err := net.ResolveUDPAddr("udp", l.options.Addr)
if err != nil {
return
}
var conn net.PacketConn
conn, err = net.ListenUDP("udp", laddr)
if err != nil {
return
}
conn = metrics.WrapPacketConn(l.options.Service, conn)
l.ln = udp.NewListener(conn, &udp.ListenConfig{
Backlog: l.md.backlog,
ReadQueueSize: l.md.readQueueSize,
ReadBufferSize: l.md.readBufferSize,
KeepAlive: l.md.keepalive,
TTL: l.md.ttl,
Logger: l.logger,
})
return
}
func (l *udpListener) Accept() (conn net.Conn, err error) {
return l.ln.Accept()
}
func (l *udpListener) Addr() net.Addr {
return l.ln.Addr()
}
func (l *udpListener) Close() error {
return l.ln.Close()
}

55
listener/udp/metadata.go Normal file
View File

@ -0,0 +1,55 @@
package udp
import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
defaultTTL = 5 * time.Second
defaultReadBufferSize = 1500
defaultReadQueueSize = 128
defaultBacklog = 128
)
type metadata struct {
readBufferSize int
readQueueSize int
backlog int
keepalive bool
ttl time.Duration
}
func (l *udpListener) parseMetadata(md mdata.Metadata) (err error) {
const (
readBufferSize = "readBufferSize"
readQueueSize = "readQueueSize"
backlog = "backlog"
keepAlive = "keepAlive"
ttl = "ttl"
)
l.md.ttl = mdx.GetDuration(md, ttl)
if l.md.ttl <= 0 {
l.md.ttl = defaultTTL
}
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
if l.md.readBufferSize <= 0 {
l.md.readBufferSize = defaultReadBufferSize
}
l.md.readQueueSize = mdx.GetInt(md, readQueueSize)
if l.md.readQueueSize <= 0 {
l.md.readQueueSize = defaultReadQueueSize
}
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.keepalive = mdx.GetBool(md, keepAlive)
return
}

View File

@ -11,8 +11,8 @@ import (
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
metrics "github.com/go-gost/core/metrics/wrapper"
"github.com/go-gost/core/registry"
ws_util "github.com/go-gost/x/internal/util/ws"
"github.com/go-gost/x/registry"
"github.com/gorilla/websocket"
)

View File

@ -5,6 +5,7 @@ import (
"time"
mdata "github.com/go-gost/core/metadata"
mdx "github.com/go-gost/x/metadata"
)
const (
@ -39,23 +40,23 @@ func (l *wsListener) parseMetadata(md mdata.Metadata) (err error) {
header = "header"
)
l.md.path = mdata.GetString(md, path)
l.md.path = mdx.GetString(md, path)
if l.md.path == "" {
l.md.path = defaultPath
}
l.md.backlog = mdata.GetInt(md, backlog)
l.md.backlog = mdx.GetInt(md, backlog)
if l.md.backlog <= 0 {
l.md.backlog = defaultBacklog
}
l.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
l.md.readHeaderTimeout = mdata.GetDuration(md, readHeaderTimeout)
l.md.readBufferSize = mdata.GetInt(md, readBufferSize)
l.md.writeBufferSize = mdata.GetInt(md, writeBufferSize)
l.md.enableCompression = mdata.GetBool(md, enableCompression)
l.md.handshakeTimeout = mdx.GetDuration(md, handshakeTimeout)
l.md.readHeaderTimeout = mdx.GetDuration(md, readHeaderTimeout)
l.md.readBufferSize = mdx.GetInt(md, readBufferSize)
l.md.writeBufferSize = mdx.GetInt(md, writeBufferSize)
l.md.enableCompression = mdx.GetBool(md, enableCompression)
if mm := mdata.GetStringMapString(md, header); len(mm) > 0 {
if mm := mdx.GetStringMapString(md, header); len(mm) > 0 {
hd := http.Header{}
for k, v := range mm {
hd.Add(k, v)