Index: cloud_sync.py =================================================================== diff -u -rb02f69db02eb8157d85f8d5c5b4e571784a6c212 -re3afee7b49f898e127dbe0330d0e9a63089f84d3 --- cloud_sync.py (.../cloud_sync.py) (revision b02f69db02eb8157d85f8d5c5b4e571784a6c212) +++ cloud_sync.py (.../cloud_sync.py) (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -19,7 +19,7 @@ import sys -VERSION = "0.4.15" +VERSION = "0.5.0" arguments = sys.argv @@ -44,7 +44,7 @@ ok = True else: if EXEC_MODE_UPDATE_KEY in arguments: # ---------- update - EXEC_MODE = EXEC_MODE_UPDATE + EXEC_MODE = EXEC_MODE_UPGRADE print(f"CloudSync starting in {EXEC_MODE} mode") print("CloudSync update config started...") # Update the $HOME from /var/configuraitons/ and update result in both for later update Index: cloudsync/common/enums.py =================================================================== diff -u -r419e3241093a822f62eade8ab206e9e4f197c408 -re3afee7b49f898e127dbe0330d0e9a63089f84d3 --- cloudsync/common/enums.py (.../enums.py) (revision 419e3241093a822f62eade8ab206e9e4f197c408) +++ cloudsync/common/enums.py (.../enums.py) (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -139,3 +139,10 @@ CS_LOG_ERROR = 931 CS_FACTORY_RESET_ERROR = 932 CS_LOG_RETENTION_ERROR = 933 + + +@unique +class LogUploadReasonCode(RootEnum): + DISCONNECTED = 1 # Backup & retry + CREDENTIAL = 2 # Backup & NO upload + DUPLICATE = 3 # Backup & rename Index: cloudsync/config/config_STAGING.json =================================================================== diff -u --- cloudsync/config/config_STAGING.json (revision 0) +++ cloudsync/config/config_STAGING.json (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -0,0 +1,29 @@ +{ + "kebormed_paas": { + "idp_client_secret": "NL2cn6eMyg2WLSB0nhfvbxvM79dvo3ta", + "url_mft": "", + "url_dcs": "https://device-api.diality.staging.kebormed.com", + "url_device_identity": "https://device-identity.diality.staging.kebormed.com/auth/realms/Main/protocol/openid-connect/token", + "url_reachability": "https://healthcheck.diality.staging.kebormed.com/", + "dia_org_id": 1 + }, + "device": { + "ip": "", + "port": 80, + "name": "", + "hd_serial": "", + "dg_serial": "", + "sw_version": "", + "mode": "registration", + "device_state": "INACTIVE_NOT_OK" + }, + "logs": { + "default_log_level": "ERROR", + "default_log_level_duration": "86400000", + "current_log_level": "", + "log_level_duration": 0, + "log_level_start_timestamp": 0, + "log_level_stop_timestamp": 0, + "update_dcs_flag": 0 + } +} \ No newline at end of file Index: cloudsync/handlers/cs_mft_dcs_request_handler.py =================================================================== diff -u -r8819ea1a48e9bb0014e9bb90ebb1e0d16eda7d65 -re3afee7b49f898e127dbe0330d0e9a63089f84d3 --- cloudsync/handlers/cs_mft_dcs_request_handler.py (.../cs_mft_dcs_request_handler.py) (revision 8819ea1a48e9bb0014e9bb90ebb1e0d16eda7d65) +++ cloudsync/handlers/cs_mft_dcs_request_handler.py (.../cs_mft_dcs_request_handler.py) (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -382,18 +382,26 @@ device_log_json = helpers_construct_device_log_json(device_log_data) - device_log_filename = cmd_outgoing_upload_file_in_chunks(base_url=base_url, + upload_result = cmd_outgoing_upload_file_in_chunks(base_url=base_url, access_token=access_token, file_json=device_log_json, error_handler=self.error_handler, log_file_origin='device') - if device_log_filename is not None: - self.logger.debug("Device log file uploaded: {device_log_filename}") - # Send response to the UI - message_body = str( - OutboundMessageIDs.CS2UI_DEVICE_LOG_UPLOADED.value) + ',1,' + device_log_filename + if isinstance(upload_result, dict) and not upload_result.get("accepted"): + # Rejection (e.g. 409 duplicate) — send 2010 with 3 params: filename, 0, reason_code + message_body = "{0},3,{1},0,{2}".format( + OutboundMessageIDs.CS2UI_DEVICE_LOG_UPLOADED.value, + upload_result["filename"], + upload_result["reason_code"]) self.output_channel.enqueue_message(message_body) + elif isinstance(upload_result, str): + # Success — send 2010 with 2 params: filename, 1 + self.logger.debug("Device log file uploaded: {upload_result}") + message_body = "{0},2,{1},1".format( + OutboundMessageIDs.CS2UI_DEVICE_LOG_UPLOADED.value, + upload_result) + self.output_channel.enqueue_message(message_body) else: error = Error( "{0},2,{1}, Missing access token".format(OutboundMessageIDs.CS2UI_ERROR.value, Index: cloudsync/handlers/outgoing/handler_cs_to_dcs.py =================================================================== diff -u -r827b6a2d23a7e61dc5ffe316b2cecebc9b310501 -re3afee7b49f898e127dbe0330d0e9a63089f84d3 --- cloudsync/handlers/outgoing/handler_cs_to_dcs.py (.../handler_cs_to_dcs.py) (revision 827b6a2d23a7e61dc5ffe316b2cecebc9b310501) +++ cloudsync/handlers/outgoing/handler_cs_to_dcs.py (.../handler_cs_to_dcs.py) (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -580,6 +580,11 @@ headers=headers, data=end_session_payload) + if response.status_code == CONFLICT: + device_file_name = str(file_json['start_session']['metadata']['deviceFileName']) + g_utils.logger.info(f"File {device_file_name} rejected as duplicate (409 Conflict).") + return {"accepted": False, "filename": device_file_name, "reason_code": LogUploadReasonCode.DUPLICATE.value} + if response.status_code != 200: raise Exception(f"Error while ending upload session: {response.status_code} - {response.text}") Index: cloudsync/utils/globals.py =================================================================== diff -u -r827b6a2d23a7e61dc5ffe316b2cecebc9b310501 -re3afee7b49f898e127dbe0330d0e9a63089f84d3 --- cloudsync/utils/globals.py (.../globals.py) (revision 827b6a2d23a7e61dc5ffe316b2cecebc9b310501) +++ cloudsync/utils/globals.py (.../globals.py) (revision e3afee7b49f898e127dbe0330d0e9a63089f84d3) @@ -162,6 +162,7 @@ BAD_REQUEST = 400 UNAUTHORIZED = 401 NOT_FOUND = 404 +CONFLICT = 409 UNASSIGNED = 427 INTERNAL_SERVER_ERROR = 500