aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-17 23:14:25 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-17 23:14:25 +0000
commitad1726391005a4fdcd259652d4be65e3d08c0f6c (patch)
treeaee5594e96c0ed616e46b4b117940ce58c2673e0
parent78bbe0e95fcd066bf4aca587ff8d8ab1ac3a1a7b (diff)
merge with ^/branches/tk100
svn path=/branches/tk161/; revision=4211
-rw-r--r--rpkid/rpki/irdb/models.py40
-rw-r--r--rpkid/rpki/irdbd.py20
-rw-r--r--rpkid/rpki/resource_set.py23
-rw-r--r--rpkid/rpki/rpkic.py22
4 files changed, 80 insertions, 25 deletions
diff --git a/rpkid/rpki/irdb/models.py b/rpkid/rpki/irdb/models.py
index 1add3593..ba6708a3 100644
--- a/rpkid/rpki/irdb/models.py
+++ b/rpkid/rpki/irdb/models.py
@@ -25,6 +25,8 @@ PERFORMANCE OF THIS SOFTWARE.
import django.db.models
import rpki.x509
import rpki.sundial
+import rpki.resource_set
+import rpki.ipaddrs
import socket
## @var ip_version_choices
@@ -453,6 +455,19 @@ class Child(CrossCertification):
name = django.db.models.TextField(null = True, blank = True)
valid_until = SundialField()
+ @property
+ def resource_bag(self):
+ asns = rpki.resource_set.resource_set_as.from_django(
+ (a.start_as, a.end_as) for a in self.asns.all())
+ ipv4 = rpki.resource_set.resource_set_ipv4.from_django(
+ (a.start_ip, a.end_ip) for a in self.address_ranges.filter(version = 4))
+ ipv6 = rpki.resource_set.resource_set_ipv6.from_django(
+ (a.start_ip, a.end_ip) for a in self.address_ranges.filter(version = 6))
+ return rpki.resource_set.resource_bag(
+ valid_until = self.valid_until, asn = asns, v4 = ipv4, v6 = ipv6)
+
+ # Writing of .setter method deferred until something needs it.
+
# This shouldn't be necessary
class Meta:
unique_together = ("issuer", "handle")
@@ -462,6 +477,9 @@ class ChildASN(django.db.models.Model):
start_as = django.db.models.BigIntegerField()
end_as = django.db.models.BigIntegerField()
+ def as_resource_range(self):
+ return rpki.resource_set.resource_range_as.from_strings(self.start_as, self.end_as)
+
class Meta:
unique_together = ("child", "start_as", "end_as")
@@ -471,6 +489,9 @@ class ChildNet(django.db.models.Model):
end_ip = django.db.models.CharField(max_length = 40)
version = EnumField(choices = ip_version_choices)
+ def as_resource_range(self):
+ return rpki.resource_set.resource_range_ip.from_strings(self.start_ip, self.end_ip)
+
class Meta:
unique_together = ("child", "start_ip", "end_ip", "version")
@@ -490,6 +511,16 @@ class ROARequest(django.db.models.Model):
issuer = django.db.models.ForeignKey(ResourceHolderCA, related_name = "roa_requests")
asn = django.db.models.BigIntegerField()
+ @property
+ def roa_prefix_bag(self):
+ v4 = rpki.resource_set.roa_prefix_set_ipv4.from_django(
+ (p.prefix, p.prefixlen, p.max_prefixlen) for p in self.prefixes.filter(version = 4))
+ v6 = rpki.resource_set.roa_prefix_set_ipv6.from_django(
+ (p.prefix, p.prefixlen, p.max_prefixlen) for p in self.prefixes.filter(version = 6))
+ return rpki.resource_set.roa_prefix_bag(v4 = v4, v6 = v6)
+
+ # Writing of .setter method deferred until something needs it.
+
class ROARequestPrefix(django.db.models.Model):
roa_request = django.db.models.ForeignKey(ROARequest, related_name = "prefixes")
version = EnumField(choices = ip_version_choices)
@@ -497,6 +528,15 @@ class ROARequestPrefix(django.db.models.Model):
prefixlen = django.db.models.PositiveSmallIntegerField()
max_prefixlen = django.db.models.PositiveSmallIntegerField()
+ def as_roa_prefix(self):
+ if self.version == 4:
+ return resource_set.roa_prefix_ipv4(ipaddrs.v4addr(self.prefix), self.prefixlen, self.max_prefixlen)
+ else:
+ return resource_set.roa_prefix_ipv6(ipaddrs.v6addr(self.prefix), self.prefixlen, self.max_prefixlen)
+
+ def as_resource_range(self):
+ return self.as_roa_prefix().to_resource_range()
+
class Meta:
unique_together = ("roa_request", "version", "prefix", "prefixlen", "max_prefixlen")
diff --git a/rpkid/rpki/irdbd.py b/rpkid/rpki/irdbd.py
index 60e122c7..d3cfbb55 100644
--- a/rpkid/rpki/irdbd.py
+++ b/rpkid/rpki/irdbd.py
@@ -41,30 +41,28 @@ import rpki.exceptions, rpki.left_right, rpki.log, rpki.x509
class main(object):
def handle_list_resources(self, q_pdu, r_msg):
- child = rpki.irdb.Child.objects.get(issuer__handle__exact = q_pdu.self_handle, handle = q_pdu.child_handle)
+ child = rpki.irdb.Child.objects.get(issuer__handle__exact = q_pdu.self_handle,
+ handle = q_pdu.child_handle)
+ resources = child.resource_bag
r_pdu = rpki.left_right.list_resources_elt()
r_pdu.tag = q_pdu.tag
r_pdu.self_handle = q_pdu.self_handle
r_pdu.child_handle = q_pdu.child_handle
r_pdu.valid_until = child.valid_until.strftime("%Y-%m-%dT%H:%M:%SZ")
- r_pdu.asn = rpki.resource_set.resource_set_as.from_django(
- (a.start_as, a.end_as) for a in child.asns.all())
- r_pdu.ipv4 = rpki.resource_set.resource_set_ipv4.from_django(
- (a.start_ip, a.end_ip) for a in child.address_ranges.filter(version = 4))
- r_pdu.ipv6 = rpki.resource_set.resource_set_ipv6.from_django(
- (a.start_ip, a.end_ip) for a in child.address_ranges.filter(version = 6))
+ r_pdu.asn = resources.asn
+ r_pdu.ipv4 = resources.v4
+ r_pdu.ipv6 = resources.v6
r_msg.append(r_pdu)
def handle_list_roa_requests(self, q_pdu, r_msg):
for request in rpki.irdb.ROARequest.objects.filter(issuer__handle__exact = q_pdu.self_handle):
+ prefix_bag = request.roa_prefix_bag
r_pdu = rpki.left_right.list_roa_requests_elt()
r_pdu.tag = q_pdu.tag
r_pdu.self_handle = q_pdu.self_handle
r_pdu.asn = request.asn
- r_pdu.ipv4 = rpki.resource_set.roa_prefix_set_ipv4.from_django(
- (p.prefix, p.prefixlen, p.max_prefixlen) for p in request.prefixes.filter(version = 4))
- r_pdu.ipv6 = rpki.resource_set.roa_prefix_set_ipv6.from_django(
- (p.prefix, p.prefixlen, p.max_prefixlen) for p in request.prefixes.filter(version = 6))
+ r_pdu.ipv4 = prefix_bag.v4
+ r_pdu.ipv6 = prefix_bag.v6
r_msg.append(r_pdu)
def handle_list_ghostbuster_requests(self, q_pdu, r_msg):
diff --git a/rpkid/rpki/resource_set.py b/rpkid/rpki/resource_set.py
index 06b2ebc7..be39df75 100644
--- a/rpkid/rpki/resource_set.py
+++ b/rpkid/rpki/resource_set.py
@@ -1054,6 +1054,29 @@ class roa_prefix_set_ipv6(roa_prefix_set):
# Fix back link from resource_set to roa_prefix
resource_set_ipv6.roa_prefix_set_type = roa_prefix_set_ipv6
+class roa_prefix_bag(object):
+ """
+ Container to simplify passing around the combination of an IPv4 ROA
+ prefix set and an IPv6 ROA prefix set.
+ """
+
+ ## @var v4
+ # Set of IPv4 prefixes.
+
+ ## @var v6
+ # Set of IPv6 prefixes.
+
+ def __init__(self, v4 = None, v6 = None):
+ self.v4 = v4 or roa_prefix_set_ipv4()
+ self.v6 = v6 or roa_prefix_set_ipv6()
+
+ def __eq__(self, other):
+ return self.v4 == other.v4 and self.v6 == other.v6
+
+ def __ne__(self, other):
+ return not (self == other)
+
+
# Test suite for set operations.
if __name__ == "__main__":
diff --git a/rpkid/rpki/rpkic.py b/rpkid/rpki/rpkic.py
index 96431114..947026b5 100644
--- a/rpkid/rpki/rpkic.py
+++ b/rpkid/rpki/rpkic.py
@@ -395,22 +395,16 @@ class main(rpki.cli.Cmd):
if arg.strip():
raise BadCommandSyntax("This command takes no arguments")
- for child in self.resource_ca.children.all():
-
- asn = rpki.resource_set.resource_set_as.from_django(
- (a.start_as, a.end_as) for a in child.asns.all())
- ipv4 = rpki.resource_set.resource_set_ipv4.from_django(
- (a.start_ip, a.end_ip) for a in child.address_ranges.filter(version = 4))
- ipv6 = rpki.resource_set.resource_set_ipv6.from_django(
- (a.start_ip, a.end_ip) for a in child.address_ranges.filter(version = 6))
+ for child in self.zoo.resource_ca.children.all():
+ resources = child.resource_bag
print "Child:", child.handle
- if asn:
- print " ASN:", asn
- if ipv4:
- print " IPv4:", ipv4
- if ipv6:
- print " IPv6:", ipv6
+ if resources.asn:
+ print " ASN:", resources.asn
+ if resources.v4:
+ print " IPv4:", resources.v4
+ if resources.v6:
+ print " IPv6:", resources.v6
def do_load_asns(self, arg):