#!/bin/bash

. /etc/profile > /dev/null
. /etc/tos/scripts/scripts

if [ -z "$1" ]; then
    exit 1
fi

package="/tmp/databack/$1"
if [ -e "$package" ]; then
    echo "[$package] exists!"
    exit 1
fi
script_get_lock > /dev/null
[ $? -ne 0 ] && exit 1
redis-cli set generate_info 0 >/dev/null
generate_list="
/tmp/databack/readme.txt
/tmp/databack/device.txt
/tmp/databack/system.txt
/tmp/databack/service.txt
/tmp/databack/network.txt
/tmp/databack/dmesg.txt
/tmp/databack/disks.txt
/tmp/databack/mdadm.txt
/tmp/databack/lvm.txt
/tmp/databack/blkid.txt
/tmp/databack/df.txt
/var/log
/etc
/usr/lib/version
"

processer(){
    local value=`redis-cli --raw get generate_info`
    if [ $value -lt 100 ]; then
        redis-cli incr generate_info >/dev/null
    fi
}

isArm(){
    cat /proc/cmdline | grep "RtkSFC:" >/dev/null
    return $?
}

generate_hardware(){
    echo -e "Generate bios information:\n" > /tmp/databack/device.txt
    dmidecode -t bios >> /tmp/databack/device.txt
    dmidecode -t system >> /tmp/databack/device.txt
}

generate_system(){
    echo -e "\nGenerate TOS version:\n" > /tmp/databack/system.txt
    cat /usr/lib/version >> /tmp/databack/system.txt
    echo -e "\n\nGenerate cpu information:\n" >> /tmp/databack/system.txt
    cat /proc/cpuinfo >> /tmp/databack/system.txt
    echo -e "\nGenerate memory information:\n" >> /tmp/databack/system.txt
    cat /proc/meminfo >> /tmp/databack/system.txt
    echo -e "\nGenerate uptime:\n" >> /tmp/databack/system.txt
    uptime >> /tmp/databack/system.txt
    echo -e "\nGenerate system information:\n" >> /tmp/databack/system.txt
    isArm
    if [ $? -ne 0 ]; then
        ec_stat -rst >> /tmp/databack/system.txt
        ec_stat -rss >> /tmp/databack/system.txt
    else
        cputemp=`expr $(cat /sys/devices/virtual/thermal/thermal_zone0/temp) / 1000`
        let cputemp=cputemp-18
        echo "CPU Temputre=${cputemp} ℃" >> /tmp/databack/system.txt
        fanspeed=$(expr $(cat /sys/devices/platform/9801bc00.rtk_fan/fan_speed) / 8)
        echo "FAN Speed=${fanspeed} RPM" >> /tmp/databack/system.txt
        echo -e "\n" >> /tmp/databack/system.txt
        fw_printenv >> /tmp/databack/system.txt
    fi
}

generate_service(){
    echo -e "\nCurrent processes information:\n" > /tmp/databack/service.txt
    ps aux >> /tmp/databack/service.txt
    echo -e "\n" >> /tmp/databack/service.txt
    top -n 1 -c >> /tmp/databack/service.txt
    echo -e "\nInstalled apps\n" >> /tmp/databack/service.txt
    ls /Volume*/\@apps/ -l >> /tmp/databack/service.txt
}

generate_network(){
    route -n > /tmp/databack/network.txt
    echo -e "\n" >> /tmp/databack/network.txt
    ip route list >> /tmp/databack/network.txt
    echo -e "\n" >> /tmp/databack/network.txt
    ip rule list >> /tmp/databack/network.txt
    echo -e "\n" >> /tmp/databack/network.txt
    ifconfig >> /tmp/databack/network.txt
    netstat -anp >> /tmp/databack/network.txt
}

