commit 7d07f33d56b53ecc0cce2b995a56eac0d04981a5 Author: Arturo Filastò hellais@gmail.com Date: Fri Feb 10 21:36:14 2012 +0100
Implement descriptor reading and make Bridget comunicate with TorCtl --- refactor/plugoo.py | 3 ++- refactor/tests/bridget.py | 44 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/refactor/plugoo.py b/refactor/plugoo.py index 1540034..de33445 100644 --- a/refactor/plugoo.py +++ b/refactor/plugoo.py @@ -103,7 +103,8 @@ class Report: data to the reporting system """ #print "Writing report(s)" - dump = "- " + yaml.dump(data) + dump = '---\n' + dump += yaml.dump(data) reports = []
if self.file: diff --git a/refactor/tests/bridget.py b/refactor/tests/bridget.py index 2d1126f..2f6df2c 100644 --- a/refactor/tests/bridget.py +++ b/refactor/tests/bridget.py @@ -17,6 +17,7 @@ import random import re from shutil import rmtree from subprocess import Popen, PIPE +from datetime import datetime
import plugoo import gevent @@ -24,6 +25,11 @@ from gevent import socket import fcntl from plugoo import Plugoo, Asset
+try: + from TorCtl import TorCtl +except: + print "Error TorCtl not installed!" + class BridgeTAsset(Asset): def __init__(self, file=None): self = Asset.__init__(self, file) @@ -36,6 +42,7 @@ class BridgeT(Plugoo): def writetorrc(self, bridge): # register Tor to an ephemeral port socksport = random.randint(49152, 65535) + controlport = random.randint(49152, 65535) randomname = "tor_"+str(random.randint(0, 424242424242)) datadir = "/tmp/" + randomname if bridge.startswith("obfs://"): @@ -45,8 +52,8 @@ UseBridges 1 Bridge obfs2 %s DataDirectory %s ClientTransportPlugin obfs2 exec /usr/local/bin/obfsproxy --managed -""" % (socksport, obfsbridge, datadir) - print torrc +ControlPort %s +""" % (socksport, obfsbridge, datadir, controlport) else: torrc = """SocksPort %s UseBridges 1 @@ -62,14 +69,24 @@ usemicrodescriptors 0 f.close()
os.mkdir(datadir) - return (randomname, datadir) + return (randomname, datadir, controlport) + + def parsebridgeinfo(self, output): + ret = {} + fields = ['router', 'platform', 'opt', 'published', 'uptime', 'bandwidth'] + + for x in output.split("\n"): + cfield = x.split(' ') + if cfield[0] in fields: + ret[cfield[0]] = ' '.join(cfield[1:]) + return ret
def connect(self, bridge, timeout=None): if not timeout: if self.config.tests.tor_bridges_timeout: self.timeout = self.config.tests.tor_bridges_timeout timeout = self.timeout - torrc, tordir = self.writetorrc(bridge) + torrc, tordir, controlport = self.writetorrc(bridge) cmd = ["tor", "-f", torrc]
tupdate = time.time() @@ -84,16 +101,24 @@ usemicrodescriptors 0 o = p.stdout.read(4096) if re.search("100%", o): print "%s bridge works" % bridge + c = TorCtl.connect('127.0.0.1', controlport) + bridgeinfo = self.parsebridgeinfo(c.get_info('dir/server/all')['dir/server/all']) + c.close() p.stdout.close() os.unlink(os.path.join(os.getcwd(), torrc)) rmtree(tordir) p.terminate() - return [bridge, True] + return { + 'Time': datetime.now(), + 'Bridge': bridge, + 'Working': True, + 'Descriptor': bridgeinfo + }
if re.search("%", o): # Keep updating the timeout if there is progress tupdate = time.time() - print o + print ".", continue
except IOError: @@ -111,7 +136,12 @@ usemicrodescriptors 0 os.unlink(os.path.join(os.getcwd(), torrc)) rmtree(tordir) p.terminate() - return [bridge, False] + return { + 'Time': datetime.now(), + 'Bridge': bridge, + 'Working': False, + 'Descriptor': {} + }
def experiment(self, *a, **kw): # this is just a dirty hack
tor-commits@lists.torproject.org