diff options
| author | Jason D. McCormick <jason@mfamily.org> | 2022-11-26 13:45:34 -0500 |
|---|---|---|
| committer | Jason D. McCormick <jason@mfamily.org> | 2022-11-26 13:45:34 -0500 |
| commit | 187a6be04a7d7a87248e74a756a1611299a27d4a (patch) | |
| tree | 6785d38a71dcf988a46fbe06d50c6f5c40f1456e | |
| parent | d97bbb1bc398e0ac66b61b3f5c3c2aba91cb0731 (diff) | |
implement configuration files
| -rwxr-xr-x | he-dyndns | 34 | ||||
| -rw-r--r-- | he-dyndns.conf | 4 |
2 files changed, 34 insertions, 4 deletions
@@ -2,10 +2,12 @@ import argparse import base64 +import configparser import dns.resolver import ipaddress import logging import logging.handlers +import os.path import socket import sys import urllib @@ -26,7 +28,6 @@ def build_ip(ip_string): return ip def haveIPv6(): - log.debug("inside haveIPv6()") haveIPv6 = True try: s = socket.socket(socket.AF_INET6) @@ -48,6 +49,21 @@ def haveIPv6(): haveIPv6 = False return haveIPv6 +def getKey(keyfile, record): + if not os.path.exists(keyfile): + raise Exception("missing keyfile {}".format(keyfile)) + + config = configparser.ConfigParser() + config.read(keyfile) + + if not "keys" in config: + raise Exception("keyfile lacks [keys] section") + + if not record in config["keys"]: + raise Exception("keyfile has no entry for {}".format(record)) + + return config["keys"][record] + def main(): ap = argparse.ArgumentParser(description="Update Hurricane Electric DNS dynamic record") ap.add_argument("record", help="DNS record to update") @@ -55,7 +71,8 @@ def main(): ap.add_argument("--v6", help="Update IPv6 AAAA record", action="store_true", default=False) ap.add_argument("--addr4", help="Update A record with provided IP rather than detected IP") ap.add_argument("--addr6", help="Update AAAA record with provided IP rather than detected IP") - ap.add_argument("--key", help="HE DDNS key for record (by default read from /etc/he-dns-secret)") + ap.add_argument("--keyfile", help="Alternate location for key config file (default /etc/he-dns-secret.conf)") + ap.add_argument("--key", help="HE DDNS key for record (by default read from /etc/he-dns-secret.conf or --keyfile)") ap.add_argument("--debug", help="Enable debug logging", action="store_true", default=False) args = ap.parse_args() @@ -64,7 +81,13 @@ def main(): else: log.setLevel(logging.ERROR) - # Handle manual addressing + if args.keyfile: + log.debug("KEYFILE: {}".format(args.keyfile)) + keyfile = args.keyfile + else: + log.debug("KEYFILE: /etc/he-dyndns.conf") + keyfile = "/etc/he-dyndns.conf" + if args.addr4: ip = build_ip(args.addr4) @@ -75,7 +98,10 @@ def main(): if not haveIPv6 and not args.addr6: log.error("no IPv6 detected and --v6 specified without --addr6 (try --debug?)") sys.exit(1) + try: + + apikey = getKey(keyfile, args.record) if args.v6: ans = dns.resolver.resolve(HE_DNS_API_HOST, "AAAA")[0] @@ -93,7 +119,7 @@ def main(): log.debug("API request URL: " + url) # make the HTTP request - authstr = base64.b64encode(bytes("%s:%s" % ( args.record, "yEuFfO74TskIX2NG0Yod" ), "ascii")) + authstr = base64.b64encode(bytes("%s:%s" % ( args.record, apikey ), "ascii")) log.debug("auth string: %s" % authstr.decode("utf-8")) req = urllib.request.Request(url) req.add_header("Host", HE_DNS_API_HOST) diff --git a/he-dyndns.conf b/he-dyndns.conf new file mode 100644 index 0000000..26b387b --- /dev/null +++ b/he-dyndns.conf @@ -0,0 +1,4 @@ +# List API keys one key per domain record in the format +# record = key +[keys] +dyntest.mfamily.org = yEuFfO74TskIX2NG0Yod |
