mirror of https://github.com/fatedier/frp
				
				
				
			frpc: udpate proxies check and start logic
							parent
							
								
									ce8fde793c
								
							
						
					
					
						commit
						637ddbce1f
					
				| 
						 | 
				
			
			@ -89,8 +89,8 @@ func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf, visitorCfgs m
 | 
			
		|||
	ctl := &Control{
 | 
			
		||||
		svr:                svr,
 | 
			
		||||
		loginMsg:           loginMsg,
 | 
			
		||||
		sendCh:             make(chan msg.Message, 10),
 | 
			
		||||
		readCh:             make(chan msg.Message, 10),
 | 
			
		||||
		sendCh:             make(chan msg.Message, 100),
 | 
			
		||||
		readCh:             make(chan msg.Message, 100),
 | 
			
		||||
		closedCh:           make(chan int),
 | 
			
		||||
		readerShutdown:     shutdown.New(),
 | 
			
		||||
		writerShutdown:     shutdown.New(),
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf, visitorCfgs m
 | 
			
		|||
		Logger:             log.NewPrefixLogger(""),
 | 
			
		||||
	}
 | 
			
		||||
	ctl.pm = NewProxyManager(ctl, ctl.sendCh, "")
 | 
			
		||||
	ctl.pm.Reload(pxyCfgs, visitorCfgs)
 | 
			
		||||
	ctl.pm.Reload(pxyCfgs, visitorCfgs, false)
 | 
			
		||||
	return ctl
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ func (ctl *Control) Run() (err error) {
 | 
			
		|||
 | 
			
		||||
	// start all local visitors and send NewProxy message for all configured proxies
 | 
			
		||||
	ctl.pm.Reset(ctl.sendCh, ctl.runId)
 | 
			
		||||
	ctl.pm.CheckAndStartProxy()
 | 
			
		||||
	ctl.pm.CheckAndStartProxy([]string{ProxyStatusNew})
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -360,20 +360,20 @@ func (ctl *Control) msgHandler() {
 | 
			
		|||
// If controler is notified by closedCh, reader and writer and handler will exit, then recall these functions.
 | 
			
		||||
func (ctl *Control) worker() {
 | 
			
		||||
	go ctl.msgHandler()
 | 
			
		||||
	go ctl.writer()
 | 
			
		||||
	go ctl.reader()
 | 
			
		||||
	go ctl.writer()
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	maxDelayTime := 20 * time.Second
 | 
			
		||||
	delayTime := time.Second
 | 
			
		||||
 | 
			
		||||
	checkInterval := 10 * time.Second
 | 
			
		||||
	checkInterval := 60 * time.Second
 | 
			
		||||
	checkProxyTicker := time.NewTicker(checkInterval)
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-checkProxyTicker.C:
 | 
			
		||||
			// every 10 seconds, check which proxy registered failed and reregister it to server
 | 
			
		||||
			ctl.pm.CheckAndStartProxy()
 | 
			
		||||
			// check which proxy registered failed and reregister it to server
 | 
			
		||||
			ctl.pm.CheckAndStartProxy([]string{ProxyStatusStartErr, ProxyStatusClosed})
 | 
			
		||||
		case _, ok := <-ctl.closedCh:
 | 
			
		||||
			// we won't get any variable from this channel
 | 
			
		||||
			if !ok {
 | 
			
		||||
| 
						 | 
				
			
			@ -413,8 +413,8 @@ func (ctl *Control) worker() {
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				// init related channels and variables
 | 
			
		||||
				ctl.sendCh = make(chan msg.Message, 10)
 | 
			
		||||
				ctl.readCh = make(chan msg.Message, 10)
 | 
			
		||||
				ctl.sendCh = make(chan msg.Message, 100)
 | 
			
		||||
				ctl.readCh = make(chan msg.Message, 100)
 | 
			
		||||
				ctl.closedCh = make(chan int)
 | 
			
		||||
				ctl.readerShutdown = shutdown.New()
 | 
			
		||||
				ctl.writerShutdown = shutdown.New()
 | 
			
		||||
| 
						 | 
				
			
			@ -427,7 +427,7 @@ func (ctl *Control) worker() {
 | 
			
		|||
				go ctl.reader()
 | 
			
		||||
 | 
			
		||||
				// start all configured proxies
 | 
			
		||||
				ctl.pm.CheckAndStartProxy()
 | 
			
		||||
				ctl.pm.CheckAndStartProxy([]string{ProxyStatusNew})
 | 
			
		||||
 | 
			
		||||
				checkProxyTicker.Stop()
 | 
			
		||||
				checkProxyTicker = time.NewTicker(checkInterval)
 | 
			
		||||
| 
						 | 
				
			
			@ -437,6 +437,6 @@ func (ctl *Control) worker() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (ctl *Control) reloadConf(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) error {
 | 
			
		||||
	err := ctl.pm.Reload(pxyCfgs, visitorCfgs)
 | 
			
		||||
	err := ctl.pm.Reload(pxyCfgs, visitorCfgs, true)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,14 +69,10 @@ func NewProxyWrapper(cfg config.ProxyConf) *ProxyWrapper {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pw *ProxyWrapper) IsRunning() bool {
 | 
			
		||||
func (pw *ProxyWrapper) GetStatusStr() string {
 | 
			
		||||
	pw.mu.RLock()
 | 
			
		||||
	defer pw.mu.RUnlock()
 | 
			
		||||
	if pw.Status == ProxyStatusRunning {
 | 
			
		||||
		return true
 | 
			
		||||
	} else {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return pw.Status
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pw *ProxyWrapper) GetStatus() *ProxyStatus {
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +206,8 @@ func (pm *ProxyManager) CloseProxies() {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pm *ProxyManager) CheckAndStartProxy() {
 | 
			
		||||
// pxyStatus: check and start proxies in which status
 | 
			
		||||
func (pm *ProxyManager) CheckAndStartProxy(pxyStatus []string) {
 | 
			
		||||
	pm.mu.RLock()
 | 
			
		||||
	defer pm.mu.RUnlock()
 | 
			
		||||
	if pm.closed {
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +216,9 @@ func (pm *ProxyManager) CheckAndStartProxy() {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	for _, pxy := range pm.proxies {
 | 
			
		||||
		if !pxy.IsRunning() {
 | 
			
		||||
		status := pxy.GetStatusStr()
 | 
			
		||||
		for _, s := range pxyStatus {
 | 
			
		||||
			if status == s {
 | 
			
		||||
				var newProxyMsg msg.NewProxy
 | 
			
		||||
				pxy.Cfg.UnMarshalToMsg(&newProxyMsg)
 | 
			
		||||
				err := pm.sendMsg(&newProxyMsg)
 | 
			
		||||
| 
						 | 
				
			
			@ -227,6 +226,8 @@ func (pm *ProxyManager) CheckAndStartProxy() {
 | 
			
		|||
					pm.Warn("[%s] proxy send NewProxy message error")
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -245,9 +246,14 @@ func (pm *ProxyManager) CheckAndStartProxy() {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pm *ProxyManager) Reload(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) error {
 | 
			
		||||
func (pm *ProxyManager) Reload(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf, startNow bool) error {
 | 
			
		||||
	pm.mu.Lock()
 | 
			
		||||
	defer pm.mu.Unlock()
 | 
			
		||||
	defer func() {
 | 
			
		||||
		pm.mu.Unlock()
 | 
			
		||||
		if startNow {
 | 
			
		||||
			go pm.CheckAndStartProxy([]string{ProxyStatusNew})
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	if pm.closed {
 | 
			
		||||
		err := fmt.Errorf("Reload error: ProxyManager is closed now")
 | 
			
		||||
		pm.Warn(err.Error())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ func main() {
 | 
			
		|||
	if args["status"] != nil {
 | 
			
		||||
		if args["status"].(bool) {
 | 
			
		||||
			if err = CmdStatus(); err != nil {
 | 
			
		||||
				fmt.Printf("frps get status error: %v\n", err)
 | 
			
		||||
				fmt.Printf("frpc get status error: %v\n", err)
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
			} else {
 | 
			
		||||
				os.Exit(0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue