import argparse import json import subprocess import requests def get(uri, token): result = requests.get(uri, headers={"Authorization": f"Bearer {token}"}) result.raise_for_status() return result def print_rrdata(zone, rrdata, filter={}): rrtype = rrdata["type"] data = rrdata["rrdatas"] rrname = rrdata["name"] # print(filter) if rrtype in [ 'A', "AAAA"]: for d in data: if not filter or ('name' in filter and filter['name'] in rrname) or ("ip" in filter and d == filter["ip"]): return f"{zone} {rrtype} {rrname} {d}" elif rrtype == 'CNAME': for d in data: if not filter or ("name" in filter and filter["name"] in d): return(zone, rrtype, d) elif rrtype == 'MX': for d in data: if not filter or ("name" in filter and filter["name"] in d): return(zone, rrtype, d) elif rrtype == 'NS': for d in data: if not filter or ("name" in filter and filter["name"] in d): return(zone, rrtype, d) elif rrtype == 'SOA': for d in data: if not filter or ("name" in filter and filter["name"] in d): return(zone, rrtype, d) elif rrtype in ["SRV", "TXT"]: for d in data: if not filter or ('name' in filter and filter['name'] in d) or ("ip" in filter and filter["ip"] in d): return(zone, rrtype, rrname, d) else: print(f"unknown type({rrtype})") print(rrdata) raise TypeError def print_rrset(zone, rrset, filter={}): for rrdata in rrset['rrdatas']: print_rrdata(zone, rrdata, filter=filter) def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--project", help="Google Cloud Project ID", default="ace-hosting-1253") parser.add_argument("--zone", help="Google Cloud Zone ID") parser.add_argument("--token", help="Google Cloud API Token") parser.add_argument("--find-name", help="Look for this name") parser.add_argument("--find-ip", help="Look for this IP address") return parser.parse_args() def get_token(args): if args.token: return args.token return subprocess.run( "gcloud auth print-access-token", shell=True, capture_output=True, universal_newlines=True ).stdout[:-1] def get_filter(args): filter = {} if args.find_name: filter["name"] = args.find_name if args.find_ip: filter["ip"] = args.find_ip return filter def main(): args = parse_args() project_dns_uri = f"https://dns.googleapis.com/dns/v1/projects/{args.project}" token = get_token(args) filter = get_filter(args) r = get(f"{project_dns_uri}/managedZones?maxResults=1000", token) zones = r.json()['managedZones'] found = [] for zone in zones: print(f"Checking domain {zone['name']}...") rrsets = get(f"{project_dns_uri}/managedZones/{zone['id']}/rrsets", token).json()['rrsets'] matches = 0 for rrset in rrsets: result = print_rrdata( zone["name"], rrset, filter=filter ) if result: matches += 1 found.append(result) if matches: print(f" found {matches} matches...") for f in found: print(f) if __name__ == "__main__": main()