summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason D. McCormick <jason@mfamily.org>2022-11-26 13:45:34 -0500
committerJason D. McCormick <jason@mfamily.org>2022-11-26 13:45:34 -0500
commit187a6be04a7d7a87248e74a756a1611299a27d4a (patch)
tree6785d38a71dcf988a46fbe06d50c6f5c40f1456e
parentd97bbb1bc398e0ac66b61b3f5c3c2aba91cb0731 (diff)
implement configuration files
-rwxr-xr-xhe-dyndns34
-rw-r--r--he-dyndns.conf4
2 files changed, 34 insertions, 4 deletions
diff --git a/he-dyndns b/he-dyndns
index 6e2258e..443e76e 100755
--- a/he-dyndns
+++ b/he-dyndns
@@ -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