Merge pull request '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' (#3) from restart into master

This commit is contained in:
Sarah Jamie Lewis 2020-05-12 14:50:57 -07:00
commit b076b8bad6
1 changed files with 33 additions and 54 deletions

View File

@ -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
}