#!/bin/bash

SMB_LINK_CONF=/mdata/etc/samba/smb.conf
SMB_NORECYCLE_CONF=/mdata/etc/samba/smb.conf.norecycle
SMB_RECYCLE_CONF=/mdata/etc/samba/smb.conf.recycle
SMB_NORECYCLE_CONF_GLB=/mdata/etc/samba/smb.conf.norecycle.glb
SMB_RECYCLE_CONF_GLB=/mdata/etc/samba/smb.conf.recycle.glb
SMB3XX_KPFSMB_CONF=/mdata/etc/samba/kpfsmb.conf

SMB_CONFIG_FILE=${SMB_LINK_CONF}

USE_RECYCLE="use recycle"
CREATE_FILELIST="CREATE_FILELIST"
DELETE_FILELIST="DELETE_FILELIST"
HIDE_FILES="hide files"

AUDIT_LOG="AUDIT_LOG"
FILE_OPEN_AUDIT="FILE_OPEN_AUDIT"
SPLIT_HOST="SPLIT_HOST"
MULTIPLE_USER="MULTIPLE_USER"
FILE_LIST_DIR="FILE_LIST_DIR"
AUDIT_IGNORE_LIST="AUDIT_IGNORE_LIST"
USER_NAME_PREFIX="USER_NAME_PREFIX"
GUSER_NAME_PREFIX="GUSER_NAME_PREFIX"
BACKEND_TYPE="BACKEND_TYPE"

opt_get=0
opt_get_all=0
opt_set=0
opt_all=0

. /usr/sbin/kpf_com_fun

usage() {
    echo "Usage: smbconfig [options]"
    echo -e "\t--get: get the value or key-value pairs."
    echo -e "\t--set: set the value or key-value pairs."
    echo -e "\t--key: specified the key."
    echo -e "\t--val: specify the value."
    echo -e "\t--all: get all key-value pairs."
    echo -e "\t--dict: set specified key-value pairs."
    echo -e "\t-h| --help: show this help message"
    echo -e "Examples:"
    echo -e "\tsmbconfig --get --all\t\t\t\t\tprint all key-value pairs"
    echo -e "\tsmbconfig --get --key key\t\t\t\tprint the value of a specified key"
    echo -e "\tsmbconfig --set --key key --val value\t\t\tset a key and reload service"
    echo -e "\tsmbconfig --set --dict key1=value1,key2=value2\t\tset some keys and reload service"

    echo -e "Options:"
    echo -e "\taudit_log:\t\tyes/no 审计日志总开关\
        \n\tfile_open_audit:\tyes/no open操作审计开关\
        \n\tsplit_host:\t\tyes/no 集群模式开关\
        \n\tmultiple_user\t\tyes/no 是否开启多用户模式开关\
        \n\tdelete_filelist\t\tyes/no 删除操作差异列表开关\
        \n\tcreate_filelist\t\tyes/no 新增操作差异列表开关\
        \n\tuse_recycle\t\tyes/no 是否启用回收站\
        \n\tfile_list_dir\t\tstring 差异列表存放目录\
        \n\taudit_ignore_list\tstring 审计日志忽略通配符列表\
        \n\tuser_name_prefix\tstring 用户名前缀\
        \n\tguser_name_prefix\tstring 组用户名前缀\
        \n\thide_files\t\tstring SMB过滤文件类型\
        \n\tbackend_type\t\tstring 后端存储类型"

}

parse_options() {

    local TEMP=`getopt -o h --long help,get,set,all,key:,val,dict: -n 'smbconfig' -- "$@"`
    [ $? -ne 0 ] && usage && exit 1
    eval set -- "${TEMP}"

    while true
    do
        case "$1" in
            -h | --help)
                usage
                exit 0
                ;;
            --get)
                opt_get=1
                shift
                ;;
            --set)
                opt_set=1
                shift
                ;;
            --all)
                opt_all=1
                shift
                ;;
            --key)
                key1=${2}
                key=${2//_/ }
                shift 2
                ;;
            --val)
                if [[ $# -gt 2 ]]
                then
                    if [ "$2" == "--" ]
                    then
                        value=${3}
                    fi
                fi
                shift
                ;;
            --dict)
                key_value_pairs=${2}
                shift 2
                ;;
            --)
                shift
                break
                ;;
            *)
                echo "internal error!"
                exit 1
        esac
    done

    if [ ${opt_get} = 0 ] && [ ${opt_set} = 0 ]; then
        usage
        exit 1
    fi

    if [ ${opt_get} = 1 ] && [ ${opt_all} = 0 ] && [[ -z ${key} ]]; then
        usage
        exit 1
    fi

    if [ ${opt_set} = 1 ] && [[ -z ${key_value_pairs} ]]; then
        if [[ -z ${key} ]] ; then
            echo "when you set something, you should pass the key and value!"
            usage
            exit 1
        fi
    fi

    return 0
}

