Index: cloud_sync.py =================================================================== diff -u -r4ebf654ab1b0d436ce7d171bfe06c6bdc46aca47 -rcc7bbd932684e69aa456c114596625546630903e --- cloud_sync.py (.../cloud_sync.py) (revision 4ebf654ab1b0d436ce7d171bfe06c6bdc46aca47) +++ cloud_sync.py (.../cloud_sync.py) (revision cc7bbd932684e69aa456c114596625546630903e) @@ -20,78 +20,95 @@ from cloudsync.handlers.ui_cs_request_handler import UICSMessageHandler from cloudsync.busses.file_input_bus import FileInputBus from cloudsync.utils.heartbeat import HeartBeatProvider +from cloudsync.handlers.error import Error -VERSION = "0.2.6" +VERSION = "0.4.3" -arguments = sys.argv -log_level = int(arguments[1]) +try: + arguments = sys.argv + log_level = int(arguments[1]) -logging.basicConfig(filename='cloudsync.log', - level=log_level, - format='[%(asctime)s]: %(levelname)s - %(message)s | {%(pathname)s:%(lineno)d}', - ) + if not os.path.exists(CS_LOG_PATH): + os.makedirs(CS_LOG_PATH) -app = Flask(__name__) -api = Api(app=app, version=VERSION, title="CloudSync Registration API", - description="Interface with DIA Manufacturing Tool") + logging.basicConfig(filename=CS_LOG_FILE, + level=log_level, + format='[%(asctime)s]: %(levelname)s - %(message)s | {%(pathname)s:%(lineno)d}', + ) -for handler in app.logger.handlers: - app.logger.removeHandler(handler) -handler = logging.FileHandler('cloudsync.log') -handler.setLevel(log_level) -default_formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(module)s: %(message)s') -handler.setFormatter(default_formatter) + app = Flask(__name__) + api = Api(app=app, version=VERSION, title="CloudSync Registration API", + description="Interface with DIA Manufacturing Tool * DCS") -# app.logger.addHandler(handler) -app.logger.setLevel(log_level) + for handler in app.logger.handlers: + app.logger.removeHandler(handler) + handler = logging.FileHandler(CS_LOG_FILE) + handler.setLevel(log_level) + default_formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(module)s: %(message)s') + handler.setFormatter(default_formatter) -g_utils.add_logger(app.logger) + app.logger.setLevel(log_level) -g_config = helpers_read_config(CONFIG_PATH) + g_utils.add_logger(app.logger) -reachability_provider = ReachabilityProvider(logger=app.logger) + g_config = helpers_read_config(CONFIG_PATH) -g_utils.add_reachability_provider(reachability_provider=reachability_provider) + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'operation': + helpers_read_config(OPERATION_CONFIG_FILE_PATH) + CONFIG_PATH = OPERATION_CONFIG_FILE_PATH -output_channel = FileOutputBus(logger=app.logger, max_size=100, file_channels_path=UI2CS_FILE_CHANNELS_PATH) + reachability_provider = ReachabilityProvider(logger=app.logger) -error_handler = ErrorHandler(logger=app.logger, max_size=100, output_channel=output_channel) + g_utils.add_reachability_provider(reachability_provider=reachability_provider) -network_request_handler = NetworkRequestHandler(logger=app.logger, max_size=1, output_channel=output_channel, - reachability_provider=reachability_provider, - error_handler=error_handler) -message_handler = UICSMessageHandler(logger=app.logger, max_size=20, network_request_handler=network_request_handler, - output_channel=output_channel, reachability_provider=reachability_provider, - error_handler=error_handler) -ui_cs_bus = FileInputBus(logger=app.logger, file_channels_path=UI2CS_FILE_CHANNELS_PATH, input_channel_name="inp.buf", - g_config=g_config, message_handler=message_handler) + output_channel = FileOutputBus(logger=app.logger, max_size=100, file_channels_path=UI2CS_FILE_CHANNELS_PATH) -heartbeat_provider = HeartBeatProvider(logger=app.logger, network_request_handler=network_request_handler, - output_channel=output_channel) + error_handler = ErrorHandler(logger=app.logger, max_size=100, output_channel=output_channel) -if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'operation': - heartbeat_provider.send_heartbeat = True -else: - heartbeat_provider.send_heartbeat = False + network_request_handler = NetworkRequestHandler(logger=app.logger, max_size=1, output_channel=output_channel, + reachability_provider=reachability_provider, + error_handler=error_handler) + message_handler = UICSMessageHandler(logger=app.logger, max_size=20, network_request_handler=network_request_handler, + output_channel=output_channel, reachability_provider=reachability_provider, + error_handler=error_handler) + ui_cs_bus = FileInputBus(logger=app.logger, file_channels_path=UI2CS_FILE_CHANNELS_PATH, input_channel_name="inp.buf", + g_config=g_config, message_handler=message_handler) -parser = reqparse.RequestParser() + heartbeat_provider = HeartBeatProvider(logger=app.logger, network_request_handler=network_request_handler, + output_channel=output_channel) -# START - REGISTRATION ENDPOINTS + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'operation': + heartbeat_provider.send_heartbeat = True + else: + heartbeat_provider.send_heartbeat = False + g_utils.logger.debug("Current config path: {0}".format(CONFIG_PATH)) + + parser = reqparse.RequestParser() +except Exception as e: + error = Error("{0},2,{1},Failed to start CS - {2}".format(OutboundMessageIDs.CS2UI_ERROR.value, + ErrorIDs.GENERIC_ERROR.value, + e)) + self.error_handler.enqueue_error(error=error) + + @api.route("/version") class Version(Resource): @api.response(OK, "Success") def get(self): app.logger.info("Received /version HTTP request") - return { - "version": VERSION - }, OK + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'registration': + return { + "version": VERSION + }, OK + +# START - REGISTRATION ENDPOINTS + @api.route("/credentials") class Credentials(Resource): - FIELD_CREDENTIALS = api.model("Credentials", { "certificate": fields.String, "public_key": fields.String, @@ -103,58 +120,71 @@ @api.response(BAD_REQUEST, "Validation Error") def put(self): """ - 4. Update the device's certificate and keys + Update the device's certificate and keys Manufacturing Tool -> Device """ app.logger.info("Received /credentials HTTP request") - payload = request.json - certificate = payload.get("certificate", None) - private_key = payload.get("private_key", None) - public_key = payload.get("public_key", None) - invalid_params = [] - if certificate is None: - invalid_params.append("certificate") - if private_key is None: - invalid_params.append("private_key") - if public_key is None: - invalid_params.append("public_key") - if len(invalid_params) > 0: - return {"invalidAttributes": invalid_params}, BAD_REQUEST - r = NetworkRequest(request_type=NetworkRequestType.MFT2CS_REQ_SET_CREDENTIALS, - url=request.url, - payload=payload, - method=request.method, - g_config=g_config, - ) - network_request_handler.enqueue_request(r) + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'registration': + payload = request.json + certificate = payload.get("certificate", None) + private_key = payload.get("private_key", None) + public_key = payload.get("public_key", None) + invalid_params = [] + if certificate is None: + invalid_params.append("certificate") + if private_key is None: + invalid_params.append("private_key") + if public_key is None: + invalid_params.append("public_key") + if len(invalid_params) > 0: + error = Error("{0},2,{1}, invalid credentials".format(OutboundMessageIDs.CS2UI_ERROR.value, + ErrorIDs.CS_SAVE_CREDENTIALS_ERROR.value, + invalid_params)) + error_handler.enqueue_error(error=error) + return {"invalidAttributes": invalid_params}, BAD_REQUEST - return { - "invalidAttributes": [], - }, OK + try: + helpers_add_to_network_queue(network_request_handler=network_request_handler, + request_type=NetworkRequestType.MFT2CS_REQ_SET_CREDENTIALS, + url=request.url, + payload=payload, + method=request.method, + g_config=g_config, + success_message='CS2MFT_REQ_SET_CREDENTIALS request added to network ' + 'queue') + except Exception as e: + error = Error("{0},2,{1},{2}".format(OutboundMessageIDs.CS2UI_ERROR.value, + ErrorIDs.CS_SAVE_CREDENTIALS_ERROR.value, + e)) + error_handler.enqueue_error(error=error) + return { + "invalidAttributes": [], + }, OK + @api.route("/validate") class Validate(Resource): @api.response(OK, "Success") def head(self): """ - 5. Initiate device connectivity test + Initiate device connectivity test Manufacturing Tool -> Device """ app.logger.info("Received /validate HTTP request") - r = NetworkRequest(request_type=NetworkRequestType.MFT2CS_REQ_INIT_CONNECTIVITY_TEST, - url=request.url, - payload={}, - method=request.method, - g_config=g_config, - ) - network_request_handler.enqueue_request(r) + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'registration': + r = NetworkRequest(request_type=NetworkRequestType.MFT2CS_REQ_INIT_CONNECTIVITY_TEST, + url=request.url, + payload={}, + method=request.method, + g_config=g_config, + ) + network_request_handler.enqueue_request(r) - # no body is returned - return {}, OK + return {}, OK @api.route("/reset") @@ -163,72 +193,36 @@ @api.response(OK, "Success") def head(self): """ - 13. Initiate a factory reset + Initiate a factory reset Assumes the connectivity test has already been completed Manufacturing Tool -> Device """ app.logger.info("Received /reset HTTP request") - r = NetworkRequest(request_type=NetworkRequestType.MFT2CS_REQ_FACTORY_RESET, - url=request.url, - payload={}, - method=request.method, - g_config=g_config, - ) - network_request_handler.enqueue_request(r) + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'registration': + r = NetworkRequest(request_type=NetworkRequestType.MFT2CS_REQ_FACTORY_RESET, + url=request.url, + payload={}, + method=request.method, + g_config=g_config, + ) + network_request_handler.enqueue_request(r) - heartbeat_provider.send_heartbeat = True + heartbeat_provider.send_heartbeat = True - return {}, OK + return {}, OK + # END - REGISTRATION ENDPOINTS -@api.route("/config") -class Config(Resource): - @api.response(OK, "Success") - def get(self): - """ - Get the current json config - """ - app.logger.info("Received /config HTTP request") - return g_config, OK - - -@api.route("/token") -class Config(Resource): - - @api.response(OK, "Success") - def get(self): - """ - Get the currently stored token - """ - app.logger.info("Received /token HTTP request") - return helpers_read_access_token(DEVICE_KEBORMED_ACCESS_TOKEN_PATH), OK - - -@api.route("/logs") -class Logs(Resource): - - @api.hide - def get(self): - app.logger.info("Received /logs HTTP request") - content = "" - with open(CS_LOG_FILE, 'r') as f: - content = f.read() - return Response(content, mimetype="text/plain") - - def main(): - if DEBUG: + if g_config[CONFIG_DEVICE][CONFIG_DEVICE_MODE] == 'registration': app.run(debug=False, use_reloader=False, host="0.0.0.0", port=g_config[CONFIG_DEVICE][CONFIG_DEVICE_PORT]) - elif VM: - app.logger.error("VM mode not implemented yet.") - elif SERVER: - app.logger.error("Server mode not implemented yet.") else: - app.logger.error("Production mode not implemented yet.") + while True: + sleep(1) if __name__ == '__main__':