From 2339d03038bd075b6f6e2f47bfe54e79486576e7 Mon Sep 17 00:00:00 2001
From: Siarhei Siniak <siarheisiniak@gmail.com>
Date: Sun, 7 Nov 2021 00:28:43 +0300
Subject: [PATCH] [~] Refactor

---
 d1/forward.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)
 create mode 100644 d1/forward.py

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')