#!/bin/bash
LOGF="/var/log/patch_dbg.log"
OLD_VER="V100R001C01SPC100 V100R001C01SPC200 V100R001C01SPC210 V100R001C01SPC290 V100R001C20SPC100 V100R001C20SPC001 V100R001C20 V100R001C30 V100R001C30SPC100 V100R001C30SPC110 V100R001C30 V100R001C30SPC200 V300R005C00SPC100 V300R005C00SPC110 V300R005C00SPC160 V300R005C00SPC170 V300R005C00"
OLD_PATH="/opt/huawei/patch"
NEW_VER="V300R006C00 V300R006C00SPC100 V300R006C00SPC200 V300R006C10"
NEW_PATH="/var/huawei/patch"

LOG ()
{
    local time_now=`date "+%Y/%m/%d %H:%M:%S"`
    echo "[$time_now] $@" >> ${LOGF}
}

function get_patch_path()
{
    local nr=0
    local patch_base=${NEW_PATH}
    local work_path=""
    local found=0
    local dir=""
    local sub_dirs="cur tmp"
    local ver=$(grep ProductVersion /opt/huawei/deploy/package/version | awk -F "=" '{print $2}')
    if [ $? -ne 0 -o "$ver" == "" ];then
        LOG [$FUNCNAME][$LINENO] "get version fail"
        return 1
    fi
    echo ${OLD_VER} | grep ${ver} > /dev/null 2>&1
    if [ $? -eq 0 ];then
        patch_base=${OLD_PATH}
        fi
    echo ${NeW_VER} | grep ${ver} > /dev/null 2>&1
    if [ $? -eq 0 ];then
        patch_base=${NEW_PATH}
    fi

    for dir in ${sub_dirs}
    do
        if [ -d ${patch_base}/${dir} ];then
            nr=$(find ${patch_base}/${dir} -type d -name "*SPH*" | wc -l 2>/dev/null )
            ret=$?
            if [ ! -z ${nr} -a ${nr} -ne 0 ];then
                work_path=${patch_base}/${dir}
                found=1
                break
            fi
        fi
    done

    if [ ${found} -eq 1 ];then
        echo ${work_path}
        LOG [$FUNCNAME][$LINENO] "Get work path of hot patch ok, ${work_path}"
        return 0
    fi
    LOG [$FUNCNAME][$LINENO] "Get work path of hot patch fail}"
    return 1
}

function get_livepatch_moudle()
{
    
    local pname="OceanStor_9000_$2.patch"
    local ppath=$(find $1 -name "$pname" -exec dirname {} \;)
    local tmpDir="/tmp/tmp_HotPatch$$"
    if [ ! -d "${tmpDir}" ]; then
        mkdir -p "${tmpDir}"
    else
        rm -rf "${tmpDir}/*"
    fi
    local tmpfile="${tmpDir}/tmp.tar.gz"
    cp ${ppath}/${pname} ${tmpDir}

    export hp_aa=`grep -a -n '^##\[\[DATA\]\]##' "${tmpDir}/${pname}" | awk -F: '{print $1}'`
    export hp_bb
    let hp_bb=$hp_aa+1
    tail +$hp_bb ${tmpDir}/${pname} > $tmpfile

    tar xvf $tmpfile -C ${tmpDir} > /dev/null 2>&1
    module=$(ls ${tmpDir}/| grep ".tar.gz" | grep -v tmp.tar.gz |cut -b 9-|sed "s/.tar.gz//g")

    tar xvf ${tmpDir}/ksplice-*.tar.gz -C ${tmpDir} > /dev/null 2>&1
    ls ${tmpDir}/ksplice-*/ |grep ksplice-$module.ko > /dev/null 2>&1
    if [ $? -ne 0 ];then
        echo "NO"
    else
        echo "$module"
    fi
    rm -rf ${tmpDir}
}

function check_patch()
{
    local ret=0
    local p=""
    local hpath=$1
    local htpatchs=$(find ${hpath} -name "*.patch" -exec basename {} \; |awk -F "_" '{print $NF}' | sed 's/.patch//g')
    ret=$?
    if [ ${ret} -ne 0 ] || [ "" == "${htpatchs}" ];then
        LOG [$FUNCNAME][$LINENO] "get hot patch name from ${hpath} fail with ${ret}, patchs ${htpatchs}"
        return 1
    fi

    for p in ${htpatchs}
    do
        if [ -z ${p} ];then
            LOG [$FUNCNAME][$LINENO] "The hot patch sub package is null"
            continue
        fi
       
        device=$(grep device_type /opt/huawei/snas/etc/snas.ini|awk -F= '{print $2}')

        if [ ${device} == 4 ] && [ "${p}" == "V300R006C00SPH209MLX" -o "${p}" == "V300R006C00SPH202CS1" -o "${p}" == "V300R006C00SPH205T3" ] ;then
          continue 
        fi
        local patch_module=$(get_livepatch_moudle "${hpath}" "${p}")
        if [ "X${patch_module}" = "XNO" ];then
            continue
        fi
        livepatch -q${patch_module} |grep "^Patch State" | grep "Active" > /dev/null 2>&1
        ret=$?
        if [ ${ret} -ne 0 ];then
            LOG [$FUNCNAME][$LINENO] "Check hot patch of ${p} fail(${patch_module})"
            echo "${p}: Hot patch active fail(${patch_module}).ERRCODE(4)"
        fi
    done
    return 0
}

hppath=$(get_patch_path)
if [ ! -z ${hppath} ];then
    check_patch ${hppath}
fi
