From 50775880009df0b897f800a86284fa11cb572f9b Mon Sep 17 00:00:00 2001
From: Siarhei Siniak <siarheisiniak@gmail.com>
Date: Sat, 13 Nov 2021 13:14:40 +0300
Subject: [PATCH] [~] Refactor

---
 d1/dynu_update.py      | 84 ++++++++++++++++++++++++++++++++++++++++++
 docker-compose.yml     | 14 ++++++-
 docker/dynu/Dockerfile |  9 +++++
 3 files changed, 105 insertions(+), 2 deletions(-)
 create mode 100644 d1/dynu_update.py
 create mode 100644 docker/dynu/Dockerfile

diff --git a/d1/dynu_update.py b/d1/dynu_update.py
new file mode 100644
index 0000000..052b7c7
--- /dev/null
+++ b/d1/dynu_update.py
@@ -0,0 +1,84 @@
+import requests
+import logging
+import pprint
+import copy
+import io
+import json
+import sys
+
+logging.warning('start dynu_update')
+with io.open(
+    sys.argv[1],
+    'r'
+) as f:
+    dynu_config = json.load(f)
+logging.warning('loaded dynu_config')
+
+t2 = requests.get(
+    'https://api.dynu.com/v2/oauth2/token',
+    auth=(
+        dynu_config['oath2_client_id'],
+        dynu_config['oath2_secret'],
+    )
+).json()
+logging.warning('got access_token')
+
+t1 = requests.get(
+    'https://api.dynu.com/v2/dns',
+    headers={
+        'Authorization': 'Bearer %s' % t2['access_token']
+    }
+).json()
+DYNU_DOMAIN = t1['domains'][0]
+logging.warning('got dynu_domain')
+
+t3 = requests.get(
+    'https://api.dynu.com/v2/dns/%d/webredirect' % DYNU_DOMAIN['id'],
+    headers={
+        'Authorization': 'Bearer %s' % t2['access_token']
+    }
+).json()
+DYNU_REDIRECT = t3['webRedirects'][0]
+logging.warning('got dynu_redirect')
+
+NGROK_DOMAIN = sys.argv[2]
+t6 = requests.get('http://%s:4040/api/tunnels' % NGROK_DOMAIN).json()
+TUNNEL_URL = t6['tunnels'][0]['public_url']
+logging.warning('got tunnel_url')
+
+
+
+if TUNNEL_URL != DYNU_REDIRECT['url']:
+    t5 = copy.deepcopy(t3['webRedirects'][0])
+    t5.update(
+        dict(
+            url=TUNNEL_URL,
+        )
+    )
+
+    DYNU_REDIRECT = requests.post(
+        'https://api.dynu.com/v2/dns/%d/webRedirect/%d' % (
+            DYNU_DOMAIN['id'],
+            t3['webRedirects'][0]['id']
+        ),
+        headers={
+            'Authorization': 'Bearer %s' % t2['access_token']
+        },
+        json=t5
+    ).json()
+    logging.warning('updated dynu_redirect')
+else:
+    logging.warning('skip update dynu_redirect')
+
+logging.warning(
+    pprint.pformat(
+        dict(
+            NGROK_DOMAIN=NGROK_DOMAIN,
+            TUNNEL_URL=TUNNEL_URL,
+            DYNU_DOMAIN=DYNU_DOMAIN,
+            DYNU_REDIRECT=DYNU_REDIRECT,
+        )
+    )
+)
+
+logging.warning('done dynu_update')
diff --git a/docker-compose.yml b/docker-compose.yml
index 485a455..38772ad 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -8,8 +8,18 @@ services:
       - ./d1/nginx_config.py:/app/d1/nginx_config.py:ro
       - ./tmp/cache/forward.nginx.json:/app/tmp/cache/forward.nginx.json:ro
     restart: always
-    ports:
-      - 80:80
+  dynu:
+    build:
+      context: .
+      dockerfile: ./docker/dynu/Dockerfile
+    volumes:
+      - ./d1/dynu_update.py:/app/d1/dynu_update.py:ro
+      - ./tmp/cache/dynu.auth.json:/app/tmp/cache/dynu.auth.json:ro
+  ngrok:
+    image: wernight/ngrok
+    links:
+      - app
+    command: ['ngrok', 'http', 'app:80']
   #forward:
   #  build:
   #    context: .
diff --git a/docker/dynu/Dockerfile b/docker/dynu/Dockerfile
new file mode 100644
index 0000000..10fb797
--- /dev/null
+++ b/docker/dynu/Dockerfile
@@ -0,0 +1,9 @@
+FROM python:3
+WORKDIR /app
+
+RUN pip3 install requests
+
+ENTRYPOINT /bin/sh -c "\
+  python3 d1/dynu_update.py tmp/cache/dynu.auth.json ngrok \
+"
+