From f3813c32a0215e22493fd0f87cfa9ec40d6870cd Mon Sep 17 00:00:00 2001 From: haidy Date: Mon, 26 Nov 2018 22:28:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0frp=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/service.go | 17 ++++++++++++----- cmd/frp/frp.go | 10 ++++++++++ cmd/frpc/sub/root.go | 4 ++++ cmd/frps/frps/root.go | 4 ++++ server/service.go | 11 +++++++++++ vendor/github.com/fatedier/golib/net/mux/mux.go | 7 +++++++ 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/client/service.go b/client/service.go index 866118d0..92a9e366 100644 --- a/client/service.go +++ b/client/service.go @@ -24,12 +24,15 @@ type Service struct { // manager control connection with server ctl *Control - closedCh chan int + closedCh chan bool + + closed bool } func NewService(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) (svr *Service) { svr = &Service{ - closedCh: make(chan int), + closedCh: make(chan bool), + closed: false, } ctl := NewControl(svr, pxyCfgs, visitorCfgs) svr.ctl = ctl @@ -51,11 +54,11 @@ func (svr *Service) Run(cmd bool) error { } if cmd { - <-svr.closedCh + svr.closed = <-svr.closedCh log.Info("svr closed") } else { go func() { - <-svr.closedCh + svr.closed = <-svr.closedCh log.Info("svr closed") }() } @@ -64,5 +67,9 @@ func (svr *Service) Run(cmd bool) error { func (svr *Service) Close() { svr.ctl.Close() - svr.closedCh <- 0 + svr.closedCh <- true +} + +func (svr *Service) IsClosed() bool { + return svr.closed } diff --git a/cmd/frp/frp.go b/cmd/frp/frp.go index 1858a37b..4079e9f4 100644 --- a/cmd/frp/frp.go +++ b/cmd/frp/frp.go @@ -30,12 +30,22 @@ func StopFrpc() (err error) { return sub.StopFrp() } +func IsFrpcRunning() bool { + return sub.IsFrpRunning() +} + func RunFrps(cfgFilePath string) (err error) { crypto.DefaultSalt = "frp" return frps.RunFrps(cfgFilePath) } +// StopFrps 停止frps服务 func StopFrps() error { return frps.StopFrps() } + +// IsFrpsRunning 是否还在运行 +func IsFrpsRunning() bool { + return frps.IsFrpsRunning() +} diff --git a/cmd/frpc/sub/root.go b/cmd/frpc/sub/root.go index f5a1b9fe..3d45e03b 100644 --- a/cmd/frpc/sub/root.go +++ b/cmd/frpc/sub/root.go @@ -125,6 +125,10 @@ func StopFrp() (err error) { return } +func IsFrpRunning() bool { + return service != nil && !service.IsClosed() +} + func handleSignal(svr *client.Service) { ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) diff --git a/cmd/frps/frps/root.go b/cmd/frps/frps/root.go index 32dcc99d..84dd7973 100644 --- a/cmd/frps/frps/root.go +++ b/cmd/frps/frps/root.go @@ -233,3 +233,7 @@ func runBackgroundServer() (err error) { func StopFrps() error { return service.Stop() } + +func IsFrpsRunning() bool { + return service != nil && !service.Closed +} diff --git a/server/service.go b/server/service.go index 87decb71..cfc04507 100644 --- a/server/service.go +++ b/server/service.go @@ -82,6 +82,9 @@ type Service struct { // Controller for nat hole connections natHoleController *NatHoleController + + // Closed is service closed + Closed bool } func NewService() (svr *Service, err error) { @@ -233,10 +236,18 @@ func (svr *Service) Run() { } func (svr *Service) Stop() error { + err := svr.muxer.Close() + if err != nil { + return err + } return svr.listener.Close() } func (svr *Service) HandleListener(l frpNet.Listener) { + defer func() { + svr.Closed = true + log.Warn("Frps is Closed") + }() // Listen for incoming connections from client. for { c, err := l.Accept() diff --git a/vendor/github.com/fatedier/golib/net/mux/mux.go b/vendor/github.com/fatedier/golib/net/mux/mux.go index 296392b9..ffbfbd3c 100644 --- a/vendor/github.com/fatedier/golib/net/mux/mux.go +++ b/vendor/github.com/fatedier/golib/net/mux/mux.go @@ -51,6 +51,13 @@ func NewMux(ln net.Listener) (mux *Mux) { return } +func (mux *Mux) Close() error { + if mux.ln != nil { + return mux.ln.Close() + } + return nil +} + // priority func (mux *Mux) Listen(priority int, needBytesNum uint32, fn MatchFunc) net.Listener { ln := &listener{