get_all() {
    path=`readlink ${SMB_LINK_CONF}`
    if [ $? != 0 ]; then
        echo "${SMB_LINK_CONF} is not link file"
        exit 1
    fi

    if [[ $path =~ "norecycle" ]]; then
        use_recycle="no"
    else
        use_recycle="yes"
    fi

    # get filelist options
    value=`sed -n "/${CREATE_FILELIST}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    if [ "${value}" = "0" ]; then
        create_filelist="no"
    else
        create_filelist="yes"
    fi
    value=`sed -n "/${DELETE_FILELIST}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    if [ "${value}" = "0" ]; then
        delete_filelist="no"
    else
        delete_filelist="yes"
    fi

    value=`sed -n "/${AUDIT_LOG}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    if [ "${value}" = "0" ]; then
        audit_log="no"
    else
        audit_log="yes"
    fi

    # get hide file options
    if [ "$use_recycle" = "no" ]; then
        hide_files=`sed -n "/${HIDE_FILES}/p" ${SMB_NORECYCLE_CONF_GLB} | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    else
        hide_files=`sed -n "/${HIDE_FILES}/p" ${SMB_RECYCLE_CONF_GLB} | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    fi

    value=`sed -n "/${AUDIT_IGNORE_LIST}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' |awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    audit_ignore_list=$value

    echo "use_recycle=$use_recycle"
    echo "create_filelist=$create_filelist"
    #echo "delete_filelist=$delete_filelist"
    echo "hide_files=$hide_files"
    echo "audit_log=$audit_log"
    echo "audit_ignore_list=$audit_ignore_list"

    return 0
}

get_key() {
    # read recycle status
    path=`readlink ${SMB_LINK_CONF}`
    if [ $? != 0 ]; then
        echo "${SMB_LINK_CONF} is not link file"
        exit 1
    fi
    # whether include string "norecycle"
    if [[ $path =~ "norecycle" ]]; then
        SMB_CONFIG_FILE=${SMB_NORECYCLE_CONF_GLB}
    else
        SMB_CONFIG_FILE=${SMB_RECYCLE_CONF_GLB}
    fi

    key2=`echo ${key1^^}`
    value=`sed -n "/^${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
    case "${key}" in
        "${USE_RECYCLE}")
            if [ "${SMB_CONFIG_FILE}" = "${SMB_NORECYCLE_CONF_GLB}" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "create filelist")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "delete filelist")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "${HIDE_FILES}")
            sed -n "/${key}/p" ${SMB_CONFIG_FILE} | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'
            ;;
        "audit log")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "file open audit")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "split host")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "multiple user")
            if [ "${value}" = "0" ]; then
                echo "no"
            else
                echo "yes"
            fi
            ;;
        "file list dir")
            echo $value
            ;;
        "user name prefix")
            echo $value
            ;;
        "audit ignore list")
            audit_list=${value// //}
            echo $audit_list
            ;;
        "guser name prefix")
            echo $value
            ;;
        "backend type")
            if [ "${value}" = "0" ]; then
                echo "SAN"
            else
                echo "NAS"
            fi
            ;;
        *)
            echo "the option do not support the key or invalid option: $key1"
            exit 1
            ;;
    esac

    return 0
}

set_key() {
    key2=`echo ${key1^^}`
    if [ "${value}" = "no" ]; then
        key_value=0
    elif [ "${value}" = "yes" ]; then
        key_value=1
    fi

    if [ "${value}" = "0" ]; then
        key_value=0
    elif [ "${value}" = "1" ]; then
        key_value=1
    fi

    case "${key}" in
        "${USE_RECYCLE}")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            if [ "${key_value}" = "1" ]; then
                ln -sf ${SMB_RECYCLE_CONF} ${SMB_LINK_CONF}
            else
                ln -sf ${SMB_NORECYCLE_CONF} ${SMB_LINK_CONF}
            fi
            ;;
        "create filelist")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "delete filelist")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "${HIDE_FILES}")
            sed -i "s&${HIDE_FILES}.*&${HIDE_FILES} = ${value}&" ${SMB_NORECYCLE_CONF_GLB}
            sed -i "s&${HIDE_FILES}.*&${HIDE_FILES} = ${value}&" ${SMB_RECYCLE_CONF_GLB}
            ;;
        "audit log")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "file open audit")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "split host")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "multiple user")
            if [ "${key_value}" = "" ]; then
                echo "the option do not support the value: $value"
                exit 1
            fi
            orgin_val=`sed -n "/${key2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
            sed -i "/${key2}=/ s&${orgin_val}&${key_value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "file list dir")
            sed -i "s&${FILE_LIST_DIR}=.*&${FILE_LIST_DIR}=${value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "user name prefix")
            sed -i "s&^${USER_NAME_PREFIX}=.*&${USER_NAME_PREFIX}=${value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "audit ignore list")
            audit_list=${value//// }
            sed -i "s&${AUDIT_IGNORE_LIST}=.*&${AUDIT_IGNORE_LIST}=${audit_list}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        "guser name prefix")
            sed -i "s&${GUSER_NAME_PREFIX}=.*&${GUSER_NAME_PREFIX}=${value}&" ${SMB3XX_KPFSMB_CONF}
            ;;
        *)
            echo "the option do not support the key or invalid option: $key1"
            exit 1
            ;;
    esac

    return 0
}

