125 lines
3.4 KiB
Python
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()
|