From 21d13bf1ebe555caa6b3f94d4191449ee3c600d5 Mon Sep 17 00:00:00 2001 From: Gentile G Date: Wed, 25 Oct 2023 17:14:44 +0200 Subject: [PATCH] Adding gandi client and bbox modem client --- detector.py | 50 +++++++++++++++-------------------------- services/fast5330br1.py | 33 +++++++++++++++++++++++++++ services/gandi.py | 34 ++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 services/fast5330br1.py create mode 100644 services/gandi.py diff --git a/detector.py b/detector.py index d2a7e43..4c61937 100644 --- a/detector.py +++ b/detector.py @@ -1,41 +1,13 @@ import requests -from requests.adapters import HTTPAdapter -from requests.packages.urllib3.util.ssl_ import create_urllib3_context +import socket +import subprocess + +from services.fast5330br1 import Fast5330bR1 MODEM_ADDRESS = 'mabbox.bytel.fr' ROUTER_ADDRESS = 'kynes.local:8000' - -class SecLevel1Adapter(HTTPAdapter): - def init_poolmanager(self, *args, **kwargs): - context = create_urllib3_context(ciphers='DEFAULT@SECLEVEL=1') - kwargs['ssl_context'] = context - return super(SecLevel1Adapter, self).init_poolmanager(*args, **kwargs) - - def proxy_manager_for(self, *args, **kwargs): - context = create_urllib3_context(ciphers='DEFAULT@SECLEVEL=1') - kwargs['ssl_context'] = context - return super(SecLevel1Adapter, self).proxy_manager_for(*args, **kwargs) - - -class Fast5330bR1: - def __init__(self, address): - self.address = address - - def check_internet_status(self): - with requests.Session() as session: - session.mount(f"https://{self.address}", SecLevel1Adapter()) - r = session.get( - f"https://{self.address}/api/v1/summary", - proxies={"https": "socks5h://localhost:1337"} - ) - - result = r.json() - - return result[0]['internet']['state'] == 2 - - eth_modem = Fast5330bR1(MODEM_ADDRESS) eth_modem_is_up = eth_modem.check_internet_status() @@ -50,3 +22,17 @@ elif not eth_modem_is_up and router_status == 'eth': if new_router_status: requests.post(f"http://{ROUTER_ADDRESS}/status/{new_router_status}", auth=(router_user, router_pass)) + router_status = new_router_status + +current_dns_host = socket.gethostbyname_ex('dorfsvald.net') +expected_host = ETH_HOST if router_status == "eth" else USB_HOST +if current_dns_host != expected_host: + client = GandiClient(domain, gandi_api_key, '@', 'A') + dns_updating = client.get_host() == expected_host + if not dns_updating: + client.set_host(expected_host) +else: + if expected_host == ETH_HOST: + subprocess.run(['systemctl', 'start', 'wg-quick@wg0']) + else: + subprocess.run(['systemctl', 'stop', 'wg-quick@wg0']) diff --git a/services/fast5330br1.py b/services/fast5330br1.py new file mode 100644 index 0000000..2b86eae --- /dev/null +++ b/services/fast5330br1.py @@ -0,0 +1,33 @@ +import requests + +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.ssl_ import create_urllib3_context + + +class SecLevel1Adapter(HTTPAdapter): + def init_poolmanager(self, *args, **kwargs): + context = create_urllib3_context(ciphers='DEFAULT@SECLEVEL=1') + kwargs['ssl_context'] = context + return super(SecLevel1Adapter, self).init_poolmanager(*args, **kwargs) + + def proxy_manager_for(self, *args, **kwargs): + context = create_urllib3_context(ciphers='DEFAULT@SECLEVEL=1') + kwargs['ssl_context'] = context + return super(SecLevel1Adapter, self).proxy_manager_for(*args, **kwargs) + + +class Fast5330bR1: + def __init__(self, address): + self.address = address + + def check_internet_status(self): + with requests.Session() as session: + session.mount(f"https://{self.address}", SecLevel1Adapter()) + r = session.get( + f"https://{self.address}/api/v1/summary", + proxies={"https": "socks5h://localhost:1337"} + ) + + result = r.json() + + return result[0]['internet']['state'] == 2 diff --git a/services/gandi.py b/services/gandi.py new file mode 100644 index 0000000..2d07642 --- /dev/null +++ b/services/gandi.py @@ -0,0 +1,34 @@ +import requests +import json + + +class GandiClient: + base_url = "https://api.gandi.net/v5/livedns/domains" + + def __init__(self, domain, api_key, record_name, record_type): + self.domain = domain + self.api_key = api_key + self.record_name = record_name + self.record_type = record_type + + def _get_headers(self): + return { + 'Authorization': f'Bearer {self.api_key}', + 'Content-Type': 'application/json' + } + + def _get_url(self): + return f"{self.base_url}/{self.domain}/records/{self.record_name}/{self.record_type}" + + def get_host(self): + response = requests.request("PUT", self._get_url(), headers=self._get_headers()) + + return response.json()['rrset_values'][0] + + def set_host(self, host, tls=3600): + payload = json.dumps({ + "rrset_ttl": tls, + "rrset_values": [host] + }) + + requests.request("PUT", self._get_url(), headers=self._get_headers(), data=payload)