]> www.average.org Git - loctrkd.git/blobdiff - loctrkd/watch.py
WIP: beesure protocol
[loctrkd.git] / loctrkd / watch.py
index a8a53b0dd62f04938bef519e200796986a45a3a4..ab041edc832c7ae78198ea5deb3375d9e32dff29 100644 (file)
@@ -2,17 +2,34 @@
 
 from configparser import ConfigParser
 from datetime import datetime, timezone
+from importlib import import_module
 from logging import getLogger
+from typing import Any, cast, List
 import zmq
 
 from . import common
-from .zx303proto import parse_message
 from .zmsg import Bcast
 
 log = getLogger("loctrkd/watch")
 
 
+class ProtoModule:
+    PROTO_PREFIX: str
+
+    @staticmethod
+    def parse_message(packet: bytes, is_incoming: bool = True) -> Any:
+        ...
+
+
+pmods: List[ProtoModule] = []
+
+
 def runserver(conf: ConfigParser) -> None:
+    global pmods
+    pmods = [
+        cast(ProtoModule, import_module("." + modnm, __package__))
+        for modnm in conf.get("collector", "protocols").split(",")
+    ]
     # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?!
     zctx = zmq.Context()  # type: ignore
     zsub = zctx.socket(zmq.SUB)  # type: ignore
@@ -22,8 +39,11 @@ def runserver(conf: ConfigParser) -> None:
     try:
         while True:
             zmsg = Bcast(zsub.recv())
-            msg = parse_message(zmsg.packet, zmsg.is_incoming)
-            print("I" if zmsg.is_incoming else "O", zmsg.imei, msg)
+            print("Bcast:", zmsg)
+            for pmod in pmods:
+                if zmsg.proto.startswith(pmod.PROTO_PREFIX):
+                    msg = pmod.parse_message(zmsg.packet, zmsg.is_incoming)
+                    print("I" if zmsg.is_incoming else "O", zmsg.imei, msg)
     except KeyboardInterrupt:
         pass