class MessagePusher(SonicDaemonApp):
    def __init__(self):
        self.pidfile_path = "/var/run/sonic_app/message_pusher.pid"
        self.log_path = "/var/log/sonic_app/message_pusher.log"
        self.amqp_client = AmqpClient()
        SonicDaemonApp.__init__(self)

    def run(self):
        self.logger.debug("Starting message pusher")
        self.amqp_client.open_connection()
        while True:
            db = init_db()
            try:
                messages = db.execute(
                    "SELECT devices.uuid, messages.params, messages.id"
                    " FROM messages, devices"
                    " WHERE messages.device_id = devices.id"
                    " AND messages.status = 'queued'")
                for message in messages:
                    self.logger.debug(message)
                    payload = message['params']
                    queue = message['uuid']
                    message_id = message['id']
                    self.amqp_client.publish(queue, payload)
                    db.execute("UPDATE messages SET status = 'pushed'"
                               " WHERE id = {}".format(message_id))
                    self.logger.debug("Pushed message {0} for device uuid {1}"
                                      .format(payload, queue))
            except Exception as e:
                self.logger.debug("Oops! Error :{0}\n{1}"
                                  .format(e.message, traceback.format_exc()))
            db.close()
            time.sleep(10)
class MessageListener(SonicDaemonApp):
    QUEUE = CONF.app_queue

    def __init__(self):
        self.pidfile_path = "/var/run/sonic_app/message_listener.pid"
        self.log_path = "/var/log/sonic_app/message_listener.log"
        SonicDaemonApp.__init__(self)
        self.amqp_client = AmqpClient()
        self.manager = Manager()

    def run(self):
        self.logger.debug("Starting message listener")
        try:
            self.amqp_client.open_connection()
            self.amqp_client.channel.queue_declare(queue=self.QUEUE)
            self.amqp_client.channel.basic_consume(self._callback,
                                                   queue=self.QUEUE,
                                                   no_ack=True)
            self.amqp_client.channel.start_consuming()
        except Exception as e:
            self.logger.error("Error while starting amqp - {0}\n{1}"
                              .format(e.message, traceback.format_exc()))

    def _callback(self, ch, method, properties, body):
        self.logger.debug("Processing {}".format(body))
        try:
            # message = json.loads(decrypt(body))
            message = json.loads(body)
            for key, val in message.iteritems():
                if hasattr(self.manager, key):
                    getattr(self.manager, key)(val)
                else:
                    raise ActionUnsupportedError(key)
        except Exception as e:
            self.logger.error("Error while processing message - {0}\n{1}"
                              .format(e.message, traceback.format_exc()))
 def __init__(self):
     self.pidfile_path = "/var/run/sonic_app/message_pusher.pid"
     self.log_path = "/var/log/sonic_app/message_pusher.log"
     self.amqp_client = AmqpClient()
     SonicDaemonApp.__init__(self)
 def __init__(self):
     self.pidfile_path = "/var/run/sonic_app/message_listener.pid"
     self.log_path = "/var/log/sonic_app/message_listener.log"
     SonicDaemonApp.__init__(self)
     self.amqp_client = AmqpClient()
     self.manager = Manager()