def do_combine_a_ptr_to_interface(
        addr, ptr, system, mac_address=None,
        interface=None, dhcp_hostname=None,
        dhcp_domain_name=None, dhcp_domain_name_servers=None,
        dhcp_filename=None):

    if mac_address == '00:00:00:00:00:00' or mac_address is None:
        system.get_next_key_value_adapter()
    if (addr.ip_str != ptr.ip_str or addr.fqdn != ptr.name or
            addr.ip_type != ptr.ip_type):
        raise ValidationError("This A and PTR have different data.")

    intr = StaticInterface(
        label=addr.label, mac=mac_address, domain=addr.domain,
        ip_str=addr.ip_str, ip_type=addr.ip_type, system=system)
    addr_deleted = False
    ptr_deleted = False

    addr.delete(check_cname=False)
    addr_deleted = True
    ptr.delete()
    ptr_deleted = True
    intr.full_clean()
    intr.save()
    if interface:
        from api_v3.system_api import SystemResource
        intr.update_attrs()
        adapter_type, primary, alias = SystemResource.extract_nic_attrs(
            interface)
        intr.attrs.primary = primary
        intr.attrs.alias = alias
        intr.attrs.interface_type = adapter_type
        if dhcp_hostname:
            intr.attrs.hostname = dhcp_hostname

        if dhcp_filename:
            intr.attrs.filename = dhcp_filename

        if dhcp_domain_name:
            intr.attrs.domain_name = dhcp_domain_name

        if dhcp_domain_name_servers:
            intr.attrs.domain_name_servers = dhcp_domain_name_servers

    return intr, addr_deleted, ptr_deleted
    def test2(self):
        ip_start = "10.0.1.0"
        ip_end = "10.0.1.99"
        ptr = PTR(name="foo.mz", ip_str="10.0.1.3", ip_type='4')
        ptr.full_clean()
        ptr.save()

        a = AddressRecord(label="foo", domain=self.domain, ip_str="10.0.1.3",
                          ip_type='4')
        a.full_clean()
        a.save()

        s = System()
        s.save()
        intr = StaticInterface(
            label="foo", domain=self.domain, ip_str="10.0.1.4",
            ip_type='4', system=s, mac="00:11:22:33:44:55")
        intr.full_clean()
        intr.save()

        istart, iend, ipf_q = start_end_filter(ip_start, ip_end, '4')
        addrs = list(AddressRecord.objects.filter(ipf_q).
                     order_by('ip_lower').order_by('ip_upper'))
        ptrs = list(PTR.objects.filter(ipf_q).
                    order_by('ip_lower').order_by('ip_upper'))
        intrs = list(StaticInterface.objects.filter(ipf_q).
                     order_by('ip_lower').order_by('ip_upper'))
        self.assertEqual(a.pk, addrs[0].pk)
        self.assertEqual(ptr.pk, ptrs[0].pk)
        self.assertEqual(intr.pk, intrs[0].pk)

        range_details = range_usage(ip_start, ip_end, '4')
        self.assertEqual(98, range_details['unused'])
        self.assertEqual(2, range_details['used'])
        self.assertEqual([(int(istart) + 0, int(istart) + 2),
                          (int(istart) + 5, int(istart) + 99)],
                         range_details['free_ranges'])
