From: Eugene Crosser Date: Mon, 11 Jul 2022 22:00:57 +0000 (+0200) Subject: make qry work again X-Git-Tag: 1.90~28 X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=commitdiff_plain;h=e4f6256a6cd5a80e9afcaaa4033fa40d4d0b7ee9 make qry work again --- diff --git a/loctrkd/beesure.py b/loctrkd/beesure.py index 8fa83f5..9c10286 100755 --- a/loctrkd/beesure.py +++ b/loctrkd/beesure.py @@ -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() diff --git a/loctrkd/collector.py b/loctrkd/collector.py index 9834500..22bc9c3 100644 --- a/loctrkd/collector.py +++ b/loctrkd/collector.py @@ -61,10 +61,6 @@ class ProtoModule: def proto_of_message(packet: bytes) -> str: ... - @staticmethod - def proto_by_name(name: str) -> int: - ... - pmods: List[ProtoModule] = [] diff --git a/loctrkd/qry.py b/loctrkd/qry.py index cde47ec..e33ba16 100644 --- a/loctrkd/qry.py +++ b/loctrkd/qry.py @@ -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) diff --git a/loctrkd/zx303proto.py b/loctrkd/zx303proto.py index 2c44a13..a2132f6 100755 --- a/loctrkd/zx303proto.py +++ b/loctrkd/zx303proto.py @@ -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))