-from logging import getLogger, StreamHandler, DEBUG, INFO
-from logging.handlers import SysLogHandler
+from logging import getLogger
from select import poll, POLLIN, POLLERR, POLLHUP, POLLPRI
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
import sys
from time import time
-from .GT06mod import handle_packet, make_response, LOGIN
+from . import common
+from .gps303proto import handle_packet, make_response, LOGIN
from .evstore import initdb, stow
+from .lookaside import prepare_response
-PORT = 4303
-log = getLogger("gps303")
+CONF = "/etc/gps303.conf"
-if __name__.endswith("__main__"):
- if sys.stdout.isatty():
- log.addHandler(StreamHandler(sys.stderr))
- log.setLevel(DEBUG)
- else:
- log.addHandler(SysLogHandler(address="/dev/log"))
- log.setLevel(INFO)
+log = getLogger("gps303")
- initdb("/tmp/gps303.sqlite")
+def runserver(conf):
+ initdb(conf.get("storage", "dbfn"))
ctlsock = socket(AF_INET, SOCK_STREAM)
ctlsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- ctlsock.bind(("", PORT))
+ ctlsock.bind(("", conf.getint("collector", "port")))
ctlsock.listen(5)
ctlfd = ctlsock.fileno()
pollset = poll()
packet = clntsock.recv(4096)
when = time()
if packet:
- msg = handle_packet(packet, clntaddr, when)
- log.debug("%s from %s fd %d'", msg, clntaddr, fd)
+ msg = handle_packet(packet)
+ log.debug("%s from %s fd %d", msg, clntaddr, fd)
if isinstance(msg, LOGIN):
imei = msg.imei
clnt_dict[fd] = (clntsock, clntaddr, imei)
- stow(clntaddr, when, imei, msg.proto, msg.payload)
- response = make_response(msg)
+ stow(
+ clntaddr,
+ when,
+ imei,
+ msg.length,
+ msg.PROTO,
+ msg.payload,
+ )
+ kwargs = prepare_response(conf, msg)
+ response = make_response(msg, **kwargs)
if response:
try:
# Ignore possibility of blocking
except OSError as e:
log.debug("sending to fd %d error %s", fd, e)
else:
+ # TODO: Also disconnect on HIBERNATION
log.info("disconnect fd %d imei %s", fd, imei)
pollset.unregister(fd)
clntsock.close()
del clnt_dict[fd]
if ev & ~POLLIN:
log.warning("unexpected event", ev, "on fd", fd)
+
+if __name__.endswith("__main__"):
+ runserver(common.init(log))