From 181478adfb43164ee8fa66a212acdadf040751c2 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Tue, 12 May 2020 14:34:12 -0700 Subject: [PATCH] refactor torProvider: merge networkStatus and BootstrapStatus, simplify monitorRestart logic. Catch case due to magic numbers where it was not restarting tor when tor was killed --- tor/torProvider.go | 87 ++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 54 deletions(-) diff --git a/tor/torProvider.go b/tor/torProvider.go index 82a45bb..703e8ab 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -35,9 +35,10 @@ const ( ) const ( - networkUnknown int = iota - networkDown - networkUp + networkUnknown = -3 + torDown = -2 + networkDown = -1 + networkUp = 0 ) type onionListenService struct { @@ -78,20 +79,25 @@ func (ols *onionListenService) Close() { // returns -1 on network disconnected // returns -2 on error func (tp *torProvider) GetBootstrapStatus() (int, string) { - if tp.t == nil { - return -2, "error: no tor, trying to restart..." - } - - netStatus := tp.getNetworkStatus() - if netStatus == networkDown { - return -1, "Network Down" - } - tp.lock.Lock() - kvs, err := tp.t.Control.GetInfo("status/bootstrap-phase") - tp.lock.Unlock() + defer tp.lock.Unlock() + + if tp.t == nil { + return torDown, "error: no tor, trying to restart..." + } + + val, err := tp.t.Control.GetInfo("network-liveness") if err != nil { - return -2, "error querrying status/bootstrap-phase" + return torDown, "can't query tor network-liveness" + } + if val[0].Val == "down" { + return networkDown, "tor cannot detect underlying network" + } + // else network is up + + kvs, err := tp.t.Control.GetInfo("status/bootstrap-phase") + if err != nil { + return torDown, "error querrying status/bootstrap-phase" } progress := 0 status := "" @@ -122,23 +128,6 @@ func (tp *torProvider) WaitTillBootstrapped() { } } -// getNetworkStatus returns tor's beleif in the underlying network's status -func (tp *torProvider) getNetworkStatus() int { - tp.lock.Lock() - defer tp.lock.Unlock() - if tp.t == nil { - return networkDown - } - val, err := tp.t.Control.GetInfo("network-liveness") - if err != nil { - return networkDown - } - if val[0].Val == "up" { - return networkUp - } - return networkDown -} - func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) { var onion = "" var privkey ed25519.PrivateKey @@ -266,7 +255,7 @@ func newHideCmd(exePath string) process.Creator { func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) { dataDir := path.Join(appDirectory, "tor") os.MkdirAll(dataDir, 0700) - tp := &torProvider{appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool), statusCallback: nil, lastRestartTime: time.Now()} + tp := &torProvider{appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool), statusCallback: nil, lastRestartTime: time.Now().Add(-restartCooldown)} // attempt connect to system tor log.Debugf("dialing system tor control port\n") @@ -317,8 +306,7 @@ func (tp *torProvider) unregisterListener(id string) { } func (tp *torProvider) monitorRestart() { - lastBootstrapProgress := 0 - lastNetworkStatus := networkUnknown + lastBootstrapProgress := networkUnknown interval := minStatusIntervalMs for { @@ -328,25 +316,16 @@ func (tp *torProvider) monitorRestart() { interval *= 2 } - netStatus := tp.getNetworkStatus() - if netStatus == networkDown { - if lastNetworkStatus != netStatus { - tp.callStatusCallback(-1, "Network Down") - } - lastBootstrapProgress = 0 - lastNetworkStatus = netStatus - } else { - lastNetworkStatus = networkUp - prog, status := tp.GetBootstrapStatus() - if prog == -1 && tp.t != nil { - tp.callStatusCallback(-2, status) - log.Infof("monitorRestart calling tp.restart() with prog:%v\n", prog) - tp.restart() - interval = minStatusIntervalMs - } else if prog != lastBootstrapProgress { - tp.callStatusCallback(prog, status) - interval = minStatusIntervalMs - } + prog, status := tp.GetBootstrapStatus() + + if prog == torDown && tp.t != nil { + log.Warnf("monitorRestart calling tp.restart() with prog:%v\n", prog) + tp.restart() + } + + if prog != lastBootstrapProgress { + tp.callStatusCallback(prog, status) + interval = minStatusIntervalMs lastBootstrapProgress = prog }