#!/usr/bin/env bash
# 文件名: lvscare_deploy.sh
# 作者: 树辉<shuhui@vqiu.cn>
# vim:sw=4:ts=4:et

set -e

# 终端颜色定义
txtbld=$(tput bold)             # Bold
bldred=${txtbld}$(tput setaf 1) # red
bldgre=${txtbld}$(tput setaf 2) # green
bldylw=${txtbld}$(tput setaf 3) # yellow
txtrst=$(tput sgr0)             # Reset
err=${bldred}ERROR${txtrst}
info=${bldgre}INFO${txtrst}
warn=${bldylw}WARNING${txtrst}


# 引入系统发行版本配置
if [ -f "/etc/os-release" ];
then
    . /etc/os-release
else
    printf "$err: 不支持该操作系统."
    exit 1
fi

# 动态声明环境变量
case "$ID" in
    "debian")
        OPTS_CONFIG=/etc/default/lvscare ;;
    "ubuntu")
        OPTS_CONFIG=/etc/default/lvscare ;;
    "centos")
        OPTS_CONFIG=/etc/sysconfig/lvscare ;;
    "kylin")
        OPTS_CONFIG=/etc/sysconfig/lvscare ;;
    *)
        printf "$err: 不支持该OS发行发支." && exit 1
        ;;
esac

# 判断环境平台
if [ -z "${ARCH}" ]; then
  case $(uname -m) in
    x86_64) ARCH=amd64 ;;
    aarch64) ARCH=arm64 ;;
    *) printf "$err: 不支持该平台 $(uname -m)"; exit 1 ;;
  esac
fi

# 版本号
lvscare_version=4.3.2

# 下载链接
package_url="http://gitee:gitee@dl.gitee.work:8848/package/lvscare/lvscare-${lvscare_version}-${ARCH}.tar.xz"


if [[ "$@" < "1" ]]; then
    echo """
用法: $(basename $0) [选项]
选项:
  --masters         [必填] Kubernetes 控制平面节点IP地址
  --vip             [选填] 虚拟IP地址(默认: 168.254.88.48)
  --port            [选填] 虚拟IP地址监听端口(默认: 6443)
  --logger          [选填] 打印的日志级别(默认: DEBG)
  --interval        [选填] 探测后端服务的间隔时间(默认：6秒)
  --iface           [选填] 虚拟网口名称(默认：kube-vip)
  --offline         [选填] 是否为离线部署(默认: false)

示例:
1. 在线部署
# ./$(basename $0) --masters 192.168.88.11,192.168.88.12,192.168.88.13

2. 离线部署
# ./$(basename $0) --masters 192.168.88.11,192.168.88.12,192.168.88.13 --offline true
"""
    exit 67
fi

# 读取命令行参数
ARGUMENT_LIST=(
    "masters"
    "vip"
    "port"
    "logger"
    "interval"
    "iface"
    "offline"
)

# 读取参数
opts=$(getopt \
    --longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
    --name "$(basename "$0")" \
    --options "" \
    -- "$@"
)

eval set --$opts

while true; do
    case "$1" in
    --masters)  
        shift
        masters=$1
        ;;
    --vip)  
        shift
        vip=$1
        ;;
    --port)  
        shift
        port=$1
        ;;
    --logger)  
        shift
        logger=$1
        ;;
    --interval)
        shift
        interval=$1
        ;;
    --iface)
        shift
        iface=$1
        ;;
    --offline)
        shift
        offline=$1
        ;;
      --)
        shift
        break
        ;;
    esac
    shift
done

# 定义默认变量
master_servers=$(echo ${masters} | sed 's/,/ /g')
master_server_opt=$(for ip in ${master_servers}; do echo -n " --rs ${ip}:6443"; done )
vip=${vip:-169.254.88.48}
port=${port:-6443}
logger=${logger:-DEBG}
interval=${interval:-6}
iface=${iface:-kube-vip}
offline=${offline:-false}

# 输出当前部署信息
cat<< EOF
`echo -e " ====================== 环境部署指要 =========================="`
`echo -e " - 控制平面IP: ${master_servers}"` 
`echo -e " - 虚拟IP地址: ${vip}"`
`echo -e " - 代理监听端口: ${port}"`
`echo -e " - 日志输出级别: ${logger}"`
`echo -e " - 服务探测间隔: ${interval}"`
`echo -e " - 虚拟网口名称: ${iface}"`
`echo -e " - 是否离线部署: ${offline}"`
`echo -e " =============================================================="`
`echo -e ""`
EOF
read -p "确认无误后,请按Enter键进行部署..."

if [[ "${offline}" == "false" ]]; then
    if [[ ! -e ${package_url##*/} ]]; then
        wget -O ${package_url##*/} ${package_url} || curl -o ${package_url##*/} ${package_url}
        tar axvf ${package_url##*/} -C /usr/sbin >/dev/null
    fi
else
    if [[ -e ${package_url##*/} ]]; then
        tar axvf ${package_url##*/} -C /usr/sbin >/dev/null
    else
        printf "$err: ${package_url##*/} 文件不存在~"
        exit 67
    fi
fi

cat >${OPTS_CONFIG} <<EOF
OPTS="--vs ${vip}:${port}${master_server_opt} --logger ${logger} --interval ${interval} --mode link --iface ${iface}"

EOF

cat >/etc/systemd/system/lvscare.service<<EOF
[Unit]
Description=lvscare
After=network.target

[Service]
User=root
LimitNOFILE=10240
LimitNPROC=10240
LimitCORE=infinity
LimitMEMLOCK=infinity
EnvironmentFile=${OPTS_CONFIG}
ExecStart=/usr/sbin/lvscare care \$OPTS
ExecStop=/usr/sbin/lvscare care \$OPTS --clean
Restart=on-failure
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable lvscare.service
systemctl restart lvscare.service
