예제 #1
0
파일: client.py 프로젝트: MarsYoung/alertR
	def _sensorAlertHandler(self, data):

		logging.debug("[%s]: Received sensor alert." % self.fileName)
		
		# extract data from sensor alert message
		try:
			splittedData = data.split()
			sensorId = int(splittedData[1])
			state = int(splittedData[2])
			alertLevel = int(splittedData[3])
		except Exception as e:
			logging.exception("[%s]: Receiving sensor alert " % self.fileName
				+ "failed.")

			return False

		# acknowledge sensor alert
		logging.debug("[%s]: Sending SENSORALERT OK message." % self.fileName)
		try:
			self.client.send("SENSORALERT OK\r\n")
		except Exception as e:
			logging.exception("[%s]: Sending sensor alert " % self.fileName
				+ "acknowledgement failed.")

			return False

		# trigger all alerts that have the same alert level
		for alert in self.alerts:
			if alertLevel in alert.alertLevels:

				# trigger alert in an own thread to not block this one
				alertTriggerProcess = AsynchronousAlertExecuter(alert)
				# set thread to daemon
				# => threads terminates when main thread terminates	
				alertTriggerProcess.daemon = True
				alertTriggerProcess.triggerAlert = True
				alertTriggerProcess.start()

		return True
예제 #2
0
    def _sensorAlertHandler(self, data):

        logging.debug("[%s]: Received sensor alert." % self.fileName)

        # extract data from sensor alert message
        try:
            splittedData = data.split()
            sensorId = int(splittedData[1])
            state = int(splittedData[2])
            alertLevel = int(splittedData[3])
        except Exception as e:
            logging.exception("[%s]: Receiving sensor alert " % self.fileName +
                              "failed.")

            return False

        # acknowledge sensor alert
        logging.debug("[%s]: Sending SENSORALERT OK message." % self.fileName)
        try:
            self.client.send("SENSORALERT OK\r\n")
        except Exception as e:
            logging.exception("[%s]: Sending sensor alert " % self.fileName +
                              "acknowledgement failed.")

            return False

        # trigger all alerts that have the same alert level
        for alert in self.alerts:
            if alertLevel in alert.alertLevels:

                # trigger alert in an own thread to not block this one
                alertTriggerProcess = AsynchronousAlertExecuter(alert)
                # set thread to daemon
                # => threads terminates when main thread terminates
                alertTriggerProcess.daemon = True
                alertTriggerProcess.triggerAlert = True
                alertTriggerProcess.start()

        return True
