Importing data
This commit is contained in:
parent
ed5fee0b13
commit
ecec36aa3d
|
@ -0,0 +1,111 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import django
|
||||||
|
import ipaddress
|
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dnmgmt.settings")
|
||||||
|
sys.path.append("..")
|
||||||
|
django.setup()
|
||||||
|
|
||||||
|
|
||||||
|
from whoisdb.models import ASBlock, ASNumber, Contact, Maintainer, InetNum
|
||||||
|
|
||||||
|
__VERSION__ = '0.1'
|
||||||
|
|
||||||
|
def _parser():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
#prog='foo',
|
||||||
|
#description='do some awesome foo',
|
||||||
|
)
|
||||||
|
|
||||||
|
#parser.add_argument("-p", "--port", default=2323, type=int, help="Your port")
|
||||||
|
#parser.add_argument("-v", "--verbose", default=False, action="store_true", help="Be more verbose")
|
||||||
|
parser.add_argument("-j", "--json", type=argparse.FileType('r'), required=True, help="Path to json file")
|
||||||
|
|
||||||
|
parser.add_argument("--version", action="version", version="%(prog)s " + __VERSION__)
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = _parser()
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
defContact = Contact.objects.get(handle="DURC1-DN")
|
||||||
|
defContact
|
||||||
|
defMnt = Maintainer.objects.get(handle="DARK1-MNT")
|
||||||
|
blocks = [
|
||||||
|
ASBlock.objects.get(handle="TRA1-ASB"),
|
||||||
|
ASBlock.objects.get(handle="UAB1-ASB")
|
||||||
|
]
|
||||||
|
ASNumber
|
||||||
|
|
||||||
|
|
||||||
|
data = json.load(args.json)
|
||||||
|
print(data.keys())
|
||||||
|
for k, v in data["handles"].items():
|
||||||
|
print(k, v["person"])
|
||||||
|
for asn in data["as"]:
|
||||||
|
print(asn)
|
||||||
|
if ASNumber.objects.filter(number=asn["number"]).count() > 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
obj = ASNumber(number=asn["number"])
|
||||||
|
block = None
|
||||||
|
for block in blocks:
|
||||||
|
if obj.number >= block.asBegin and obj.number <= block.asEnd:
|
||||||
|
obj.asblock = block
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise ValueError("AS %d does not fit a block" % asn["number"])
|
||||||
|
|
||||||
|
if len(asn['admin_c']) >= 1:
|
||||||
|
name = data["handles"][asn["admin_c"][0]]["person"]
|
||||||
|
obj.name = "Imported AS from %s" % name
|
||||||
|
obj.handle = ASNumber.genGenericHandle(re.sub("[^a-zA-Z0-9 ]", "", name))
|
||||||
|
else:
|
||||||
|
obj.name = "Imported AS without admin info"
|
||||||
|
obj.handle = ASNumber.genGenericHandle("Unknown Imported AS")
|
||||||
|
obj.description = "Object has been imported from old DB and has not yet been edited"
|
||||||
|
obj.save()
|
||||||
|
obj.mnt_by.add(defMnt)
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
for net in data["network"]:
|
||||||
|
print(net)
|
||||||
|
network = ipaddress.ip_network(net["prefix"])
|
||||||
|
|
||||||
|
if InetNum.objects.filter(address=str(network.network_address), netmask=network.prefixlen).count() > 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
origin = None
|
||||||
|
if net["origin"]:
|
||||||
|
origin = ASNumber.objects.get(number=net["origin"])
|
||||||
|
obj = InetNum(address=str(network.network_address), netmask=network.prefixlen)
|
||||||
|
obj.protocol = InetNum.IPv4 if network.version == 4 else InetNum.IPv6
|
||||||
|
|
||||||
|
x = list(filter(lambda _x: _x['number'] == net["origin"], data["as"]))
|
||||||
|
if len(x) > 0 and x[0]["admin_c"]:
|
||||||
|
name = data["handles"][x[0]["admin_c"][0]]["person"]
|
||||||
|
obj.name = "Imported Network from %s" % name
|
||||||
|
obj.handle = InetNum.genGenericHandle(re.sub("[^a-zA-Z0-9 ]", "", name))
|
||||||
|
else:
|
||||||
|
obj.name = "Imported Network without admin info"
|
||||||
|
obj.handle = InetNum.genGenericHandle("Unknown Imported Network")
|
||||||
|
obj.description = "Object has been imported from old DB and has not yet been edited"
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
obj.mnt_by.add(defMnt)
|
||||||
|
if origin:
|
||||||
|
obj.origin_as.add(origin)
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -6,7 +6,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ obj|linkObject }}</td>
|
<td>{{ obj|linkObject }}</td>
|
||||||
<td>{{ objType }}</td>
|
<td>{{ objType }}</td>
|
||||||
<td>{{ obj.name }}{{ obj.description }}</td>
|
<td>{{ obj.name }}{% if obj.name and obj.description %} / {% endif %}{{ obj.description }}</td>
|
||||||
<td>{{ obj.getResource|default:"-" }}</td>
|
<td>{{ obj.getResource|default:"-" }}</td>
|
||||||
<td>{{ obj.mnt_by.all|linkObjects|default:"-" }}{% if obj.mnt_lower.all %} / lower: {{ obj.mnt_lower.all|linkObjects }}{% endif %}</td>
|
<td>{{ obj.mnt_by.all|linkObjects|default:"-" }}{% if obj.mnt_lower.all %} / lower: {{ obj.mnt_lower.all|linkObjects }}{% endif %}</td>
|
||||||
<td>{{ obj.admin_c.all|linkObjects }}</td>
|
<td>{{ obj.admin_c.all|linkObjects }}</td>
|
||||||
|
|
|
@ -116,7 +116,7 @@ class InetNumForm(MntFormMixin, WhoisObjectFormMixin, forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InetNum
|
model = InetNum
|
||||||
fields = ['handle', 'protocol', 'parent_range', 'prefix', 'name', 'description', 'mnt_by', 'mnt_lower', 'admin_c']
|
fields = ['handle', 'protocol', 'parent_range', 'prefix', 'name', 'description', 'origin_as', 'mnt_by', 'mnt_lower', 'admin_c']
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(InetNumForm, self).__init__(*args, **kwargs)
|
super(InetNumForm, self).__init__(*args, **kwargs)
|
||||||
|
@ -132,6 +132,7 @@ class InetNumForm(MntFormMixin, WhoisObjectFormMixin, forms.ModelForm):
|
||||||
|
|
||||||
#self.fields['parent_range'].queryset = self.fields['parent_range'].queryset.distinct()
|
#self.fields['parent_range'].queryset = self.fields['parent_range'].queryset.distinct()
|
||||||
self.fields['parent_range'].queryset = InetNum.getMntQueryset(mnts, self.instance, "parent_range")
|
self.fields['parent_range'].queryset = InetNum.getMntQueryset(mnts, self.instance, "parent_range")
|
||||||
|
self.fields['origin_as'].queryset = ASNumber.getMntQueryset(mnts, self.instance, "origin_as")
|
||||||
|
|
||||||
def clean_prefix(self):
|
def clean_prefix(self):
|
||||||
# make sure this is a subnet we're getting
|
# make sure this is a subnet we're getting
|
||||||
|
@ -148,6 +149,9 @@ class InetNumForm(MntFormMixin, WhoisObjectFormMixin, forms.ModelForm):
|
||||||
def clean_parent_range(self):
|
def clean_parent_range(self):
|
||||||
parent_range = self.cleaned_data.get('parent_range', None)
|
parent_range = self.cleaned_data.get('parent_range', None)
|
||||||
|
|
||||||
|
if parent_range.origin_as.count() > 0:
|
||||||
|
raise forms.ValidationError("Parent range has origin as set")
|
||||||
|
|
||||||
# allow parent range to be unset for already present objects
|
# allow parent range to be unset for already present objects
|
||||||
if not parent_range and (self._create or not self._create and self.instance.parent_range):
|
if not parent_range and (self._create or not self._create and self.instance.parent_range):
|
||||||
raise forms.ValidationError("Parent range must be set")
|
raise forms.ValidationError("Parent range must be set")
|
||||||
|
@ -167,9 +171,15 @@ class InetNumForm(MntFormMixin, WhoisObjectFormMixin, forms.ModelForm):
|
||||||
|
|
||||||
if not self._editLower:
|
if not self._editLower:
|
||||||
if not self.errors:
|
if not self.errors:
|
||||||
|
if not self._create and self.cleaned_data['origin_as']:
|
||||||
|
if self.instance.inetnum_set.count() > 0:
|
||||||
|
ranges = ", ".join(map(str, self.instance.inetnum_set.all()))
|
||||||
|
raise forms.ValidationError("You cannot set an origin as if there are already existing subranges (%s)" % (ranges))
|
||||||
|
|
||||||
prefix = cleaned_data['prefix']
|
prefix = cleaned_data['prefix']
|
||||||
parent = cleaned_data['parent_range']
|
parent = cleaned_data['parent_range']
|
||||||
if parent:
|
if parent:
|
||||||
|
|
||||||
parentNet = parent.getNetwork()
|
parentNet = parent.getNetwork()
|
||||||
|
|
||||||
if cleaned_data['protocol'] != parent.protocol:
|
if cleaned_data['protocol'] != parent.protocol:
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-03-26 03:28
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0013_auto_20170303_1206'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='inetnum',
|
||||||
|
name='origin_as',
|
||||||
|
field=models.ManyToManyField(blank=True, to='whoisdb.ASNumber'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,19 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-03-26 22:20
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0014_inetnum_origin_as'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='inetnum',
|
||||||
|
unique_together=set([('address', 'netmask')]),
|
||||||
|
),
|
||||||
|
]
|
|
@ -222,6 +222,11 @@ class ASNumber(MntdObject):
|
||||||
|
|
||||||
|
|
||||||
class InetNum(MntdObject):
|
class InetNum(MntdObject):
|
||||||
|
class Meta:
|
||||||
|
unique_together = (
|
||||||
|
("address", "netmask"),
|
||||||
|
)
|
||||||
|
|
||||||
handleSuffix = "NET"
|
handleSuffix = "NET"
|
||||||
|
|
||||||
IPv4 = "ipv4"
|
IPv4 = "ipv4"
|
||||||
|
@ -234,6 +239,7 @@ class InetNum(MntdObject):
|
||||||
parent_range = models.ForeignKey("InetNum", models.CASCADE, null=True, blank=True, default=None)
|
parent_range = models.ForeignKey("InetNum", models.CASCADE, null=True, blank=True, default=None)
|
||||||
name = models.CharField(max_length=64)
|
name = models.CharField(max_length=64)
|
||||||
description = models.CharField(max_length=64, blank=True)
|
description = models.CharField(max_length=64, blank=True)
|
||||||
|
origin_as = models.ManyToManyField(ASNumber, blank=True)
|
||||||
admin_c = models.ManyToManyField("Contact")
|
admin_c = models.ManyToManyField("Contact")
|
||||||
|
|
||||||
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_inetnum_set', blank=True)
|
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_inetnum_set', blank=True)
|
||||||
|
|
Loading…
Reference in New Issue