#!/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, "wb") as zone_file: zone_file.write(zone) log.info(f"Wrote {name}'s zone file to {path}")