diff options
author | Michael Elkins <melkins@tislabs.com> | 2012-01-17 05:02:46 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2012-01-17 05:02:46 +0000 |
commit | 56d2ec46c6b87e5fab0add0f5668cba58cddf05d (patch) | |
tree | 5b9005cd57f4fba12e6c896f6bcd70e34202527c /rpkid/rpki | |
parent | 133939aa88fef6dc0e9b4a2aecf337139628aa28 (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.py | 5 | ||||
-rw-r--r-- | rpkid/rpki/gui/models.py | 91 | ||||
-rw-r--r-- | rpkid/rpki/gui/routeview/models.py | 68 |
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 |