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):
84 pack("BB", is_incoming, proto) + b"" if imei is None else imei.encode()
89 """Zmq message to broadcast what was received from the terminal"""
92 ("is_incoming", True),
103 pack("BB", int(self.is_incoming), self.proto)
104 + ("0000000000000000" if self.imei is None else self.imei).encode()
108 else pack("!d", self.when)
110 + pack_peer(self.peeraddr)
114 def decode(self, buffer):
115 self.is_incoming = bool(buffer[0])
116 self.proto = buffer[1]
117 self.imei = buffer[2:18].decode()
118 if self.imei == "0000000000000000":
120 self.when = unpack("!d", buffer[18:26])[0]
121 self.peeraddr = unpack_peer(buffer[26:44])
122 self.packet = buffer[44:]
126 """Zmq message received from a third party to send to the terminal"""
128 KWARGS = (("imei", None), ("when", None), ("packet", b""))
133 ("0000000000000000" if self.imei is None else self.imei.encode())
137 else pack("!d", self.when)
142 def decode(self, buffer):
143 self.imei = buffer[:16].decode()
144 self.when = unpack("!d", buffer[16:24])[0]
145 self.packet = buffer[24:]