1 """ Zeromq messages """
4 from struct import pack, unpack
6 __all__ = "Bcast", "Resp", "topic"
9 def pack_peer(peeraddr):
15 saddr, port, _x, _y = peeraddr
16 addr = ip.ip_address(saddr)
18 saddr, port = peeraddr
19 a4 = ip.ip_address(saddr)
20 addr = ip.IPv6Address(b"\0\0\0\0\0\0\0\0\0\0\xff\xff" + a4.packed)
21 return addr.packed + pack("!H", port)
24 def unpack_peer(buffer):
25 a6 = ip.IPv6Address(buffer[:16])
26 port = unpack("!H", buffer[16:])[0]
34 def __init__(self, *args, **kwargs):
38 for k, v in self.KWARGS:
39 setattr(self, k, kwargs.get(k, v))
42 self.__class__.__name__
50 return "{}({})".format(
51 self.__class__.__name__,
56 'bytes.fromhex("{}")'.format(getattr(self, k).hex())
57 if isinstance(getattr(self, k), bytes)
58 else getattr(self, k),
60 for k, _ in self.KWARGS
65 def __eq__(self, other):
67 [getattr(self, k) == getattr(other, k) for k, _ in self.KWARGS]
70 def decode(self, buffer):
71 raise NotImplementedError(
72 self.__class__.__name__ + "must implement `decode()` method"
77 raise NotImplementedError(
78 self.__class__.__name__ + "must implement `packed()` property"
82 def topic(proto, is_incoming=True, imei=None):
83 return pack("BB", is_incoming, proto) + (
84 b"" if imei is None else pack("16s", imei.encode())
89 """Zmq message to broadcast what was received from the terminal"""
92 ("is_incoming", True),
105 int(self.is_incoming),
109 else self.imei.encode(),
114 else pack("!d", self.when)
116 + pack_peer(self.peeraddr)
120 def decode(self, buffer):
121 self.is_incoming = bool(buffer[0])
122 self.proto = buffer[1]
123 self.imei = buffer[2:18].decode()
124 if self.imei == "0000000000000000":
126 self.when = unpack("!d", buffer[18:26])[0]
127 self.peeraddr = unpack_peer(buffer[26:44])
128 self.packet = buffer[44:]
132 """Zmq message received from a third party to send to the terminal"""
134 KWARGS = (("imei", None), ("when", None), ("packet", b""))
143 else self.imei.encode(),
148 else pack("!d", self.when)
153 def decode(self, buffer):
154 self.imei = buffer[:16].decode()
155 self.when = unpack("!d", buffer[16:24])[0]
156 self.packet = buffer[24:]