Adding gandi client and bbox modem client

This commit is contained in:
2023-10-25 17:14:44 +02:00
parent d25e6d9de6
commit 21d13bf1eb
3 changed files with 85 additions and 32 deletions

View File

@@ -1,41 +1,13 @@
import requests import requests
from requests.adapters import HTTPAdapter import socket
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
import subprocess
from services.fast5330br1 import Fast5330bR1
MODEM_ADDRESS = 'mabbox.bytel.fr' MODEM_ADDRESS = 'mabbox.bytel.fr'
ROUTER_ADDRESS = 'kynes.local:8000' 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 = Fast5330bR1(MODEM_ADDRESS)
eth_modem_is_up = eth_modem.check_internet_status() 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: if new_router_status:
requests.post(f"http://{ROUTER_ADDRESS}/status/{new_router_status}", auth=(router_user, router_pass)) 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'])

33
services/fast5330br1.py Normal file
View File

@@ -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

34
services/gandi.py Normal file
View File

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