Index: cloudsync/common/enums.py =================================================================== diff -u -r34a18ebe349364c4e0462d876d4d191bf3df8939 -rb04cc09e78e03c04c2fe04bb4ef18dc14ab203de --- cloudsync/common/enums.py (.../enums.py) (revision 34a18ebe349364c4e0462d876d4d191bf3df8939) +++ cloudsync/common/enums.py (.../enums.py) (revision b04cc09e78e03c04c2fe04bb4ef18dc14ab203de) @@ -75,6 +75,7 @@ UI2CS_SEND_TREATMENT_REPORT = 1007 UI2CS_REQ_DECOMMISSION = 1009 UI2CS_UPLOAD_DEVICE_LOG = 1010 # DEVICE_LOG + UI2CS_REQ_LOG_ROTATION = 1011 # INCOMING ERROR UI2CS_ERROR = 1999 @@ -93,6 +94,7 @@ CS2UI_REQ_TX_CODE_DISPLAY = 2008 CS2UI_REQ_DEVICE_DECOMMISSIONED = 2009 CS2UI_DEVICE_LOG_UPLOADED = 2010 + CS2UI_REQ_LOG_ROTATION = 2011 # OUTGOING ERROR CS2UI_ERROR = 2999 @@ -131,3 +133,4 @@ CS_SAVE_CONFIG_ERROR = 929 CS_DEVICE_LOG_ERROR = 930 CS_LOG_ERROR = 931 + CS_LOG_ROTATION_ERROR = 932 Index: cloudsync/handlers/ui_cs_request_handler.py =================================================================== diff -u -r34a18ebe349364c4e0462d876d4d191bf3df8939 -rb04cc09e78e03c04c2fe04bb4ef18dc14ab203de --- cloudsync/handlers/ui_cs_request_handler.py (.../ui_cs_request_handler.py) (revision 34a18ebe349364c4e0462d876d4d191bf3df8939) +++ cloudsync/handlers/ui_cs_request_handler.py (.../ui_cs_request_handler.py) (revision b04cc09e78e03c04c2fe04bb4ef18dc14ab203de) @@ -232,6 +232,26 @@ e)) self.error_handler.enqueue_error(error=error) + # CS LOG ROTATION + elif InboundMessageIDs.mapped_str_value(message.ID) == InboundMessageIDs.UI2CS_REQ_LOG_ROTATION: + self.logger.info("UI2CS_REQ_LOG_ROTATION request received") + if len(message.parameters) != 1 and message.parameters[0] > 0: + try: + self.logger.debug("Used Percentage: {0}".format(message.parameters[0])) + num_of_files, del_size_mb = helpers_log_rotation(message.parameters[0]) + message_body = str( + OutboundMessageIDs.CS2UI_REQ_LOG_ROTATION.value) + f',{num_of_files}' + f',{del_size_mb}' + self.output_channel.enqueue_message(message_body) + except Exception as e: + error = Error("{0},2,{1},{2}".format(OutboundMessageIDs.CS2UI_ERROR.value, + ErrorIDs.CS_LOG_ROTATION_ERROR.value, + e)) + self.error_handler.enqueue_error(error=error) + else: + error = Error("{0},2,{1},invalid # of parameters for log rotation".format( + OutboundMessageIDs.CS2UI_ERROR.value, + ErrorIDs.CS_LOG_ROTATION_ERROR.value)) + self.error_handler.enqueue_error(error=error) # ERROR MESSAGE RECEIVED FROM UI elif InboundMessageIDs.mapped_str_value(message.ID) == InboundMessageIDs.UI2CS_ERROR: error_body = "{0},{1},{2}".format(InboundMessageIDs.UI2CS_ERROR.value, message.size, Index: cloudsync/utils/globals.py =================================================================== diff -u -r34a18ebe349364c4e0462d876d4d191bf3df8939 -rb04cc09e78e03c04c2fe04bb4ef18dc14ab203de --- cloudsync/utils/globals.py (.../globals.py) (revision 34a18ebe349364c4e0462d876d4d191bf3df8939) +++ cloudsync/utils/globals.py (.../globals.py) (revision b04cc09e78e03c04c2fe04bb4ef18dc14ab203de) @@ -67,6 +67,7 @@ # UI2CS VALUES UI2CS_FILE_CHANNELS_PATH = "/media/sd-card/cloudsync" +UI2CS_FILE_LOG_PATH = "/media/sd-card/cloudsync/log" # PATH for running off device UI2CS_FILE_CHANNELS_PATH = "data/busses" Index: cloudsync/utils/helpers.py =================================================================== diff -u -r34a18ebe349364c4e0462d876d4d191bf3df8939 -rb04cc09e78e03c04c2fe04bb4ef18dc14ab203de --- cloudsync/utils/helpers.py (.../helpers.py) (revision 34a18ebe349364c4e0462d876d4d191bf3df8939) +++ cloudsync/utils/helpers.py (.../helpers.py) (revision b04cc09e78e03c04c2fe04bb4ef18dc14ab203de) @@ -8,6 +8,7 @@ import re import base64 import uuid +import subprocess from datetime import * from time import time, sleep @@ -742,3 +743,49 @@ duration_in_seconds = int(duration/1000) return duration_in_seconds, start_timestamp, end_timestamp return None + + +def helpers_log_rotation(rotation_pct): + cs_log_pct = rotation_pct / 100 + num_files_deleted = 0 + total_deleted_size = 0 + # Total sd stats + sd_total_bytes, sd_used_bytes, sd_free_bytes = shutil.disk_usage(UI2CS_FILE_CHANNELS_PATH) + + if sd_used_bytes == 0: + sd_used_bytes = 1 + # Cloudsync log stats + used_bytes_proc_call = subprocess.check_output(['du', '-bsx', UI2CS_FILE_CHANNELS_PATH]).split() + if len(used_bytes_proc_call) > 0: + cs_used_bytes = int(used_bytes_proc_call[0].decode('utf-8')) + + total_deleted_size = cs_used_bytes + # Retrieve file list + f = [] + for subdir, dir, files in os.walk(UI2CS_FILE_LOG_PATH): + for file in files: + f.append(os.path.join(UI2CS_FILE_LOG_PATH, file)) + + # Sorted with oldest modified first. + f.sort(key=lambda x: os.path.getmtime(x)) + + if len(f) > 1: + while (cs_used_bytes / sd_used_bytes) <= cs_log_pct: + file_to_remove = f[0] + os.remove(file_to_remove) + num_files_deleted += 1 + f.pop(0) + used_bytes_proc_call = subprocess.check_output(['du', '-bsx', UI2CS_FILE_CHANNELS_PATH]).split() + if len(used_bytes_proc_call) > 0: + cs_used_bytes = int(used_bytes_proc_call[0].decode('utf-8')) + else: + g_utils.logger.error("Error in disk usage call.") + break + total_deleted_size = total_deleted_size - cs_used_bytes + else: + total_deleted_size = 0 + g_utils.logger.info("No files Removed.") + else: + g_utils.logger.error("Error in disk usage call.") + + return num_files_deleted, total_deleted_size