diff options
Diffstat (limited to 'lib/chutney/TorNet.py')
-rw-r--r-- | lib/chutney/TorNet.py | 84 |
1 files changed, 57 insertions, 27 deletions
diff --git a/lib/chutney/TorNet.py b/lib/chutney/TorNet.py index 1c626ba..436810d 100644 --- a/lib/chutney/TorNet.py +++ b/lib/chutney/TorNet.py @@ -22,6 +22,7 @@ import time import thread import threading import random +import argparse import stem.control @@ -31,6 +32,8 @@ import urllib import socks import pycurl +from twisted.internet import reactor + import Queue import chutney.Templating @@ -49,7 +52,7 @@ DEFAULTS = { 'hiddenserviceport' : 80, 'hiddenservicetarget' : '127.0.0.1', 'connlimit' : 60, - 'net_base_dir' : 'net', +# 'net_base_dir' : 'net', 'tor' : 'tor', 'auth_cert_lifetime' : 12, 'ip' : '127.0.0.1', @@ -386,7 +389,7 @@ class LocalNodeBuilder(NodeBuilder): datadir = self._env['dir'] cmdline = [ "cp", "-r", - "/".join(datadir.split("/")[:-3]) + "/hs", + "./hs", datadir + "/hidden_service" ] p = subprocess.Popen(cmdline, stdout=subprocess.PIPE) #stdout, stderr = p.communicate() @@ -519,11 +522,11 @@ class LocalNodeController(NodeController): running = self.isRunning() nick = self._env['nick'] if self.isRunning(): - print "Sending sighup to %s"%nick + logging.info("Sending sighup to %s"%nick) os.kill(pid, signal.SIGHUP) return True else: - print "%s is not running"%nick + logging.info("%s is not running"%nick) return False def start(self): @@ -623,7 +626,7 @@ class TorEnviron(chutney.Templating.Environ): class Network(list): """A network of Tor nodes, plus functions to manipulate them """ - def __init__(self, defaultEnviron=_BASE_ENVIRON): + def __init__(self, name="net"): """if name: environ = chutney.Templating.Environ(parent=defaultEnviron) @@ -633,7 +636,17 @@ class Network(list): self._dfltEnv = environ else:""" - self._dfltEnv = defaultEnviron + + NETWORK_DEFAULTS = { + 'torrc_fname' : '${dir}/torrc', + 'authority' : False, + 'bridgeauthority' : False, + 'hasbridgeauth' : False, + 'net_base_dir' : name, + 'bridges' : "Bridge bleargh bad torrc file!", + } + + self._dfltEnv = chutney.Templating.Environ(parent=_BASE_ENVIRON, **NETWORK_DEFAULTS) self._nextnodenum = 0 @@ -655,6 +668,9 @@ class Network(list): def _addNode(self, n): n.setNodenum(self._nextnodenum) + + n._env._parent = self._dfltEnv + self._nextnodenum += 1 self.append(n) @@ -719,11 +735,11 @@ class Network(list): for sig, desc in [(signal.SIGINT, "SIGINT"), (signal.SIGINT, "another SIGINT"), (signal.SIGKILL, "SIGKILL")]: - print "Sending %s to nodes"%desc + logging.info("Sending %s to nodes"%desc) for c in controllers: if c.isRunning(): c.stop(sig=sig) - print "Waiting for nodes to finish." + logging.info("Waiting for nodes to finish.") for n in xrange(10): time.sleep(1) if all(not c.isRunning() for c in controllers): @@ -791,17 +807,26 @@ def runConfigFile(verb, f): return getattr(network, verb)() def main(): + + parser = argparse.ArgumentParser() + parser.add_argument("command", help="what to do") + parser.add_argument("file", help="network to act on", nargs='+') + parser.add_argument("--quiet", dest="quiet", help="quiet", action='store_true') + parser.set_defaults(quiet=False) + args = parser.parse_args() + stem.util.log.get_logger().setLevel(logging.WARN) logger = logging.getLogger() logger.setLevel(logging.DEBUG) - # create console handler and set level to info - handler = logging.StreamHandler() - handler.setLevel(logging.INFO) - formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%b %d %H:%M:%S.000") - handler.setFormatter(formatter) - logger.addHandler(handler) + if not args.quiet: + # create console handler and set level to info + handler = logging.StreamHandler() + handler.setLevel(logging.INFO) + formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%b %d %H:%M:%S.000") + handler.setFormatter(formatter) + logger.addHandler(handler) # create debug file handler and set level to debug handler = logging.FileHandler(os.path.join(".", "chutney.log"), "w") @@ -810,22 +835,27 @@ def main(): handler.setFormatter(formatter) logger.addHandler(handler) - if len(sys.argv) < 3: - print usage(network) - print "Error: Not enough arguments given." - sys.exit(1) + thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + + overall_result = True + + for path in args.file: + f = open(path) - f = open(sys.argv[2]) - result = runConfigFile(sys.argv[1], f) - #print("run config file returns " + str(result)) - if result is False: - sys.exit(-1) + result = runConfigFile(args.command, f) - #if sys.argv[1] == "start": - # signal.signal(signal.SIGINT, signal_handler) - # signal.pause() + overall_result = result and overall_result - return 0 + if args.command == "start": + if result: + print(path + " PASS") + else: + print(path + " FAIL") + + reactor.stop() + + if not overall_result: + sys.exit(1) if __name__ == '__main__': main() |