from decouple import config import datetime import logging import MySQLdb as m import dns.resolver def read_config(): zones_str = config('ZONES', default='example.com') zones = zones_str.split(',') dbhost = config('DB_HOST', 'localhost') dbport = int(config('DB_PORT', '3306')) dbdb = config('DB_DB', 'pdns') dbuser = config('DB_USER', 'test') dbpass = config('DB_PASS', 'testpass') master = config('DNS_MASTER', 'wile') print(f"{zones=} {dbhost=} {dbport=} {dbuser=} {dbpass=} {dbdb=} {master=}") return (zones,dbhost, dbport, dbuser, dbpass, dbdb, master) def main(): (zones, host, port, username, password, database, myname) = read_config() db = m.connect(host, username, password, database) for zone in zones: logging.debug(f"checking zone {zone}") # try to resolve dnskey.{zone} on all nameservers # dammit, my testserver is running on a weird port r = dns.resolver.Resolver() nsarr = ['127.0.0.1:10053'] expected = None for ns in nsarr: # r.nameservers = [ns] try: answer = r.resolve(qname=zone, rdtype='DNSKEY', tcp=False, search=ns) print(f"{answer=}") if not expected: expected = answer.rrset.to_text() print(f"set {expected=}") else: if answer.rrset.to_text() != expected: print(f"{answer.rrset.to_text()=} differs from {expected=}") # I'm very confident this is more complicated than it needs to be... db.query(f"""SELECT id,content FROM records WHERE type='SOA' AND name='{zone}'""") result = db.store_result() row = result.fetch_row() (id,content) = row[0] carr = content.split() newdatestr = datetime.datetime.today().strftime("%Y%m%d01") if newdatestr[:8] == carr[2][:8]: count = int(carr[2][8:]) newcount = count + 1 newdatestr = f"{newdatestr[:8]}{newcount:02d}" carr[2] = newdatestr db.query(f"""UPDATE records SET content = '{' '.join(carr)}' WHERE id={id}""") db.commit() except: print(f"{zone} has no DNSKEY") if __name__ == "__main__": main()