|
@@ -21,7 +21,6 @@ import (
|
|
"sync"
|
|
"sync"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
- "github.com/fatedier/frp/g"
|
|
|
|
"github.com/fatedier/frp/models/config"
|
|
"github.com/fatedier/frp/models/config"
|
|
"github.com/fatedier/frp/models/consts"
|
|
"github.com/fatedier/frp/models/consts"
|
|
frpErr "github.com/fatedier/frp/models/errors"
|
|
frpErr "github.com/fatedier/frp/models/errors"
|
|
@@ -129,10 +128,14 @@ type Control struct {
|
|
allShutdown *shutdown.Shutdown
|
|
allShutdown *shutdown.Shutdown
|
|
|
|
|
|
mu sync.RWMutex
|
|
mu sync.RWMutex
|
|
|
|
+
|
|
|
|
+ // Server configuration information
|
|
|
|
+ serverCfg config.ServerCommonConf
|
|
}
|
|
}
|
|
|
|
|
|
func NewControl(rc *controller.ResourceController, pxyManager *proxy.ProxyManager,
|
|
func NewControl(rc *controller.ResourceController, pxyManager *proxy.ProxyManager,
|
|
- statsCollector stats.Collector, ctlConn net.Conn, loginMsg *msg.Login) *Control {
|
|
|
|
|
|
+ statsCollector stats.Collector, ctlConn net.Conn, loginMsg *msg.Login,
|
|
|
|
+ serverCfg config.ServerCommonConf) *Control {
|
|
|
|
|
|
return &Control{
|
|
return &Control{
|
|
rc: rc,
|
|
rc: rc,
|
|
@@ -153,6 +156,7 @@ func NewControl(rc *controller.ResourceController, pxyManager *proxy.ProxyManage
|
|
writerShutdown: shutdown.New(),
|
|
writerShutdown: shutdown.New(),
|
|
managerShutdown: shutdown.New(),
|
|
managerShutdown: shutdown.New(),
|
|
allShutdown: shutdown.New(),
|
|
allShutdown: shutdown.New(),
|
|
|
|
+ serverCfg: serverCfg,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -161,7 +165,7 @@ func (ctl *Control) Start() {
|
|
loginRespMsg := &msg.LoginResp{
|
|
loginRespMsg := &msg.LoginResp{
|
|
Version: version.Full(),
|
|
Version: version.Full(),
|
|
RunId: ctl.runId,
|
|
RunId: ctl.runId,
|
|
- ServerUdpPort: g.GlbServerCfg.BindUdpPort,
|
|
|
|
|
|
+ ServerUdpPort: ctl.serverCfg.BindUdpPort,
|
|
Error: "",
|
|
Error: "",
|
|
}
|
|
}
|
|
msg.WriteMsg(ctl.conn, loginRespMsg)
|
|
msg.WriteMsg(ctl.conn, loginRespMsg)
|
|
@@ -232,7 +236,7 @@ func (ctl *Control) GetWorkConn() (workConn net.Conn, err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- case <-time.After(time.Duration(g.GlbServerCfg.UserConnTimeout) * time.Second):
|
|
|
|
|
|
+ case <-time.After(time.Duration(ctl.serverCfg.UserConnTimeout) * time.Second):
|
|
err = fmt.Errorf("timeout trying to get work connection")
|
|
err = fmt.Errorf("timeout trying to get work connection")
|
|
ctl.conn.Warn("%v", err)
|
|
ctl.conn.Warn("%v", err)
|
|
return
|
|
return
|
|
@@ -263,7 +267,7 @@ func (ctl *Control) writer() {
|
|
defer ctl.allShutdown.Start()
|
|
defer ctl.allShutdown.Start()
|
|
defer ctl.writerShutdown.Done()
|
|
defer ctl.writerShutdown.Done()
|
|
|
|
|
|
- encWriter, err := crypto.NewWriter(ctl.conn, []byte(g.GlbServerCfg.Token))
|
|
|
|
|
|
+ encWriter, err := crypto.NewWriter(ctl.conn, []byte(ctl.serverCfg.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.allShutdown.Start()
|
|
ctl.allShutdown.Start()
|
|
@@ -293,7 +297,7 @@ func (ctl *Control) reader() {
|
|
defer ctl.allShutdown.Start()
|
|
defer ctl.allShutdown.Start()
|
|
defer ctl.readerShutdown.Done()
|
|
defer ctl.readerShutdown.Done()
|
|
|
|
|
|
- encReader := crypto.NewReader(ctl.conn, []byte(g.GlbServerCfg.Token))
|
|
|
|
|
|
+ encReader := crypto.NewReader(ctl.conn, []byte(ctl.serverCfg.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 {
|
|
@@ -374,7 +378,7 @@ func (ctl *Control) manager() {
|
|
for {
|
|
for {
|
|
select {
|
|
select {
|
|
case <-heartbeat.C:
|
|
case <-heartbeat.C:
|
|
- if time.Since(ctl.lastPing) > time.Duration(g.GlbServerCfg.HeartBeatTimeout)*time.Second {
|
|
|
|
|
|
+ if time.Since(ctl.lastPing) > time.Duration(ctl.serverCfg.HeartBeatTimeout)*time.Second {
|
|
ctl.conn.Warn("heartbeat timeout")
|
|
ctl.conn.Warn("heartbeat timeout")
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -417,22 +421,22 @@ func (ctl *Control) manager() {
|
|
func (ctl *Control) RegisterProxy(pxyMsg *msg.NewProxy) (remoteAddr string, err error) {
|
|
func (ctl *Control) RegisterProxy(pxyMsg *msg.NewProxy) (remoteAddr string, err error) {
|
|
var pxyConf config.ProxyConf
|
|
var pxyConf config.ProxyConf
|
|
// Load configures from NewProxy message and check.
|
|
// Load configures from NewProxy message and check.
|
|
- pxyConf, err = config.NewProxyConfFromMsg(pxyMsg)
|
|
|
|
|
|
+ pxyConf, err = config.NewProxyConfFromMsg(pxyMsg, ctl.serverCfg)
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
// NewProxy will return a interface Proxy.
|
|
// NewProxy will return a interface Proxy.
|
|
// In fact it create different proxies by different proxy type, we just call run() here.
|
|
// In fact it create different proxies by different proxy type, we just call run() here.
|
|
- pxy, err := proxy.NewProxy(ctl.runId, ctl.rc, ctl.statsCollector, ctl.poolCount, ctl.GetWorkConn, pxyConf)
|
|
|
|
|
|
+ pxy, err := proxy.NewProxy(ctl.runId, ctl.rc, ctl.statsCollector, ctl.poolCount, ctl.GetWorkConn, pxyConf, ctl.serverCfg)
|
|
if err != nil {
|
|
if err != nil {
|
|
return remoteAddr, err
|
|
return remoteAddr, err
|
|
}
|
|
}
|
|
|
|
|
|
// Check ports used number in each client
|
|
// Check ports used number in each client
|
|
- if g.GlbServerCfg.MaxPortsPerClient > 0 {
|
|
|
|
|
|
+ if ctl.serverCfg.MaxPortsPerClient > 0 {
|
|
ctl.mu.Lock()
|
|
ctl.mu.Lock()
|
|
- if ctl.portsUsedNum+pxy.GetUsedPortsNum() > int(g.GlbServerCfg.MaxPortsPerClient) {
|
|
|
|
|
|
+ if ctl.portsUsedNum+pxy.GetUsedPortsNum() > int(ctl.serverCfg.MaxPortsPerClient) {
|
|
ctl.mu.Unlock()
|
|
ctl.mu.Unlock()
|
|
err = fmt.Errorf("exceed the max_ports_per_client")
|
|
err = fmt.Errorf("exceed the max_ports_per_client")
|
|
return
|
|
return
|
|
@@ -478,7 +482,7 @@ func (ctl *Control) CloseProxy(closeMsg *msg.CloseProxy) (err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- if g.GlbServerCfg.MaxPortsPerClient > 0 {
|
|
|
|
|
|
+ if ctl.serverCfg.MaxPortsPerClient > 0 {
|
|
ctl.portsUsedNum = ctl.portsUsedNum - pxy.GetUsedPortsNum()
|
|
ctl.portsUsedNum = ctl.portsUsedNum - pxy.GetUsedPortsNum()
|
|
}
|
|
}
|
|
pxy.Close()
|
|
pxy.Close()
|