Index: cloudsync/common/enums.py =================================================================== diff -u -rf8d59f1691d5b6850d2fa59d5312c563a42f0d72 -rd2799fd4159bbf89974027611ef0f854a5d94121 --- cloudsync/common/enums.py (.../enums.py) (revision f8d59f1691d5b6850d2fa59d5312c563a42f0d72) +++ cloudsync/common/enums.py (.../enums.py) (revision d2799fd4159bbf89974027611ef0f854a5d94121) @@ -73,6 +73,7 @@ UI2CS_SEND_DEVICE_STATE = 1006 UI2CS_SEND_TREATMENT_REPORT = 1007 UI2CS_REQ_DECOMMISSION = 1009 + UI2CS_REQ_LOG_ROTATION = 1011 # INCOMING ERROR UI2CS_ERROR = 1999 @@ -90,6 +91,7 @@ CS2UI_REQ_DEVICE_STATE = 2006 CS2UI_REQ_TX_CODE_DISPLAY = 2008 CS2UI_REQ_DEVICE_DECOMMISSIONED = 2009 + CS2UI_REQ_LOG_ROTATION = 2011 # OUTGOING ERROR CS2UI_ERROR = 2999 @@ -122,4 +124,5 @@ CS_SAVE_CREDENTIALS_ERROR = 927 CS_UNKNOWN_DEVICE_STATE_ERROR = 928 CS_SAVE_CONFIG_ERROR = 929 + CS_LOG_ROTATION_ERROR = 930 Index: cloudsync/handlers/ui_cs_request_handler.py =================================================================== diff -u -rf8d59f1691d5b6850d2fa59d5312c563a42f0d72 -rd2799fd4159bbf89974027611ef0f854a5d94121 --- cloudsync/handlers/ui_cs_request_handler.py (.../ui_cs_request_handler.py) (revision f8d59f1691d5b6850d2fa59d5312c563a42f0d72) +++ cloudsync/handlers/ui_cs_request_handler.py (.../ui_cs_request_handler.py) (revision d2799fd4159bbf89974027611ef0f854a5d94121) @@ -232,6 +232,21 @@ 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") + self.logger.debug("Used Percentage: {0}".format(message.parameters[0])) + try: + 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) + # 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 -r373fd8d0c900ff129152e13d896e7de2e222b0e7 -rd2799fd4159bbf89974027611ef0f854a5d94121 --- cloudsync/utils/globals.py (.../globals.py) (revision 373fd8d0c900ff129152e13d896e7de2e222b0e7) +++ cloudsync/utils/globals.py (.../globals.py) (revision d2799fd4159bbf89974027611ef0f854a5d94121) @@ -55,6 +55,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 -r373fd8d0c900ff129152e13d896e7de2e222b0e7 -rd2799fd4159bbf89974027611ef0f854a5d94121 --- cloudsync/utils/helpers.py (.../helpers.py) (revision 373fd8d0c900ff129152e13d896e7de2e222b0e7) +++ cloudsync/utils/helpers.py (.../helpers.py) (revision d2799fd4159bbf89974027611ef0f854a5d94121) @@ -6,6 +6,7 @@ import datetime import hashlib import socket +import subprocess from time import time, sleep from typing import Union, Any @@ -494,3 +495,36 @@ shutil.rmtree(path_to_delete) else: raise FileNotFoundError(f"{path_to_delete} not found or not a directory!") + + +def helpers_log_rotation(rotation_pct): + cs_log_pct = rotation_pct / 100 + num_files_deleted = 0 + # Total sd stats + sd_total_bytes, sd_used_bytes, sd_free_bytes = shutil.disk_usage(UI2CS_FILE_CHANNELS_PATH) + # Cloudsync log stats + cs_used_bytes = int(subprocess.check_output(['du', '-bsx', UI2CS_FILE_CHANNELS_PATH]).split()[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) + cs_used_bytes = int( + subprocess.check_output(['du', '-bsx', UI2CS_FILE_CHANNELS_PATH]).split()[0].decode('utf-8')) + total_deleted_size = total_deleted_size - cs_used_bytes + else: + total_deleted_size = 0 + g_utils.logger.info("No files Removed.") + + return num_files_deleted, total_deleted_size