#!/bin/bash
set +x
# ********************************************** ***************************** #
# File Name: appctl
# Description: Provide Basic Interfaces For Component-Upgrade
# Input:
# Output:
# Author:
# Created: 2019-1-30
# Function List:
# **************************************************************************** #
 
# **********************************Global Vars******************************* #
CMPT_NAME="CMPT_OMTASK"
PKG_DIR=`dirname $0`/..
REPO_DIR=$PKG_DIR/repo
LOCAL_THIRD_PACKAGES=/usr/local/lib64/python3.7/site-packages
OCEANSTOR_IBC_DATA_USER=ibc_os_hs
DB_PATH=/OSM/coffer_data/ISM/AI/smart.db
SMART_FIX_DB_PATH=/OSM/coffer_data/ISM/AI/smartfix.db
# **********************************Public Function*************************** #
 
# show help info
function ShowHelp()
{
    echo "Usage:"
    echo "  appctl [options]"
    echo ""
    echo "Options:"
    echo "  showhelp"
    echo "  install"
    echo "  uninstall"
    echo "  start"
    echo "  stop"
    echo "  check_status"
    echo "  online"
    echo "  offline"
    echo "  pre_upgrade"
    echo "  upgrade"
    echo "  check_upgrade"
    echo "  pre_rollbak"
    echo "  rollback"
 
    return 0
}

