]> www.average.org Git - loctrkd.git/blobdiff - loctrkd/rectifier.py
Implement sending commands from the web interface
[loctrkd.git] / loctrkd / rectifier.py
index e4f29b2936a40258d664521ba85fb4267ff38da8..5926377ee76ad4dc5665b72dec551a5e279bc661 100644 (file)
@@ -6,6 +6,7 @@ from importlib import import_module
 from logging import getLogger
 from os import umask
 from struct import pack
+from typing import cast, List, Tuple
 import zmq
 
 from . import common
@@ -15,8 +16,30 @@ from .zmsg import Bcast, Rept, Resp, topic
 log = getLogger("loctrkd/rectifier")
 
 
+class QryModule:
+    @staticmethod
+    def init(conf: ConfigParser) -> None:
+        ...
+
+    @staticmethod
+    def shut() -> None:
+        ...
+
+    @staticmethod
+    def lookup(
+        mcc: int,
+        mnc: int,
+        gsm_cells: List[Tuple[int, int, int]],
+        wifi_aps: List[Tuple[str, int]],
+    ) -> Tuple[float, float, float]:
+        ...
+
+
 def runserver(conf: ConfigParser) -> None:
-    qry = import_module("." + conf.get("rectifier", "lookaside"), __package__)
+    qry = cast(
+        QryModule,
+        import_module("." + conf.get("rectifier", "lookaside"), __package__),
+    )
     qry.init(conf)
     proto_needanswer = dict(common.exposed_protos())
     # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?!
@@ -28,7 +51,9 @@ def runserver(conf: ConfigParser) -> None:
     zpush = zctx.socket(zmq.PUSH)  # type: ignore
     zpush.connect(conf.get("collector", "listenurl"))
     zpub = zctx.socket(zmq.PUB)  # type: ignore
-    zpub.connect(conf.get("rectifier", "publishurl"))
+    oldmask = umask(0o117)
+    zpub.bind(conf.get("rectifier", "publishurl"))
+    umask(oldmask)
 
     try:
         while True:
@@ -43,17 +68,26 @@ def runserver(conf: ConfigParser) -> None:
                 datetime.fromtimestamp(zmsg.when).astimezone(tz=timezone.utc),
                 msg,
             )
-            rect: Report = msg.rectified()
+            pmod, rect = msg.rectified()
             log.debug("rectified: %s", rect)
             if isinstance(rect, (CoordReport, StatusReport)):
-                zpub.send(Rept(imei=zmsg.imei, payload=rect.json).packed)
+                zpub.send(
+                    Rept(imei=zmsg.imei, pmod=pmod, payload=rect.json).packed
+                )
             elif isinstance(rect, HintReport):
                 try:
-                    lat, lon = qry.lookup(
-                        rect.mcc, rect.mnc, rect.gsm_cells, rect.wifi_aps
+                    lat, lon, acc = qry.lookup(
+                        rect.mcc,
+                        rect.mnc,
+                        rect.gsm_cells,
+                        list((mac, strng) for _, mac, strng in rect.wifi_aps),
                     )
                     log.debug(
-                        "Approximated lat=%s, lon=%s for %s", lat, lon, rect
+                        "Approximated lat=%s, lon=%s, acc=%s for %s",
+                        lat,
+                        lon,
+                        acc,
+                        rect,
                     )
                     if proto_needanswer.get(zmsg.proto, False):
                         resp = Resp(
@@ -63,23 +97,25 @@ def runserver(conf: ConfigParser) -> None:
                         )
                         log.debug("Sending reponse %s", resp)
                         zpush.send(resp.packed)
+                    rept = CoordReport(
+                        devtime=rect.devtime,
+                        battery_percentage=rect.battery_percentage,
+                        accuracy=acc,
+                        altitude=None,
+                        speed=None,
+                        direction=None,
+                        latitude=lat,
+                        longitude=lon,
+                    )
+                    log.debug("Sending report %s", rept)
                     zpub.send(
                         Rept(
                             imei=zmsg.imei,
-                            payload=CoordReport(
-                                devtime=rect.devtime,
-                                battery_percentage=rect.battery_percentage,
-                                accuracy=-1,
-                                altitude=-1,
-                                speed=-1,
-                                direction=-1,
-                                latitude=lat,
-                                longitude=lon,
-                            ).json,
+                            payload=rept.json,
                         ).packed
                     )
                 except Exception as e:
-                    log.warning(
+                    log.exception(
                         "Lookup for %s rectified as %s resulted in %s",
                         msg,
                         rect,