|
@@ -33,6 +33,7 @@ import (
|
|
"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/models/nathole"
|
|
"github.com/fatedier/frp/models/nathole"
|
|
|
|
+ plugin "github.com/fatedier/frp/models/plugin/server"
|
|
"github.com/fatedier/frp/server/controller"
|
|
"github.com/fatedier/frp/server/controller"
|
|
"github.com/fatedier/frp/server/group"
|
|
"github.com/fatedier/frp/server/group"
|
|
"github.com/fatedier/frp/server/ports"
|
|
"github.com/fatedier/frp/server/ports"
|
|
@@ -76,6 +77,9 @@ type Service struct {
|
|
// Manage all proxies
|
|
// Manage all proxies
|
|
pxyManager *proxy.ProxyManager
|
|
pxyManager *proxy.ProxyManager
|
|
|
|
|
|
|
|
+ // Manage all plugins
|
|
|
|
+ pluginManager *plugin.Manager
|
|
|
|
+
|
|
// HTTP vhost router
|
|
// HTTP vhost router
|
|
httpVhostRouter *vhost.VhostRouters
|
|
httpVhostRouter *vhost.VhostRouters
|
|
|
|
|
|
@@ -92,8 +96,9 @@ type Service struct {
|
|
|
|
|
|
func NewService(cfg config.ServerCommonConf) (svr *Service, err error) {
|
|
func NewService(cfg config.ServerCommonConf) (svr *Service, err error) {
|
|
svr = &Service{
|
|
svr = &Service{
|
|
- ctlManager: NewControlManager(),
|
|
|
|
- pxyManager: proxy.NewProxyManager(),
|
|
|
|
|
|
+ ctlManager: NewControlManager(),
|
|
|
|
+ pxyManager: proxy.NewProxyManager(),
|
|
|
|
+ pluginManager: plugin.NewManager(),
|
|
rc: &controller.ResourceController{
|
|
rc: &controller.ResourceController{
|
|
VisitorManager: controller.NewVisitorManager(),
|
|
VisitorManager: controller.NewVisitorManager(),
|
|
TcpPortManager: ports.NewPortManager("tcp", cfg.ProxyBindAddr, cfg.AllowPorts),
|
|
TcpPortManager: ports.NewPortManager("tcp", cfg.ProxyBindAddr, cfg.AllowPorts),
|
|
@@ -104,6 +109,12 @@ func NewService(cfg config.ServerCommonConf) (svr *Service, err error) {
|
|
cfg: cfg,
|
|
cfg: cfg,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Init all plugins
|
|
|
|
+ for name, options := range cfg.HTTPPlugins {
|
|
|
|
+ svr.pluginManager.Register(plugin.NewHTTPPluginOptions(options))
|
|
|
|
+ log.Info("plugin [%s] has been registered", name)
|
|
|
|
+ }
|
|
|
|
+
|
|
// Init group controller
|
|
// Init group controller
|
|
svr.rc.TcpGroupCtl = group.NewTcpGroupCtl(svr.rc.TcpPortManager)
|
|
svr.rc.TcpGroupCtl = group.NewTcpGroupCtl(svr.rc.TcpPortManager)
|
|
|
|
|
|
@@ -295,7 +306,16 @@ func (svr *Service) HandleListener(l net.Listener) {
|
|
|
|
|
|
switch m := rawMsg.(type) {
|
|
switch m := rawMsg.(type) {
|
|
case *msg.Login:
|
|
case *msg.Login:
|
|
- err = svr.RegisterControl(conn, m)
|
|
|
|
|
|
+ // server plugin hook
|
|
|
|
+ content := &plugin.LoginContent{
|
|
|
|
+ Login: *m,
|
|
|
|
+ }
|
|
|
|
+ retContent, err := svr.pluginManager.Login(content)
|
|
|
|
+ if err == nil {
|
|
|
|
+ m = &retContent.Login
|
|
|
|
+ err = svr.RegisterControl(conn, m)
|
|
|
|
+ }
|
|
|
|
+
|
|
// If login failed, send error message there.
|
|
// If login failed, send error message there.
|
|
// Otherwise send success message in control's work goroutine.
|
|
// Otherwise send success message in control's work goroutine.
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -384,7 +404,7 @@ func (svr *Service) RegisterControl(ctlConn net.Conn, loginMsg *msg.Login) (err
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- ctl := NewControl(ctx, svr.rc, svr.pxyManager, svr.statsCollector, ctlConn, loginMsg, svr.cfg)
|
|
|
|
|
|
+ ctl := NewControl(ctx, svr.rc, svr.pxyManager, svr.pluginManager, svr.statsCollector, ctlConn, loginMsg, svr.cfg)
|
|
|
|
|
|
if oldCtl := svr.ctlManager.Add(loginMsg.RunId, ctl); oldCtl != nil {
|
|
if oldCtl := svr.ctlManager.Add(loginMsg.RunId, ctl); oldCtl != nil {
|
|
oldCtl.allShutdown.WaitDone()
|
|
oldCtl.allShutdown.WaitDone()
|