function removeOldFiles()
{
    # 升级和会滚去移除多余文件，防止被遍历目录时加载
    OS_echo "[$CMPT_NAME] begin to rm /ISM/omtask/conf/*.xml."
    if [ -d /ISM/omtask/conf ]; then
        rm -rf /ISM/omtask/conf/*.xml
        OS_echo "[$CMPT_NAME]  rm /ISM/omtask/conf/*.xml  end."
    fi
    OS_echo "[$CMPT_NAME] begin to rm /ISM/omtask/new/tasks/*."
    if [ -d /ISM/omtask/new/tasks ]; then
        rm -rf /ISM/omtask/new/tasks/*
        OS_echo "[$CMPT_NAME] rm /ISM/omtask/new/tasks/* end."
    fi
    # 回滚600 601时删除smartGUI/omtask模块
    if [ -f /OSM/coffer_data/swm/upgrade_flag ]; then
        upgrade_version=`grep "dstversion" /OSM/coffer_data/swm/upgrade_flag | awk -F "=" '{printf $2}'`
    else
        OS_echo "no upgrade_flag file"
    fi
    if [[ $upgrade_version =~ "6.0.0" ]] || [[ $upgrade_version =~ "6.0.1" ]]; then
        OS_echo "[$CMPT_NAME] upgrade version=$upgrade_version for remove old files"

        if [ -f /OSM/script/smartgui/stop_smart_gui.sh ]; then
            OS_echo "begin to stop smartGUI"
            sh /OSM/script/smartgui/stop_smart_gui.sh
        fi

        if [ -f /OSM/script/omtask/stop_omtask.sh ]; then
            OS_echo "begin to stop omtask"
            sh /OSM/script/omtask/stop_omtask.sh
            OS_echo "begin to remove omtask site-packages"
        fi

        rm -rf /ISM/omtask/site-packages
        rm -rf /OSM/script/omtask
        rm -rf /ISM/AI/gui
        rm -rf /ISM/AI/smart_gui_virtual
        rm -rf /OSM/script/smartgui/
        rm -rf /OSM/coffer_data/ISM/AI
    else
        OS_echo "[$CMPT_NAME] upgrade version=$upgrade_version no need remove"
    fi
}

function RemoveUnusedFiles()
{
    # check soft link
    if [ -f /ISM/omtask/omtask_debug.py ] && [ ! -L /ISM/omtask/omtask_debug.py ]; then
        rm -rf /ISM/omtask/omtask_debug.py
    fi
    cacert_file_list=$(find /ISM/omtask -name cacert.pem)
    for cacert_file in ${cacert_file_list}; do
        if [ -f ${cacert_file} ] && [ ! -L ${cacert_file} ]; then
            # certifi-2020.12.05要保证cacert.pem存在，对文件进行清空处理
            > ${cacert_file}
        fi
    done
    rm_file=("bind.sh" "os_get_cpu_partition.sh" "start_omtask.sh" "stop_omtask.sh" "tar_omtask_log.sh")
    for rm_name in ${rm_file[@]}
    do
        real_file="/ISM/omtask/script/${rm_name}"
        if [ -f ${real_file} ]  && [ ! -L ${real_file} ]; then
            rm -f ${real_file}
        fi
    done

}

function RemoveUnusedFilesGUI()
{
    if [ -f /ISM/AI/gui/site-packages ]; then
        rm -rf /ISM/AI/gui/site-packages
    fi
}

function change_owner_R()
{
    owner=$1
    target=$2

    if [ -L $target ]; then
        OS_echo "Failed. ${target} is a soft link or relative path. [Line:${LINENO}, File:${SCRIPT_NAME}]"
        return 1
    fi

    chown -h $owner $target
    find $target -type f -exec chown -h $owner {} \;
    find $target -type d -exec chown -h $owner {} \;
    find $target -type l -exec chown -h $owner {} \;
    return 0
}

function change_mod_R()
{
    mod=$1
    target=$2

    if [ -L $target ]; then
        OS_echo "Failed. ${target} is a soft link or relative path. [Line:${LINENO}, File:${SCRIPT_NAME}]"
        return 1
    fi

    /ISM/ism_tool OceanStorMgrUser -c "chmod -Rf $mod $target"
    return 0
}

function change_mod()
{
    mod=$1
    target=$2

    if [ -L $target ]; then
        OS_echo "Failed. ${target} is a soft link or relative path. [Line:${LINENO}, File:${SCRIPT_NAME}]"
        return 1
    fi

    /ISM/ism_tool OceanStorMgrUser -c "chmod $mod $target"
    return 0
}

function mv_root_script()
{
    OS_echo "begin to mv script to root path."
    if [ -d /OSM/script/omtask ]; then
        rm -rf /OSM/script/omtask
    fi
    mkdir -p /OSM/script/omtask
    mv /ISM/omtask/root_script/* /OSM/script/omtask
    if [ -f /OSM/conf/unroot_flag ]; then
        chown -R -h root:OceanStorCommonGroup /OSM/script/omtask
    else
        chown -R -h root:root /OSM/script/omtask
    fi
    change_mod_R 550 /OSM/script/omtask
    OS_echo "succeed mv script to root path."
}

function mv_smart_gui_root_script()
{
    OS_echo "begin to mv smartgui script to root path."
    if [ -d /OSM/script/smartgui ]; then
        rm -rf /OSM/script/smartgui
    fi
    mkdir -p /OSM/script/smartgui
    mv /ISM/AI/gui/root_script/* /OSM/script/smartgui
    if [ -f /OSM/conf/unroot_flag ]; then
        chown -R -h root:OceanStorCommonGroup /OSM/script/smartgui
    else
        chown -R -h root:root /OSM/script/smartgui
    fi
    change_mod_R 550 /OSM/script/smartgui
    chmod 550 /OSM/script/smartgui
    chmod g-s /OSM/script/smartgui
    OS_echo "succeed mv smartgui script to root path."
}

function copy_site_packages_virtual() {
    cp -rf /ISM/AI/gui/site-packages/* /ISM/AI/smart_gui_virtual/lib/python3.7/site-packages/
}

function change_smartgui_db_permit()
{
    # 清空继承的ACL，适配613及以后版本升级
    setfacl -b ${DB_PATH} ${SMART_FIX_DB_PATH}
    change_mod 640 $DB_PATH
    change_mod 640 $SMART_FIX_DB_PATH
    setfacl -R -m user:${OCEANSTOR_IBC_DATA_USER}:-rw ${DB_PATH} ${SMART_FIX_DB_PATH}
}


# install all RPMs in repo directory
function Install()
{
    OS_echo "[$CMPT_NAME] Install start."
    for file in `ls $REPO_DIR/*.rpm`
    do
        retryTimes=3
        i=0
        while [[ $i -lt $retryTimes ]];do
            rpm -ivh --nodeps --force $file
            if [ $? -ne 0 ]; then
                if [ $i -lt $retryTimes ]; then
                    OS_echo "[$CMPT_NAME] Install rpm($file) fail. sleep 2s and try again"
                    sleep 2
                    let i++
                else
                   OS_echo "[$CMPT_NAME] Install rpm($file) fail."
                   return 1
                fi
            else
                OS_echo "[$CMPT_NAME] Install rpm($file) success."
                break
            fi
        done
    done
    cp $PKG_DIR/manifest.yml /ISM/omtask/
    cd /ISM/omtask
    if [ -d "/ISM/omtask/omtask_virtual/" ];then
        OS_echo "[appctl] clean omtask_virtual"
        rm -rf /ISM/omtask/omtask_virtual
    fi
    if [ -f "/usr/bin/python3.7" ]; then
        OS_echo "[appctl] create omtask_virtual by /usr/bin/python3.7"
        python3 -m venv --without-pip --copies omtask_virtual
    else
        OS_echo "[appctl] create omtask_virtual by /ISM/omtask/python3/bin/python3"
        /ISM/omtask/python3/bin/python3 -m venv --without-pip --copies omtask_virtual
    fi
    cp /ISM/omtask/site-packages/bin/* /ISM/omtask/omtask_virtual/bin/
    cp -rf /ISM/omtask/site-packages/lib/* /ISM/omtask/omtask_virtual/lib/python3.7/site-packages/
 
    # copy error conf file
    if [ -f /OSM/conf/error_en.xml ]; then
        cp -f /OSM/conf/error_en.xml /ISM/omtask/conf/i18n/error_en.xml
    else
        OS_echo "error_en.xml is not exsit."
    fi
 
    if [ -f /OSM/conf/error_zh.xml ]; then
        cp -f /OSM/conf/error_zh.xml /ISM/omtask/conf/i18n/error_zh.xml
    else
        OS_echo "error_zh.xml is not exsit."
    fi
    chmod 440 /ISM/omtask/conf/omtask_sudoer
    mv /ISM/omtask/conf/omtask_sudoer /etc/sudoers.d/

    mv_root_script
    # cp stop file
    cp /OSM/script/omtask/stop_omtask.sh /OSM/script/setup.hook/before
    change_owner_R root:root /OSM/script/setup.hook/before/stop_omtask.sh
 
    if [ -f /OSM/conf/unroot_flag ]; then
        change_owner_R OceanStorMgrUser:OceanStorCommonGroup /ISM/omtask
    else
        change_owner_R OceanStorMgrUser:mgrgroup /ISM/omtask
    fi
    change_mod_R 550 /ISM/omtask
    change_mod_R 640 /ISM/omtask/conf
    change_mod 750 /ISM/omtask/conf
    change_mod 750 /ISM/omtask/conf/i18n

    OS_echo "[$CMPT_NAME] Install end."
 
    cp /OSM/script/omtask/tar_omtask_log.sh /OSM/script
    change_mod 550 /OSM/script/tar_omtask_log.sh
    
    # remove omtask_debug.py and certify.pem
    RemoveUnusedFiles
 
    # smartGUI
    echo `uname -a` | grep -i "aarch64"
    if [ $? -eq 0 ]; then
        # copy root script to OSM
        mv_smart_gui_root_script
        
        cd /ISM/AI/
        if [ -d "/ISM/AI/smart_gui_virtual" ];then
            rm -rf smart_gui_virtual
        fi
        # del python env tar packages
        rm -rf /ISM/AI/smart_gui_env
        rm -rf /ISM/AI/smart_gui_env.tar.gz
        rm -rf /ISM/AI/cap_pred_env.tar.gz
        /usr/bin/python3.7 -m venv smart_gui_virtual --without-pip --copies
        if [ ! -d "smart_gui_virtual/lib/python3.7" ];then
            mv smart_gui_virtual/lib/python3.8 smart_gui_virtual/lib/python3.7
        fi
        copy_site_packages_virtual
        RemoveUnusedFilesGUI
        mkdir -p /ISM/AI/gui/logs /OSM/coffer_data/ISM/AI /OSM/coffer_log/log/ismlog/smartguilog
        OS_echo "[Install SMARTGUI] init path /ISM/AI/gui/logs /OSM/coffer_data/ISM/AI /OSM/coffer_log/log/ismlog/smartguilog res=$?"
        # 切数据权限
        if [ -f /OSM/conf/unroot_flag ]; then
            chown -R -h OceanStorMgrUser:OceanStorCommonGroup /OSM/coffer_log/log/ismlog/smartguilog
        else
            chown -R -h OceanStorMgrUser:mgrgroup /OSM/coffer_log/log/ismlog/smartguilog
        fi
        chown -R -h OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        ln -sfn /OSM/coffer_log/log/ismlog/smartguilog/ /ISM/AI/gui/logs
        if [ -f /OSM/conf/unroot_flag ]; then
            change_owner_R OceanStorMgrUser:OceanStorCommonGroup /ISM/AI
        else
            change_owner_R OceanStorMgrUser:mgrgroup /ISM/AI
        fi
        change_mod_R 550 /ISM/AI
        # Init db when deploy smartGUI
        if [ ! -f "/OSM/coffer_data/ISM/AI/smart.db" ];then
            PYTHONPATH=$PYTHONPATH:/ISM/AI/gui/ /ISM/AI/smart_gui_virtual/bin/python3 /ISM/AI/gui/script/deploy_init_db.py
            OS_echo "[SMARTGUI] init database"
        fi
        if [ ! -f "/OSM/coffer_data/ISM/AI/smartfix.db" ];then
            PYTHONPATH=$PYTHONPATH:/ISM/AI/gui/ /ISM/AI/smart_gui_virtual/bin/python3 /ISM/AI/gui/script/deploy_init_smartfix_db.py
            OS_echo "[SMARTFIX] init database"
        fi
        if [ -f /OSM/conf/unroot_flag ]; then
            change_owner_R OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        else
            change_owner_R OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        fi
        change_mod 750 /OSM/coffer_data/ISM/AI
        change_smartgui_db_permit
        cp /OSM/script/smartgui/tar_smart_gui_log.sh /OSM/script
        chmod 550 /OSM/script/tar_smart_gui_log.sh
        # 切配置文件权限
        chmod 750 /ISM/AI/gui/conf
        chmod 750 /ISM/AI/gui/conf/i18n
        chmod 640 /ISM/AI/gui/conf/i18n/system_para_zh.xml
    fi
    return 0
}

# uninstall all RPMs in repo directory
function Uninstall()
{
    OS_echo "[$CMPT_NAME] Uninstall start."
    Stop
    for file in `ls $REPO_DIR/*.rpm`
    do
        RPM_PKG=${file##*/}
        rpm -e --nodeps ${RPM_PKG%.*}
        if [ $? -ne 0 ]; then
            OS_echo "[$CMPT_NAME] Uninstall rpm($file) fail."
            return 1
        fi
    done
    rm -rf /ISM/omtask
    rm -rf /OSM/script/omtask
    # rm smartGUI
    rm -rf /OSM/script/smartgui
    rm -rf /ISM/AI/gui
    rm -rf /ISM/AI/smart_gui_env
    rm -rf /ISM/AI/smart_gui_env.tar.gz
    rm -rf /ISM/AI/cap_pred_env.tar.gz
    rm -rf /ISM/AI/smart_gui_virtual
    rm -rf /OSM/script/smartgui
    rm -rf /OSM/coffer_data/ISM/AI/smart_backup.db
    OS_echo "[$CMPT_NAME] Uninstall end."
    return 0
}

