Initial Commit
This commit is contained in:
commit
05c2e5e81f
17 changed files with 1197 additions and 0 deletions
125
ah_tools/gcloud_dns.py
Normal file
125
ah_tools/gcloud_dns.py
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue