""" TCP server that communicates with terminals """
from logging import getLogger
+from os import umask
from socket import socket, AF_INET6, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
from time import time
from struct import pack
def add(self, clntsock, clntaddr):
fd = clntsock.fileno()
+ log.info("Start serving fd %d from %s", fd, clntaddr)
self.by_fd[fd] = Client(clntsock, clntaddr)
return fd
if proto_of_message(packet) == LOGIN.PROTO: # Could do blindly...
self.by_imei[clnt.imei] = clnt
result.append((clnt.imei, when, peeraddr, packet))
+ log.debug(
+ "Received from %s (IMEI %s): %s",
+ peeraddr,
+ clnt.imei,
+ packet.hex(),
+ )
return result
def response(self, resp):
def runserver(conf):
zctx = zmq.Context()
zpub = zctx.socket(zmq.PUB)
- zpub.bind(conf.get("collector", "publishurl"))
zpull = zctx.socket(zmq.PULL)
+ oldmask = umask(0o117)
+ zpub.bind(conf.get("collector", "publishurl"))
zpull.bind(conf.get("collector", "listenurl"))
+ umask(oldmask)
tcpl = socket(AF_INET6, SOCK_STREAM)
tcpl.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
tcpl.bind(("", conf.getint("collector", "port")))
while True:
try:
msg = zpull.recv(zmq.NOBLOCK)
- tosend.append(Resp(msg))
+ zmsg = Resp(msg)
+ zpub.send(
+ Bcast(
+ is_incoming=False,
+ proto=proto_of_message(zmsg.packet),
+ imei=zmsg.imei,
+ packet=zmsg.packet,
+ ).packed
+ )
+ tosend.append(zmsg)
except zmq.Again:
break
elif sk == tcpfd: