[tor-commits] [flashproxy/master] Capture registration helper stdout, stderr, and exit status.

dcf at torproject.org dcf at torproject.org
Mon Sep 24 00:40:09 UTC 2012


commit 89e54229a9e94c7cfb385d42d195f65a885a50ff
Author: David Fifield <david at bamsoftware.com>
Date:   Sun Sep 23 17:28:15 2012 -0700

    Capture registration helper stdout, stderr, and exit status.
    
    The registration helpers run in a thread, waiting in an infinite loop
    until the main process asks for a registration. This is necessary now
    because flashproxy-client needs to register multiple times in order to
    keep getting service. When #5426 is done, it should only be necessary to
    register once in the common case, and the thread won't be necessary.
---
 flashproxy-client |   39 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/flashproxy-client b/flashproxy-client
index f0491dd..746f5eb 100755
--- a/flashproxy-client
+++ b/flashproxy-client
@@ -13,6 +13,7 @@ import socket
 import struct
 import subprocess
 import sys
+import threading
 import time
 import traceback
 import urllib
@@ -91,9 +92,14 @@ def safe_str(s):
     else:
         return s
 
+log_lock = threading.Lock()
 def log(msg):
-    print >> options.log_file, (u"%s %s" % (time.strftime(LOG_DATE_FORMAT), msg)).encode("UTF-8")
-    options.log_file.flush()
+    log_lock.acquire()
+    try:
+        print >> options.log_file, (u"%s %s" % (time.strftime(LOG_DATE_FORMAT), msg)).encode("UTF-8")
+        options.log_file.flush()
+    finally:
+        log_lock.release()
 
 def parse_addr_spec(spec, defhost = None, defport = None):
     host = None
@@ -639,10 +645,15 @@ def report_pending():
     log(u"locals  (%d): %s" % (len(locals), [safe_format_peername(x) for x in locals]))
     log(u"remotes (%d): %s" % (len(remotes), [safe_format_peername(x) for x in remotes]))
  
+register_condvar = threading.Condition()
 def register():
     if not options.register:
         return
+    register_condvar.acquire()
+    register_condvar.notify()
+    register_condvar.release()
 
+def register_one():
     # sys.path[0] is initialized to the directory containing the Python script file.
     script_dir = sys.path[0]
     if not script_dir:
@@ -655,9 +666,23 @@ def register():
         command += ["-f", options.facilitator_url]
     command += [spec]
     try:
-        p = subprocess.Popen(command)
+        p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        stdout, stderr = p.communicate()
     except OSError, e:
-        log(u"Failed to register: %s" % str(e))
+        log(u"Error running registration helper: %s" % str(e))
+    for line in stdout.splitlines():
+        log(line)
+    for line in stderr.splitlines():
+        log(line)
+    if p.returncode != 0:
+        log("Registration helper ended with status %d." % p.returncode)
+
+def registration_thread_func():
+    register_condvar.acquire()
+    while True:
+        register_condvar.wait()
+        register_one()
+    register_condvar.release()
 
 def proxy_chunk_local_to_remote(local, remote, data = None):
     if data is None:
@@ -955,7 +980,11 @@ if __name__ == "__main__":
     # Locals not yet linked with a remote. This is a subset of remotes.
     unlinked_locals = []
 
-    register()
+    if options.register:
+        registration_thread = threading.Thread(target=registration_thread_func, name="register")
+        registration_thread.daemon = True
+        registration_thread.start()
+        register()
 
     if options.daemonize:
         log(u"Daemonizing.")



More information about the tor-commits mailing list