def html_name(request, name): """ Displays the sorted by name data in html format. (NOTE: should combine this into one function with html_ ip) See html_ip above - info is the same, sort order is by hostname rather than IP """ sortby = "name" subnet_info = Subnet.objects.get(subnet_name=name) proper_name = subnet_info.proper_name mapping = Mapping.objects.filter(subnet_id=name) ip_host_list = [] cname_host_list = [] for obj in mapping: if pylib.is_valid_ip(obj.ip_or_cname): ip_host_list.append((obj.ip_or_cname, obj.hostname)) else: cname_host_list.append((obj.hostname, obj.ip_or_cname)) total_ips = pylib.determine_total_num_ips(subnet_info.ip_range_start, subnet_info.ip_range_end) total_registered_ips = len(ip_host_list) available_ips = total_ips - total_registered_ips sorted_list = sorted(ip_host_list, key=lambda name: name[1]) context = { "sorted_list": sorted_list, "cname_host_list": cname_host_list, "sortby": sortby, "subnet_name": name, "subnet_info": subnet_info, "total_ips": total_ips, "total_registered_ips": total_registered_ips, "available_ips": available_ips, "proper_name": proper_name, } return render(request, "pdns/html.html", context)
def text_reverse(request, name): """ Displays data for reverse text view. Index redirects here. Generates IP list from model, reverses each IP in the list and appends the .in-addr.arpa suffix Returns direct response in plaintext format arguments: request: request object name: subnet name """ response = HttpResponse(content_type="text/plain") if not Mapping.objects.filter(subnet_id=name): response.write("ERROR: NO SUBNET WITH NAME: %s FOUND textreverse" % name) else: mapping = Mapping.objects.filter(subnet_id=name) unsorted_ip_list = [] for obj in mapping: if pylib.is_valid_ip(obj.ip_or_cname): unsorted_ip_list.append(obj.ip_or_cname) sorted_ip_list = sorted(unsorted_ip_list, key=lambda octet: socket.inet_aton(octet)) header = pylib.get_header("@") response.write(header) for ip in sorted_ip_list: reversed_ip = pylib.reverse_ip(ip) # obj = Mapping.objects.get(ip_or_cname = ip) objs = Mapping.objects.filter(ip_or_cname=ip) for obj in objs: subnet_model = Subnet.objects.get(subnet_name=str(obj.subnet_id)) response.write( "{0:<30}{1}".format( reversed_ip + ".in-addr.arpa.", "IN\tPTR\t" + obj.hostname + "." + subnet_model.domain + ".\n" ) ) return response
def modify_all(request, name): """ Creates formset and populates data for modify_all page Records the changes that are made as appropriate """ pylib.backup_database() MappingModelFormSet = modelformset_factory(Mapping, form=ModifyAllForm, can_delete=True, extra=0) if request.method == "POST": deletions = [] modifications = [] formset = MappingModelFormSet(request.POST) if formset.is_valid(): for form in formset: # Adds the subnet name and sets the record_type for each database entry modified_data = form.save(commit=False) modified_data.subnet_id = name if not pylib.is_valid_ip(modified_data.ip_or_cname): modified_data.record_type = "CNAME" if form.changed_data and form not in formset.deleted_forms: modifications.append( "%s, %s, %s" % (modified_data.record_type, modified_data.ip_or_cname, modified_data.hostname) ) modified_data.save() deletions += pylib.remove_dependent_cnames(name, formset.deleted_forms) formset.save() # Have to call this in 1.6 in order to delete the selected forms modifications, deletions = remove_mod_message_for_deleted(modifications, deletions) add_messages(request, deletions, "del") add_messages(request, modifications, "mod") domain_name = Subnet.objects.filter(subnet_name=name)[0].domain save_success = pylib.write_domain_zone_file(domain_name, name) if not save_success: messages.error(request, "ERROR: THE ZONE FILE DID NOT PASS NAMED-CHECKZONE. NO CHANGES SAVED") pylib.restore_database() return HttpResponseRedirect("/privatedns/index/error/") CHANGELOG.save(request) return HttpResponseRedirect("/privatedns/index/summary/") else: print formset.errors else: formset = MappingModelFormSet(queryset=Mapping.objects.filter(subnet=name)) proper_name_obj = Subnet.objects.get(subnet_name=name) proper_name = proper_name_obj.proper_name context = {"formset": formset, "subnet_name": name, "proper_name": proper_name} return render(request, "pdns/modify_all.html", context)
def add_new(request, name, number): """ Creates formset and data for new entry page. Will create the selected number of new forms for new entries arguments: request: request object name: subnet_name number: number of new entry forms to create """ pylib.backup_database() MappingFormSet = formset_factory(MappingForm, extra=int(number), formset=RequiredFormSet) if request.method == "POST": additions = [] formset = MappingFormSet(request.POST) if formset.is_valid(): for form in formset: new_entry = form.save(commit=False) new_entry.subnet_id = name if new_entry.ip_or_cname == "": new_entry.ip_or_cname = pylib.get_available_ip(name) if not pylib.is_valid_ip(new_entry.ip_or_cname): new_entry.record_type = "CNAME" additions.append("%s, %s, %s" % (new_entry.record_type, new_entry.ip_or_cname, new_entry.hostname)) new_entry.save() add_messages(request, additions, "add") print "name=", name domain_name = Subnet.objects.filter(subnet_name=name)[0].domain save_success = pylib.write_domain_zone_file(domain_name, name) if not save_success: messages.error(request, "ERROR: THE ZONE FILE DID NOT PASS NAMED-CHECKZONE. NO CHANGES SAVED") pylib.restore_database() return HttpResponseRedirect("/privatedns/index/error/") CHANGELOG.save(request) return HttpResponseRedirect("/privatedns/index/summary/") else: print formset.errors else: formset = MappingFormSet() proper_name_obj = Subnet.objects.get(subnet_name=name) proper_name = proper_name_obj.proper_name context = {"formset": formset, "subnet_name": name, "number": number, "proper_name": proper_name} return render(request, "pdns/add_new.html", context)
def mod_single_record(request, name, record): """ Creates the form and populates the data for a single selected entry """ pylib.backup_database() RecordModelFormSet = modelformset_factory(Mapping, form=RecordForm, can_delete=True, extra=0) if request.method == "POST": deletions = [] modifications = [] formset = RecordModelFormSet(request.POST) if formset.is_valid(): for form in formset: modified_data = form.save(commit=False) modified_data.subnet_id = name if not pylib.is_valid_ip(modified_data.ip_or_cname): modified_data.record_type = "CNAME" modifications.append( "%s, %s, %s" % (modified_data.record_type, modified_data.ip_or_cname, modified_data.hostname) ) modified_data.save() deletions += pylib.remove_dependent_cnames(name, formset.deleted_forms) formset.save() # FYI - when testing, use a valid IP format. is_valid() will change the record_type to CNAME if not and you get an error when save() cant delete the obj modifications, deletions = remove_mod_message_for_deleted(modifications, deletions) add_messages(request, deletions, "del") add_messages(request, modifications, "mod") domain_name = Subnet.objects.filter(subnet_name=name)[0].domain save_success = pylib.write_domain_zone_file(domain_name, name) if not save_success: messages.error(request, "ERROR: THE ZONE FILE DID NOT PASS NAMED-CHECKZONE. NO CHANGES SAVED") pylib.restore_database() return HttpResponseRedirect("/privatedns/index/error/") CHANGELOG.save(request) return HttpResponseRedirect("/privatedns/index/summary/") else: print formset.errors else: formset = RecordModelFormSet(queryset=Mapping.objects.filter(hostname=record)) proper_name_obj = Subnet.objects.get(subnet_name=name) proper_name = proper_name_obj.proper_name context = {"formset": formset, "subnet_name": name, "record": record, "proper_name": proper_name} return render(request, "pdns/modify_single_record.html", context)
def html_ip(request, name): """ Displays the sorted by IP data in html format. (NOTE: should combine this into one function with html_ name) Collects IPs and CNAMES from the model and sorts them Returns render with sorted_ip list, sorted_cname list, sort_by order, subnet name, subnet_info, total_ips, total_registered_ips, available_ips, proper name (This info is created in pylib.py and used in the header of the page to render) arguments: request: request object name: subnet name """ sortby = "ip" subnet_info = Subnet.objects.get(subnet_name=name) proper_name = subnet_info.proper_name mapping = Mapping.objects.filter(subnet_id=name) ip_host_list = [] cname_host_list = [] for obj in mapping: if pylib.is_valid_ip(obj.ip_or_cname): ip_host_list.append((obj.ip_or_cname, obj.hostname)) else: cname_host_list.append((obj.hostname, obj.ip_or_cname)) total_ips = pylib.determine_total_num_ips(subnet_info.ip_range_start, subnet_info.ip_range_end) total_registered_ips = len(ip_host_list) available_ips = total_ips - total_registered_ips sorted_list = sorted(ip_host_list, key=lambda octet: socket.inet_aton(octet[0])) context = { "sorted_list": sorted_list, "cname_host_list": cname_host_list, "sortby": sortby, "subnet_name": name, "subnet_info": subnet_info, "total_ips": total_ips, "total_registered_ips": total_registered_ips, "available_ips": available_ips, "proper_name": proper_name, } return render(request, "pdns/html.html", context)
def text(request, name): """ Displays data for forward text view. Index redirects here. Generates IP/CNAME lists from models and sorts them Returns direct response in plain text format arguments: request: request object name: subnet name """ response = HttpResponse(content_type="text/plain") if not Mapping.objects.filter(subnet_id=name): response.write("ERROR: NO SUBNET WITH NAME: %s FOUND text" % name) else: mapping = Mapping.objects.filter(subnet_id=name) unsorted_ip_list = [] unsorted_cname_list = [] for obj in mapping: if not pylib.is_valid_ip(obj.ip_or_cname): unsorted_cname_list.append(obj.ip_or_cname) else: unsorted_ip_list.append(obj.ip_or_cname) sorted_ip_list = sorted(unsorted_ip_list, key=lambda octet: socket.inet_aton(octet)) sorted_cname_list = sorted(unsorted_cname_list) prevent_dupes = [] # Prevents cnames that point to the same hostname from appearing more than once each for cname in sorted_cname_list: mapping_objs = Mapping.objects.filter(ip_or_cname=cname) for obj in mapping_objs: if "%s,%s" % (obj.hostname, cname) not in prevent_dupes: response.write("%s\t%s\t\t%s\n" % (obj.record_type, obj.hostname, cname)) prevent_dupes.append("%s,%s" % (obj.hostname, cname)) for ip in sorted_ip_list: # obj = Mapping.objects.get(ip_or_cname = ip) objs = Mapping.objects.filter(ip_or_cname=ip) for obj in objs: response.write("%s\t%s\t\t%s\n" % (obj.record_type, ip, obj.hostname)) return response