diff options
author | Rob Austein <sra@hactrn.net> | 2009-03-31 19:42:21 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2009-03-31 19:42:21 +0000 |
commit | 647e07cbeb82a84e08f2342b6ebad67bf27c4a07 (patch) | |
tree | dcee5717aa331c0f77122a23ac6bebe08a35a350 | |
parent | 717ab5a1f35d4d63c6462bd9eba8d0396c5d046e (diff) |
Checkpoint
svn path=/rtr-origin/updater.py; revision=2290
-rwxr-xr-x | rtr-origin/updater.py | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/rtr-origin/updater.py b/rtr-origin/updater.py index 1414e579..567925d7 100755 --- a/rtr-origin/updater.py +++ b/rtr-origin/updater.py @@ -62,7 +62,17 @@ class prefix(object): return self def __str__(self): - return "%s/%s-%s[%s]" % (self.prefix, self.prefixlen, self.max_prefixlen, self.asn) + plm = "%s/%s-%s" % (self.prefix, self.prefixlen, self.max_prefixlen) + return "%8s %-32s %s" % (self.asn, plm, ":".join(("%02X" % ord(i) for i in p.to_pdu()))) + + def pprint(self): + print "# Class: ", self.__class__.__name__ + print "# ASN: ", self.asn + print "# Prefix: ", self.prefix + print "# Prefixlen: ", self.prefixlen + print "# MaxPrefixlen:", self.max_prefixlen + print "# Color: ", self.color + print "# Announce: ", self.announce def __cmp__(self, other): return cmp(self.to_pdu(), other.to_pdu()) @@ -72,6 +82,7 @@ class prefix(object): assert self.announce in (0, 1) assert self.prefixlen >= 0 and self.prefixlen <= self.addr_type.bits assert self.max_prefixlen >= self.prefixlen and self.max_prefixlen <= self.addr_type.bits + assert len(self.to_pdu()) == 12 + self.addr_type.bits / 8, "Expected %d byte PDU, got %d" % (12 + self.addr_type.bits / 8, len(self.to_pdu())) def to_pdu(self, announce = None): """Generate the wire format PDU for this prefix.""" @@ -94,20 +105,27 @@ class prefix(object): """Read one wire format PDU from a file. This is intended to be used in an iterator, so it raises StopIteration on end of file. """ + assert cls._pdu is None b = f.read(8) if b == "": raise StopIteration version, pdu_type, color, announce, prefixlen, max_prefixlen, source = cls.header_struct.unpack(b) - assert version == self.version, "PDU version is %d, expected %d" % (version, self.version) - assert source == self.source + assert version == cls.version, "PDU version is %d, expected %d" % (version, self.version) + assert source == cls.source + pdu = b self = cls.pdu_map[pdu_type]() self.prefixlen = prefixlen self.max_prefixlen = max_prefixlen self.color = color self.announce = announce - self.prefix = self.addr_type.from_bytes(f.read(self.addr_type.bits / 8)) - self.asn = cls.serial_struct.unpack(f.read(4)) + b = f.read(self.addr_type.bits / 8) + pdu += b + self.prefix = self.addr_type.from_bytes(b) + b = f.read(4) + pdu += b + self.asn = cls.serial_struct.unpack(b)[0] self.check() + assert pdu == self.to_pdu() return self class v4prefix(prefix): @@ -152,7 +170,44 @@ class prefix_set(list): del self[i + 1] return self + class _pdufile(file): + """File subclass with PDU iterator.""" + + def __iter__(self): + return self + + def next(self): + return prefix.from_pdu_file(self) + + def to_file(self, filename): + """Write prefix_set to a file.""" + f = self._pdufile(filename, "wb") + for p in self: + f.write(p.to_pdu()) + f.close() + + @classmethod + def from_file(cls, filename): + """Read prefix_set from a file.""" + self = cls() + f = cls._pdufile(filename, "rb") + for p in f: + self.append(p) + f.close() + return self + prefixes = prefix_set.from_rcynic("../rcynic/rcynic-data/authenticated") for p in prefixes: - print "%-40s %s" % (p, ":".join(("%02X" % ord(i) for i in p.to_pdu()))) + print p + +prefixes.to_file("fnord") + +fnord = prefix_set.from_file("fnord") + +for p in fnord: + print p + +os.unlink("fnord") + +print prefixes == fnord |