def main():
    for mrange in Range.objects.all():
        #if not str(mrange.network.site) == 'Phx1':
        #    continue
        print "Now starting on Range %s" % mrange
        attrs = mrange.rangekeyvalue_set.all()

        start_upper, start_lower = mrange.start_upper, mrange.start_lower
        end_upper, end_lower = mrange.end_upper, mrange.end_lower

        gt_start = Q(ip_upper=start_upper, ip_lower__gte=start_lower)
        gt_start = gt_start | Q(ip_upper__gte=start_upper)

        lt_end = Q(ip_upper=end_upper, ip_lower__lte=end_lower)
        lt_end = lt_end | Q(ip_upper__lte=end_upper)

        records = AddressRecord.objects.filter(gt_start, lt_end)
        ptrs = PTR.objects.filter(gt_start, lt_end)
        intrs = StaticInterface.objects.filter(gt_start, lt_end)

        range_data = []
        for i in range((start_upper << 64) + start_lower, (end_upper << 64) +
                end_lower - 1):
            taken = False
            adr_taken = None
            ip_str = str(ipaddr.IPv4Address(i))
            for record in records:
                if record.ip_lower == i:
                    adr_taken = record
                    break

            ptr_taken = None
            for ptr in ptrs:
                if ptr.ip_lower == i:
                    ptr_taken = ptr
                    break

            if ptr_taken and adr_taken:
                if ptr_taken.name == adr_taken.fqdn:
                    range_data.append(('A/PTR', ip_str, ptr_taken, adr_taken))
                else:
                    range_data.append(('PTR', ip_str, ptr_taken))
                    range_data.append(('A', ip_str, adr_taken))
                taken = True
            elif ptr_taken and not adr_taken:
                range_data.append(('PTR', ip_str, ptr_taken))
                taken = True
            elif not ptr_taken and adr_taken:
                range_data.append(('A', ip_str, adr_taken))
                taken = True

            for intr in intrs:
                if intr.ip_lower == i:
                    range_data.append(('Interface', ip_str, intr))
                    taken = True
                    break

            if taken == False:
                range_data.append((None, ip_str))
        client = Client()
        for bl in range_data:
            system_hostname = ''
            try:
                if bl[2].name:
                    #import pdb; pdb.set_trace()
                    intr_hostname = bl[2].name.replace(".mozilla.com", "")
                    system_hostname = intr_hostname
                #system = System.objects.get(hostname=intr_hostname)
                system = KeyValue.objects.filter(key__icontains='ipv4_address', value=bl[1])[0].system
                addr = AddressRecord.objects.get(pk=bl[3].pk)
                ptr = PTR.objects.get(pk=bl[2].pk)
                try:
                    first = True
                    while system.get_next_key_value_adapter():
                        adapter = system.get_next_key_value_adapter()
                        mac_address = adapter['mac_address']
                        num = adapter['num']
                        private = View.objects.get(name='private')
                        if 'nic' in adapter['name'] or 'eth' in adapter['name']:
                            interface = 'eth%s.0' % num
                        elif 'mgmt' in adapter['name']:
                            interface = 'mgmt%s.0' % num
                        else:
                            interface = 'eth%s.0' % num

                        if 'dhcp_hostname' in adapter:
                            dhcp_hostname = adapter['dhcp_hostname']
                        else:
                            dhcp_hostname = None

                        if 'dhcp_filename' in adapter:
                            dhcp_filename = adapter['dhcp_filename']
                        else:
                            dhcp_filename = None

                        if 'dhcp_domain_name_servers' in adapter:
                            dhcp_domain_name_servers = adapter['dhcp_domain_name_servers']
                        else:
                            dhcp_domain_name_servers = None

                        if 'dhcp_domain_name' in adapter:
                            dhcp_domain_name = adapter['dhcp_domain_name']
                        else:
                            dhcp_domain_name = None

                        if first:
                            intr, addr_del, ptr_del = do_combine_a_ptr_to_interface(
                                addr, ptr, system, mac_address,
                                interface, dhcp_hostname=dhcp_hostname,
                                dhcp_domain_name_servers=dhcp_domain_name_servers,
                                dhcp_domain_name=dhcp_domain_name, dhcp_filename=dhcp_filename)
                            intr.views.add(private)
                            intr.save()
                        else:
                            from api_v3.system_api import SystemResource
                            intr = StaticInterface(label=addr.label, mac=mac_address, domain=addr.domain,
                                    ip_str=addr.ip_str, ip_type=addr.ip_type, system=system)
                            intr.full_clean()
                            intr.dns_enabled = False
                            intr.dhcp_enabled = True
                            intr.save()
                            intr.update_attrs()
                            adapter_type, primary, alias = SystemResource.extract_nic_attrs(interface)
                            intr.attrs.primary = primary
                            intr.attrs.alias = alias
                            intr.attrs.interface_type = adapter_type

                        system.delete_key_value_adapter_by_index(num)
                        first = False
                        print "SUCCESS ===== %s" % system.hostname
                except IndexError:
                    ### We can't get the next adapter
                    pass
                except Exception, e:
                    print e
                    print "FAIL ===== %s - Could not get mac_address for" % system.hostname
                #client.post('/en-US/core/interface/combine_a_ptr_to_interface/%i/%i/' % (bl[3].pk, bl[2].pk), data={'is_ajax' : 1, 'system_hostname': bl[2].name.replace(".mozilla.com", "")})
            except IndexError, e:
                pass
            except System.DoesNotExist, e:
                print "FAIL ===== %s Host Not Found" % (system_hostname)
            except AttributeError, e:
                if str(e) == "'AddressRecord' object has no attribute 'name'":
                    #import pdb; pdb.set_trace()
                    try:
                        print "FAIL ===== %s - %s - %s" % (addr.ip_str, system_hostname, e)
                    except:
                        print "FAIL =====  %s - %s" % (system_hostname, e)
