1 from logging import getLogger, StreamHandler, DEBUG, INFO
2 from logging.handlers import SysLogHandler
3 from select import poll, POLLIN, POLLERR, POLLHUP, POLLPRI
4 from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
8 from .GT06mod import handle_packet, make_response, LOGIN
9 from .evstore import initdb, stow
12 log = getLogger("gps303")
14 if __name__.endswith("__main__"):
15 if sys.stdout.isatty():
16 log.addHandler(StreamHandler(sys.stderr))
19 log.addHandler(SysLogHandler(address="/dev/log"))
22 initdb("/tmp/gps303.sqlite")
24 ctlsock = socket(AF_INET, SOCK_STREAM)
25 ctlsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
26 ctlsock.bind(("", PORT))
28 ctlfd = ctlsock.fileno()
30 pollset.register(ctlfd, POLLIN | POLLERR | POLLHUP | POLLPRI)
34 events = pollset.poll(1000)
35 except KeyboardInterrupt:
41 clntsock, clntaddr = ctlsock.accept()
42 clntfd = clntsock.fileno()
43 clnt_dict[clntfd] = (clntsock, clntaddr, None)
45 clntfd, POLLIN | POLLERR | POLLHUP | POLLPRI
48 "accepted connection from %s as fd %d",
53 log.debug("unexpected event on ctlfd: %s", ev)
56 clntsock, clntaddr, imei = clnt_dict[fd]
57 except KeyError: # this socket closed already
60 packet = clntsock.recv(4096)
63 msg = handle_packet(packet, clntaddr, when)
64 log.debug("%s from %s fd %d'", msg, clntaddr, fd)
65 if isinstance(msg, LOGIN):
67 clnt_dict[fd] = (clntsock, clntaddr, imei)
68 stow(clntaddr, when, imei, msg.proto, msg.payload)
69 response = make_response(msg)
72 # Ignore possibility of blocking
73 clntsock.send(make_response(msg))
75 log.debug("sending to fd %d error %s", fd, e)
77 log.info("disconnect fd %d imei %s", fd, imei)
78 pollset.unregister(fd)
82 log.warning("unexpected event", ev, "on fd", fd)