generate_disks(){
    #echo 0 > /proc/sys/vm/block_dump
    lsblk -as > /tmp/databack/disks.txt
    echo -e "\n" >> /tmp/databack/disks.txt
    ls -l /sys/block/sd* >> /tmp/databack/disks.txt
    echo -e "\nGenerate raid members information:" >> /tmp/databack/disks.txt
    for i in {4..20}; do
        for dev in /dev/sd*"$i"; do
            if [ -e "$dev" ]; then
                mdadm -E "$dev" >> /tmp/databack/disks.txt 2>/dev/null
            fi
        done
    done

    echo -e "\nGenerate disk information:\n" >> /tmp/databack/disks.txt
    for blk in /dev/sd[a-z]; do
        echo -e "\n********************[${blk}]****************\n" >> /tmp/databack/disks.txt
        smartctl -d sat,auto -iA $blk >> /tmp/databack/disks.txt
    done
    echo -e "\nGenerate sdz information:\n" >> /tmp/databack/disks.txt
    for blk in /dev/sdz[a-z]; do
        echo -e "\n********************[${blk}]****************\n" >> /tmp/databack/disks.txt
        smartctl -d nvme -iH $blk >> /tmp/databack/disks.txt
    done
    echo -e "\nGenerate smart log:\n" >> /tmp/databack/disks.txt
    for blk in /dev/sdz[a-z]; do
        echo -e "\n********************[${blk}]****************\n" >> /tmp/databack/disks.txt
        nvme smart-log $blk >> /tmp/databack/disks.txt
    done
}

generate_additional_info(){
    echo -e "\nGenerate blkid output:\n" > /tmp/databack/blkid.txt
    blkid >> /tmp/databack/blkid.txt

    echo -e "\nGenerate df -h output:\n" > /tmp/databack/df.txt
    df -h >> /tmp/databack/df.txt
    echo -e "\nGenerate df-json output:\n" >> /tmp/databack/df.txt
    df-json >> /tmp/databack/df.txt
}

generate_info(){
    #echo 1 > /proc/sys/vm/block_dump
    local wait=0
    while [ $wait -lt 60 ];
    do
        sleep 3
        let wait=wait+1
        processer
    done
    #收集硬件信息
    generate_hardware
    processer
    #收集系统相关信息
    generate_system
    processer
    #收集各种应用服务信息
    generate_service
    processer
    #收集网络信息
    generate_network
    processer
    #收集系统日志
    dmesg -H > /tmp/databack/dmesg.txt
    processer
    #收集disks信息
    generate_disks
    processer
    #收集raid信息
    echo "Generate raid information:" >> /tmp/databack/mdadm.txt
    mdadm -D /dev/md[0-9] > /tmp/databack/mdadm.txt
    processer
    #收集lvm信息
    pvdisplay > /tmp/databack/lvm.txt
    vgdisplay >> /tmp/databack/lvm.txt
    lvdisplay >> /tmp/databack/lvm.txt
    processer
    #收集blkid、df信息
    generate_additional_info
    processer

    # 动态生成排除列表
    exclude_file="/tmp/exclude_list.txt"
    echo "/etc/tos/scripts/*" > $exclude_file
    echo "/etc/tos.init/i18n/*" >> $exclude_file
    echo "/etc/tos/i18n/*" >> $exclude_file
    echo "/etc/postgresql/*" >> $exclude_file
    echo "/etc/udev/*" >> $exclude_file
    echo "/etc/init.d/*" >> $exclude_file
    chmod 644 $exclude_file

    cat $exclude_file

    #开始打包
    rm -f "$package" > /dev/null
    for item in $generate_list; do
        local dir_name=$(dirname "$item")
        cd $dir_name
        local base_name=$(basename "$item")
        local link_name=$(readlink "$base_name")
        [ -z "$link_name" ] || base_name=$link_name
        if [ ! -e "$package" ]; then
            zip -q -r -y "$package" "$base_name" -x@$exclude_file
        else
            zip -q -r -g -y "$package" "$base_name" -x@$exclude_file
        fi
        processer
    done
    redis-cli set generate_info 100 >/dev/null

    # 清理排除列表文件
    rm -f $exclude_file
}

generate_info

script_put_lock > /dev/null
exit 0