]> www.average.org Git - loctrkd.git/commitdiff
make qry work again
authorEugene Crosser <crosser@average.org>
Mon, 11 Jul 2022 22:00:57 +0000 (00:00 +0200)
committerEugene Crosser <crosser@average.org>
Thu, 14 Jul 2022 20:39:57 +0000 (22:39 +0200)
loctrkd/beesure.py
loctrkd/collector.py
loctrkd/qry.py
loctrkd/zx303proto.py

index 8fa83f51902b0e472286ceff089ba49aeb389964..9c10286e178769b9bc31aaf465cd0388d3ef52cc 100755 (executable)
@@ -29,7 +29,6 @@ __all__ = (
     "proto_handled",
     "parse_message",
     "probe_buffer",
-    "proto_by_name",
     "proto_name",
     "DecodeError",
     "Respond",
@@ -419,10 +418,6 @@ def proto_name(obj: Union[MetaPkt, BeeSurePkt]) -> str:
     )
 
 
-def proto_by_name(name: str) -> str:
-    return PROTO_PREFIX + PROTOS.get(name, "UNKNOWN")
-
-
 def proto_of_message(packet: bytes) -> str:
     return PROTO_PREFIX + packet[20:-1].split(b",")[0].decode()
 
index 98345007b708ad446c80c39d04d42fe7c52fd6e1..22bc9c3ffa2014346d74fd13b19de48d6d098472 100644 (file)
@@ -61,10 +61,6 @@ class ProtoModule:
     def proto_of_message(packet: bytes) -> str:
         ...
 
-    @staticmethod
-    def proto_by_name(name: str) -> int:
-        ...
-
 
 pmods: List[ProtoModule] = []
 
index cde47ec7a64a62552667f19dd73fade36fad36fe..e33ba16b1fcb9d5208de77ae611ea441f01e2ffb 100644 (file)
@@ -1,40 +1,71 @@
+""" Print out contens of the event database """
+
+from configparser import ConfigParser
 from datetime import datetime, timezone
+from getopt import getopt
+from importlib import import_module
+from logging import getLogger
 from sqlite3 import connect
-import sys
-
-from .zx303proto import parse_message, proto_by_name
-
-db = connect(sys.argv[1])
-c = db.cursor()
-if len(sys.argv) > 2:
-    proto = proto_by_name(sys.argv[2])
-    if proto < 0:
-        raise ValueError("No protocol with name " + sys.argv[2])
-    selector = " where proto = :proto"
-else:
-    proto = -1
-    selector = ""
-
-c.execute(
-    "select tstamp, imei, peeraddr, proto, packet from events" + selector,
-    {"proto": proto},
-)
-
-for tstamp, imei, peeraddr, proto, packet in c:
-    if len(packet) > packet[0] + 1:
+from sys import argv
+from typing import Any, cast, List, Tuple
+
+from . import common
+
+log = getLogger("loctrkd/qry")
+
+
+class ProtoModule:
+    @staticmethod
+    def proto_handled(proto: str) -> bool:
+        ...
+
+    @staticmethod
+    def parse_message(packet: bytes, is_incoming: bool = True) -> Any:
+        ...
+
+
+pmods: List[ProtoModule] = []
+
+
+def main(
+    conf: ConfigParser, opts: List[Tuple[str, str]], args: List[str]
+) -> None:
+    global pmods
+    pmods = [
+        cast(ProtoModule, import_module("." + modnm, __package__))
+        for modnm in conf.get("collector", "protocols").split(",")
+    ]
+    db = connect(conf.get("storage", "dbfn"))
+    c = db.cursor()
+    if len(args) > 0:
+        proto = args[0]
+        selector = " where proto = :proto"
+    else:
+        proto = ""
+        selector = ""
+
+    c.execute(
+        """select tstamp, imei, peeraddr, is_incoming, proto, packet
+           from events"""
+        + selector,
+        {"proto": proto},
+    )
+
+    for tstamp, imei, peeraddr, is_incoming, proto, packet in c:
+        msg: Any = f"Unparseable({packet.hex()})"
+        for pmod in pmods:
+            if pmod.proto_handled(proto):
+                msg = pmod.parse_message(packet, is_incoming)
         print(
-            "proto",
-            packet[1],
-            "datalen",
-            len(packet),
-            "msg.length",
-            packet[0],
-            file=sys.stderr,
+            datetime.fromtimestamp(tstamp)
+            .astimezone(tz=timezone.utc)
+            .isoformat(),
+            imei,
+            peeraddr,
+            msg,
         )
-    msg = parse_message(packet)
-    print(
-        datetime.fromtimestamp(tstamp).astimezone(tz=timezone.utc).isoformat(),
-        imei,
-        peeraddr,
-        msg,
-    )
+
+
+if __name__.endswith("__main__"):
+    opts, args = getopt(argv[1:], "c:d")
+    main(common.init(log, opts=opts), opts, args)
index 2c44a1382b1058b7b0a9e2f0325fde57c3b107a5..a2132f6c3c658aee30995d5326cf4d8701f93ba3 100755 (executable)
@@ -38,7 +38,6 @@ __all__ = (
     "proto_handled",
     "parse_message",
     "probe_buffer",
-    "proto_by_name",
     "proto_name",
     "DecodeError",
     "Respond",
@@ -886,10 +885,6 @@ def proto_name(obj: Union[MetaPkt, GPS303Pkt]) -> str:
     )
 
 
-def proto_by_name(name: str) -> int:
-    return PROTOS.get(name, -1)
-
-
 def proto_of_message(packet: bytes) -> str:
     return proto_name(CLASSES.get(packet[1], UNKNOWN))