aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/gui/routeview/models.py
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-17 05:02:19 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-17 05:02:19 +0000
commit1d69510295bae9ee87d810cd9c9f8ce716e9c847 (patch)
treed4493f9b3031df6635e39159c659b11ee77626b4 /rpkid/rpki/gui/routeview/models.py
parent223102db50c00b931bd40e3e9af0b407d345517d (diff)
import initial cut at rpki.gui.routeview app
svn path=/branches/tk161/; revision=4159
Diffstat (limited to 'rpkid/rpki/gui/routeview/models.py')
-rw-r--r--rpkid/rpki/gui/routeview/models.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/rpkid/rpki/gui/routeview/models.py b/rpkid/rpki/gui/routeview/models.py
new file mode 100644
index 00000000..411f4876
--- /dev/null
+++ b/rpkid/rpki/gui/routeview/models.py
@@ -0,0 +1,68 @@
+import binascii
+
+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', db_index=True)
+ family = models.PositiveSmallIntegerField(help_text='IP version')
+
+ # address stored as unsigned integer to faciliate lookups
+ prefix_min = PositiveHugeIntegerField(db_index=True)
+ prefix_max = PositiveHugeIntegerField(db_index=True)
+
+ 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()
+
+ 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 = ( 'prefix_min', 'prefix_max', 'asn' )
+
+ unique_together = ('asn', 'prefix_min', 'prefix_max')
+
+# vim:sw=4 ts=8 expandtab