]> www.average.org Git - loctrkd.git/blob - loctrkd/watch.py
6d3dcd9fa8ed7eb1f4eba1cdacd266549e9b2519
[loctrkd.git] / loctrkd / watch.py
1 """ Watch for locevt and print them """
2
3 from configparser import ConfigParser
4 from datetime import datetime, timezone
5 from importlib import import_module
6 from logging import getLogger
7 from typing import Any, cast, List
8 import zmq
9
10 from . import common
11 from .protomodule import ProtoModule
12 from .zmsg import Bcast
13
14 log = getLogger("loctrkd/watch")
15
16
17 pmods: List[ProtoModule] = []
18
19
20 def runserver(conf: ConfigParser) -> None:
21     global pmods
22     pmods = [
23         cast(ProtoModule, import_module("." + modnm, __package__))
24         for modnm in conf.get("common", "protocols").split(",")
25     ]
26     # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?!
27     zctx = zmq.Context()  # type: ignore
28     zsub = zctx.socket(zmq.SUB)  # type: ignore
29     zsub.connect(conf.get("collector", "publishurl"))
30     zsub.setsockopt(zmq.SUBSCRIBE, b"")
31
32     try:
33         while True:
34             zmsg = Bcast(zsub.recv())
35             print("I" if zmsg.is_incoming else "O", zmsg.proto, zmsg.imei)
36             for pmod in pmods:
37                 if pmod.proto_handled(zmsg.proto):
38                     msg = pmod.parse_message(zmsg.packet, zmsg.is_incoming)
39                     print(msg)
40                     if zmsg.is_incoming and hasattr(msg, "rectified"):
41                         print(msg.rectified())
42     except KeyboardInterrupt:
43         pass
44
45
46 if __name__.endswith("__main__"):
47     runserver(common.init(log))