#!/bin/bash

function show_help() {
    echo "Usage: $0 [OPTION]"
    echo "Collect logs and system information."
    echo
    echo "Options:"
    echo "  mgr       Collect manager logs"
    echo "  agent     Collect agent logs"
    echo "  system    Collect system logs and performance data"
    echo "  -h, --help  Display this help and exit"
}

function resolve_symlinks() {
    local file=$1
    if [ -L "$file" ]; then
        readlink -f "$file"
    else
        echo "$file"
    fi
}

function get_mgr_log() {
	mkdir /tmp/mongodb_log && cp /data/mongodata/mongodb.log* /tmp/mongodb_log
    local sf_config_path=/sf/edr/manager/config/
    local sf_log_path=/sf/edr/manager/var/
    local go_log=/sf/edr/manager/log/
    local ac_log=/ac/var/
    local license_log=/sf/sgp/license/log/
    local vls_authorize_log=/sf/sgp/vls_authorize/var/
    local kafka_logs=/data/kafka-logs/
    local pg_log=/data/pg/data/log/
    local blackbox_log=/data/blackbox_log/
    local mongodata_for_log=/data/mongodata_for_log/mongodb.log
	local mongodb_log=/tmp/mongodb_log/
    
    local system_info=/etc/os-release
    local system_info_1=/etc/os-version
    local system_info_2=/etc/kylin-build
    local system_info_3=/etc/kylin-release
    local uname_info=/tmp/uname_info
    uname -a > /tmp/uname_info
    
    local log_files=(
        "$sf_config_path"
        "$sf_log_path"
        "$go_log"
        "$ac_log"
        "$license_log"
        "$vls_authorize_log"
        "$kafka_logs"
        "$pg_log"
        "$blackbox_log"
        "$mongodb_log"
		"$mongodata_for_log"
        "$system_info"
        "$system_info_1"
        "$system_info_2"
        "$system_info_3"
        "$uname_info"
    )
    
    local total_size=0
    for file in "${log_files[@]}"; do
        resolved_file=$(resolve_symlinks "$file")
        if [ -e "$resolved_file" ]; then
            total_size=$((total_size + $(du -sb "$resolved_file" | cut -f1)))
        fi
    done
    
    local total_size_mb=$((total_size / 1024 / 1024))
    local tmp_free_space_kb=$(df /tmp | tail -1 | awk '{print $4}')
    local tmp_free_space_mb=$((tmp_free_space_kb / 1024))
    
    if [ "$total_size_mb" -gt "$tmp_free_space_mb" ]; then
        echo "Error: Not enough space in /tmp directory. Total log size: $total_size_mb MB."
        exit 1
    fi
    
    local output_file="/tmp/mgr_logs.tar.gz"
    tar -czf "$output_file" $(for file in "${log_files[@]}"; do resolved_file=$(resolve_symlinks "$file"); [ -e "$resolved_file" ] && echo "$resolved_file"; done)
    echo "Manager logs have been compressed to: $output_file"
}

function get_linux_agent_log() {
    local agent_bin_path=$(dirname $(readlink -f /proc/$(pgrep abs_deployer)/exe))
    local agent_install_path=${agent_bin_path}/../
    
    local agent_log_path=${agent_install_path}/var/
    local xsagent_log_path=${agent_install_path}/xs_agent/var/
    local agent_config_path=${agent_install_path}/config/
    local system_info=/etc/os-release
    local system_info_1=/etc/os-version
    local system_info_2=/etc/kylin-build
    local system_info_3=/etc/kylin-release
    local uname_info=/tmp/uname_info
    uname -a > /tmp/uname_info
    
    local log_files=(
        "$agent_log_path"
        "$xsagent_log_path"
        "$agent_config_path"
        "$system_info"
        "$system_info_1"
        "$system_info_2"
        "$system_info_3"
        "$uname_info"
    )
    
    local total_size=0
    for file in "${log_files[@]}"; do
        resolved_file=$(resolve_symlinks "$file")
        if [ -e "$resolved_file" ]; then
            total_size=$((total_size + $(du -sb "$resolved_file" | cut -f1)))
        fi
    done
    
    local total_size_mb=$((total_size / 1024 / 1024))
    local tmp_free_space_kb=$(df /tmp | tail -1 | awk '{print $4}')
    local tmp_free_space_mb=$((tmp_free_space_kb / 1024))
    
    if [ "$total_size_mb" -gt "$tmp_free_space_mb" ]; then
        echo "Error: Not enough space in /tmp directory. Total log size: $total_size_mb MB."
        exit 1
    fi
    
    local output_file="/tmp/agent_logs.tar.gz"
    tar -czf "$output_file" $(for file in "${log_files[@]}"; do resolved_file=$(resolve_symlinks "$file"); [ -e "$resolved_file" ] && echo "$resolved_file"; done)
    echo "Agent logs have been compressed to: $output_file"
}

