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 ( const (
networkUnknown int = iota networkUnknown = -3
networkDown torDown = -2
networkUp networkDown = -1
networkUp = 0
) )
type onionListenService struct { type onionListenService struct {
@ -78,20 +79,25 @@ func (ols *onionListenService) Close() {
// returns -1 on network disconnected // returns -1 on network disconnected
// returns -2 on error // returns -2 on error
func (tp *torProvider) GetBootstrapStatus() (int, string) { 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() tp.lock.Lock()
kvs, err := tp.t.Control.GetInfo("status/bootstrap-phase") defer tp.lock.Unlock()
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 { 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 progress := 0
status := "" 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) { func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) {
var onion = "" var onion = ""
var privkey ed25519.PrivateKey var privkey ed25519.PrivateKey
@ -266,7 +255,7 @@ func newHideCmd(exePath string) process.Creator {
func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) { func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) {
dataDir := path.Join(appDirectory, "tor") dataDir := path.Join(appDirectory, "tor")
os.MkdirAll(dataDir, 0700) 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 // attempt connect to system tor
log.Debugf("dialing system tor control port\n") log.Debugf("dialing system tor control port\n")
@ -317,8 +306,7 @@ func (tp *torProvider) unregisterListener(id string) {
} }
func (tp *torProvider) monitorRestart() { func (tp *torProvider) monitorRestart() {
lastBootstrapProgress := 0 lastBootstrapProgress := networkUnknown
lastNetworkStatus := networkUnknown
interval := minStatusIntervalMs interval := minStatusIntervalMs
for { for {
@ -328,25 +316,16 @@ func (tp *torProvider) monitorRestart() {
interval *= 2 interval *= 2
} }
netStatus := tp.getNetworkStatus() prog, status := tp.GetBootstrapStatus()
if netStatus == networkDown {
if lastNetworkStatus != netStatus { if prog == torDown && tp.t != nil {
tp.callStatusCallback(-1, "Network Down") log.Warnf("monitorRestart calling tp.restart() with prog:%v\n", prog)
} tp.restart()
lastBootstrapProgress = 0 }
lastNetworkStatus = netStatus
} else { if prog != lastBootstrapProgress {
lastNetworkStatus = networkUp tp.callStatusCallback(prog, status)
prog, status := tp.GetBootstrapStatus() interval = minStatusIntervalMs
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
}
lastBootstrapProgress = prog lastBootstrapProgress = prog
} }