""" TCP server that communicates with terminals """
from logging import getLogger
-from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
+from socket import socket, AF_INET6, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
from time import time
from struct import pack
import zmq
log.debug("Closing fd %d (IMEI %s)", self.sock.fileno(), self.imei)
self.sock.close()
self.buffer = b""
- self.imei = None
def recv(self):
"""Read from the socket and parse complete messages"""
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):
if resp.imei in self.by_imei:
self.by_imei[resp.imei].send(resp.packet)
+ else:
+ log.info("Not connected (IMEI %s)", resp.imei)
def runserver(conf):
zctx = zmq.Context()
zpub = zctx.socket(zmq.PUB)
zpub.bind(conf.get("collector", "publishurl"))
- zsub = zctx.socket(zmq.SUB)
- zsub.connect(conf.get("collector", "listenurl"))
- tcpl = socket(AF_INET, SOCK_STREAM)
+ zpull = zctx.socket(zmq.PULL)
+ zpull.bind(conf.get("collector", "listenurl"))
+ tcpl = socket(AF_INET6, SOCK_STREAM)
tcpl.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
tcpl.bind(("", conf.getint("collector", "port")))
tcpl.listen(5)
tcpfd = tcpl.fileno()
poller = zmq.Poller()
- poller.register(zsub, flags=zmq.POLLIN)
+ poller.register(zpull, flags=zmq.POLLIN)
poller.register(tcpfd, flags=zmq.POLLIN)
clients = Clients()
try:
tosend = []
topoll = []
tostop = []
- events = poller.poll(10)
+ events = poller.poll(1000)
for sk, fl in events:
- if sk is zsub:
+ if sk is zpull:
while True:
try:
- msg = zsub.recv(zmq.NOBLOCK)
+ msg = zpull.recv(zmq.NOBLOCK)
tosend.append(Resp(msg))
except zmq.Again:
break
elif sk == tcpfd:
clntsock, clntaddr = tcpl.accept()
topoll.append((clntsock, clntaddr))
- else:
+ elif fl & zmq.POLLIN:
received = clients.recv(sk)
if received is None:
log.debug(
clients.response(
Resp(imei=imei, packet=respmsg)
)
+ else:
+ log.debug("Stray event: %s on socket %s", fl, sk)
# poll queue consumed, make changes now
for fd in tostop:
poller.unregister(fd)
clients.stop(fd)
for zmsg in tosend:
+ log.debug("Sending to the client: %s", zmsg)
clients.response(zmsg)
for clntsock, clntaddr in topoll:
fd = clients.add(clntsock, clntaddr)
- poller.register(fd)
+ poller.register(fd, flags=zmq.POLLIN)
except KeyboardInterrupt:
pass