aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-17 05:02:46 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-17 05:02:46 +0000
commit56d2ec46c6b87e5fab0add0f5668cba58cddf05d (patch)
tree5b9005cd57f4fba12e6c896f6bcd70e34202527c /rpkid/rpki
parent133939aa88fef6dc0e9b4a2aecf337139628aa28 (diff)
updated routeviews data handling
refactor common IP range tables into rpki.gui.models. rework import script to load data into a staging table and swap with the active table upon completion. use separate tables for v4 and v6. svn path=/branches/tk161/; revision=4163
Diffstat (limited to 'rpkid/rpki')
-rw-r--r--rpkid/rpki/gui/app/views.py5
-rw-r--r--rpkid/rpki/gui/models.py91
-rw-r--r--rpkid/rpki/gui/routeview/models.py68
3 files changed, 101 insertions, 63 deletions
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index a29ecba2..4e89dcda 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -918,7 +918,10 @@ def route_view(request):
for p in models.AddressRange.objects.filter(from_cert__parent__in=handle.parents.all()):
r = p.as_resource_range()
print >>log, 'querying for routes matching %s' % r
- qs = rpki.gui.routeview.models.RouteOrigin.objects.filter(family=4, prefix_min__gte=r.min, prefix_max__lte=r.max)
+ if isinstance(r, rpki.resource_set.resource_range_ipv6):
+ print >>log, 'skipping ipv6 address: %s' % r
+ continue
+ qs = rpki.gui.routeview.models.RouteOrigin.objects.filter(prefix_min__gte=r.min, prefix_max__lte=r.max)
for obj in qs:
# determine the validation status of each route
obj.status_label = 'warning'
diff --git a/rpkid/rpki/gui/models.py b/rpkid/rpki/gui/models.py
new file mode 100644
index 00000000..323d43e6
--- /dev/null
+++ b/rpkid/rpki/gui/models.py
@@ -0,0 +1,91 @@
+# Common classes for resuse in apps
+
+import struct
+
+from django.db import models
+
+import rpki.resource_set
+import rpki.ipaddrs
+
+class IPv6AddressField(models.Field):
+ "Field large enough to hold a 128-bit unsigned integer."
+
+ __metaclass__ = models.SubfieldBase
+
+ def db_type(self, connection):
+ return 'binary(16)'
+
+ def to_python(self, value):
+ if isinstance(value, rpki.ipaddrs.v6addr):
+ return value
+ x = struct.unpack('!QQ', value)
+ return rpki.ipaddrs.v6addr((x[0] << 64) | x[1])
+
+ def get_db_prep_value(self, value, connection, prepared):
+ return struct.pack('!QQ', (long(value) >> 64) & 0xFFFFFFFFFFFFFFFFL, long(value) & 0xFFFFFFFFFFFFFFFFL)
+
+class IPv4AddressField(models.Field):
+ "Wrapper around rpki.ipaddrs.v4addr."
+
+ __metaclass__ = models.SubfieldBase
+
+ def db_type(self, connection):
+ return 'int UNSIGNED'
+
+ def to_python(self, value):
+ if isinstance(value, rpki.ipaddrs.v4addr):
+ return value
+ return rpki.ipaddrs.v4addr(value)
+
+ def get_db_prep_value(self, value, connection, prepared):
+ return long(value)
+
+class Prefix(models.Model):
+ """Common implementation for models with an IP address range.
+
+ Expects that `range_cls` is set to the appropriate subclass of
+ rpki.resource_set.resource_range_ip."""
+
+ def as_resource_range(self):
+ """
+ Returns the prefix as a rpki.resource_set.resource_range_ip object.
+ """
+ return self.range_cls(self.prefix_min, self.prefix_max)
+
+ def prefixlen(self):
+ "Returns the prefix length for the prefix in this object."
+ return self.as_range().prefixlen()
+
+ def get_prefix_display(self):
+ "Returns a string version of the prefix in this object."
+ return str(self.as_resource_range())
+
+ class Meta:
+ abstract = True
+
+ # default sort order reflects what "sh ip bgp" outputs
+ ordering = ('prefix_min',)
+
+class PrefixV4(Prefix):
+ "IPv4 Prefix."
+
+ range_cls = rpki.resource_set.resource_range_ipv4
+
+ prefix_min = IPv4AddressField(db_index=True, null=False)
+ prefix_max = IPv4AddressField(db_index=True, null=False)
+
+ class Meta:
+ abstract = True
+
+class PrefixV6(Prefix):
+ "IPv6 Prefix."
+
+ range_cls = rpki.resource_set.resource_range_ipv6
+
+ prefix_min = IPv6AddressField(db_index=True, null=False)
+ prefix_max = IPv6AddressField(db_index=True, null=False)
+
+ class Meta:
+ abstract = True
+
+# vim:sw=4 ts=8 expandtab
diff --git a/rpkid/rpki/gui/routeview/models.py b/rpkid/rpki/gui/routeview/models.py
index 4bb6eef5..99dd0297 100644
--- a/rpkid/rpki/gui/routeview/models.py
+++ b/rpkid/rpki/gui/routeview/models.py
@@ -1,68 +1,12 @@
-import binascii
+import django.db.models
+import rpki.gui.models
-from django.db import models
-
-import rpki
-import rpki.resource_set
-import rpki.ipaddrs
-
-class PositiveHugeIntegerField(models.Field):
-
- description = "Represents a 128-bit unsigned integer."
-
- __metaclass__ = models.SubfieldBase
-
- def db_type(self, connection):
- if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql':
- return 'binary(16)'
- return 'blob'
-
- def to_python(self, value):
- if isinstance(value, int):
- return long(value)
- if isinstance(value, long):
- return value
- return long(binascii.hexlify(value), 16)
-
- def get_db_prep_value(self, value, connection, prepared=False):
- return binascii.unhexlify('%032x' % value)
-
-class RouteOrigin(models.Model):
-
- asn = models.PositiveIntegerField(help_text='origin AS')
- family = models.PositiveSmallIntegerField(help_text='IP version')
-
- # address stored as unsigned integer to faciliate lookups
- prefix_min = PositiveHugeIntegerField()
- prefix_max = PositiveHugeIntegerField()
-
- def as_range(self):
- """
- Returns the prefix as a rpki.resource_set.resource_range_ip object.
- """
- cls = rpki.resource_set.resource_range_ipv4 if self.family == 4 else rpki.resource_set.resource_range_ipv6
- ipcls = rpki.ipaddrs.v4addr if self.family == 4 else rpki.ipaddrs.v6addr
- return cls(ipcls(self.prefix_min), ipcls(self.prefix_max))
-
- def get_prefix_display(self):
- """
- Returns a string version of the prefix in the routing entry.
- """
- return str(self.as_range())
-
- def prefixlen(self):
- """
- Returns the prefix length for this route object.
- """
- return self.as_range().prefixlen()
+class RouteOrigin(rpki.gui.models.PrefixV4):
+ "Represents a BGP routing table entry."
+ asn = django.db.models.PositiveIntegerField(help_text='origin AS', null=False)
+
def __unicode__(self):
return u"AS%d's route origin for %s" % (self.asn, self.get_prefix_display())
- class Meta:
- # sort order reflects what "sh ip bgp" outputs
- ordering = ( 'family', 'prefix_min', 'prefix_max', 'asn' )
-
- unique_together = ('family', 'asn', 'prefix_min', 'prefix_max')
-
# vim:sw=4 ts=8 expandtab