ah-tools/ah_tools/gcloud_dns.py
2024-08-10 14:13:07 +10:00

125 lines
3.4 KiB
Python

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()