# start component
function Start()
{
    OS_echo "[$CMPT_NAME] Start start."

    # servicectrl start
    OS_echo "[$CMPT_NAME] Begin to start omtask."

    sh /OSM/script/omtask/start_omtask.sh

    # smart_gui start and bind to SNM
    echo `uname -a` | grep -i "aarch64"
    if [ $? -eq 0 ]; then
        OS_echo "[$CMPT_NAME] Begin to start smart gui."
        sh /OSM/script/smartgui/start_smart_gui.sh
        sleep 2
        OS_echo "[SMART_GUI][Start] smart gui start and port info:  $(sudo netstat -anp | grep 8408 | grep LISTEN)."
        sh /OSM/script/smartgui/stop_smart_gui.sh
        sleep 2
        sh /OSM/script/smartgui/start_smart_gui.sh
        sleep 2
        OS_echo "[SMART_GUI][Start] smart gui start and port info:  $(sudo netstat -anp | grep 8408 | grep LISTEN)."
    fi
    return 0
}

# stop component
function Stop()
{
    OS_echo "[$CMPT_NAME] Stop start."

    # omtask stop
    OS_echo "[$CMPT_NAME] Begin to stop omtask."
    # nothing to do if it's already offline
    sh $PKG_DIR/action/stop_omtask.sh

    # smart_gui stop and stop SNM
    echo `uname -a` | grep -i "aarch64"
    if [ $? -eq 0 ]; then
        OS_echo "[$CMPT_NAME] Begin to stop smart gui."
        sh $PKG_DIR/action/stop_smart_gui.sh
        OS_echo "[$CMPT_NAME] Stop end."
    fi
    return 0
}


