#!/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.fetchone() if result: return result else: return ['NO DATA - ' + socket.gethostname()] def add_challenge(db, path, value): c = db.cursor() c.execute('REPLACE INTO challenges (q, value) VALUES(?, ?)', (path,value,)) 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 + '"\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()