from binder import exceptions, forms, helpers, models from django.shortcuts import redirect, render import re RE_UNICODEARRAY = re.compile(r"u'(.*?)'") def home_index(request): """ List the main index page for Binder. """ return render(request, "index.htm") def view_server_list(request): """ List the DNS servers configured in the database. """ server_list = models.BindServer.objects.all().order_by("hostname") return render(request, "bcommon/list_servers.htm", { "server_list" : server_list}) def view_server_zones(request, dns_server): """ Display the list of DNS zones a particular DNS host provides. """ errors = "" zone_array = {} try: this_server = models.BindServer.objects.get(hostname=dns_server) zone_array = this_server.list_zones() except models.BindServer.DoesNotExist, err: errors = "There is no configured server by that name: %s" % dns_server except exceptions.ZoneException, err: errors = "Unable to list server zones. Error: %s" % err return render(request, "bcommon/list_server_zones.htm", { "errors" : errors, "dns_server" : dns_server, "zone_array" : zone_array}) def view_zone_records(request, dns_server, zone_name): """ Display the list of records for a particular zone. """ # Have we tried here to transfer for a zone that does not exist? # Try with a transfer key and without. try: this_server = models.BindServer.objects.get(hostname=dns_server) zone_array = this_server.list_zone_records(zone_name) except exceptions.TransferException, err: return render(request, "bcommon/list_zone.htm", { "errors" : err, "zone_name" : zone_name}) return render(request, "bcommon/list_zone.htm", { "zone_array" : zone_array, "dns_server" : dns_server, "zone_name" : zone_name}) def view_add_record(request, dns_server, zone_name): """ View to provide form to add a DNS record. """ return render(request, "bcommon/add_record_form.htm", { "dns_server" : dns_server, "zone_name" : zone_name, "tsig_keys" : models.Key.objects.all() }) def view_add_record_result(request): """ Process the input given to add a DNS record. """ errors = "" if request.method == "GET": return redirect("/") form = forms.FormAddRecord(request.POST) if form.is_valid(): form_cleaned = form.cleaned_data try: add_record_response = helpers.add_record(form_cleaned) except exceptions.RecordException, err: # TODO: Start using this exception. errors = err return render(request, "bcommon/response_result.htm", { "errors" : errors, "response" : add_record_response }) return render(request, "bcommon/add_record_form.htm", { "dns_server" : request.POST["dns_server"], "zone_name" : request.POST["zone_name"], "form_errors" : form.errors, "form_data" : request.POST }) def view_add_cname_record(request, dns_server, zone_name, record_name): """ Process given input to add a CNAME pointer.""" return render(request, "bcommon/add_cname_record_form.htm", { "dns_server" : dns_server, "originating_record" : "%s.%s" % (record_name, zone_name), "zone_name" : zone_name, "tsig_keys" : models.Key.objects.all() }) def view_add_cname_result(request): """ Process input on the CNAME form and provide a response.""" if request.method == "GET": return redirect("/") errors = "" form = forms.FormAddCnameRecord(request.POST) if form.is_valid(): cd = form.cleaned_data add_cname_response = helpers.add_cname_record( str(cd["dns_server"]), str(cd["zone_name"]), str(cd["originating_record"]), str(cd["cname"]), str(cd["ttl"]), str(cd["key_name"])) return render(request, "bcommon/response_result.htm", {"response" : add_cname_response }) return render(request, "bcommon/add_cname_record_form.htm", { "dns_server" : request.POST["dns_server"], "zone_name" : request.POST["zone_name"], "record_name" : request.POST["cname"], "originating_record" : request.POST["originating_record"], "form_data" : request.POST, "form_errors" : form.errors, "tsig_keys" : models.Key.objects.all() }) def view_delete_record(request): """ Provide the initial form for deleting records. """ if request.method == "GET": # Return home. You shouldn't trying to directly acces # the url for deleting records. return redirect("/") dns_server = request.POST["dns_server"] zone_name = request.POST["zone_name"] rr_array = request.POST.getlist("rr_array") return render(request, "bcommon/delete_record_initial.htm", { "dns_server" : dns_server, "zone_name" : zone_name, "rr_array" : rr_array, "tsig_keys" : models.Key.objects.all() }) def view_delete_result(request): """ View that deletes records and returns the response. """ if request.method == "GET": # Return home. You shouldn't trying to directly access # the url for deleting records. return redirect("/") # What seems like an ugly hack to get around the fact # that the array comes back as Unicode values. # TODO: Can we make this cleaner? rr_unicode_array = request.POST.getlist("rr_array")[0] rr_items = RE_UNICODEARRAY.findall(rr_unicode_array) delete_result = helpers.delete_record(request.POST, rr_items) return render(request, "bcommon/response_result.htm", { "response" : delete_result })