Skip to content

Instantly share code, notes, and snippets.

@marcoceppi
Created October 19, 2011 17:16
Show Gist options
  • Save marcoceppi/1298978 to your computer and use it in GitHub Desktop.
Save marcoceppi/1298978 to your computer and use it in GitHub Desktop.
import json_rpc
import subprocess
import cherrypy
import os
import json
class Module (object):
@json_rpc.expose_secure_dont_jsonify
def meta(self, service, user_id, domain):
user_dir = "/etc/meta/%s/%s" % (service, user_id)
filename = "/etc/meta/%s/%s/%s" % (service, user_id, domain)
if cherrypy.request.method == "POST":
body = cherrypy.request.body
if not os.path.exists(user_dir):
os.mkdir(user_dir)
open(filename, 'w').write(body.read().decode())
self.generate(service, user_id, domain)
return "success"
elif cherrypy.request.method == "GET":
if os.path.exists(filename):
return open(filename).read()
else:
raise cherrypy.HTTPError(404)
else:
raise cherrypy.HTTPError(405)
def generate(self, service, user_id, domain):
metadata = json.load(open("/etc/meta/%s/%s/%s" %
(service, user_id, domain)))
if service == "dns":
out = open("/opt/tools/dns/templates/zone.tpl").read()
opt_template = open("/opt/tools/dns/templates/opt-line.tpl").read()
line_template = open("/opt/tools/dns/templates/line.tpl").read()
for key in metadata['zone']:
out = out.replace("[%s]" % key.upper(),
str(metadata['zone'][key]))
for key in metadata['lines']['SOA']:
out = out.replace("[%s]" % key.upper(),
str(metadata['lines']['SOA'][key]))
classes = (key for key in metadata['lines'] if key != "SOA")
classes = ["NS"] + list(i for i in classes if i != "NS")
for cls in classes:
for line in metadata['lines'][cls]:
template = opt_template if "opt" in line else line_template
template = template.replace("[RECORD]", line['record'])
template = template.replace("[SUB]", line['sub'])
template = template.replace("[CLASS]", cls)
if "opt" in line:
template = template.replace("[OPT]", str(line['opt']))
out += template
open("/etc/bind/zones/%s/%s" % (user_id, domain +
".db"), 'w').write(out)
if domain in self.user_zones(user_id):
proc = subprocess.Popen("/etc/init.d/bind9 reload", shell=True)
else:
user_zone = open("/opt/tools/dns/templates/user-zone.tpl").read()
user_zone = user_zone.replace("[DOMAIN]", domain)
user_zone = user_zone.replace("[USER]", user_id)
open("/etc/bind/conf.d/%s.zones" % (user_id), 'w').write(user_zone)
proc = subprocess.Popen("/etc/init.d/bind9 restart", shell=True)
status = os.waitpid(proc.pid, 0)[1]
return True
@staticmethod
def user_zones(username):
import re
for i in open("/etc/bind/conf.d/%s.zones" % (username)):
domains = re.search('(?<=zone ")\w+.*', i)
if domains:
yield domains.group().strip("\"")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment