forked from openprivacy/connectivity
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
This commit is contained in:
parent
42033f9819
commit
181478adfb
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue