diff --git a/app/app.go b/app/app.go index f366891..fa74d51 100644 --- a/app/app.go +++ b/app/app.go @@ -31,6 +31,8 @@ type Application interface { GetPeer(onion string) peer.CwtchPeer ListPeers() map[string]string + GetTorStatus() (map[string]string, error) + Shutdown() } @@ -166,6 +168,11 @@ func (app *application) GetPeer(onion string) peer.CwtchPeer { return nil } +// GetTorStatus returns tor control port bootstrap-phase status info in a map +func (app *application) GetTorStatus() (map[string]string, error) { + return app.torManager.GetStatus() +} + // Shutdown shutsdown all peers of an app and then the tormanager func (app *application) Shutdown() { for _, peer := range app.peers { diff --git a/connectivity/tor/tormanager.go b/connectivity/tor/tormanager.go index 3f4f4f8..ee27fa9 100644 --- a/connectivity/tor/tormanager.go +++ b/connectivity/tor/tormanager.go @@ -141,3 +141,28 @@ func (tm *Manager) TestConnection() error { } return errors.New(proxyStatusMessage(proxyStatus)) } + +// GetStatus returns tor control port bootstrap-phase status info in a map +func (tm *Manager) GetStatus() (map[string]string, error) { + controlAddress := fmt.Sprintf("127.0.0.1:%d", tm.controlPort) + c, err := bulb.Dial("tcp4", controlAddress) + if err != nil { + return nil, err + } + defer c.Close() + c.Request("AUTHENTICATE \"\"") + resp, err := c.Request("GETINFO status/bootstrap-phase") + if err != nil { + return nil, err + } + + lines := strings.SplitN(resp.RawLines[0], " ", 5) + var resps = make(map[string]string) + for _, l := range lines { + kv := strings.Split(l, "=") + if len(kv) == 2 { + resps[kv[0]] = kv[1] + } + } + return resps, nil +}