1 """ Zeromq messages """
4 from struct import pack, unpack
6 __all__ = "Bcast", "Resp"
8 def pack_peer(peeraddr):
10 addr = ip.ip_address(saddr)
11 return pack("B", addr.version) + (addr.packed + b"\0\0\0\0\0\0\0\0\0\0\0\0")[:16] + pack("!H", port)
13 def unpack_peer(buffer):
15 if version not in (4, 6):
18 addr = ip.IPv4Address(buffer[1:5])
20 addr = ip.IPv6Address(buffer[1:17])
21 port = unpack("!H", buffer[17:19])[0]
26 def __init__(self, *args, **kwargs):
30 for k, v in self.KWARGS:
31 setattr(self, k, kwargs.get(k, v))
34 self.__class__.__name__
41 def decode(self, buffer):
43 self.__class__.__name__ + "must implement `encode()` method"
49 self.__class__.__name__ + "must implement `encode()` method"
54 """Zmq message to broadcast what was received from the terminal"""
68 + ("0000000000000000" if self.imei is None else self.imei).encode()
69 + (b"\0\0\0\0\0\0\0\0" if self.when is None else pack("!d", self.when))
70 + pack_peer(self.peeraddr)
74 def decode(self, buffer):
75 self.proto = buffer[0]
76 self.imei = buffer[1:17].decode()
77 if self.imei == "0000000000000000":
79 self.when = unpack("!d", buffer[17:25])[0]
80 self.peeraddr = unpack_peer(buffer[25:44])
81 self.packet = buffer[44:]
85 """Zmq message received from a third party to send to the terminal"""
87 KWARGS = (("imei", None), ("packet", b""))
92 "0000000000000000" if self.imei is None else self.imei.encode()
95 def decode(self, buffer):
96 self.imei = buffer[:16].decode()
97 self.packet = buffer[16:]