#!/bin/bash
#
#***************************************************************************
# Author: liwanggui
# Email: liwanggui@163.com
# Date: 2023-08-10
# FileName: install-flannel.sh
# Description: 在线安装 flannel
# Copyright (C): 2023 All rights reserved
#***************************************************************************
# 
# 安装最新版本 docker:
#    $ curl -s https://dl.zrshuiwu.com/scripts/install-flannel.sh | bash
# 安装指定版本的 flannel:
#    $ curl -s https://dl.zrshuiwu.com/scripts/install-flannel.sh | VERSION=v0.22.3 bash
# 

VERSION="${VERSION:-latest}" 
GHPROXY="https://gh.wglee.org/"
DOWNLOAD_BASE_URL="${GHPROXY}https://github.com/flannel-io/flannel/releases/download"
FLANNEL_RELEASE_API="https://api.github.com/repos/flannel-io/flannel/releases/latest"

INSTALL_DIR="/usr/local/bin"
TEMPDIR="$(mktemp -d)"

error () {
    echo -e "\e[0;31m[ERROR] - $(date +'%F %T') -\e[0m $@"
}

info () {
    echo -e "\e[0;34m[INFO] - $(date +'%F %T') -\e[0m $@"
}

_wget() {
    local url="$1"
    local save_name="$2"
    local opts

    if [[ -n "${save_name}" ]]; then
        opts="-O ${save_name}"
    fi

    info "下载 ${url}"
    if ! wget -q --show-progress --tries=3 --timeout=30 "${url}" ${opts}; then
        error "下载失败，请检查后重试!"
        /bin/rm -rf ${TEMPDIR}
        exit 1
    fi
}

get_latest_version() {
    local api_url="$1"
    curl -s ${api_url} | grep tag_name | cut -f4 -d "\""
}

install_flannel () {
    local download_url
    local iface

    if [[ "$VERSION" = "latest" ]]; then
        VERSION=$(get_latest_version ${FLANNEL_RELEASE_API})
    fi
    
    download_url="${DOWNLOAD_BASE_URL}/${VERSION}/flannel-${VERSION}-linux-amd64.tar.gz"

    cd ${TEMPDIR}
    _wget $download_url
    tar xzvf $(basename $download_url) -C ${INSTALL_DIR} --exclude=README.md
    cd && /bin/rm -rf ${TEMPDIR}

    # get iterface name
    if [[ $(ls /sys/class/net/ | grep ^e | wc -l) -eq 1 ]]; then
        iface=$(ls /sys/class/net/ | grep ^e)
    else
        select iface in $(ls /sys/class/net/ | grep ^e); do
            [ -n $iface ] && break
        done
    fi

    info "创建配置文件 /etc/sysconfig/flanneld "
    cat >/etc/sysconfig/flanneld <<EOF
FLANNEL_OPTIONS="-ip-masq -iface=$iface \
-etcd-endpoints=http://localhost:2379"
EOF

    info "创建 service 文件 /usr/lib/systemd/system/flanneld.service"
    cat >/usr/lib/systemd/system/flanneld.service <<EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/flanneld
ExecStart=/usr/local/bin/flanneld \$FLANNEL_OPTIONS
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k OPTIONS -d /etc/sysconfig/docker
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

    tee <<EOF

$(echo -e "\e[0;34m安装完成，执行以下命令向 etcd 中写入 flanneld 配置信息:\e[0m")
  $ etcdctl put /coreos.com/network/config '{ "Network": "10.5.0.0/16", "Backend": {"Type": "vxlan"}}' 
$(echo -e "\e[0;34m使用以下命令启动 flanneld:\e[0m")
  $ sudo systemctl start flanneld.service
  or
  $ sudo systemctl enable --now flanneld.service
EOF

}


install_flannel
