def _start_(self): try: with yombo.utils.fopen("automation.txt", "r") as fp_: temp_rules = hjson.loads(fp_.read()) self._rulesRaw = msgpack.loads(msgpack.dumps(temp_rules)) # remove ordered dict. # print "hjosn: %s" % hjson.loads(self._rulesRaw) logger.debug("automation.txt rules RAW: {rules}", rules=self._rulesRaw) except Exception, e: logger.warn("Simple automation is unable to parse 'automation.txt' file: %s." % e) self._rulesRaw = {}
def is_msgpack(self, mymsgpack): """ Helper function to determine if data is msgpack or not. :param mymsgpack: :return: """ try: json_object = msgpack.loads(mymsgpack) except ValueError, e: return False
def amqp_incoming(self, deliver, properties, msg, queue): """ All incoming messages come here. It will be parsed and sorted as needed. Routing: 1) Device updates, changes, deletes -> Devices library 1) Command updates, changes, deletes -> Command library 1) Module updates, changes, deletes -> Module library 1) Device updates, changes, deletes -> Devices library 1) Device updates, changes, deletes -> Devices library Summary of tasks: 1) Validate incoming headers. 2) Setup ACK/Nack responses. 3) Route the message to the proper library for final handling. """ # self._local_log("info", "AMQPLibrary::amqp_incoming") # print " !!!!!!!!!!!!!!!!!!!!!!!!! " # print "properties: %s" % properties # log.msg('%s (%s): %s' % (deliver.exchange, deliver.routing_key, repr(msg)), system='Pika:<=') if properties.user_id is None: self._Statistics.increment("lib.amqpyombo.received.discarded.nouserid", bucket_time=15, anon=True) raise YomboWarning("user_id missing.") if properties.content_type is None: self._Statistics.increment("lib.amqpyombo.received.discarded.content_type_missing", bucket_time=15, anon=True) raise YomboWarning("content_type missing.") if properties.content_encoding is None: self._Statistics.increment("lib.amqpyombo.received.discarded.content_encoding_missing", bucket_time=15, anon=True) raise YomboWarning("content_encoding missing.") if properties.content_encoding != 'text' and properties.content_encoding != 'zlib': self._Statistics.increment("lib.amqpyombo.received.discarded.content_encoding_invalid", bucket_time=15, anon=True) raise YomboWarning("Content Encoding must be either 'text' or 'zlib'. Got: " + properties.content_encoding) if properties.content_type != 'text/plain' and properties.content_type != 'application/msgpack' and properties.content_type != 'application/json': self._Statistics.increment("lib.amqpyombo.received.discarded.content_type_invalid", bucket_time=15, anon=True) logger.warn('Error with contentType!') raise YomboWarning("Content type must be 'application/msgpack', 'application/json' or 'text/plain'. Got: " + properties.content_type) if properties.content_encoding == 'zlib': beforeZlib = len(msg) msg = zlib.decompress(msg) afterZlib = len(msg) logger.debug("Message sizes: msg_size_compressed = {compressed}, non-compressed = {uncompressed}, percent: {percent}", compressed=beforeZlib, uncompressed=afterZlib, percent=percentage(beforeZlib, afterZlib)) self._Statistics.increment("lib.amqpyombo.received.compressed", bucket_time=15, anon=True) self._Statistics.averages("lib.amqpyombo.received.compressed.percentage", percentage(beforeZlib, afterZlib), bucket_time=15, anon=True) else: self._Statistics.increment("lib.amqpyombo.received.uncompressed", bucket_time=15, anon=True) self._Statistics.averages("lib.amqpyombo.received.payload.size", len(msg), bucket_time=15, anon=True) if properties.content_type == 'application/json': if self.is_json(msg): msg = json.loads(msg) else: raise YomboWarning("Receive msg reported json, but isn't.") elif properties.content_type == 'application/msgpack': if self.is_msgpack(msg): msg = msgpack.loads(msg) else: raise YomboWarning("Received msg reported msgpack, but isn't.") if properties.headers['type'] == 'request': self._Statistics.increment("lib.amqpyombo.received.request", bucket_time=15, anon=True) # if a response, lets make sure it's something we asked for! elif properties.headers['type'] == "response": # print "send_correlation_ids: %s" % self.amqp.send_correlation_ids if properties.correlation_id not in self.amqp.send_correlation_ids: self._Statistics.increment("lib.amqpyombo.received.discarded.correlation_id_missing", bucket_time=15, anon=True) raise YomboWarning("correlation_id missing.") time_info = self.amqp.send_correlation_ids[properties.correlation_id] daate_time = time_info['time_received'] - time_info['time_sent'] milliseconds = ( daate_time.days * 24 * 60 * 60 + daate_time.seconds) * 1000 + daate_time.microseconds / 1000.0 logger.debug("Time between sending and receiving a response:: {milliseconds}", milliseconds=milliseconds) self._Statistics.averages("lib.amqpyombo.amqp.response.time", milliseconds, bucket_time=15, anon=True) if properties.correlation_id is None or not isinstance(properties.correlation_id, six.string_types): self._Statistics.increment("lib.amqpyombo.received.discarded.correlation_id_invalid", bucket_time=15, anon=True) raise YomboWarning("Correlation_id must be present for 'Response' types, and must be a string.") if properties.correlation_id not in self.amqp.send_correlation_ids: logger.debug("{correlation_id} not in list of ids: {send_correlation_ids} ", correlation_id=properties.correlation_id, send_correlation_ids=self.amqp.send_correlation_ids.keys()) self._Statistics.increment("lib.amqpyombo.received.discarded.nocorrelation", bucket_time=15, anon=True) raise YomboWarning("Received request {correlation_id}, but never asked for it. Discarding", correlation_id=properties.correlation_id) else: self._Statistics.increment("lib.amqpyombo.received.discarded.unknown_msg_type", bucket_time=15, anon=True) raise YomboWarning("Unknown message type recieved.") # self._local_log("debug", "PikaProtocol::receive_item4") # if we are here.. we have a valid message.... if properties.headers['type'] == 'request': try: logger.debug("headers: {headers}", headers=properties.headers) if properties.headers['request_type'] == 'control': self.controlHandler.process_control(msg, properties) elif properties.headers['request_type'] == 'system': self.process_system_request(msg, properties) except Exception, e: logger.error("--------==(Error: in response processing )==--------") logger.error("--------------------------------------------------------") logger.error("{error}", error=sys.exc_info()) logger.error("---------------==(Traceback)==--------------------------") logger.error("{trace}", trace=traceback.print_exc(file=sys.stdout)) logger.error("--------------------------------------------------------")