예제 #3
0
	def _sensorAlertHandler(self, incomingMessage):

		logging.info("[%s]: Received sensor alert." % self.fileName)

		# extract sensor alert values
		sensorAlert = SensorAlert()
		sensorAlert.timeReceived = int(time.time())
		try:
			if not self._checkMsgServerTime(
				incomingMessage["serverTime"],
				incomingMessage["message"]):

				logging.error("[%s]: Received serverTime invalid."
					% self.fileName)
				return False
			if not self._checkMsgAlertLevels(
				incomingMessage["payload"]["alertLevels"],
				incomingMessage["message"]):

				logging.error("[%s]: Received alertLevels invalid."
					% self.fileName)
				return False
			if not self._checkMsgDescription(
				incomingMessage["payload"]["description"],
				incomingMessage["message"]):

				logging.error("[%s]: Received description invalid."
					% self.fileName)
				return False
			if not self._checkMsgRulesActivated(
				incomingMessage["payload"]["rulesActivated"],
				incomingMessage["message"]):

				logging.error("[%s]: Received rulesActivated invalid."
					% self.fileName)
				return False
			if not self._checkMsgSensorId(
				incomingMessage["payload"]["sensorId"],
				incomingMessage["message"]):

				logging.error("[%s]: Received sensorId invalid."
					% self.fileName)
				return False
			if not self._checkMsgState(
				incomingMessage["payload"]["state"],
				incomingMessage["message"]):

				logging.error("[%s]: Received state invalid."
					% self.fileName)
				return False
			if not self._checkMsgHasOptionalData(
				incomingMessage["payload"]["hasOptionalData"],
				incomingMessage["message"]):

				logging.error("[%s]: Received hasOptionalData invalid."
					% self.fileName)
				return False
			if incomingMessage["payload"]["hasOptionalData"]:
				if not self._checkMsgOptionalData(
					incomingMessage["payload"]["optionalData"],
					incomingMessage["message"]):

					logging.error("[%s]: Received optionalData invalid."
						% self.fileName)
					return False
			if not self._checkMsgSensorDataType(
				incomingMessage["payload"]["dataType"],
				incomingMessage["message"]):

				logging.error("[%s]: Received dataType invalid."
					% self.fileName)
				return False
			if incomingMessage["payload"]["dataType"] != SensorDataType.NONE:
				if not self._checkMsgSensorData(
					incomingMessage["payload"]["data"],
					incomingMessage["payload"]["dataType"],
					incomingMessage["message"]):

					logging.error("[%s]: Received data invalid."
						% self.fileName)
					return False
			if not self._checkMsgHasLatestData(
				incomingMessage["payload"]["hasLatestData"],
				incomingMessage["message"]):

				logging.error("[%s]: Received hasLatestData invalid."
					% self.fileName)
				return False
			if not self._checkMsgChangeState(
				incomingMessage["payload"]["changeState"],
				incomingMessage["message"]):

				logging.error("[%s]: Received changeState invalid."
					% self.fileName)
				return False

			sensorAlert.sensorId = incomingMessage["payload"]["sensorId"]
			sensorAlert.alertLevels = incomingMessage["payload"]["alertLevels"]
			sensorAlert.state = incomingMessage["payload"]["state"]
			sensorAlert.description = incomingMessage["payload"]["description"]
			sensorAlert.changeState = incomingMessage["payload"]["changeState"]
			sensorAlert.rulesActivated = \
				incomingMessage["payload"]["rulesActivated"]

			# parse received data (if data transfer is activated)
			sensorAlert.optionalData = None
			sensorAlert.hasOptionalData = \
				incomingMessage["payload"]["hasOptionalData"]
			if sensorAlert.hasOptionalData:
				sensorAlert.optionalData = incomingMessage[
					"payload"]["optionalData"]

			sensorAlert.changeState = incomingMessage["payload"]["changeState"]
			sensorAlert.hasLatestData = \
				incomingMessage["payload"]["hasLatestData"]

			sensorAlert.dataType = incomingMessage["payload"]["dataType"]
			sensorAlert.sensorData = None
			if sensorAlert.dataType != SensorDataType.NONE:
				sensorAlert.sensorData = incomingMessage["payload"]["data"]

		except Exception as e:
			logging.exception("[%s]: Received sensor alert " % self.fileName
				+ "invalid.")

			# send error message back
			try:
				utcTimestamp = int(time.time())
				message = {"clientTime": utcTimestamp,
					"message": incomingMessage["message"],
					"error": "received sensor alert invalid"}
				self.client.send(json.dumps(message))
			except Exception as e:
				pass

			return False

		# sending sensor alert response
		logging.debug("[%s]: Sending sensor alert " % self.fileName
			+ "response message.")
		try:
			payload = {"type": "response", "result": "ok"}
			utcTimestamp = int(time.time())
			message = {"clientTime": utcTimestamp,
				"message": "sensoralert", "payload": payload}
			self.client.send(json.dumps(message))

		except Exception as e:
			logging.exception("[%s]: Sending sensor alert " % self.fileName
				+ "response failed.")

			return False

		# trigger all alerts that have the same alert level
		atLeastOnceTriggered = False
		for alert in self.alerts:
			for alertLevel in sensorAlert.alertLevels:
				if alertLevel in alert.alertLevels:
					atLeastOnceTriggered = True
					# trigger alert in an own thread to not block this one
					alertTriggerProcess = AsynchronousAlertExecuter(alert)
					alertTriggerProcess.sensorAlert = sensorAlert
					# set thread to daemon
					# => threads terminates when main thread terminates
					alertTriggerProcess.daemon = True
					alertTriggerProcess.triggerAlert = True
					alertTriggerProcess.start()
					break

		# Write to log file if no alert was triggered for received sensorAlert.
		if not atLeastOnceTriggered:
			alertLevelsStr = ", ".join(map(str, sensorAlert.alertLevels))
			logging.info("[%s]: No alert triggered for alertLevels: %s."
				% (self.fileName, alertLevelsStr))

		return True
