]> www.average.org Git - loctrkd.git/blob - loctrkd/storage.py
128a4573cbacfe550d30b5c6f757a9de56b0feeb
[loctrkd.git] / loctrkd / storage.py
1 """ Store zmq broadcasts to sqlite """
2
3 from configparser import ConfigParser
4 from datetime import datetime, timezone
5 from logging import getLogger
6 import zmq
7
8 from . import common
9 from .evstore import initdb, stow
10 from .zmsg import Bcast
11
12 log = getLogger("loctrkd/storage")
13
14
15 def runserver(conf: ConfigParser) -> None:
16     dbname = conf.get("storage", "dbfn")
17     log.info('Using Sqlite3 database "%s"', dbname)
18     initdb(dbname)
19     # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?!
20     zctx = zmq.Context()  # type: ignore
21     zsub = zctx.socket(zmq.SUB)  # type: ignore
22     zsub.connect(conf.get("collector", "publishurl"))
23     zsub.setsockopt(zmq.SUBSCRIBE, b"")
24
25     try:
26         while True:
27             zmsg = Bcast(zsub.recv())
28             log.debug(
29                 "%s IMEI %s from %s at %s: %s",
30                 "I" if zmsg.is_incoming else "O",
31                 zmsg.imei,
32                 zmsg.peeraddr,
33                 datetime.fromtimestamp(zmsg.when).astimezone(tz=timezone.utc),
34                 zmsg.packet.hex(),
35             )
36             stow(
37                 is_incoming=zmsg.is_incoming,
38                 peeraddr=str(zmsg.peeraddr),
39                 when=zmsg.when,
40                 imei=zmsg.imei,
41                 proto=zmsg.proto,
42                 packet=zmsg.packet,
43             )
44     except KeyboardInterrupt:
45         zsub.close()
46         zctx.destroy()  # type: ignore
47
48
49 if __name__.endswith("__main__"):
50     runserver(common.init(log))