def quick_create(request, system_pk):
    # TODO, make sure the user has access to this system
    system = get_object_or_404(System, pk=system_pk)
    if request.method == 'POST':
        interface_form = StaticInterfaceQuickForm(request.POST)

        a, ptr, r = None, None, None
        if interface_form.is_valid():
            try:
                # mac = interface_form.cleaned_data['mac']
                if 'label' in interface_form.cleaned_data:
                    label = interface_form.cleaned_data['label']
                else:
                    label = ""
                mrange_pk = interface_form.cleaned_data['range']
                mrange = get_object_or_404(Range, pk=mrange_pk)
                network = mrange.network
                ip_type = network.ip_type
                vlan = network.vlan
                site = network.site

                networks = []
                for network in vlan.network_set.all():
                    if not network.site:
                        continue
                    if network.site.get_site_path() == site.get_site_path():
                        networks.append(network)
                if not networks:
                    raise ValidationError(
                        "No appropriate networks found. Consider adding this "
                        "interface manually.")

                ip = mrange.get_next_ip()
                if ip is None:
                    raise ValidationError(
                        "No appropriate IP found in {0} Vlan {1} Range {2} - "
                        "{3}. Consider adding this interface "
                        "manually.".format(site.name, vlan.name,
                        mrange.start_str, mrange.end_str))

                expected_name = "{0}.{1}.mozilla.com".format(
                    vlan.name, site.get_site_path())
                print "Expected name {0}".format(expected_name)
                try:
                    domain = Domain.objects.get(name=expected_name)
                except ObjectDoesNotExist, e:
                    raise ValidationError(
                        "The domain '{0}' doesn't seem to exist. Consider "
                        "creating this interface manually.".
                        format(expected_name))

                intr = StaticInterface(label=label, domain=domain,
                                       ip_str=str(ip),
                                       # ip_type=ip_type, mac=mac,
                                       # system=system)
                                       ip_type=ip_type, system=system)
                intr.full_clean()
                intr.save()
            except ValidationError, e:
                interface_form._errors['__all__'] = ErrorList(e.messages)
                return render(request, 'static_intr/static_intr_form.html', {
                    'form': interface_form,
                    'form_title': "Quick Interface Create for System "
                    "{0}".format(system)
                })