# check if the comonent is normal
function CheckStatus()
{
    OS_echo "[$CMPT_NAME] CheckStatus start."


    OS_echo "[$CMPT_NAME] check omtask_daemon status start."
    ONLINE_FLAG=`ps -ef | grep -w "omtask_daemon" | grep -v grep | awk '{print $2}'`
    OS_echo "[$CMPT_NAME][CheckStatus] ps -ef | grep -w 'omtask_daemon' | grep -v grep | awk '{print $2}' result=$ONLINE_FLAG"
    RETRY_TIMES=0
    while [ -z "$ONLINE_FLAG" -a $RETRY_TIMES -lt 30 ]
    do
        ((RETRY_TIMES++))
        OS_echo "[$CMPT_NAME] check omtask_daemon status failed, times($RETRY_TIMES)."
        sleep 1
        ONLINE_FLAG=`ps -ef | grep -w "omtask_daemon" | grep -v grep | awk '{print $2}'`
        OS_echo "[$CMPT_NAME][CheckStatus] ps -ef | grep -w 'omtask_daemon' | grep -v grep | awk '{print $2}' result=$ONLINE_FLAG"
    done

    if [ -z "$ONLINE_FLAG" ]; then
        OS_echo "[$CMPT_NAME] check omtask_daemon status failed."
        return 1
    fi
    OS_echo "[$CMPT_NAME] check omtask_daemon status success."


    check_main_control
    if [ $? -eq 0 ];then
        OS_echo "[$CMPT_NAME][CheckStatus]  current controller is not main controller. skip check omtask.py"
        return 0
    fi

    # check omtask
    OS_echo "[$CMPT_NAME] check omtask.py status start."
    ONLINE_FLAG=`ps -ef | grep -w "python omtask.py" | grep -v grep | awk '{print $2}'`
    OS_echo "[$CMPT_NAME][CheckStatus] ps -ef | grep -w 'python omtask.py' | grep -v grep | awk '{print $2}' result=$ONLINE_FLAG"
    RETRY_TIMES=0
    while [ -z "$ONLINE_FLAG" -a $RETRY_TIMES -lt 30 ]
    do
        ((RETRY_TIMES++))
        OS_echo "[$CMPT_NAME] check omtask status failed, times($RETRY_TIMES)."
        sleep 1
        ONLINE_FLAG=`ps -ef | grep -w "python omtask.py" | grep -v grep | awk '{print $2}'`
        OS_echo "[$CMPT_NAME][CheckStatus] ps -ef | grep -w "python omtask.py" | grep -v grep | awk '{print $2}' result=$ONLINE_FLAG"
    done

    if [ -z "$ONLINE_FLAG" ]; then
        OS_echo "[$CMPT_NAME] check omtask.py status failed."
        return 1
    fi

    # check smart gui
    OS_echo "[SMART_GUI][CheckStatus] smart gui start and port info:  $(netstat -anp | grep 8408 | grep LISTEN)."
    sleep 1
    PYTHONPATH=$PYTHONPATH:/ISM/AI/gui/ /ISM/AI/smart_gui_virtual/bin/python3 /ISM/AI/gui/script/check_status.py
    OS_echo "[SMART_GUI][CheckStatus] check switch status info: $?"

    OS_echo "[$CMPT_NAME] check omtask.py status success."
    # no need to check omtask

    OS_echo "[$CMPT_NAME] CheckStatus end."

    return 0
}
function check_main_control()
{
    python $PKG_DIR/action/check_main_controller.py
    if [ $? -eq 0 ];then
        OS_echo "[omtask:] [check_main_control.py] current controller is not main controller."
        return 0
    fi
    return 1
}
# component online, nothing to do
function Online()
{
    OS_echo "[$CMPT_NAME] Online start."
    OS_echo "[$CMPT_NAME] Online end."
    return 0
}

