[Feature][T108][task-view-1683] update log manage program

Only Configure: No
Affected branch: GSW_V1453
Affected module: log
Self-test: yes
Doc Update: no

Change-Id: I582bc596bfae016ef9a0df50f283ddbb9304b191
diff --git a/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
index 26ab10a..d21024c 100755
--- a/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
+++ b/mbtk/rootfs/etc/init.d/mbtk_boot_server_ready
@@ -20,10 +20,10 @@
 
 	#mbtk_start /bin/mbtk_info_test
 	mbtk_start /bin/mbtk_logd
-        mbtk_start /bin/gsw_log_check
     # i2s ×ó¶ÔÆë´«ÊäģʽÉèÖÃÖ¸Áî
 	#ubus call audio_if config_pcmexpert "{ 'frame_format': 1, 'invert_frame' : 0, 'frame_polarity' : 1, 'bitclk_polarity' : 0, 'fsyc_shift' : 1}"
-	echo "--mbtk server ready boot end--" > /dev/kmsg
+        /etc/mbtk/gsw_log_manage.sh
+        echo "--mbtk server ready boot end--" > /dev/kmsg
 }
 
 start_service
diff --git a/mbtk/rootfs/etc/mbtk/gsw_log_manage.sh b/mbtk/rootfs/etc/mbtk/gsw_log_manage.sh
new file mode 100755
index 0000000..3bc2488
--- /dev/null
+++ b/mbtk/rootfs/etc/mbtk/gsw_log_manage.sh
@@ -0,0 +1,435 @@
+#!/bin/sh
+LOGI() { echo "<6> LOG_MANAGE_INFO: $1" > /dev/kmsg; }
+LOGW() { echo "<4>LOG_MANAGE_WARN: $1" > /dev/kmsg; }
+LOGE() { echo "<3>LOG_MANAGE_ERROR: $1" > /dev/kmsg; }
+
+LOG_DIR="/media/var/log"
+G_LOG_DIR=""
+G_LOG_DIRS=""
+
+AP_LOG_MAX_SIZE=$(((300-10) * 1048576))   		# 300MB-10MB(radio_log.txt)
+CP_LOG_MAX_SIZE=$(((600-10) * 1048576))   		# 600MB-10MB(sdlog00x.sdl)
+CORE_LOG_MAX_SIZE=$((200 * 1048576)) 			# 200MB
+
+COUNTER_FILE="$LOG_DIR/counter.txt"  # 保存当前文件夹计数器值
+# ==================== Create log directory ====================
+
+create_log_dir() {
+    local dir="$1"
+    cd "$dir" || {
+        LOGE "create_log_dir: Failed to enter directory $dir"
+        return 1
+    }
+    
+    if [ ! -f "$COUNTER_FILE" ]; then
+        echo "1" > "$COUNTER_FILE"  # 从1开始
+        LOGI "create_log_dir: Created counter file: $COUNTER_FILE"
+    fi
+    
+    local current_counter=$(cat "$COUNTER_FILE")
+    
+    local new_folder
+    if [ "$current_counter" -lt 200 ]; then
+        new_folder=$((current_counter + 1))
+    else
+        new_folder=1
+    fi
+    
+    echo "$new_folder" > "$COUNTER_FILE"
+    LOGI "create_log_dir: Updated counter to: $new_folder"
+    
+    local formatted_folder=$(printf "%03d" "$new_folder")
+    local target_folder="LOG_FILE$formatted_folder"
+    
+    if [ -d "$target_folder" ]; then
+        LOGI "create_log_dir: Deleting existing folder $target_folder..."
+        rm -rf "$target_folder" || {
+            LOGI "create_log_dir: Failed to delete $target_folder"
+        }
+    fi
+	
+    if mkdir -p "$target_folder"; then
+        G_LOG_DIR="$dir/$target_folder"
+        LOGI "create_log_dir: Log directory created: $G_LOG_DIR"
+    else
+        mkdir -p "LOG_FILE001"
+        G_LOG_DIR="$dir/LOG_FILE001"
+        LOGE "create_log_dir: Fallback to LOG_FILE001 (create $target_folder failed)"
+    fi
+    
+    return 0
+}
+
+
+sort_log_dir() {
+	local log_folders=$(find "$LOG_DIR" -maxdepth 1 -type d -name "LOG_FILE[0-9][0-9][0-9]" 2>/dev/null)
+    local folder_nums=""
+    
+    for folder in $log_folders; do
+        local num=$(basename "$folder" | sed 's/LOG_FILE//' | sed 's/^0*//')
+        folder_nums="$folder_nums $num"
+    done
+    
+	local current_folder=$(basename "$G_LOG_DIR")
+    local current_num=$(echo "$current_folder" | sed 's/LOG_FILE//' | sed 's/^0*//')
+	
+    # 按照规则排序文件夹:先处理大于最新编号的(按升序),再处理小于等于的(按升序)
+    local sorted_folders=""
+    
+    # 1. 添加大于最新编号的文件夹(按升序)
+    for num in $(echo $folder_nums | tr ' ' '\n' | sort -n); do
+        if [ "$num" -gt "$current_num" ]; then
+            sorted_folders="$sorted_folders $LOG_DIR/LOG_FILE$(printf "%03d" $num)"
+        fi
+    done
+    
+    # 2. 添加小于等于最新编号的文件夹(按升序)
+    for num in $(echo $folder_nums | tr ' ' '\n' | sort -n); do
+        if [ "$num" -le "$current_num" ]; then
+            sorted_folders="$sorted_folders $LOG_DIR/LOG_FILE$(printf "%03d" $num)"
+        fi
+    done
+	
+	G_LOG_DIRS="$sorted_folders"
+	for folder in $G_LOG_DIRS; do
+        LOGI "create_log_dir: get LOG_FILES:$folder"
+	done
+	return 0
+}
+
+# ==================== Compress single file ====================
+tar_single_file() {
+    local file="$1"
+    local dir=$(dirname "$file")
+    local filename=$(basename "$file")
+    
+    [ ! -f "$file" ] && {
+        LOGE "tar_single_file: File '$file' does not exist"
+        return 1
+    }
+    
+    local compressed_file="${dir}/${filename}.tar.gz"
+    
+    # Low priority compression (reduce CPU usage)
+    (cd "$dir" && nice -n 19 tar -czf "$compressed_file" "$filename") || {
+        LOGE "tar_single_file: Failed to compress $file"
+        return 2
+    }
+    
+    rm -f "$file" || {
+        LOGE "tar_single_file: Failed to delete original file $file"
+        return 3
+    }
+    
+    LOGI "tar_single_file: Compression completed: $compressed_file"
+    echo "$compressed_file"
+    return 0
+}
+
+
+# ==================== Get AP log compressed filename ====================
+get_ap_log_tar() {
+    local radio_tar_files=$(find "$1" -maxdepth 1 -type f -name 'radio_log.txt.*.tar.gz' | sed -E 's/.*radio_log.txt.([0-9]+).tar.gz/\1/')
+    local new_number=1
+    
+    if [ -n "$radio_tar_files" ]; then
+        local last_number=$(echo "$radio_tar_files" | sort -n | tail -n 1)
+        new_number=$((last_number + 1))
+    fi
+    
+    echo "radio_log.txt.${new_number}.tar.gz"
+}
+
+
+# ==================== Get inactive CP logs ====================
+get_inactive_cplogs_by_name() {
+    local dir="$1"
+    cd "$dir" || {
+        LOGE "get_inactive_cplogs_by_name: Failed to enter directory $dir"
+        return 1
+    }
+    
+    local temp_file=$(mktemp)
+    ls sdlog[0-9][0-9][0-9].sdl 2>/dev/null | sort -t 'g' -k2 -n > "$temp_file"
+    
+    local total=$(wc -l < "$temp_file")
+    if [ "$total" -gt 1 ]; then
+        head -n 1 "$temp_file"  # Only take one file
+    fi
+    
+    rm -f "$temp_file"
+    return 0
+}
+
+
+process_single_log() {
+    local file_pattern="$1"
+    local search_dir="$2"
+    local regex_pattern="$3"
+    
+    cd "$search_dir" || {
+        LOGE "process_single_log: Failed to enter directory $search_dir"
+        return 1
+    }
+    
+    local file=""
+    case "$file_pattern" in
+        "ap_log")
+            file=$(find . -maxdepth 1 -type f -regex "$regex_pattern" | head -n 1)
+            ;;
+        "cp_log")
+            file=$(get_inactive_cplogs_by_name "$search_dir")
+            ;;
+        "core_dump_log")
+            file=$(find "$search_dir" -type f | head -n 1)
+            ;;
+        *)
+            LOGE "process_single_log: Unknown file pattern '$file_pattern'"
+            return 1
+            ;;
+    esac
+    
+    [ -z "$file" ] && {
+        LOGI "process_single_log: No $file_pattern type files to process"
+        return 0
+    }
+    
+    file="${file#./}"  # Remove leading ./
+    LOGI "process_single_log: Found file: $file"
+    
+    local full_file_path
+    if [ "$file_pattern" = "core_dump_log" ]; then
+        full_file_path="$file"
+    else
+        full_file_path="$search_dir/$file"
+    fi
+    
+    local compressed_file=$(tar_single_file "$full_file_path")
+    local ret=$?
+    if [ $ret -ne 0 ]; then
+        LOGE "process_single_log: Compression of $file failed with code $ret"
+        return $ret
+    fi
+    
+    if [ -n "$G_LOG_DIR" ] && [ -d "$G_LOG_DIR" ]; then
+        if [ "$file_pattern" = "ap_log" ]; then
+            local new_file=$(get_ap_log_tar "$G_LOG_DIR")
+            mv "$compressed_file" "${G_LOG_DIR}/${new_file}" || {
+                LOGE "process_single_log: Failed to move $new_file to $G_LOG_DIR"
+                return 1
+            }
+            LOGI "process_single_log: AP log moved to: $G_LOG_DIR/$new_file"
+        else
+            mv "$compressed_file" "$G_LOG_DIR/" || {
+                LOGE "process_single_log: Failed to move $compressed_file to $G_LOG_DIR"
+                return 1
+            }
+            LOGI "process_single_log: Log moved to: $G_LOG_DIR/$(basename "$compressed_file")"
+        fi
+    fi
+    
+    return 0
+}
+
+
+# ==================== Clean up files by type ====================
+cleanup_by_type() {
+    local type_name="$1"
+    local pattern="$2"
+    local max_size="$3"
+    local sort_method="$4"
+	
+    LOGI "cleanup_by_type: Starting check for $type_name files"
+    
+    # Calculate total size of all files of this type
+    local all_files=""
+    local total_size=0
+    local file_size_kb=0
+    for folder in $G_LOG_DIRS; do
+        local files=$(find "$folder/" -type f -name "$pattern" 2>/dev/null | eval "$sort_method")
+        
+        if [ -n "$files" ]; then
+            for file in $files; do
+                local size=$(ls -l "$file" | awk '{print $5}')       
+				file_size_kb=$((size / 1024))			
+				LOGI "cleanup_by_type: Found $type_name file: $file size:$file_size_kb KB"
+                total_size=$((total_size + size))
+                all_files="$all_files\n$size $file"
+            done
+        fi
+    done
+	
+    local total_mb=$((total_size / 1048576))
+    local max_mb=$((max_size / 1048576))
+	local total_kb=$((total_size / 1024))
+    local max_kb=$((max_size / 1024))
+	
+    LOGI "cleanup_by_type: $type_name total size: $total_mb MB $total_kb KB (threshold: $max_mb MB  $max_kb KB)"
+	
+    if [ "$total_size" -le "$max_size" ]; then
+        LOGI "cleanup_by_type: $type_name below threshold, no need cleanup"
+        return 0
+    fi
+    
+    # Exceeds threshold, start cleaning up (oldest folders first)
+    LOGI "cleanup_by_type: $type_name exceeds threshold, starting cleanup..."
+    local current_size=$total_size
+    
+    for folder in $G_LOG_DIRS; do
+        local folder_files=$(echo -e "$all_files" | grep "$folder" | awk '{print $2}')
+        
+        for file in $folder_files; do
+            local file_size=$(ls -l "$file" | awk '{print $5}')
+            current_size=$((current_size - file_size))
+            
+            rm -f "$file" || {
+                LOGE "cleanup_by_type: Failed to delete $file"
+                continue
+            }
+            LOGI "cleanup_by_type: Deleted $(basename "$file"), freed $((file_size / 1048576)) MB"
+            
+            # Stop if below threshold after deletion
+            if [ "$current_size" -le "$max_size" ]; then
+                LOGI "cleanup_by_type: $type_name cleanup completed, current total size $((current_size / 1048576)) MB"
+                return 0
+            fi
+        done
+    done
+    
+    LOGI "cleanup_by_type: All matching files deleted, current total size $((current_size / 1048576)) MB"
+    return 0
+}
+
+
+# ==================== Log processing functions ====================
+ap_log_process() {    
+	LOGI "======================= Processing AP log ==================================="
+    process_single_log "ap_log" "$LOG_DIR" '.*/radio_log\.txt\.[0-9]\{1,3\}$'
+}
+
+cp_log_process() {
+    LOGI "======================= Processing CP log ==================================="
+	local search_dir="$1"
+    
+    cd "$search_dir" || {
+        LOGE "cp_log_process: Failed to enter directory $search_dir"
+        return 1
+    }
+    
+    local CP_Log_folder=$(find . -maxdepth 1 -type d -regex '.*/Log[0-9]\{3\}$' | head -n 1)
+    [ -z "$CP_Log_folder" ] && {
+        LOGE "cp_log_process: No matching Log folder found"
+        return 1
+    }
+    
+    CP_Log_folder="${CP_Log_folder#./}"
+    LOGI "cp_log_process: Found CP log folder: $search_dir/$CP_Log_folder"
+    process_single_log "cp_log" "$search_dir/$CP_Log_folder" ''
+}
+
+core_dump_log_process() {
+    LOGI "==================== Processing core dump log ================================"
+	local core_dump_folder="${1}/modem_dump"
+    
+    [ ! -d "$core_dump_folder" ] && {
+        LOGE "core_dump_log_process: Core dump directory does not exist - $core_dump_folder"
+        return 1
+    }
+    process_single_log "core_dump_log" "$core_dump_folder" ''
+}
+
+
+
+# ==================== Main loop ====================
+gsw_log_manage() {
+    while true; do
+        sleep 90  # Execute every 90 seconds
+        
+        # Process AP log
+        ap_log_process
+        sleep 2
+        
+        # Process CP log
+        cp_log_process "$LOG_DIR"
+        sleep 2
+        
+        # Process core dump log
+        core_dump_log_process "$LOG_DIR"
+        sleep 2
+        
+        # Clean up files by type
+        LOGI "======================= Starting cleanup by file type ======================="
+        cleanup_by_type "AP log" "radio_log.txt.*.tar.gz" "$AP_LOG_MAX_SIZE" "sort -t '.' -k3 -n"
+        cleanup_by_type "CP log" "sdlog*.sdl.tar.gz" "$CP_LOG_MAX_SIZE"	"sort -t 'g' -k2 -n"
+        cleanup_by_type "Core_Dump log" "coredump-*.tar.gz" "$CORE_LOG_MAX_SIZE" ""
+        
+        LOGI "===== Current round of log processing completed, waiting for next round ====="
+    done
+}
+
+#处理上一次开机中,遗留的cp log文件,将其压缩并移动到上一个G_LOG_DIR文件夹中
+cp_log_previous_boot_process() {
+    if [ ! -f "$COUNTER_FILE" ]; then
+        LOGI "cp_log_previous_boot_process: $COUNTER_FILE is not exist, returning"
+        return 0
+    fi
+    
+    local previous_counter=$(cat "$COUNTER_FILE")
+    local formatted_folder=$(printf "%03d" "$previous_counter")
+    local target_folder="LOG_FILE$formatted_folder"
+    local compressed_file=""
+    target_folder="$1/$target_folder"
+    
+    local log000_dir="$1/Log000"
+    
+    if [ ! -d "$log000_dir" ]; then
+        LOGE "Log000 directory not found: $log000_dir"
+        return 0
+    fi
+    
+    cd "$log000_dir" || {
+        LOGE "Failed to enter directory: $log000_dir"
+        return 1
+    }
+    
+    
+    local files_to_tar_move=$(find . -maxdepth 1 -type f ! -name "sdlog000.sdl")
+    
+    if [ -n "$files_to_tar_move" ]; then
+        for file in $files_to_tar_move; do
+            file="${file#./}"
+            compressed_file=$(tar_single_file "$file")
+            if [ ! -f "$compressed_file" ]; then
+                compressed_file="$log000_dir/$compressed_file"
+            fi
+            
+            mv "$compressed_file" "$target_folder/" || {
+                LOGE "Failed to move $compressed_file to $target_folder"
+                return 1
+            }
+            LOGI "Moved $file (compressed) to $target_folder"
+        done
+    else
+        LOGI "cp_log_previous_boot_process: No files to process in $log000_dir (excluding sdlog000.sdl)"
+    fi
+    
+    LOGI "cp_log_previous_boot_process: completed successfully"
+    return 0
+}
+
+(
+	#开机延迟200秒执行
+	sleep 200 ; \
+	#处理上一次开机遗留的cp log(sdlog000.sdl会被覆盖)
+	cp_log_previous_boot_process "$LOG_DIR" ; \
+	#创建LOG存储文件夹
+	create_log_dir "$LOG_DIR" ; \
+	#对LOG存储文件夹进行排序
+	sort_log_dir ; \
+	LOGI "Initial functions completed, starting gsw_log_manage..."
+
+	while ! gsw_log_manage; do
+		echo "Restarting gsw_log_manage ..."
+		sleep 1
+	done
+) &
diff --git a/mbtk/rootfs/etc/mbtk/mbtk_log.json b/mbtk/rootfs/etc/mbtk/mbtk_log.json
index 0b65b34..503c562 100755
--- a/mbtk/rootfs/etc/mbtk/mbtk_log.json
+++ b/mbtk/rootfs/etc/mbtk/mbtk_log.json
@@ -5,7 +5,7 @@
     "buffer_list" :
     [
         {
-            "enable": 1,
+            "enable": 0,
             /* (mandatory) alternate ring buffer name, 'main', 'system', 'events' */
             "name" : "syslog",
             /* log output format : log type, time, pid, tid, tag, msg */
@@ -43,9 +43,9 @@
             "log_file":"/media/var/log/radio_log.txt",
 	    "emmc_protect": 0,
             /* (optional) rotate log every kbytes, default is unlimit */
-            "rotate_file_size":  1024,
+            "rotate_file_size":  10240,
             /* (optional) max number of rotated logs, -1 is unlimit */
-            "rotate_file_count": 8,
+            "rotate_file_count": 20,
 
             /* (optional) log format, default or csv */
             "log_format":"default",