]> average.org Git - loctrkd.git/blobdiff - gps303/__main__.py
rename protocol module to "gps303proto"
[loctrkd.git] / gps303 / __main__.py
index 0f6484a01fb8d1712933b42ba0326ac7de3280d4..d3d6d1e7bfc5d0c8bf54205e1039cebcbcee5bef 100755 (executable)
@@ -1,3 +1,4 @@
+from getopt import getopt
 from logging import getLogger, StreamHandler, DEBUG, INFO
 from logging.handlers import SysLogHandler
 from select import poll, POLLIN, POLLERR, POLLHUP, POLLPRI
@@ -5,25 +6,33 @@ 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 .config import readconfig
+from .gps303proto import handle_packet, make_response, LOGIN, set_config
 from .evstore import initdb, stow
+from .lookaside import prepare_response
+
+CONF = "/etc/gps303.conf"
 
-PORT = 4303
 log = getLogger("gps303")
 
 if __name__.endswith("__main__"):
+    opts, _ = getopt(sys.argv[1:], "c:d")
+    opts = dict(opts)
+    conf = readconfig(opts["-c"] if "-c" in opts else CONF)
+
     if sys.stdout.isatty():
         log.addHandler(StreamHandler(sys.stderr))
-        log.setLevel(DEBUG)
     else:
         log.addHandler(SysLogHandler(address="/dev/log"))
-        log.setLevel(INFO)
+    log.setLevel(DEBUG if "-d" in opts else INFO)
+    log.info("starting with options: %s", opts)
 
-    initdb("/tmp/gps303.sqlite")
+    initdb(conf.get("daemon", "dbfn"))
+    set_config(conf)
 
     ctlsock = socket(AF_INET, SOCK_STREAM)
     ctlsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
-    ctlsock.bind(("", PORT))
+    ctlsock.bind(("", conf.getint("daemon", "port")))
     ctlsock.listen(5)
     ctlfd = ctlsock.fileno()
     pollset = poll()
@@ -61,12 +70,20 @@ if __name__.endswith("__main__"):
                     when = time()
                     if packet:
                         msg = handle_packet(packet, clntaddr, when)
-                        log.debug("%s from %s fd %d'", msg, clntaddr, fd)
+                        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
@@ -74,6 +91,7 @@ if __name__.endswith("__main__"):
                             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()