# component offline, nothing to do
function Offline()
{
    OS_echo "[$CMPT_NAME] Offline start."
    OS_echo "[$CMPT_NAME] Offline end."
    return 0
}

# component pre_upgrade, nothing to do
function PreUpgrade()
{
    OS_echo "[$CMPT_NAME] PreUpgrade start."
    removeOldFiles
    OS_echo "[$CMPT_NAME] PreUpgrade end."
    return 0
}

# component upgrade
function Upgrade()
{
    OS_echo "[$CMPT_NAME] Upgrade start."
    OS_echo "[$CMPT_NAME] Stop omtask start."
    # intall rpms
    # nothing to do if it's already offline
    sh $PKG_DIR/action/stop_omtask.sh
    OS_echo "[$CMPT_NAME] Stop omtask end."
    echo `uname -a` | grep -i "aarch64"
    if [ $? -eq 0 ]; then
        sh $PKG_DIR/action/stop_smart_gui.sh
        sleep 1
    fi
    OS_echo "[SMART_GUI_UPGRADE] Stop smart gui end."
    if [ -d /ISM/omtask/site-packages ]; then
        rm -rf /ISM/omtask/site-packages
    fi
    rm -rf /ISM/AI/smart_gui_env
    OS_echo "[$CMPT_NAME] clean /ISM/omtask/site-packages end."
    for file in `ls $REPO_DIR/*.rpm`
    do
        retryTimes=3
        i=0
        while [[ $i -lt $retryTimes ]];do
            rpm -ivh --nodeps --force $file
            if [ $? -ne 0 ]; then
                if [ $i -lt $retryTimes ]; then
                    OS_echo "[$CMPT_NAME] Install rpm($file) fail. sleep 2s and try again"
                    sleep 2
                    let i++
                else
                   OS_echo "[$CMPT_NAME] Install rpm($file) fail."
                   return 1
                fi
            else
                OS_echo "[$CMPT_NAME] Install rpm($file) success."
                break
            fi
        done
    done
    cp $PKG_DIR/manifest.yml /ISM/omtask/
    mv_root_script

    OS_echo "[$CMPT_NAME] Begin to restart omtask."
    cd /ISM/omtask
    if [ -f "/ISM/omtask/omtask_debug.py" ];then
        OS_echo "[appctl] clean omtask_virtual"
        rm omtask_debug.py
    fi

    if [ -d "/ISM/omtask/omtask_virtual/" ];then
        OS_echo "[appctl] clean omtask_virtual"
        rm -rf /ISM/omtask/omtask_virtual
    fi
    # check arm or x86
    if [ -f "/usr/bin/python3.7" ]; then
        OS_echo "[appctl] create omtask_virtual by /usr/bin/python3.7"
        python3 -m venv --without-pip --copies omtask_virtual
    else
        OS_echo "[appctl] create omtask_virtual by /ISM/omtask/python3/bin/python3"
        /ISM/omtask/python3/bin/python3 -m venv --without-pip --copies omtask_virtual
    fi
    cp /ISM/omtask/site-packages/bin/* /ISM/omtask/omtask_virtual/bin/
    cp -rf /ISM/omtask/site-packages/lib/* /ISM/omtask/omtask_virtual/lib/python3.7/site-packages/

    # copy error conf file
    if [ -f /OSM/conf/error_en.xml ]; then
        cp -f /OSM/conf/error_en.xml /ISM/omtask/conf/i18n/error_en.xml
    else
        OS_echo "error_en.xml is not exsit."
    fi

    if [ -f /OSM/conf/error_zh.xml ]; then
        cp -f /OSM/conf/error_zh.xml /ISM/omtask/conf/i18n/error_zh.xml
    else
        OS_echo "error_zh.xml is not exsit."
    fi
    chmod 440 /ISM/omtask/conf/omtask_sudoer
    mv /ISM/omtask/conf/omtask_sudoer /etc/sudoers.d/

    # cp stop file
    cp /OSM/script/omtask/stop_omtask.sh /OSM/script/setup.hook/before
    change_owner_R root:root  /OSM/script/setup.hook/before/stop_omtask.sh

    if [ -f /OSM/conf/unroot_flag ]; then
        change_owner_R OceanStorMgrUser:OceanStorCommonGroup /ISM/omtask
    else
        change_owner_R OceanStorMgrUser:mgrgroup /ISM/omtask
    fi
    change_mod_R 550 /ISM/omtask
    change_mod_R 640 /ISM/omtask/conf
    change_mod 750 /ISM/omtask/conf
    change_mod 750 /ISM/omtask/conf/i18n

    cp /OSM/script/omtask/tar_omtask_log.sh /OSM/script
    change_mod 550 /OSM/script/tar_omtask_log.sh
    OS_echo "[$CMPT_NAME] Install end."

    sh /OSM/script/omtask/start_omtask.sh
    OS_echo "[$CMPT_NAME] Restart omtask end."

    # remove omtask_debug.py and certify.pem
    RemoveUnusedFiles

    # smart_gui start and bind to SNM
    echo `uname -a` | grep -i "aarch64"
    if [ $? -eq 0 ]; then
        OS_echo "[SMART_GUI_UPGRADE] Begin to restart smart gui."
        # copy smartgui root script to OSM
        mv_smart_gui_root_script

        cd /ISM/AI/
        # del python env tar packages
        rm -rf /ISM/AI/smart_gui_env
        rm -rf /ISM/AI/smart_gui_env.tar.gz
        rm -rf /ISM/AI/cap_pred_env.tar.gz
        if [ -d "/ISM/AI/smart_gui_virtual" ];then
            rm -rf smart_gui_virtual
        fi
        # cp libopenblas
        /usr/bin/python3.7 -m venv smart_gui_virtual --without-pip --copies
        copy_site_packages_virtual
        RemoveUnusedFilesGUI
        if [ -f /OSM/conf/unroot_flag ]; then
            change_owner_R OceanStorMgrUser:OceanStorCommonGroup /ISM/AI/gui
        else
            change_owner_R OceanStorMgrUser:mgrgroup /ISM/AI/gui
        fi
        su OceanStorMgrUser -s /bin/bash -c "mkdir -p /ISM/AI/gui/logs /OSM/coffer_data/ISM/AI /OSM/coffer_log/log/ismlog/smartguilog"
        if [ $? -ne 0 ]; then
           mkdir -p /ISM/AI/gui/logs /OSM/coffer_data/ISM/AI /OSM/coffer_log/log/ismlog/smartguilog
        fi
        # 切数据权限
        if [ -f /OSM/conf/unroot_flag ]; then
            chown -R -h OceanStorMgrUser:OceanStorCommonGroup /OSM/coffer_log/log/ismlog/smartguilog
        else
            chown -R -h OceanStorMgrUser:mgrgroup /OSM/coffer_log/log/ismlog/smartguilog
        fi
        chown -R -h OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        ln -sfn /OSM/coffer_log/log/ismlog/smartguilog/ /ISM/AI/gui/logs
        OS_echo "[Upgrade SMARTGUI] init path /ISM/AI/gui/logs /OSM/coffer_data/ISM/AI /OSM/coffer_log/log/ismlog/smartguilog res=$?"
        change_mod_R 550 /ISM/AI/gui
        cp /OSM/script/smartgui/tar_smart_gui_log.sh /OSM/script
        change_mod 550 /OSM/script/tar_smart_gui_log.sh
        # Init db when deploy smartGUI
        if [ ! -d "/OSM/coffer_data/ISM/AI" ];then
            mkdir -p /OSM/coffer_data/ISM/AI
            OS_echo "[SMARTGUI] mkdir /OSM/coffer_data/ISM/AI"
        fi
        if [ ! -f "/OSM/coffer_data/ISM/AI/smart.db" ];then
            PYTHONPATH=$PYTHONPATH:/ISM/AI/gui/ /ISM/AI/smart_gui_virtual/bin/python3 /ISM/AI/gui/script/deploy_init_db.py
            OS_echo "[SMARTGUI] init database"
        fi
        if [ ! -f "/OSM/coffer_data/ISM/AI/smartfix.db" ];then
            PYTHONPATH=$PYTHONPATH:/ISM/AI/gui/ /ISM/AI/smart_gui_virtual/bin/python3 /ISM/AI/gui/script/deploy_init_smartfix_db.py
            OS_echo "[SMARTFIX] init database"
        fi
        if [ -f /OSM/conf/unroot_flag ]; then
            change_owner_R OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        else
            change_owner_R OceanStorMgrUser:mgrgroup /OSM/coffer_data/ISM/AI
        fi
        change_mod 750 /OSM/coffer_data/ISM/AI
        change_smartgui_db_permit
        # 切配置文件权限
        chmod 750 /ISM/AI/gui/conf
        chmod 750 /ISM/AI/gui/conf/i18n
        chmod 640 /ISM/AI/gui/conf/i18n/system_para_zh.xml
        sh /OSM/script/smartgui/start_smart_gui.sh
        sleep 2
        ONLINE_FLAG_MONITOR_GUI=`ps -ef | grep -w "smart_gui_daemon" | grep -v grep | awk '{print $2}'`
        OS_echo "[SMART_GUI_UPGRADE] ps -ef | grep -w 'smart_gui_daemon' | grep -v grep | awk '{print $2}', result = $ONLINE_FLAG_MONITOR_GUI"
        if [ -z "$ONLINE_FLAG_MONITOR_GUI" ]; then
            sh /OSM/script/smartgui/start_smart_gui.sh
            OS_echo "[SMART_GUI_UPGRADE] smart gui is started."
        fi
        sleep 1
        
    fi
    OS_echo "[$CMPT_NAME] Upgrade omtask end."
    return 0
}
 
# check component upgrade type (0:not support;1:none upgrade;2:hot upgrade;3:cold upgrade, need reboot)
function CheckUpgrade()
{
    OS_echo "[$CMPT_NAME] CheckUpgrade start."
    if [ ! -f "/ISM/omtask/manifest.yml" ];then
        OS_echo "[$CMPT_NAME] upgrade_version not exist; return 0; PreUpgrade end."
        return 2
    fi
    cur_version=`grep "Version" /ISM/omtask/manifest.yml | awk '{print $2}'`
    OS_echo "[$CMPT_NAME] current version=$cur_version"
    upgrade_version=`grep "Version" $PKG_DIR/manifest.yml | awk '{print $2}'`
    OS_echo "[$CMPT_NAME] upgrade version=$upgrade_version"
 
    if [[ -z "$cur_version" ]];then
        OS_echo "[$CMPT_NAME] cur_version not exist; return 2; PreUpgrade end."
        return 2
    fi
    if [[ -z "$upgrade_version" ]];then
        OS_echo "[$CMPT_NAME] upgrade_version not exist; return 2; PreUpgrade end."
        return 2
    fi
    if [[ "$cur_version" != "$upgrade_version" ]]; then
        OS_echo "[$CMPT_NAME] cur_version is different with upgrade_version; need to upgrade; return 2; CheckUpgrade end."
        return 2
    fi
    OS_echo "[$CMPT_NAME] cur_version is the same with upgrade_version; no need to upgrade; return 1; CheckUpgrade end."
    return 1
}
 
# nothing to do
function PreRollback()
{
    OS_echo "[$CMPT_NAME] PreRollback start."
    removeOldFiles
    OS_echo "[$CMPT_NAME] PreRollback end."
    return 0
}
 
# same as upgrade
function RollBack()
{
    OS_echo "[$CMPT_NAME] RollBack start."
    Upgrade
    if [ $? -ne 0 ]; then
        OS_echo "[$CMPT_NAME] Failed to rollback."
        return 1
    fi
    OS_echo "[$CMPT_NAME] RollBack end."
    return 0
}
 
# **********************************Main************************************** #
 
# Check Param
if [ $# -ne 1 ]; then
    ShowHelp
    exit -1
fi
 
# Route Opt
case "$1" in
    "showhelp")
        ShowHelp
        ;;
    "install")
        Install
        ;;
    "uninstall")
        Uninstall
        ;;
    "start")
        Start
        ;;
    "stop")
        Stop
        ;;
    "check_status")
        CheckStatus
        ;;
    "online")
        Online
        ;;
    "offline")
        Offline
        ;;
    "pre_upgrade")
        PreUpgrade
        ;;
    "upgrade")
        Upgrade
        ;;
    "check_upgrade")
        CheckUpgrade
        ;;
    "pre_rollback")
        PreRollback
        ;;
    "rollback")
        RollBack
        ;;
    *)
        ShowHelp
        exit -1
        ;;
esac
 
exit $?
