aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan <me@jordan.im>2023-07-08 16:40:54 -0700
committerJordan <me@jordan.im>2023-07-08 16:40:54 -0700
commit07db95756a1d5d4c9e1ff325979a473ce7f5f2f2 (patch)
treea015e9a15303c33b0251c5972b5c663ffaa4c805
downloaddesec-zones-07db95756a1d5d4c9e1ff325979a473ce7f5f2f2.tar.gz
desec-zones-07db95756a1d5d4c9e1ff325979a473ce7f5f2f2.zip
initial commit
-rw-r--r--README8
-rwxr-xr-xzones.py52
2 files changed, 60 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..8b72110
--- /dev/null
+++ b/README
@@ -0,0 +1,8 @@
+desec-zones: retrieve and save all zone files from deSEC API
+
+usage: zones.py [-h] --token TOKEN [--path PATH]
+
+options:
+ -h, --help show this help message and exit
+ --token TOKEN deSEC API token
+ --path PATH path to store zone files
diff --git a/zones.py b/zones.py
new file mode 100755
index 0000000..0099b3e
--- /dev/null
+++ b/zones.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+import argparse
+import json
+import logging
+import os
+import sys
+import urllib.request
+
+logging.basicConfig(
+ stream=sys.stdout, format='%(asctime)s %(message)s',
+ datefmt='%m/%d/%Y %H:%M:%S')
+log = logging.getLogger('koya')
+log.setLevel(logging.DEBUG)
+
+def get_domains(headers):
+ endpoint = "https://desec.io/api/v1/domains/"
+ req = urllib.request.Request(endpoint, headers=headers)
+ resp = urllib.request.urlopen(req)
+
+ return json.loads(resp.read())
+
+def get_zone(domain):
+ endpoint = f"https://desec.io/api/v1/domains/{domain}/zonefile/"
+ req = urllib.request.Request(endpoint, headers=headers)
+ resp = urllib.request.urlopen(req)
+
+ return resp.read()
+
+if __name__ == "__main__":
+ desc = "desec-zones: retrieve and save all zone files from deSEC API"
+ parser = argparse.ArgumentParser(description=desc)
+ parser.add_argument("--token", dest="token", type=str, action="store",
+ help="deSEC API token",
+ required=True)
+ parser.add_argument("--path", dest="path", type=str, action="store",
+ help="path to store zone files", default="./",
+ required=False)
+
+ args = parser.parse_args()
+
+ headers = {"Authorization": f"Token {args.token}"}
+ domains = get_domains(headers)
+ log.info(f"Discovered {len(domains)} domains...")
+
+ for domain in domains:
+ name = domain["name"]
+ zone = get_zone(name)
+ path = os.path.join(args.path, name + ".zone")
+ with open(path, "ab") as zone_file:
+ zone_file.write(zone)
+ log.info(f"Wrote {name}'s zone file to {path}")