set_dict() {
    echo "${key_value_pairs}" | tr "," "\n" | while read line
    do
        key_name=`echo ${line} | awk -F "=" '{print $1}'`
        key_name1=${key_name//_/ }
        key_name2=`echo ${key_name^^}`
        key_value=`echo ${line} | awk -F "=" '{print $2}'`
        if [ "${key_value}" = "no" ]; then
            key_value1=0
        elif [ "${key_value}" = "yes" ]; then
            key_value1=1
        fi

        if [ "${key_value}" = "0" ]; then
            key_value1=0
        elif [ "${key_value}" = "1" ]; then
            key_value1=1
        fi

       # if [ "${key_name1}" != "${HIDE_FILES}" ] && [ -z ${key_value} ]; then
       #    echo "the key-value pairs should be set like this: [key=value]"
       #   exit 1
       # fi
        case "${key_name1}" in
            "${USE_RECYCLE}")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                if [ "${key_value1}" = "1" ]; then
                    ln -sf ${SMB_RECYCLE_CONF} ${SMB_LINK_CONF}
                else
                    ln -sf ${SMB_NORECYCLE_CONF} ${SMB_LINK_CONF}
                fi
                ;;
            "create filelist")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "delete filelist")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "${HIDE_FILES}")
                sed -i "s&${HIDE_FILES}.*&${HIDE_FILES} = ${key_value}&" ${SMB_NORECYCLE_CONF_GLB}
                sed -i "s&${HIDE_FILES}.*&${HIDE_FILES} = ${key_value}&" ${SMB_RECYCLE_CONF_GLB}
                ;;
            "audit log")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "file open audit")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "split host")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "multiple user")
                if [ "${key_value1}" = "" ]; then
                    echo "the option do not support the value: $key_value"
                    exit 1
                fi
                orgin_val=`sed -n "/${key_name2}/p" ${SMB3XX_KPFSMB_CONF} | grep -v '^#' | awk -F "=" '{print $2}' | sed 's/^[ \t]*//g'`
                sed -i "/${key_name2}=/ s&${orgin_val}&${key_value1}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "file list dir")
                sed -i "s&${FILE_LIST_DIR}=.*&${FILE_LIST_DIR}=${key_value}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "user name prefix")
                sed -i "s&^${USER_NAME_PREFIX}=.*&${USER_NAME_PREFIX}=${key_value}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "audit ignore list")
                audit_list=${key_value//// }
                sed -i "s&${AUDIT_IGNORE_LIST}=.*&${AUDIT_IGNORE_LIST}=${audit_list}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            "guser name prefix")
                sed -i "s&${GUSER_NAME_PREFIX}=.*&${GUSER_NAME_PREFIX}=${key_value}&" ${SMB3XX_KPFSMB_CONF}
                ;;
            *)
                echo "the option do not support the key or invalid option: $key_name"
                exit 1
                ;;
        esac
    done

    return 0
}

main() {
    if [ ! -e ${SMB_LINK_CONF} ]; then
        kpf_log smbconfig "error: ${SMB_LINK_CONF} does not exist." error
        exit 1
    fi

    parse_options $@

    if [ ${opt_get} = 1 ]; then
        if [ ${opt_all} = 1 ]; then
            get_all
            return $?
        else
            get_key
            return $?
        fi
    fi

    if [ ${opt_set} = 1 ]; then
        if [[ ! -z ${key_value_pairs} ]]; then
            set_dict
            return $?
        elif [[ ! -z {key} ]]; then
            set_key
            return $?
        fi
    fi

    return 0
}

main $@

exit $?

