]> www.average.org Git - loctrkd.git/blob - loctrkd/qry.py
Update changelog for 2.00 release
[loctrkd.git] / loctrkd / qry.py
1 """ Print out contens of the event database """
2
3 from configparser import ConfigParser
4 from datetime import datetime, timezone
5 from getopt import getopt
6 from importlib import import_module
7 from logging import getLogger
8 from sqlite3 import connect
9 from sys import argv
10 from typing import Any, cast, List, Tuple
11
12 from . import common
13 from .protomodule import ProtoModule
14
15 log = getLogger("loctrkd/qry")
16
17
18 pmods: List[ProtoModule] = []
19
20
21 def main(
22     conf: ConfigParser, opts: List[Tuple[str, str]], args: List[str]
23 ) -> None:
24     global pmods
25     pmods = [
26         cast(ProtoModule, import_module("." + modnm, __package__))
27         for modnm in conf.get("common", "protocols").split(",")
28     ]
29     db = connect(conf.get("storage", "dbfn"))
30     c = db.cursor()
31     if len(args) > 0:
32         proto = args[0]
33         selector = " where proto = :proto"
34     else:
35         proto = ""
36         selector = ""
37     dopts = dict(opts)
38     if len(args) > 1 and "-o" in dopts:
39         attr = args[1]
40         fn = dopts["-o"]
41     else:
42         attr = ""
43         fn = ""
44
45     c.execute(
46         """select tstamp, imei, peeraddr, is_incoming, proto, packet
47            from events"""
48         + selector,
49         {"proto": proto},
50     )
51
52     for tstamp, imei, peeraddr, is_incoming, proto, packet in c:
53         msg: Any = f"Unparseable({packet.hex()})"
54         for pmod in pmods:
55             if pmod.proto_handled(proto):
56                 msg = pmod.parse_message(packet, is_incoming)
57         print(
58             datetime.fromtimestamp(tstamp)
59             .astimezone(tz=timezone.utc)
60             .isoformat(),
61             imei,
62             peeraddr,
63             msg,
64         )
65         if fn and hasattr(msg, attr):
66             with open(fn, "wb") as fl:  # TODO support multiple files
67                 fl.write(getattr(msg, attr))
68
69
70 if __name__.endswith("__main__"):
71     opts, args = getopt(argv[1:], "o:c:d")
72     main(common.init(log, opts=opts), opts, args)