[tor-commits] [flashproxy/master] Add a required --relay option to the facilitator.

dcf at torproject.org dcf at torproject.org
Fri Jun 10 13:59:53 UTC 2011


commit 1b1687e87fe6ce17ad1509bac7eaf479c7247628
Author: David Fifield <david at bamsoftware.com>
Date:   Fri Jun 10 03:15:25 2011 -0700

    Add a required --relay option to the facilitator.
---
 facilitator.py |   40 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/facilitator.py b/facilitator.py
index 5c33ea2..be7543a 100755
--- a/facilitator.py
+++ b/facilitator.py
@@ -15,6 +15,7 @@ import urlparse
 
 DEFAULT_ADDRESS = "0.0.0.0"
 DEFAULT_PORT = 9002
+DEFAULT_RELAY_PORT = 9001
 DEFAULT_LOG_FILENAME = "facilitator.log"
 
 LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
@@ -22,17 +23,26 @@ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
 class options(object):
     log_filename = DEFAULT_LOG_FILENAME
     log_file = sys.stdout
+    relay_spec = None
     daemonize = True
 
+    @staticmethod
+    def set_relay_spec(spec):
+        af, host, port = parse_addr_spec(spec, defport = DEFAULT_RELAY_PORT)
+        # Resolve to get an IP address.
+        addrs = socket.getaddrinfo(host, port, af)
+        options.relay_spec = format_addr(addrs[0][4])
+
 def usage(f = sys.stdout):
     print >> f, """\
-Usage: %(progname)s <OPTIONS> [HOST] [PORT]
+Usage: %(progname)s -r RELAY <OPTIONS> [HOST] [PORT]
 Flash bridge facilitator: Register client addresses with HTTP POST requests
 and serve them out again with HTTP GET. Listen on HOST and PORT, by default
 %(addr)s %(port)d.
   -d, --debug         don't daemonize, log to stdout.
   -h, --help          show this help.
-  -l, --log FILENAME  write log to FILENAME (default \"%(log)s\").\
+  -l, --log FILENAME  write log to FILENAME (default \"%(log)s\").
+  -r, --relay RELAY   send RELAY (host:port) to proxies as the relay to use.\
 """ % {
     "progname": sys.argv[0],
     "addr": DEFAULT_ADDRESS,
@@ -200,7 +210,9 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
 
         reg = REGS.fetch()
         if reg:
-            log(u"proxy %s gets %s (now %d)" % (format_addr(self.client_address), unicode(reg), len(REGS)))
+            log(u"proxy %s gets %s, relay %s (now %d)" %
+                (format_addr(self.client_address), unicode(reg),
+                 options.relay_spec, len(REGS)))
             self.send_client(reg)
         else:
             log(u"proxy %s gets none" % format_addr(self.client_address))
@@ -272,11 +284,16 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
         self.send_response(200)
         self.send_header("Content-Type", "x-www-form-urlencoded")
         self.end_headers()
-        self.request.send(urllib.urlencode({"client": client_str}))
+
+        data = {}
+        data["client"] = client_str
+        data["relay"] = options.relay_spec
+        self.request.send(urllib.urlencode(data))
 
 REGS = RegSet()
 
-opts, args = getopt.gnu_getopt(sys.argv[1:], "dhl:", ["debug", "help", "log="])
+opts, args = getopt.gnu_getopt(sys.argv[1:], "dhl:r:",
+    ["debug", "help", "log=", "relay="])
 for o, a in opts:
     if o == "-d" or o == "--debug":
         options.daemonize = False
@@ -286,12 +303,25 @@ for o, a in opts:
         sys.exit()
     elif o == "-l" or o == "--log":
         options.log_filename = a
+    elif o == "-r" or o == "--relay":
+        try:
+            options.set_relay_spec(a)
+        except socket.gaierror, e:
+            print >> sys.stderr, u"Can't resolve relay %s: %s" % (repr(a), str(e))
+            sys.exit(1)
 
 if options.log_filename:
     options.log_file = open(options.log_filename, "a")
 else:
     options.log_file = sys.stdout
 
+if not options.relay_spec:
+    print >> sys.stderr, """\
+The -r option is required. Give it the relay that will be sent to proxies.
+  -r HOST[:PORT]\
+"""
+    sys.exit(1)
+
 if len(args) == 0:
     address = (DEFAULT_ADDRESS, DEFAULT_PORT)
 elif len(args) == 1:





More information about the tor-commits mailing list