diff options
author | Rob Austein <sra@hactrn.net> | 2007-11-06 23:34:20 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2007-11-06 23:34:20 +0000 |
commit | 1b4918cd8369cec7da833a89f309bd32fbfbcba9 (patch) | |
tree | 72e2a55fff316ad5e6f8bea8ee26c8f5a5499122 | |
parent | 88953a016162642a1798c261ba04c2dc7440599a (diff) |
Handle whacky formatting of IP addresses from SQL.
svn path=/scripts/rpki/ipaddrs.py; revision=1250
-rw-r--r-- | scripts/rpki/ipaddrs.py | 1 | ||||
-rw-r--r-- | scripts/rpki/resource_set.py | 38 |
2 files changed, 22 insertions, 17 deletions
diff --git a/scripts/rpki/ipaddrs.py b/scripts/rpki/ipaddrs.py index 32410691..cd99f7bc 100644 --- a/scripts/rpki/ipaddrs.py +++ b/scripts/rpki/ipaddrs.py @@ -26,6 +26,7 @@ class v4addr(long): def __new__(cls, x): """Construct a v4addr object.""" if isinstance(x, str): + x = ".".join(str(int(i)) for i in x.split(".")) y = struct.unpack("!I", socket.inet_pton(socket.AF_INET, x)) x = y[0] return long.__new__(cls, x) diff --git a/scripts/rpki/resource_set.py b/scripts/rpki/resource_set.py index 3436398c..940f537e 100644 --- a/scripts/rpki/resource_set.py +++ b/scripts/rpki/resource_set.py @@ -39,6 +39,8 @@ class resource_range_as(resource_range): Denotes a single ASN by a range whose min and max values are identical. """ + datum_type = long + def __str__(self): """Convert a resource_range_as to string format.""" if self.min == self.max: @@ -63,7 +65,7 @@ class resource_range_ip(resource_range): def _prefixlen(self): """Determine whether a resource_range_ip can be expressed as a prefix.""" mask = self.min ^ self.max - prefixlen = self.addr_type.bits + prefixlen = self.datum_type.bits while mask & 1: prefixlen -= 1 mask >>= 1 @@ -84,20 +86,20 @@ class resource_range_ip(resource_range): """Convert a resource_range_ip to tuple format for ASN.1 encoding.""" prefixlen = self._prefixlen() if prefixlen < 0: - return ("addressRange", (_long2bs(self.min, self.addr_type.bits, strip = 0), - _long2bs(self.max, self.addr_type.bits, strip = 1))) + return ("addressRange", (_long2bs(self.min, self.datum_type.bits, strip = 0), + _long2bs(self.max, self.datum_type.bits, strip = 1))) else: - return ("addressPrefix", _long2bs(self.min, self.addr_type.bits, prefixlen = prefixlen)) + return ("addressPrefix", _long2bs(self.min, self.datum_type.bits, prefixlen = prefixlen)) class resource_range_ipv4(resource_range_ip): """Range of IPv4 addresses.""" - addr_type = ipaddrs.v4addr + datum_type = ipaddrs.v4addr class resource_range_ipv6(resource_range_ip): """Range of IPv6 addresses.""" - addr_type = ipaddrs.v6addr + datum_type = ipaddrs.v6addr def _rsplit(rset, that): """Split a resource range into two resource ranges.""" @@ -239,7 +241,9 @@ class resource_set(list): """ cursor.execute(query) - return cls(ini = [cls.range_type(b, e) for (b,e) in cursor.fetchall()]) + return cls(ini = [cls.range_type(cls.range_type.datum_type(b), + cls.range_type.datum_type(e)) + for (b,e) in cursor.fetchall()]) class resource_set_as(resource_set): """ASN resource set.""" @@ -283,14 +287,14 @@ class resource_set_ip(resource_set): """Parse IP address resource sets from text (eg, XML attributes).""" r = re.match("^([0-9:.a-fA-F]+)-([0-9:.a-fA-F]+)$", x) if r: - return self.range_type(self.range_type.addr_type(r.group(1)), self.range_type.addr_type(r.group(2))) + return self.range_type(self.range_type.datum_type(r.group(1)), self.range_type.datum_type(r.group(2))) r = re.match("^([0-9:.a-fA-F]+)/([0-9]+)$", x) if r: - min = self.range_type.addr_type(r.group(1)) + min = self.range_type.datum_type(r.group(1)) prefixlen = int(r.group(2)) - mask = (1 << (self.range_type.addr_type.bits - prefixlen)) - 1 + mask = (1 << (self.range_type.datum_type.bits - prefixlen)) - 1 assert (min & mask) == 0, "Resource not in canonical form: %s" % (x) - max = self.range_type.addr_type(min | mask) + max = self.range_type.datum_type(min | mask) return self.range_type(min, max) raise RuntimeError, 'Bad IP resource "%s"' % (x) @@ -299,15 +303,15 @@ class resource_set_ip(resource_set): assert x[0] == "addressesOrRanges" # Not handling "inherit" yet for aor in x[1]: if aor[0] == "addressRange": - min = _bs2long(aor[1][0]) << (self.range_type.addr_type.bits - len(aor[1][0])) - max = _bs2long(aor[1][1]) << (self.range_type.addr_type.bits - len(aor[1][1])) - mask = (1L << (self.range_type.addr_type.bits - len(aor[1][1]))) - 1 + min = _bs2long(aor[1][0]) << (self.range_type.datum_type.bits - len(aor[1][0])) + max = _bs2long(aor[1][1]) << (self.range_type.datum_type.bits - len(aor[1][1])) + mask = (1L << (self.range_type.datum_type.bits - len(aor[1][1]))) - 1 else: - min = _bs2long(aor[1]) << (self.range_type.addr_type.bits - len(aor[1])) - mask = (1L << (self.range_type.addr_type.bits - len(aor[1]))) - 1 + min = _bs2long(aor[1]) << (self.range_type.datum_type.bits - len(aor[1])) + mask = (1L << (self.range_type.datum_type.bits - len(aor[1]))) - 1 assert (min & mask) == 0, "Resource not in canonical form: %s" % (str(x)) max = min | mask - self.append(self.range_type(self.range_type.addr_type(min), self.range_type.addr_type(max))) + self.append(self.range_type(self.range_type.datum_type(min), self.range_type.datum_type(max))) def to_tuple(self): """Encode IP resource set into intermediate form used by ASN.1 encoder.""" |