import config import json import logging import mqtt import os import report import task import time try: from config import APP_NAME as ROOT_LOGGER_NAME except ImportError: ROOT_LOGGER_NAME = 'root' logger = logging.getLogger(ROOT_LOGGER_NAME).getChild('main') class exec_command(mqtt.mqtt_client, task.threaded_queue): def __init__(self): self.__block_execution__ = False task.threaded_queue.__init__(self) mqtt.mqtt_client.__init__(self, config.APP_NAME, config.MQTT_SERVER, 1883, config.MQTT_USER, config.MQTT_PASS) self.add_callback(config.TOPIC, self.mqtt_rx) def exec_command(self, rt): os.system(config.COMMAND) self.__block_execution__ = False def mqtt_rx(self, client, userdate, message): if not self.__block_execution__: data = None if config.PAYLOAD_KEY is None: try: data = message.payload.decode('utf-8') except: logger.exception("Error decoding mqtt message") else: try: payload = json.loads(message.payload) except: logger.exception("Error decoding json mqtt message") else: data = payload.get(config.PAYLOAD_KEY) if config.PAYLOAD_DATA is None or data == config.PAYLOAD_DATA: logger.debug("Starting execution in background...") self.__block_execution__ = True self.enqueue(5, self.exec_command) else: logger.debug("Execution in progress. Ignoring request...") if __name__ == '__main__': report.appLoggingConfigure(config.__BASEPATH__, config.LOGTARGET, ((config.APP_NAME, config.LOGLVL), ), fmt=config.formatter, host=config.LOGHOST, port=config.LOGPORT) # ec = exec_command() ec.run() # while True: time.sleep(30) try: ec.join() finally: ec.stop()