ansible-role-powerdns-letse.../templates/pdns-letsencrypt.py.j2
2020-05-14 22:14:54 +02:00

63 lines
1.7 KiB
Django/Jinja

#!/usr/bin/env python3
import sys
from sys import stdin, stdout
import socket
import sqlite3
def setupdb():
conn = sqlite3.connect('{{ powerdns.letsencrypthandler.dbpath }}', isolation_level=None)
conn.executescript("""
CREATE TABLE IF NOT EXISTS challenges (
q TEXT NOT NULL,
value TEXT,
timestamp DEFAULT (strftime('%s','now'))
)
""")
conn.commit()
return conn
def get_challenge(db, path):
c = db.cursor()
c.execute('SELECT value FROM challenges WHERE q = ?', (path,))
result = c.fetchall()
if result:
return result
else:
return ['NO DATA - ' + socket.gethostname()]
def add_challenge(db, path, value):
c = db.cursor()
c.execute('INSERT INTO challenges (q, value) VALUES(?, ?)', (path,value,))
c.execute("DELETE FROM challenges WHERE timestamp < strftime('%s', datetime('now','-2 day'))")
db.commit()
def main_query():
db = setupdb()
data = stdin.readline()
stdout.write("OK\tpdns letsencrypt handler\n")
stdout.flush()
while True:
data = stdin.readline().strip()
kind, qname, qclass, qtype, id, ip = data.split("\t")
if qtype == "SOA":
stdout.write("DATA\t" + qname + "\t" + qclass + "\t" + qtype + "\t300\t" + id + "\t")
stdout.write("example.com. example.example.com. 1 1d 2h 4w 1h\n")
else:
for i in get_challenge(db, qname.lower()):
stdout.write("DATA\t" + qname + "\t" + qclass + "\tTXT\t1\t" + id + '\t"' + i[0] + '"\n')
stdout.write("LOG\tletsencrypt pipe handler got query: '" + data + "'\n")
stdout.write("END\n")
stdout.flush()
def main_add_challenge():
db = setupdb()
add_challenge(db ,sys.argv[1], sys.argv[2])
def main():
if len(sys.argv) == 3:
main_add_challenge()
else:
main_query()
if __name__ == '__main__':
main()