aboutsummaryrefslogtreecommitdiff
path: root/rpki/rtr
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2015-11-11 03:22:38 +0000
committerRob Austein <sra@hactrn.net>2015-11-11 03:22:38 +0000
commit9f6d6462a9cef37735a9d4c61921d04934fd9864 (patch)
treee5d1b046f6f6bd44faf1b5028f6f1df9698e2a88 /rpki/rtr
parentac415cdd0f88f8479975627772dd0a84797b261a (diff)
Configure pylint to use the pylint-django plugin, which (mostly)
understands Django's exotic metaclasses, which in turn allows us to re-enable a number of pylint checks we had disabled. While we were at this, stripped out a bunch of old pylint pragmas, then added back the subset that were really needed. As usual with pylint, this turned up a few real bugs along with an awful lot of noise. svn path=/branches/tk705/; revision=6162
Diffstat (limited to 'rpki/rtr')
-rwxr-xr-xrpki/rtr/bgpdump.py9
-rw-r--r--rpki/rtr/channels.py2
-rw-r--r--rpki/rtr/generator.py19
-rw-r--r--rpki/rtr/pdus.py38
-rw-r--r--rpki/rtr/server.py26
5 files changed, 69 insertions, 25 deletions
diff --git a/rpki/rtr/bgpdump.py b/rpki/rtr/bgpdump.py
index 3336fb9f..1ca04803 100755
--- a/rpki/rtr/bgpdump.py
+++ b/rpki/rtr/bgpdump.py
@@ -91,6 +91,8 @@ class PrefixPDU(rpki.rtr.generator.PrefixPDU):
class AXFRSet(rpki.rtr.generator.AXFRSet):
+ serial = None
+
@staticmethod
def read_bgpdump(filename):
assert filename.endswith(".bz2")
@@ -101,6 +103,7 @@ class AXFRSet(rpki.rtr.generator.AXFRSet):
@classmethod
def parse_bgpdump_rib_dump(cls, filename):
+ # pylint: disable=W0201
assert os.path.basename(filename).startswith("ribs.")
self = cls()
self.serial = None
@@ -212,7 +215,7 @@ def bgpdump_select_main(args):
nonce = rpki.rtr.server.read_current(version)[1]
if nonce is None:
- nonce = rpki.rtr.generator.new_nonce()
+ nonce = rpki.rtr.generator.AXFRSet.new_nonce(force_zero_nonce = False)
rpki.rtr.server.write_current(serial, nonce, version)
rpki.rtr.generator.kick_all(serial)
@@ -238,7 +241,7 @@ class BGPDumpReplayClock(object):
self.timestamps = [Timestamp(int(f.split(".")[0])) for f in glob.iglob("*.ax.v*")]
self.timestamps.sort()
self.offset = self.timestamps[0] - int(time.time())
- self.nonce = rpki.rtr.generator.new_nonce()
+ self.nonce = rpki.rtr.generator.AXFRSet.new_nonce(force_zero_nonce = False)
def __nonzero__(self):
return len(self.timestamps) > 0
@@ -278,7 +281,7 @@ def bgpdump_server_main(args):
You have been warned.
"""
- logger = logging.LoggerAdapter(logging.root, dict(connection = rpki.rtr.server._hostport_tag()))
+ logger = logging.LoggerAdapter(logging.root, dict(connection = rpki.rtr.server.hostport_tag()))
logger.debug("[Starting]")
diff --git a/rpki/rtr/channels.py b/rpki/rtr/channels.py
index df96fa58..a4dccbc1 100644
--- a/rpki/rtr/channels.py
+++ b/rpki/rtr/channels.py
@@ -59,6 +59,8 @@ class ReadBuffer(object):
def __init__(self):
self.buffer = ""
self.version = None
+ self.need = None
+ self.callback = None
def update(self, need, callback):
"""
diff --git a/rpki/rtr/generator.py b/rpki/rtr/generator.py
index e00e44b7..a879cc39 100644
--- a/rpki/rtr/generator.py
+++ b/rpki/rtr/generator.py
@@ -105,6 +105,11 @@ class RouterKeyPDU(rpki.rtr.pdus.RouterKeyPDU):
Router Key PDU.
"""
+ announce = None
+ ski = None
+ asn = None
+ key = None
+
@classmethod
def from_text(cls, version, asn, gski, key):
"""
@@ -140,14 +145,15 @@ class ROA(rpki.POW.ROA): # pylint: disable=W0232
"""
@classmethod
- def derReadFile(cls, fn): # pylint: disable=E1002
+ def derReadFile(cls, fn):
+ # pylint: disable=E1002
self = super(ROA, cls).derReadFile(fn)
self.extractWithoutVerifying()
return self
@property
def prefixes(self):
- v4, v6 = self.getPrefixes()
+ v4, v6 = self.getPrefixes() # pylint: disable=E1101
if v4 is not None:
for p in v4:
yield p
@@ -162,7 +168,7 @@ class X509(rpki.POW.X509): # pylint: disable=W0232
@property
def asns(self):
- resources = self.getRFC3779()
+ resources = self.getRFC3779() # pylint: disable=E1101
if resources is not None and resources[0] is not None:
for min_asn, max_asn in resources[0]:
for asn in xrange(min_asn, max_asn + 1):
@@ -215,6 +221,8 @@ class AXFRSet(PDUSet):
field set.
"""
+ serial = None
+
@classmethod
def parse_rcynic(cls, rcynic_dir, version, scan_roas = None, scan_routercerts = None):
"""
@@ -245,7 +253,7 @@ class AXFRSet(PDUSet):
self.extend(PrefixPDU.from_roa(version = version, asn = asn, prefix_tuple = prefix_tuple)
for prefix_tuple in roa.prefixes)
if include_routercerts and scan_routercerts is None and fn.endswith(".cer"):
- x = X509.derReadFile(os.path.join(root, fn))
+ x = X509.derReadFile(os.path.join(root, fn)) # pylint: disable=E1101
eku = x.getEKU()
if eku is not None and rpki.oids.id_kp_bgpsec_router in eku:
ski = x.getSKI()
@@ -415,6 +423,9 @@ class IXFRSet(PDUSet):
indicate the changes.
"""
+ from_serial = None
+ to_serial = None
+
@classmethod
def load(cls, filename):
"""
diff --git a/rpki/rtr/pdus.py b/rpki/rtr/pdus.py
index d355026c..3fb7457d 100644
--- a/rpki/rtr/pdus.py
+++ b/rpki/rtr/pdus.py
@@ -116,6 +116,8 @@ class PDU(object):
header_struct = struct.Struct("!BB2xL")
+ pdu_type = None
+
def __init__(self, version):
assert version in self.version_map
self.version = version
@@ -123,6 +125,9 @@ class PDU(object):
def __cmp__(self, other):
return cmp(self.to_pdu(), other.to_pdu())
+ def to_pdu(self, announce = None):
+ return NotImplementedError
+
@property
def default_version(self):
return max(self.version_map.iterkeys())
@@ -170,11 +175,12 @@ class PDUWithSerial(PDU):
def __str__(self):
return "[%s, serial #%d nonce %d]" % (self.__class__.__name__, self.serial, self.nonce)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce,
self.header_struct.size, self.serial)
@@ -208,11 +214,12 @@ class PDUWithNonce(PDU):
def __str__(self):
return "[%s, nonce %d]" % (self.__class__.__name__, self.nonce)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce, self.header_struct.size)
return self._pdu
@@ -239,11 +246,12 @@ class PDUEmpty(PDU):
def __str__(self):
return "[%s]" % self.__class__.__name__
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU for this prefix.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, 0, self.header_struct.size)
return self._pdu
@@ -370,11 +378,12 @@ class EndOfDataPDUv1(EndOfDataPDUv0):
return "[%s, serial #%d nonce %d refresh %d retry %d expire %d]" % (
self.__class__.__name__, self.serial, self.nonce, self.refresh, self.retry, self.expire)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce,
self.header_struct.size, self.serial,
@@ -416,6 +425,15 @@ class PrefixPDU(PDU):
header_struct = struct.Struct("!BB2xLBBBx")
asnum_struct = struct.Struct("!L")
+ address_byte_count = 0
+
+ def __init__(self, version):
+ super(PrefixPDU, self).__init__(version)
+ self.asn = None
+ self.prefix = None
+ self.prefixlen = None
+ self.max_prefixlen = None
+ self.announce = None
def __str__(self):
plm = "%s/%s-%s" % (self.prefix, self.prefixlen, self.max_prefixlen)
@@ -511,6 +529,13 @@ class RouterKeyPDU(PDU):
header_struct = struct.Struct("!BBBxL20sL")
+ def __init__(self, version):
+ super(RouterKeyPDU, self).__init__(version)
+ self.announce = None
+ self.ski = None
+ self.asn = None
+ self.key = None
+
def __str__(self):
return "%s %8s %-32s %s" % ("+" if self.announce else "-", self.asn,
base64.urlsafe_b64encode(self.ski).rstrip("="),
@@ -596,6 +621,8 @@ class ErrorReportPDU(PDU):
self.errno = errno
self.errpdu = errpdu
self.errmsg = errmsg if errmsg is not None or errno is None else self.errors[errno]
+ self.pdulen = None
+ self.errlen = None
def __str__(self):
return "[%s, error #%s: %r]" % (self.__class__.__name__, self.errno, self.errmsg)
@@ -609,11 +636,12 @@ class ErrorReportPDU(PDU):
assert remaining >= self.string_struct.size + n
return n, reader.get(n), (remaining - self.string_struct.size - n)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU for this error report.
"""
+ assert announce is None
if self._pdu is None:
assert isinstance(self.errno, int)
assert not isinstance(self.errpdu, ErrorReportPDU)
diff --git a/rpki/rtr/server.py b/rpki/rtr/server.py
index f57c3037..052aef2c 100644
--- a/rpki/rtr/server.py
+++ b/rpki/rtr/server.py
@@ -393,7 +393,7 @@ class KickmeChannel(asyncore.dispatcher, object):
self.close()
try:
os.unlink(self.sockname)
- except: # pylint: disable=W0702
+ except:
pass
def log(self, msg):
@@ -420,7 +420,7 @@ class KickmeChannel(asyncore.dispatcher, object):
sys.exit(1)
-def _hostport_tag():
+def hostport_tag():
"""
Construct hostname/address + port when we're running under a
protocol we understand well enough to do that. This is all
@@ -433,28 +433,28 @@ def _hostport_tag():
try:
host, port = socket.fromfd(0, socket.AF_INET, socket.SOCK_STREAM).getpeername()
proto = "tcp"
- except: # pylint: disable=W0702
+ except:
pass
if proto is None:
try:
host, port = socket.fromfd(0, socket.AF_INET6, socket.SOCK_STREAM).getpeername()[0:2]
proto = "tcp"
- except: # pylint: disable=W0702
+ except:
pass
if proto is None:
try:
host, port = os.environ["SSH_CONNECTION"].split()[0:2]
proto = "ssh"
- except: # pylint: disable=W0702
+ except:
pass
if proto is None:
try:
host, port = os.environ["REMOTE_HOST"], os.getenv("REMOTE_PORT")
proto = "ssl"
- except: # pylint: disable=W0702
+ except:
pass
if proto is None:
@@ -476,7 +476,7 @@ def server_main(args):
pass the results along to a client.
"""
- logger = logging.LoggerAdapter(logging.root, dict(connection = _hostport_tag()))
+ logger = logging.LoggerAdapter(logging.root, dict(connection = hostport_tag()))
logger.debug("[Starting]")
@@ -516,7 +516,7 @@ def listener_main(args):
try:
listener = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
listener.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
- except: # pylint: disable=W0702
+ except:
if listener is not None:
listener.close()
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -536,8 +536,8 @@ def listener_main(args):
logging.debug("[Received connection from %r]", ai)
pid = os.fork()
if pid == 0:
- os.dup2(s.fileno(), 0) # pylint: disable=E1103
- os.dup2(s.fileno(), 1) # pylint: disable=E1103
+ os.dup2(s.fileno(), 0) # pylint: disable=E1101
+ os.dup2(s.fileno(), 1) # pylint: disable=E1101
s.close()
#os.closerange(3, os.sysconf("SC_OPEN_MAX"))
server_main(args)
@@ -546,11 +546,11 @@ def listener_main(args):
logging.debug("[Spawned server %d]", pid)
while True:
try:
- pid, status = os.waitpid(0, os.WNOHANG) # pylint: disable=W0612
+ pid, status = os.waitpid(0, os.WNOHANG)
if pid:
- logging.debug("[Server %s exited]", pid)
+ logging.debug("[Server %s exited with status 0x%x]", pid, status)
continue
- except: # pylint: disable=W0702
+ except:
pass
break