DNSocial/dnsocial/dns.py

35 lines
1 KiB
Python
Raw Normal View History

2023-06-07 09:24:33 +00:00
from typing import Optional
import subprocess
def query_txt(domain: str, fallback_ns:str='8.8.8.8') -> Optional[str]:
# get the authoritative nameserver first
# just the top domain
top_domain = '.'.join(domain.split('.')[-2:])
ns_response = subprocess.run(['dig', top_domain, 'ns', '+short'], capture_output=True)
# get the first one
ns_response = ns_response.stdout.decode('utf-8')
if ns_response == '':
ns = fallback_ns
else:
ns = ns_response.split('\n')[0]
# now actually query for the txt record
output = subprocess.run(['dig', f'@{ns}', domain, 'txt', '+short'], capture_output=True)
record = output.stdout.decode('utf-8').strip()
if record == '':
return None
else:
return record
def find_last_int(domain: str, max=50) -> int:
post_int = 1
while post_int < max:
test_domain = f'{post_int}.{domain}'
txt = query_txt(test_domain)
if txt is None:
break
post_int += 1
return post_int