1 """ Zeromq messages """
4 from struct import pack, unpack
6 __all__ = "Bcast", "Resp"
8 def pack_peer(peeraddr):
9 saddr, port, _x, _y = peeraddr
10 addr6 = ip.ip_address(saddr)
11 addr = addr6.ipv4_mapped
14 return pack("B", addr.version) + (addr.packed + b"\0\0\0\0\0\0\0\0\0\0\0\0")[:16] + pack("!H", port)
16 def unpack_peer(buffer):
18 if version not in (4, 6):
21 addr = ip.IPv4Address(buffer[1:5])
23 addr = ip.IPv6Address(buffer[1:17])
24 port = unpack("!H", buffer[17:19])[0]
29 def __init__(self, *args, **kwargs):
33 for k, v in self.KWARGS:
34 setattr(self, k, kwargs.get(k, v))
37 self.__class__.__name__
44 def decode(self, buffer):
46 self.__class__.__name__ + "must implement `encode()` method"
52 self.__class__.__name__ + "must implement `encode()` method"
57 """Zmq message to broadcast what was received from the terminal"""
71 + ("0000000000000000" if self.imei is None else self.imei).encode()
72 + (b"\0\0\0\0\0\0\0\0" if self.when is None else pack("!d", self.when))
73 + pack_peer(self.peeraddr)
77 def decode(self, buffer):
78 self.proto = buffer[0]
79 self.imei = buffer[1:17].decode()
80 if self.imei == "0000000000000000":
82 self.when = unpack("!d", buffer[17:25])[0]
83 self.peeraddr = unpack_peer(buffer[25:44])
84 self.packet = buffer[44:]
88 """Zmq message received from a third party to send to the terminal"""
90 KWARGS = (("imei", None), ("packet", b""))
95 "0000000000000000" if self.imei is None else self.imei.encode()
98 def decode(self, buffer):
99 self.imei = buffer[:16].decode()
100 self.packet = buffer[16:]