""" For when responding to the terminal is not trivial """
+from configparser import ConfigParser
from datetime import datetime, timezone
from logging import getLogger
from struct import pack
import zmq
from . import common
-from .gps303proto import parse_message, proto_by_name
-from .zmsg import Bcast, Resp
+from .gps303proto import *
+from .zmsg import Bcast, Resp, topic
log = getLogger("gps303/termconfig")
-def runserver(conf):
- zctx = zmq.Context()
- zsub = zctx.socket(zmq.SUB)
+def runserver(conf: ConfigParser) -> None:
+ termconfig = common.normconf(conf["termconfig"])
+ # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?!
+ zctx = zmq.Context() # type: ignore
+ zsub = zctx.socket(zmq.SUB) # type: ignore
zsub.connect(conf.get("collector", "publishurl"))
- for protoname in (
- "SUPERVISION",
- "STATUS",
- "RESET",
- "WHITELIST_TOTAL",
- "PROHIBIT_LBS",
- "SETUP",
- "POSITION_UPLOAD_INTERVAL",
+ for proto in (
+ STATUS.PROTO,
+ SETUP.PROTO,
+ POSITION_UPLOAD_INTERVAL.PROTO,
):
- topic = pack("B", proto_by_name(protoname))
- zsub.setsockopt(zmq.SUBSCRIBE, topic)
- zpush = zctx.socket(zmq.PUSH)
+ zsub.setsockopt(zmq.SUBSCRIBE, topic(proto))
+ zpush = zctx.socket(zmq.PUSH) # type: ignore
zpush.connect(conf.get("collector", "listenurl"))
try:
datetime.fromtimestamp(zmsg.when).astimezone(tz=timezone.utc),
msg,
)
- # TODO get data from the config
- resp = Resp(imei=zmsg.imei, packet=msg.response())
+ if msg.RESPOND is not Respond.EXT:
+ log.error(
+ "%s does not expect externally provided response", msg
+ )
+ kwargs = {}
+ if isinstance(msg, STATUS):
+ kwargs = {
+ "upload_interval": termconfig.get(
+ "statusintervalminutes", 25
+ )
+ }
+ elif isinstance(msg, SETUP):
+ for key in (
+ "uploadintervalseconds",
+ "binaryswitch",
+ "alarms",
+ "dndtimeswitch",
+ "dndtimes",
+ "gpstimeswitch",
+ "gpstimestart",
+ "gpstimestop",
+ "phonenumbers",
+ ):
+ if key in termconfig:
+ kwargs[key] = termconfig[key]
+ resp = Resp(
+ imei=zmsg.imei, when=zmsg.when, packet=msg.Out(**kwargs).packed
+ )
log.debug("Response: %s", resp)
zpush.send(resp.packed)