aboutsummaryrefslogtreecommitdiff
path: root/lib/chutney/TorNet.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chutney/TorNet.py')
-rw-r--r--lib/chutney/TorNet.py84
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()