commit 89e54229a9e94c7cfb385d42d195f65a885a50ff Author: David Fifield david@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.")