function get_system_log() {
    local system_log=/var/log/
    local performance_dir=/tmp/performance_data
    mkdir -p "$performance_dir"
    
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    echo "Timestamp: $timestamp" > "$performance_dir/timestamp.txt"
    vmstat 1 5 > "$performance_dir/vmstat.txt"
    iostat -x 1 5 > "$performance_dir/iostat.txt"
    top -b -n 1 > "$performance_dir/top.txt"
    free -m > "$performance_dir/free.txt"
    df -h > "$performance_dir/df.txt"
    uname -a > "$performance_dir/uname.txt"
    
    local system_info=/etc/os-release
    local system_info_1=/etc/os-version
    local system_info_2=/etc/kylin-build
    local system_info_3=/etc/kylin-release
    
    cp "$system_info" "$performance_dir/" 2>/dev/null || echo "$system_info not found" > "$performance_dir/os-release.txt"
    cp "$system_info_1" "$performance_dir/" 2>/dev/null || echo "$system_info_1 not found" > "$performance_dir/os-version.txt"
    cp "$system_info_2" "$performance_dir/" 2>/dev/null || echo "$system_info_2 not found" > "$performance_dir/kylin-build.txt"
    cp "$system_info_3" "$performance_dir/" 2>/dev/null || echo "$system_info_3 not found" > "$performance_dir/kylin-release.txt"
    
    if command -v ss &> /dev/null; then
        ss -tuln > "$performance_dir/ss.txt"
    else
        echo "ss command not found" > "$performance_dir/ss.txt"
    fi
    
    if command -v mpstat &> /dev/null; then
        mpstat 1 5 > "$performance_dir/mpstat.txt"
    else
        echo "mpstat command not found" > "$performance_dir/mpstat.txt"
    fi
    
    if command -v pidstat &> /dev/null; then
        pidstat 1 5 > "$performance_dir/pidstat.txt"
    else
        echo "pidstat command not found" > "$performance_dir/pidstat.txt"
    fi
    
    local log_files=(
        "$system_log"
        "$performance_dir"
    )
    
    local total_size=0
    for file in "${log_files[@]}"; do
        resolved_file=$(resolve_symlinks "$file")
        if [ -e "$resolved_file" ]; then
            total_size=$((total_size + $(du -sb "$resolved_file" | cut -f1)))
        fi
    done
    
    local total_size_mb=$((total_size / 1024 / 1024))
    local tmp_free_space_kb=$(df /tmp | tail -1 | awk '{print $4}')
    local tmp_free_space_mb=$((tmp_free_space_kb / 1024))
    
    if [ "$total_size_mb" -gt "$tmp_free_space_mb" ]; then
        echo "Error: Not enough space in /tmp directory. Total log size: $total_size_mb MB."
        exit 1
    fi
    
    local output_file="/tmp/system_logs.tar.gz"
    tar -czf "$output_file" $(for file in "${log_files[@]}"; do resolved_file=$(resolve_symlinks "$file"); [ -e "$resolved_file" ] && echo "$resolved_file"; done)
    echo "System logs and performance data have been compressed to: $output_file"
}

function get_core_dump() {
    echo "not finished..."
    return 0
}

function main() {
    local log_type=$1
    
    case "$log_type" in
        mgr)
            get_mgr_log
            ;;
        agent)
            get_linux_agent_log
            ;;
        system)
            get_system_log
            ;;
        -h|--help)
            show_help
            ;;
        *)
            echo "Invalid log type. Use 'mgr', 'agent', 'system', or '-h|--help' for usage information."
            exit 1
            ;;
    esac
}

main "$@"
