diff --git a/dish_grpc_mqtt.py b/dish_grpc_mqtt.py index ccee65d..0fc4912 100644 --- a/dish_grpc_mqtt.py +++ b/dish_grpc_mqtt.py @@ -15,6 +15,8 @@ Where *id_value* is the *id* value from the dish status information. """ import logging +import os +import signal import sys import time import json @@ -32,6 +34,14 @@ import dish_common HOST_DEFAULT = "localhost" +class Terminated(Exception): + pass + + +def handle_sigterm(signum, frame): + # Turn SIGTERM into an exception so main loop can clean up + raise Terminated + def parse_args(): parser = dish_common.create_arg_parser(output_description="publish it to a MQTT broker", @@ -72,6 +82,29 @@ def parse_args(): else: parser.epilog += "\nSSL support options not available due to missing ssl module" + env_map = ( + ("MQTT_HOST", "hostname"), + ("MQTT_PORT", "port"), + ("MQTT_USERNAME", "username"), + ("MQTT_PASSWORD", "password"), + ("MQTT_SSL", "tls"), + ) + env_defaults = {} + for var, opt in env_map: + # check both set and not empty string + val = os.environ.get(var) + if val: + if var == "MQTT_SSL": + if val == "insecure": + env_defaults[opt] = False + elif val == "secure": + env_defaults[opt] = True + else: + env_defaults["ssl_ca_cert"] = val + else: + env_defaults[opt] = val + parser.set_defaults(**env_defaults) + opts = dish_common.run_arg_parser(parser, need_id=True) if opts.username is None and opts.password is not None: @@ -145,6 +178,8 @@ def main(): gstate = dish_common.GlobalState(target=opts.target) + signal.signal(signal.SIGTERM, handle_sigterm) + try: next_loop = time.monotonic() while True: @@ -155,10 +190,11 @@ def main(): time.sleep(next_loop - now) else: break + except Terminated: + pass finally: gstate.shutdown() - - sys.exit(rc) + sys.exit(rc) if __name__ == '__main__': diff --git a/systemd/starlink-mqtt.service b/systemd/starlink-mqtt.service new file mode 100644 index 0000000..5a11a4e --- /dev/null +++ b/systemd/starlink-mqtt.service @@ -0,0 +1,12 @@ +[Unit] +Description=Starlink GRPC to MQTT exporter +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/starlink-grpc-tools/ +Environment=MQTT_HOST=localhost MQTT_PORT=1883 MQTT_USERNAME= MQTT_PASSORD= MQTT_SSL=false +ExecStart=/opt/starlink-grpc-tools/venv/bin/python3 dish_grpc_mqtt.py -t 10 status alert_detail + +[Install] +WantedBy=multi-user.target