class ShellResolver(BaseResolver): """ Example dynamic resolver. Maps DNS labels to shell commands and returns result as TXT record (Note: No context is passed to the shell command) Shell commands are passed in a a list in <label>:<cmd> format - eg: [ 'uptime.abc.com.:uptime', 'ls:ls' ] Would respond to requests to 'uptime.abc.com.' with the output of the 'uptime' command. For non-absolute labels the 'origin' parameter is prepended """ def __init__(self,routes,origin,ttl): self.origin = DNSLabel(origin) self.ttl = parse_time(ttl) self.routes = {} for r in routes: route,_,cmd = r.partition(":") if route.endswith('.'): route = DNSLabel(route) else: route = self.origin.add(route) self.routes[route] = cmd def resolve(self,request,handler): reply = request.reply() qname = request.q.qname cmd = self.routes.get(qname) if cmd: output = getoutput(cmd).encode() reply.add_answer(RR(qname,QTYPE.TXT,ttl=self.ttl, rdata=TXT(output[:254]))) else: reply.header.rcode = RCODE.NXDOMAIN return reply