1 from logging import getLogger
2 from select import poll, POLLIN, POLLERR, POLLHUP, POLLPRI
3 from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
8 from .gps303proto import handle_packet, make_response, LOGIN
9 from .evstore import initdb, stow
10 from .lookaside import prepare_response
12 CONF = "/etc/gps303.conf"
14 log = getLogger("gps303")
17 initdb(conf.get("storage", "dbfn"))
19 ctlsock = socket(AF_INET, SOCK_STREAM)
20 ctlsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
21 ctlsock.bind(("", conf.getint("collector", "port")))
23 ctlfd = ctlsock.fileno()
25 pollset.register(ctlfd, POLLIN | POLLERR | POLLHUP | POLLPRI)
29 events = pollset.poll(1000)
30 except KeyboardInterrupt:
36 clntsock, clntaddr = ctlsock.accept()
37 clntfd = clntsock.fileno()
38 clnt_dict[clntfd] = (clntsock, clntaddr, None)
40 clntfd, POLLIN | POLLERR | POLLHUP | POLLPRI
43 "accepted connection from %s as fd %d",
48 log.debug("unexpected event on ctlfd: %s", ev)
51 clntsock, clntaddr, imei = clnt_dict[fd]
52 except KeyError: # this socket closed already
55 packet = clntsock.recv(4096)
58 msg = handle_packet(packet)
59 log.debug("%s from %s fd %d", msg, clntaddr, fd)
60 if isinstance(msg, LOGIN):
62 clnt_dict[fd] = (clntsock, clntaddr, imei)
71 kwargs = prepare_response(conf, msg)
72 response = make_response(msg, **kwargs)
75 # Ignore possibility of blocking
76 clntsock.send(make_response(msg))
78 log.debug("sending to fd %d error %s", fd, e)
80 # TODO: Also disconnect on HIBERNATION
81 log.info("disconnect fd %d imei %s", fd, imei)
82 pollset.unregister(fd)
86 log.warning("unexpected event", ev, "on fd", fd)
88 if __name__.endswith("__main__"):
89 runserver(common.init(log))