diff --git a/.env-example b/.env-example new file mode 100644 index 0000000..73a1bac --- /dev/null +++ b/.env-example @@ -0,0 +1,7 @@ +ZONES=example.com,test1.no +DB_HOST=localhost +DB_PORT=3306 +DB_USER=test +DB_PASS=testpass +DB_DB=pdns +DNS_MASTER=wile diff --git a/main.py b/main.py index b571740..2a209eb 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,20 @@ +from decouple import config import datetime import logging import MySQLdb as m import dns.resolver def read_config(): - return (['example.com'],'localhost',3306,'test','testpass','pdns','wile') + 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(): @@ -19,28 +29,31 @@ def main(): expected = None for ns in nsarr: # r.nameservers = [ns] - 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() + 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() diff --git a/pyproject.toml b/pyproject.toml index cfebd14..aa1ae3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,4 +7,5 @@ requires-python = ">=3.13" dependencies = [ "dnstools>=0.0.1", "mysqlclient>=2.2.8", + "python-decouple>=3.8", ] diff --git a/uv.lock b/uv.lock index 31f0e20..9bf2d62 100644 --- a/uv.lock +++ b/uv.lock @@ -39,12 +39,14 @@ source = { virtual = "." } dependencies = [ { name = "dnstools" }, { name = "mysqlclient" }, + { name = "python-decouple" }, ] [package.metadata] requires-dist = [ { name = "dnstools", specifier = ">=0.0.1" }, { name = "mysqlclient", specifier = ">=2.2.8" }, + { name = "python-decouple", specifier = ">=3.8" }, ] [[package]] @@ -69,3 +71,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/44/6ae21b4e8490eb5167d04fa7452c462ffd72a502b96bf531477ef044a380/mysqlclient-2.2.8-cp314-cp314-win_amd64.whl", hash = "sha256:9bed7c8d3b629bdc09e17fb628d5b3b0a5fd1f12b09432b464b9126c727bedc0", size = 211644, upload-time = "2026-02-10T10:58:45.022Z" }, { url = "https://files.pythonhosted.org/packages/66/e5/037d55623be9f681236e04abe12e1290847c06bd48270c3f19ac33493cbf/mysqlclient-2.2.8-cp314-cp314t-win_amd64.whl", hash = "sha256:260cce0e81446c83bf0a389e0fae38d68547d9f8fc0833bc733014e10ce28a99", size = 213067, upload-time = "2026-02-10T10:58:43.389Z" }, ] + +[[package]] +name = "python-decouple" +version = "3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/97/373dcd5844ec0ea5893e13c39a2c67e7537987ad8de3842fe078db4582fa/python-decouple-3.8.tar.gz", hash = "sha256:ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f", size = 9612, upload-time = "2023-03-01T19:38:38.143Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/d4/9193206c4563ec771faf2ccf54815ca7918529fe81f6adb22ee6d0e06622/python_decouple-3.8-py3-none-any.whl", hash = "sha256:d0d45340815b25f4de59c974b855bb38d03151d81b037d9e3f463b0c9f8cbd66", size = 9947, upload-time = "2023-03-01T19:38:36.015Z" }, +]