Exemple #5
0
def main():
    for mrange in Range.objects.all():
        #if not str(mrange.network.site) == 'Phx1':
        #    continue
        print "Now starting on Range %s" % mrange
        attrs = mrange.rangekeyvalue_set.all()

        start_upper, start_lower = mrange.start_upper, mrange.start_lower
        end_upper, end_lower = mrange.end_upper, mrange.end_lower

        gt_start = Q(ip_upper=start_upper, ip_lower__gte=start_lower)
        gt_start = gt_start | Q(ip_upper__gte=start_upper)

        lt_end = Q(ip_upper=end_upper, ip_lower__lte=end_lower)
        lt_end = lt_end | Q(ip_upper__lte=end_upper)

        records = AddressRecord.objects.filter(gt_start, lt_end)
        ptrs = PTR.objects.filter(gt_start, lt_end)
        intrs = StaticInterface.objects.filter(gt_start, lt_end)

        range_data = []
        for i in range((start_upper << 64) + start_lower,
                       (end_upper << 64) + end_lower - 1):
            taken = False
            adr_taken = None
            ip_str = str(ipaddr.IPv4Address(i))
            for record in records:
                if record.ip_lower == i:
                    adr_taken = record
                    break

            ptr_taken = None
            for ptr in ptrs:
                if ptr.ip_lower == i:
                    ptr_taken = ptr
                    break

            if ptr_taken and adr_taken:
                if ptr_taken.name == adr_taken.fqdn:
                    range_data.append(('A/PTR', ip_str, ptr_taken, adr_taken))
                else:
                    range_data.append(('PTR', ip_str, ptr_taken))
                    range_data.append(('A', ip_str, adr_taken))
                taken = True
            elif ptr_taken and not adr_taken:
                range_data.append(('PTR', ip_str, ptr_taken))
                taken = True
            elif not ptr_taken and adr_taken:
                range_data.append(('A', ip_str, adr_taken))
                taken = True

            for intr in intrs:
                if intr.ip_lower == i:
                    range_data.append(('Interface', ip_str, intr))
                    taken = True
                    break

            if taken == False:
                range_data.append((None, ip_str))
        client = Client()
        for bl in range_data:
            system_hostname = ''
            try:
                if bl[2].name:
                    #import pdb; pdb.set_trace()
                    intr_hostname = bl[2].name.replace(".mozilla.com", "")
                    system_hostname = intr_hostname
                #system = System.objects.get(hostname=intr_hostname)
                system = KeyValue.objects.filter(key__icontains='ipv4_address',
                                                 value=bl[1])[0].system
                addr = AddressRecord.objects.get(pk=bl[3].pk)
                ptr = PTR.objects.get(pk=bl[2].pk)
                try:
                    first = True
                    while system.get_next_key_value_adapter():
                        adapter = system.get_next_key_value_adapter()
                        mac_address = adapter['mac_address']
                        num = adapter['num']
                        private = View.objects.get(name='private')
                        if 'nic' in adapter['name'] or 'eth' in adapter['name']:
                            interface = 'eth%s.0' % num
                        elif 'mgmt' in adapter['name']:
                            interface = 'mgmt%s.0' % num
                        else:
                            interface = 'eth%s.0' % num

                        if 'dhcp_hostname' in adapter:
                            dhcp_hostname = adapter['dhcp_hostname']
                        else:
                            dhcp_hostname = None

                        if 'dhcp_filename' in adapter:
                            dhcp_filename = adapter['dhcp_filename']
                        else:
                            dhcp_filename = None

                        if 'dhcp_domain_name_servers' in adapter:
                            dhcp_domain_name_servers = adapter[
                                'dhcp_domain_name_servers']
                        else:
                            dhcp_domain_name_servers = None

                        if 'dhcp_domain_name' in adapter:
                            dhcp_domain_name = adapter['dhcp_domain_name']
                        else:
                            dhcp_domain_name = None

                        if first:
                            intr, addr_del, ptr_del = do_combine_a_ptr_to_interface(
                                addr,
                                ptr,
                                system,
                                mac_address,
                                interface,
                                dhcp_hostname=dhcp_hostname,
                                dhcp_domain_name_servers=
                                dhcp_domain_name_servers,
                                dhcp_domain_name=dhcp_domain_name,
                                dhcp_filename=dhcp_filename)
                            intr.views.add(private)
                            intr.save()
                        else:
                            from api_v3.system_api import SystemResource
                            intr = StaticInterface(label=addr.label,
                                                   mac=mac_address,
                                                   domain=addr.domain,
                                                   ip_str=addr.ip_str,
                                                   ip_type=addr.ip_type,
                                                   system=system)
                            intr.full_clean()
                            intr.dns_enabled = False
                            intr.dhcp_enabled = True
                            intr.save()
                            intr.update_attrs()
                            adapter_type, primary, alias = SystemResource.extract_nic_attrs(
                                interface)
                            intr.attrs.primary = primary
                            intr.attrs.alias = alias
                            intr.attrs.interface_type = adapter_type

                        system.delete_key_value_adapter_by_index(num)
                        first = False
                        print "SUCCESS ===== %s" % system.hostname
                except IndexError:
                    ### We can't get the next adapter
                    pass
                except Exception, e:
                    print e
                    print "FAIL ===== %s - Could not get mac_address for" % system.hostname
                #client.post('/en-US/core/interface/combine_a_ptr_to_interface/%i/%i/' % (bl[3].pk, bl[2].pk), data={'is_ajax' : 1, 'system_hostname': bl[2].name.replace(".mozilla.com", "")})
            except IndexError, e:
                pass
            except System.DoesNotExist, e:
                print "FAIL ===== %s Host Not Found" % (system_hostname)
            except AttributeError, e:
                if str(e) == "'AddressRecord' object has no attribute 'name'":
                    #import pdb; pdb.set_trace()
                    try:
                        print "FAIL ===== %s - %s - %s" % (addr.ip_str,
                                                           system_hostname, e)
                    except:
                        print "FAIL =====  %s - %s" % (system_hostname, e)