diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/src/ddns_update.py b/src/ddns_update.py index 86b8ea6..befd4ae 100755 --- a/src/ddns_update.py +++ b/src/ddns_update.py @@ -8,6 +8,7 @@ from os import environ from netifaces import interfaces, ifaddresses, AF_INET6 from ipaddress import ip_address from time import sleep +import socket logging.basicConfig(level=logging.INFO, format="%(asctime)-15s - %(name)s %(levelname)-8s: %(message)s") log = logging.getLogger("ddns updater") @@ -33,7 +34,7 @@ def response_successful(response_text): def ddns_update(host, key, ip): - url = f"https://dyndns.strato_.com/nic/update?hostname={host}&myip={ip}" + url = f"https://dyndns.strato.com/nic/update?hostname={host}&myip={ip}" try: response = requests.get(url, auth=(host, key), timeout=3) @@ -45,7 +46,7 @@ def ddns_update(host, key, ip): response.raise_for_status() if not response_successful(response.text): - raise RequestException("update failed") + raise RequestException(f"update to {ip} failed") except RequestException as error: log.error(response.text.strip()) @@ -53,7 +54,7 @@ def ddns_update(host, key, ip): return False log.debug(response.text.strip()) - log.info("update successful") + log.info(f"update to {ip} successful") return True @@ -62,17 +63,17 @@ def ddns_update(host, key, ip): @click.option( "--host", required=True, - default=lambda: environ.get("DDNS_HOST", None), help="The dns name to update", ) @click.option( "--key", required=True, - default=lambda: environ.get("DDNS_KEY", None), help="The ddns authorization key", ) def loop_ddns_update(host, key): - last_ip = None + last_ip = ip_address(socket.getaddrinfo(host, None, socket.AF_INET6)[0][4][0]) + log.info(f"currently registered address: {last_ip}") + while True: current_ip = get_global_ipv6() if current_ip != last_ip: @@ -84,4 +85,5 @@ def loop_ddns_update(host, key): if __name__ == "__main__": - loop_ddns_update() + log.info("starting...") + loop_ddns_update(auto_envvar_prefix="DDNS") diff --git a/src/test_ddns_update.py b/src/test_ddns_update.py new file mode 100644 index 0000000..a091beb --- /dev/null +++ b/src/test_ddns_update.py @@ -0,0 +1,20 @@ +import unittest +from .ddns_update import response_successful + +class TestDdnsUpdate(unittest.TestCase): + + def test_response_successful(self): + self.assertTrue(response_successful("good")) + self.assertTrue(response_successful("good 1.2.3.4")) + self.assertTrue(response_successful("good abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd")) + self.assertTrue(response_successful("nochg")) + self.assertTrue(response_successful("nochg 1.2.3.4")) + self.assertTrue(response_successful("nochg abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd")) + self.assertFalse(response_successful("notfqdn")) + self.assertFalse(response_successful("nohost")) + self.assertFalse(response_successful("numhost")) + self.assertFalse(response_successful("abuse")) + self.assertFalse(response_successful("badagent")) + self.assertFalse(response_successful("dnserr")) + self.assertFalse(response_successful("911")) +