Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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