|
@@ -23,7 +23,6 @@ import (
|
|
"time"
|
|
"time"
|
|
|
|
|
|
"github.com/fatedier/frp/client/proxy"
|
|
"github.com/fatedier/frp/client/proxy"
|
|
- "github.com/fatedier/frp/g"
|
|
|
|
"github.com/fatedier/frp/models/config"
|
|
"github.com/fatedier/frp/models/config"
|
|
"github.com/fatedier/frp/models/msg"
|
|
"github.com/fatedier/frp/models/msg"
|
|
"github.com/fatedier/frp/utils/log"
|
|
"github.com/fatedier/frp/utils/log"
|
|
@@ -65,16 +64,24 @@ type Control struct {
|
|
// last time got the Pong message
|
|
// last time got the Pong message
|
|
lastPong time.Time
|
|
lastPong time.Time
|
|
|
|
|
|
|
|
+ // The client configuration
|
|
|
|
+ clientCfg config.ClientCommonConf
|
|
|
|
+
|
|
readerShutdown *shutdown.Shutdown
|
|
readerShutdown *shutdown.Shutdown
|
|
writerShutdown *shutdown.Shutdown
|
|
writerShutdown *shutdown.Shutdown
|
|
msgHandlerShutdown *shutdown.Shutdown
|
|
msgHandlerShutdown *shutdown.Shutdown
|
|
|
|
|
|
|
|
+ // The UDP port that the server is listening on
|
|
|
|
+ serverUDPPort int
|
|
|
|
+
|
|
mu sync.RWMutex
|
|
mu sync.RWMutex
|
|
|
|
|
|
log.Logger
|
|
log.Logger
|
|
}
|
|
}
|
|
|
|
|
|
-func NewControl(runId string, conn frpNet.Conn, session *fmux.Session, pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.VisitorConf) *Control {
|
|
|
|
|
|
+func NewControl(runId string, conn frpNet.Conn, session *fmux.Session, clientCfg config.ClientCommonConf,
|
|
|
|
+ pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.VisitorConf, serverUDPPort int) *Control {
|
|
|
|
+
|
|
ctl := &Control{
|
|
ctl := &Control{
|
|
runId: runId,
|
|
runId: runId,
|
|
conn: conn,
|
|
conn: conn,
|
|
@@ -84,12 +91,14 @@ func NewControl(runId string, conn frpNet.Conn, session *fmux.Session, pxyCfgs m
|
|
readCh: make(chan msg.Message, 100),
|
|
readCh: make(chan msg.Message, 100),
|
|
closedCh: make(chan struct{}),
|
|
closedCh: make(chan struct{}),
|
|
closedDoneCh: make(chan struct{}),
|
|
closedDoneCh: make(chan struct{}),
|
|
|
|
+ clientCfg: clientCfg,
|
|
readerShutdown: shutdown.New(),
|
|
readerShutdown: shutdown.New(),
|
|
writerShutdown: shutdown.New(),
|
|
writerShutdown: shutdown.New(),
|
|
msgHandlerShutdown: shutdown.New(),
|
|
msgHandlerShutdown: shutdown.New(),
|
|
|
|
+ serverUDPPort: serverUDPPort,
|
|
Logger: log.NewPrefixLogger(""),
|
|
Logger: log.NewPrefixLogger(""),
|
|
}
|
|
}
|
|
- ctl.pm = proxy.NewProxyManager(ctl.sendCh, runId)
|
|
|
|
|
|
+ ctl.pm = proxy.NewProxyManager(ctl.sendCh, runId, clientCfg, serverUDPPort)
|
|
|
|
|
|
ctl.vm = NewVisitorManager(ctl)
|
|
ctl.vm = NewVisitorManager(ctl)
|
|
ctl.vm.Reload(visitorCfgs)
|
|
ctl.vm.Reload(visitorCfgs)
|
|
@@ -161,7 +170,7 @@ func (ctl *Control) ClosedDoneCh() <-chan struct{} {
|
|
|
|
|
|
// connectServer return a new connection to frps
|
|
// connectServer return a new connection to frps
|
|
func (ctl *Control) connectServer() (conn frpNet.Conn, err error) {
|
|
func (ctl *Control) connectServer() (conn frpNet.Conn, err error) {
|
|
- if g.GlbClientCfg.TcpMux {
|
|
|
|
|
|
+ if ctl.clientCfg.TcpMux {
|
|
stream, errRet := ctl.session.OpenStream()
|
|
stream, errRet := ctl.session.OpenStream()
|
|
if errRet != nil {
|
|
if errRet != nil {
|
|
err = errRet
|
|
err = errRet
|
|
@@ -171,13 +180,13 @@ func (ctl *Control) connectServer() (conn frpNet.Conn, err error) {
|
|
conn = frpNet.WrapConn(stream)
|
|
conn = frpNet.WrapConn(stream)
|
|
} else {
|
|
} else {
|
|
var tlsConfig *tls.Config
|
|
var tlsConfig *tls.Config
|
|
- if g.GlbClientCfg.TLSEnable {
|
|
|
|
|
|
+ if ctl.clientCfg.TLSEnable {
|
|
tlsConfig = &tls.Config{
|
|
tlsConfig = &tls.Config{
|
|
InsecureSkipVerify: true,
|
|
InsecureSkipVerify: true,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- conn, err = frpNet.ConnectServerByProxyWithTLS(g.GlbClientCfg.HttpProxy, g.GlbClientCfg.Protocol,
|
|
|
|
- fmt.Sprintf("%s:%d", g.GlbClientCfg.ServerAddr, g.GlbClientCfg.ServerPort), tlsConfig)
|
|
|
|
|
|
+ conn, err = frpNet.ConnectServerByProxyWithTLS(ctl.clientCfg.HttpProxy, ctl.clientCfg.Protocol,
|
|
|
|
+ fmt.Sprintf("%s:%d", ctl.clientCfg.ServerAddr, ctl.clientCfg.ServerPort), tlsConfig)
|
|
if err != nil {
|
|
if err != nil {
|
|
ctl.Warn("start new connection to server error: %v", err)
|
|
ctl.Warn("start new connection to server error: %v", err)
|
|
return
|
|
return
|
|
@@ -197,7 +206,7 @@ func (ctl *Control) reader() {
|
|
defer ctl.readerShutdown.Done()
|
|
defer ctl.readerShutdown.Done()
|
|
defer close(ctl.closedCh)
|
|
defer close(ctl.closedCh)
|
|
|
|
|
|
- encReader := crypto.NewReader(ctl.conn, []byte(g.GlbClientCfg.Token))
|
|
|
|
|
|
+ encReader := crypto.NewReader(ctl.conn, []byte(ctl.clientCfg.Token))
|
|
for {
|
|
for {
|
|
if m, err := msg.ReadMsg(encReader); err != nil {
|
|
if m, err := msg.ReadMsg(encReader); err != nil {
|
|
if err == io.EOF {
|
|
if err == io.EOF {
|
|
@@ -217,7 +226,7 @@ func (ctl *Control) reader() {
|
|
// writer writes messages got from sendCh to frps
|
|
// writer writes messages got from sendCh to frps
|
|
func (ctl *Control) writer() {
|
|
func (ctl *Control) writer() {
|
|
defer ctl.writerShutdown.Done()
|
|
defer ctl.writerShutdown.Done()
|
|
- encWriter, err := crypto.NewWriter(ctl.conn, []byte(g.GlbClientCfg.Token))
|
|
|
|
|
|
+ encWriter, err := crypto.NewWriter(ctl.conn, []byte(ctl.clientCfg.Token))
|
|
if err != nil {
|
|
if err != nil {
|
|
ctl.conn.Error("crypto new writer error: %v", err)
|
|
ctl.conn.Error("crypto new writer error: %v", err)
|
|
ctl.conn.Close()
|
|
ctl.conn.Close()
|
|
@@ -246,7 +255,7 @@ func (ctl *Control) msgHandler() {
|
|
}()
|
|
}()
|
|
defer ctl.msgHandlerShutdown.Done()
|
|
defer ctl.msgHandlerShutdown.Done()
|
|
|
|
|
|
- hbSend := time.NewTicker(time.Duration(g.GlbClientCfg.HeartBeatInterval) * time.Second)
|
|
|
|
|
|
+ hbSend := time.NewTicker(time.Duration(ctl.clientCfg.HeartBeatInterval) * time.Second)
|
|
defer hbSend.Stop()
|
|
defer hbSend.Stop()
|
|
hbCheck := time.NewTicker(time.Second)
|
|
hbCheck := time.NewTicker(time.Second)
|
|
defer hbCheck.Stop()
|
|
defer hbCheck.Stop()
|
|
@@ -260,7 +269,7 @@ func (ctl *Control) msgHandler() {
|
|
ctl.Debug("send heartbeat to server")
|
|
ctl.Debug("send heartbeat to server")
|
|
ctl.sendCh <- &msg.Ping{}
|
|
ctl.sendCh <- &msg.Ping{}
|
|
case <-hbCheck.C:
|
|
case <-hbCheck.C:
|
|
- if time.Since(ctl.lastPong) > time.Duration(g.GlbClientCfg.HeartBeatTimeout)*time.Second {
|
|
|
|
|
|
+ if time.Since(ctl.lastPong) > time.Duration(ctl.clientCfg.HeartBeatTimeout)*time.Second {
|
|
ctl.Warn("heartbeat timeout")
|
|
ctl.Warn("heartbeat timeout")
|
|
// let reader() stop
|
|
// let reader() stop
|
|
ctl.conn.Close()
|
|
ctl.conn.Close()
|