diff options
author | Michael Elkins <melkins@tislabs.com> | 2012-01-17 23:14:25 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2012-01-17 23:14:25 +0000 |
commit | ad1726391005a4fdcd259652d4be65e3d08c0f6c (patch) | |
tree | aee5594e96c0ed616e46b4b117940ce58c2673e0 | |
parent | 78bbe0e95fcd066bf4aca587ff8d8ab1ac3a1a7b (diff) |
merge with ^/branches/tk100
svn path=/branches/tk161/; revision=4211
-rw-r--r-- | rpkid/rpki/irdb/models.py | 40 | ||||
-rw-r--r-- | rpkid/rpki/irdbd.py | 20 | ||||
-rw-r--r-- | rpkid/rpki/resource_set.py | 23 | ||||
-rw-r--r-- | rpkid/rpki/rpkic.py | 22 |
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): |