diff --git a/d1/forward.py b/d1/forward.py new file mode 100644 index 0000000..4fc36bf --- /dev/null +++ b/d1/forward.py @@ -0,0 +1,93 @@ +import subprocess +import io +import json +import sys +import os +import pprint +import traceback +import time + + +with io.open(sys.argv[1], 'r') as f: + config = json.load(f) + +server_address = config['server_address'] +username = config['username'] +target_address = config['target_address'] +blank_endpoint = config['blank_endpoint'] +target_ports = config['target_ports'] + +ports = dict( + target=r''' + ssh \ + %s@%s \ + %s \ + -v -N; + ''' % ( + username, + server_address, + ' '.join([ + '-R 0.0.0.0:%d:%s:%d' % ( + pair[0], + target_address, + pair[1], + ) + for pair in target_ports + ]), + ), + blank=r''' + ssh \ + %s@%s \ + %s \ + -v -N; + ''' % ( + username, + server_address, + ' '.join([ + '-R 0.0.0.0:%d:%s' % ( + pair[0], + blank_endpoint, + ) + for pair in target_ports + ]), + ) +) + +app_name = config['app_name'] +has_server = lambda : subprocess.call([ + 'ping','-c', '1', target_address, +]) == 0 + +notify = lambda msg : subprocess.check_output(['notify-send', '-t', '5000', app_name, msg]) + +while True: + notify('started') + if has_server(): + t6 = ports['target'] + notify('has_server') + else: + t6 = ports['blank'] + notify('blank_app') + t2 = t6 + with subprocess.Popen(t2, shell=True) as p: + try: + while True: + time.sleep(10) + t3 = has_server() + t4 = None + if t6 == ports['target'] and not t3: + t4 = 'no server' + elif t6 == ports['blank'] and t3: + t4 = 'server found' + if not t4 is None: + notify(t4) + raise RuntimeError(t4) + assert p.poll() is None + except KeyboardInterrupt: + break + except: + pprint.pprint(traceback.format_exc()) + continue + finally: + p.terminate() + notify('stopped')