From c6fe9a56dc46763b71f74f8275cc9753b022263e Mon Sep 17 00:00:00 2001 From: xmrdsc Date: Sun, 29 Nov 2020 18:36:08 +0100 Subject: [PATCH] Initial IPv6 support --- levin/bucket.py | 17 +++++++++++------ levin/ctypes.py | 19 +++++++++++++++++-- peer_retreiver.py | 5 ++++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/levin/bucket.py b/levin/bucket.py index 8cbf190..2033f2a 100644 --- a/levin/bucket.py +++ b/levin/bucket.py @@ -164,17 +164,22 @@ class Bucket: continue addr = peer['adr'].entries['addr'].entries - last_seen, m_ip, m_port = peer['last_seen'], addr['m_ip'], addr['m_port'] + ipv4 = True if "m_ip" in addr else False + if not ipv4 and not "addr" in addr: + continue - # reinterpret m_ip as big endian - m_ip = c_uint32(m_ip.to_bytes(), endian='big') + if ipv4 and len(addr["m_ip"]) == 4: + m_ip, m_port = addr['m_ip'], addr['m_port'] + m_ip = c_uint32(m_ip.to_bytes(), endian='big') + elif len(addr["addr"]) == 16: + m_ip, m_port = addr['addr'], addr["m_port"] + m_ip = c_uint64(m_ip, endian="big") + else: + continue peers.append({ - 'last_seen': peer['last_seen'], 'ip': m_ip, 'port': m_port }) - # sort on last seen - peers = sorted(peers, key=lambda k: k['last_seen'], reverse=True) return peers diff --git a/levin/ctypes.py b/levin/ctypes.py index 39be47c..d831d2f 100644 --- a/levin/ctypes.py +++ b/levin/ctypes.py @@ -228,8 +228,12 @@ class c_uint32(_IntType): super(c_uint32, self).__init__(value, endian) @property - def ipv4(self): - return ipaddress.IPv4Address(self.value) + def ipv4(self) -> str: + return str(ipaddress.IPv4Address(self.value)) + + @property + def ip(self) -> str: + return self.ipv4 class c_int64(_IntType): @@ -255,6 +259,17 @@ class c_uint64(_IntType): def __init__(self, value, endian='little'): super(c_uint64, self).__init__(value, endian) + @property + def ipv6(self) -> str: + val = socket.inet_ntop(socket.AF_INET6, self.value) + if val.startswith("::ffff:"): + val = val[7:] + return val + + @property + def ip(self) -> str: + return self.ipv6 + @property def date_utc(self): return datetime.utcfromtimestamp(self.value) diff --git a/peer_retreiver.py b/peer_retreiver.py index 5c9b06f..6824fbd 100644 --- a/peer_retreiver.py +++ b/peer_retreiver.py @@ -45,7 +45,10 @@ while 1: peers = bucket.get_peers() or [] for peer in peers: - print('%s:%d' % (peer['ip'].ipv4, peer['port'].value)) + try: + print('%s:%d' % (peer['ip'].ip, peer['port'].value)) + except: + pass sock.close() break