예제 #1
0
    def update_module_data(self, module_data):
        """
        Updates module data
        :param module_data: Module data to update. It contains the module id, request origin address and parsed
        module data
        :return: (iot_error) a status indicating if the module data was updated or not
        """
        assert isinstance(module_data, dict)

        # status code
        status = iot_error.FAILED

        # get module name
        module_name = module_data.get("id")

        # module instance
        module = Module(name=module_name)

        # get module type
        module_type = module.get_module_type()

        # check if module is registered
        if self.check_module_registration(
                module).code == iot_error.SUCCESS.code:

            # check module support
            if self.check_module_support(
                    module).code == iot_error.SUCCESS.code:

                # check for ilm module
                if module_type == "ilm":
                    status = ilm_data_update.update(module_data)

                # check for acm module
                elif module_type == "acm":
                    status = acm_data_update.update(module_data)

                # check for fpm module
                elif module_type == "fpm":
                    status = fpm_data_update.update(module_data)

            # unsupported module
            else:
                status = iot_error.UNSUPPORTED_MODULE

        # module is not registered before
        else:
            status = iot_error.UNREGISTERED_MODULE

        return status
예제 #2
0
    def process_request(self, request):
        """
        Process a given request
        :param request: (iot_message) request message with an operation to perform
        :return: (iot_error)
            iot_error: request processing status
        """
        assert isinstance(request, iot_message.IOTMessage)

        # status
        status = iot_error.FAILED

        # build response message
        response = iot_message.IOTMessage()
        response.set_source(iot_message.TCP_SERVER)

        # get request type
        request_type = request.get_operation()

        # get request data
        request_data = request.get_data()

        # get module name
        module_name = request_data.get("id")

        # module instance
        module = Module(name=module_name)

        # get module type
        module_type = module.get_module_type()

        # get module directory
        module_directory = os.path.join(self._modules_dir, module_name)

        # get module data file
        module_data_file = os.path.join(self._modules_dir, module_name,
                                        module_type + ".json")

        # get module html file
        module_html_file = os.path.join(self._modules_dir, module_name,
                                        module_type + ".html")

        # add module files to request data
        request_data["module_directory"] = module_directory
        request_data["module_data_file"] = module_data_file
        request_data["module_html_file"] = module_html_file

        # update request data
        request.set_data(request_data)

        # get module address (to send response to it)
        module_address = request_data.get("ip")

        # check for node add request
        if request_type == iot_message.ADD_NODE:
            status = self.add_module(request_data)

        # check for node remove request
        elif request_type == iot_message.REMOVE_NODE:
            status = self.remove_module(request_data)

        # check for data update request
        elif request_type == iot_message.UPDATE_DATA:
            status = self.update_module_data(request_data)
        """     build response message      """

        if (request_type
                == iot_message.ADD_NODE) or (request_type
                                             == iot_message.REMOVE_NODE):

            # get module address
            module_address = request_data.get("ip")

            # complete response message
            response.set_message_type(iot_message.RESPONSE)
            response.set_source(iot_message.TCP_SERVER)
            response.set_operation(status.string)
            response.set_data({
                "reason": status.string,
            })

        elif request_type == iot_message.UPDATE_DATA:

            # get module IP from local data file
            module_data_file = os.path.join(self._modules_dir, module_name,
                                            module_type + ".json")

            # load module data
            with open(module_data_file, 'r') as fh:
                module_data = json.loads(fh.read().strip())

            # get request source
            request_source = request.get_source()

            # check request source
            # (WEB_SERVER means that the request was sent by a CGI script, so
            # the IP passed with the request is the web server's IP and not the module's actual IP)
            if request_source == iot_message.WEB_SERVER:

                module_address = module_data.get("ip")

                del request_data["module_data_file"]
                del request_data["module_html_file"]
                del request_data["module_directory"]
                del request_data["ip"]

                # build response
                response.set_message_type(iot_message.REQUEST)
                response.set_operation(iot_message.UPDATE_DATA)
                response.set_data(request_data)

            else:
                response.set_message_type(iot_message.RESPONSE)
                response.set_operation(status.string)
                response.set_data({
                    "reason": status.string,
                })
                module_address = request_data.get("ip")

        # build response string
        response_validation, response_string = response.stringfy()

        # build TCP message for response
        response = TCPMessage(
            address=module_address,
            message=response_string,
        )

        # send response
        self.send_message(response)

        return status
예제 #3
0
    def add_module(self, module_data):
        """
        Add a module to the server
        :param module_data: Module to add
        :return: (iot_error) status indicating if module was added or not
        """

        assert isinstance(module_data, dict)

        self._logger.debug("Adding module: {}".format(module_data))

        # return status
        status = iot_error.FAILED

        # get module name
        module_name = module_data["id"]

        # get module address
        module_address = module_data["ip"]

        # make module instance
        module = Module(name=module_name)

        # check module_data registration
        if self.check_module_registration(
                module).code == iot_error.UNREGISTERED_MODULE.code:

            # check module_data support
            if self.check_module_support(
                    module).code == iot_error.SUCCESS.code:

                # get module_data type
                module_type = module.get_module_type()

                # get module html template file
                module_temp_html_file = os.path.join(
                    self._templates_dir, module_type,
                    module_type + "_html_temp.html")

                # get module data template file
                module_temp_data_file = os.path.join(
                    self._templates_dir, module_type,
                    module_type + "_data_temp.json")

                # get module directory
                module_directory = module_data["module_directory"]

                # get module html file
                module_html_file = module_data["module_html_file"]

                # get module data file
                module_data_file = module_data["module_data_file"]

                # make module_data directory
                os.mkdir(module_directory)

                # make module_data html file
                with open(module_temp_html_file, 'r') as fh:
                    module_html = fh.read().strip()

                with open(module_html_file, 'w') as fh:
                    fh.write(
                        module_html.format(module_type=module_type,
                                           module_id=module_name))

                # make module_data data file
                with open(module_temp_data_file, 'r') as fh:
                    module_data = json.loads(fh.read().strip())

                # update module address
                module_data["ip"] = module_address

                with open(module_data_file, 'w') as fh:
                    fh.write(json.dumps(module_data))

                status = iot_error.SUCCESS

            # unsupported module_data
            else:
                status = iot_error.UNSUPPORTED_MODULE

        # module_data is already registered
        else:

            # # TODO:: Test module volatility
            #
            # # check module volatility
            #
            # # get module type
            # module_type = module.get_module_type()
            #
            # # get module info file
            # module_info_file = os.path.join(self._templates_dir, module_type, "info.json")
            #
            # # check if module info file exists
            # if os.path.exists(module_info_file) and os.path.isfile(module_info_file):
            #
            #     # get module info
            #     with open(module_info_file, 'r') as fh:
            #         module_info = json.loads(fh.read().strip())
            #
            #     # get module volatility info
            #     module_volatility = module_info["volatile"]
            #
            #     # check if module is volatile
            #     if module_volatility:
            #
            #         # remove module
            #         self.remove_module(module_data=module_data)
            #
            #         # add module
            #         status = self.add_module(module_data=module_data)
            #
            #     # module is not volatile
            #     else:
            #         status = iot_error.SUCCESS
            #
            # # module info file doesn't exist
            # else:
            #     status = iot_error.MISSING_MODULE_INFO_FILE

            status = iot_error.SUCCESS

        return status