예제 #4
0
	def _sensorAlertHandler(self, incomingMessage):

		logging.debug("[%s]: Received sensor alert." % self.fileName)
		
		# extract sensor alert values
		try:
			alertLevels = incomingMessage["payload"]["alertLevels"]
			# check if alertLevels is a list
			if not isinstance(alertLevels, list):
				# send error message back
				try:
					message = {"clientTime": int(time.time()),
						"message": message["message"],
						"error": "alertLevels not of type list"}
					self.client.send(json.dumps(message))
				except Exception as e:
					pass

				return False
			# check if all elements of the alertLevels list 
			# are of type int
			if not all(isinstance(item, int) for item in alertLevels):
				# send error message back
				try:
					message = {"clientTime": int(time.time()),
						"message": message["message"],
						"error": "alertLevels items not of type int"}
					self.client.send(json.dumps(message))
				except Exception as e:
					pass

				return False

			description = str(incomingMessage["payload"]["description"])

			# parse received data (if data transfer is activated)
			data = None
			dataTransfer = bool(incomingMessage["payload"]["dataTransfer"])
			if dataTransfer:
				data = incomingMessage["payload"]["data"]

				# check if data is of type dict
				# => if not ignore it
				if not isinstance(data, dict):
					logging.warning("[%s]: Received data in sensor alert "
						% self.fileName
						+ "not valid. Ignoring it.")

					data = None
					dataTransfer = False

		except Exception as e:
			logging.exception("[%s]: Received sensor alert " % self.fileName
				+ "invalid.")

			# send error message back
			try:
				message = {"clientTime": int(time.time()),
					"message": incomingMessage["message"],
					"error": "received sensor alert invalid"}
				self.client.send(json.dumps(message))
			except Exception as e:
				pass

			return False

		# sending sensor alert response
		logging.debug("[%s]: Sending sensor alert " % self.fileName
			+ "response message.")
		try:

			payload = {"type": "response", "result": "ok"}
			message = {"clientTime": int(time.time()),
				"message": "sensoralert", "payload": payload}
			self.client.send(json.dumps(message))

		except Exception as e:
			logging.exception("[%s]: Sending sensor alert " % self.fileName
				+ "response failed.")

			return False

		# trigger all alerts that have the same alert level
		for alert in self.alerts:
			for alertLevel in alertLevels:
				if alertLevel in alert.alertLevels:
					# trigger alert in an own thread to not block this one
					alertTriggerProcess = AsynchronousAlertExecuter(alert)
					alertTriggerProcess.sensorDescription = description
					alertTriggerProcess.dataTransfer = dataTransfer
					alertTriggerProcess.data = data
					# set thread to daemon
					# => threads terminates when main thread terminates	
					alertTriggerProcess.daemon = True
					alertTriggerProcess.triggerAlert = True
					alertTriggerProcess.start()

		return True
예제 #5
0
파일: client.py 프로젝트: kakeman/alertR
    def _sensorAlertHandler(self, incomingMessage):

        logging.debug("[%s]: Received sensor alert." % self.fileName)

        # extract sensor alert values
        try:
            alertLevels = incomingMessage["payload"]["alertLevels"]
            # check if alertLevels is a list
            if not isinstance(alertLevels, list):
                # send error message back
                try:
                    message = {
                        "clientTime": int(time.time()),
                        "message": message["message"],
                        "error": "alertLevels not of type list"
                    }
                    self.client.send(json.dumps(message))
                except Exception as e:
                    pass

                return False
            # check if all elements of the alertLevels list
            # are of type int
            if not all(isinstance(item, int) for item in alertLevels):
                # send error message back
                try:
                    message = {
                        "clientTime": int(time.time()),
                        "message": message["message"],
                        "error": "alertLevels items not of type int"
                    }
                    self.client.send(json.dumps(message))
                except Exception as e:
                    pass

                return False

            state = int(incomingMessage["payload"]["state"])
            description = str(incomingMessage["payload"]["description"])

            # parse received data (if data transfer is activated)
            data = None
            dataTransfer = bool(incomingMessage["payload"]["dataTransfer"])
            if dataTransfer:
                data = incomingMessage["payload"]["data"]

                # check if data is of type dict
                # => if not ignore it
                if not isinstance(data, dict):
                    logging.warning("[%s]: Received data in sensor alert " %
                                    self.fileName + "not valid. Ignoring it.")

                    data = None
                    dataTransfer = False

        except Exception as e:
            logging.exception("[%s]: Received sensor alert " % self.fileName +
                              "invalid.")

            # send error message back
            try:
                message = {
                    "clientTime": int(time.time()),
                    "message": incomingMessage["message"],
                    "error": "received sensor alert invalid"
                }
                self.client.send(json.dumps(message))
            except Exception as e:
                pass

            return False

        # sending sensor alert response
        logging.debug("[%s]: Sending sensor alert " % self.fileName +
                      "response message.")
        try:

            payload = {"type": "response", "result": "ok"}
            message = {
                "clientTime": int(time.time()),
                "message": "sensoralert",
                "payload": payload
            }
            self.client.send(json.dumps(message))

        except Exception as e:
            logging.exception("[%s]: Sending sensor alert " % self.fileName +
                              "response failed.")

            return False

        # trigger all alerts that have the same alert level
        for alert in self.alerts:
            for alertLevel in alertLevels:
                if alertLevel in alert.alertLevels:
                    # trigger alert in an own thread to not block this one
                    alertTriggerProcess = AsynchronousAlertExecuter(alert)
                    alertTriggerProcess.sensorDescription = description
                    alertTriggerProcess.state = state
                    alertTriggerProcess.dataTransfer = dataTransfer
                    alertTriggerProcess.data = data
                    # set thread to daemon
                    # => threads terminates when main thread terminates
                    alertTriggerProcess.daemon = True
                    alertTriggerProcess.triggerAlert = True
                    alertTriggerProcess.start()

        return True