software

发布时间 2023-08-11 14:25:34作者: 牧之丨
#!/bin/bash
# author:Muzhi

set -e

readonly YES="Y"
readonly NO="N"
readonly UNION="union"
readonly MEMBER="member"
readonly DOCKER_ROOT="/var/lib/docker"

DOCKER_FILE=
DOCKER_RPM_FILE=
DOCKER_DEB_FILE=
DOCKER_COMPOSE_FILE=
JDK_FILE=
DOS2UNIX_RPM_FILE=
DOS2UNIX_DEB_FILE=

readonly jdk_home='/opt/java/jdk1.8.0_351'
readonly jdk17_home='/opt/java/openjdk'
readonly jdk_env='$JAVA_HOME/bin'

jdk_version="8"

readonly Darwin="Darwin"
readonly CentOS="CentOS"
readonly Ubuntu="Ubuntu"
readonly Redhat="Redhat"

work_dir=$(cd -P $(dirname $0); pwd)

data_path="$HOME/data"
host=""
project=""
architecture=$([ "$(uname -m |grep aarch64)" ] && echo aarch64 || echo x86)
docker_root_dir=""
assume=""
params=""
install_rancher_assume="$NO"

suffix="cfg,sh,yml,yaml,env,conf,toml,xml,properties,json"
suffix_array=(${suffix//,/ })

rancher_db_host=""
rancher_db_port=3306
rancher_db_name=cattle
rancher_db_user=cattle
rancher_db_pass=cattle

LOG_ERROR()
{
    local content=${1}
    echo -e "\033[31m[ERROR] ${content}\033[0m"
}

LOG_INFO()
{
    local content=${1}
    echo -e "\033[32m [INFO] ${content}\033[0m"
}

LOG_WARN()
{
    local content=${1}
    echo -e "\033[33m [WARN] ${content}\033[0m"
}

LOG_DEBUG()
{
    local content=${1}
    echo -e "\033[34m[DEBUG] ${content}\033[0m"
}

usage() {
    echo '   ____     _____                     '
    echo '  / __/__  / _/ /__    _____ ________ '
    echo ' _\ \/ _ \/ _/ __/ |/|/ / _ `/ __/ -_)'
    echo '/___/\___/_/ \__/|__,__/\_,_/_/  \__/ '
    echo ""
    echo "Author muzhi"
    echo ""
    echo "usage: bash software.sh -p[project]"
    echo ""
    echo "Note:"
    echo "       project        (Required)      service project, must be one of value: $UNION, $MEMBER"
    echo ""
    echo "       member software: docker, docker-compose, dos2unix"
    echo "       union  software: docker, docker-compose, dos2unix, openjdk17"
    echo ""
}

parse() {
    if [[ $1 == -h* ]]; then
        host=${1:2}
    elif [[ $1 == -d* ]]; then
        data_path=${1:2}
    elif [[ $1 == -p* ]]; then
        project=${1:2}
    elif [[ "$1" = "-R" ]]; then
        install_rancher_assume=$YES
    elif [ "$1" = "-y" ]; then
        assume=$YES
    fi
}

function parse_args() {
    while (("$#")); do
        case "$1" in
        -h | --host)
            host=$2
            if [ $# -ge 2 ]; then
                shift 2
            else
                break
            fi
            ;;

        -d | --data_path)
            data_path=$2
            if [ $# -ge 2 ]; then
                shift 2
            else
                break
            fi
            ;;

        -p | --project)
            project=$2
            if [ $# -ge 2 ]; then
                shift 2
            else
                break
            fi
            ;;

        -R | --rancher)
            install_rancher_assume=$YES
            if [ $# -ge 1 ]; then
                shift 1
            else
                break
            fi
            ;;

        -y | --yes)
            assume=$YES
            if [ $# -ge 1 ]; then
                shift 1
            else
                break
            fi
            ;;

        *) # preserve positional arguments
            params="$params $1"
            if [ $# -ge 1 ]; then
                shift
            else
                break
            fi
            ;;
        esac
    done
}

entry() {
    cd $work_dir

    for opt; do
        parse $opt
    done

    parse_args $*



    echo ">> start install software: project $project, data_path: $data_path, architecture : $architecture, install_rancher: $install_rancher_assume"

    if [ "x$project" = "x" -o "$project" != "member" -a "$project" != "union"  -o "x$architecture" = "x" ]; then
        usage
        exit -1
    fi

    source $work_dir/apollo_${architecture}.cfg

    run_dos2unix

    # check union jdk
    if [ "$UNION" = "$project" ]; then
        if [ -f "$HOME/.bash_profile" ]; then
            source $HOME/.bash_profile
        fi
        if ! type java >/dev/null 2>&1; then
            read -p ">> install jdk [Y/N]" reply
            if [ "$(echo $reply | tr '[:lower:]' '[:upper:]')" = "$YES" ]; then
                gunzip_package
                read -p ">> jdk version, default [8]: [8/17]" jdk_version

                if [ "$jdk_version" = "17" ]; then
                    install_jdk17
                else
                    install_jdk
                fi
                source /etc/profile
                source ~/.bash_profile
            fi
        fi
    fi

    if ! type docker-compose >/dev/null 2>&1; then
        read -p ">> Install docker-compose [Y/N]" reply
        if [ "$(echo $reply | tr '[:lower:]' '[:upper:]')" = "$YES" ]; then
            gunzip_package
            install_docker_compose
        fi
    fi

    if ! type docker >/dev/null 2>&1; then
        read -p ">> install docker [Y/N]" reply
        if [ "$(echo $reply | tr '[:lower:]' '[:upper:]')" = "$YES" ]; then
            read -p ">> Docker Root Dir, default [${DOCKER_ROOT}]: " docker_root_dir
            if [ x"$docker_root_dir" = x ]; then
                docker_root_dir=$DOCKER_ROOT
            fi
            gunzip_package
            install_docker
        fi
    fi

    if [ "$install_rancher_assume" = "$YES" ]; then
        echo ">> install rancher"
        load_rancher_image
        install_rancher
    fi

    echo ">> install software success"
}

load_rancher_image(){
    echo ">> load_rancher_image"
    rancher_image=(
        rancher/server:v1.6.30
        rancher/scheduler:v0.8.6
        rancher/agent:v1.2.11
        rancher/net:v0.13.17
        rancher/dns:v0.17.4
        rancher/healthcheck:v0.3.8
        rancher/metadata:v0.10.4
        rancher/network-manager:v0.7.22
        rancher/net:holder
    )
    for img in ${rancher_image[*]}
    do
        if [ ! "$(docker images -q ${img})" ]; then
            image_file=${img/:/_}
            image_file=${image_file//\//-}
            echo "load ${img} start"
            gunzip -c apollo/rancher-image-${architecture}/${image_file}\.tar.gz | docker load
            echo "load ${img} success"
        else
            echo "${img} loaded"
        fi
    done
}

install_rancher(){
    echo ">> install_rancher"

#    rancher_db_host=${rancher_db_host:-$host}
#    if [ "x$rancher_db_host" = "x" ]; then
#        echo "rancher_db_host not be null"
#        exit -1
#    fi
#    echo "rancher_db_host: $rancher_db_host , rancher_db_port: $rancher_db_port , rancher_db_user: $rancher_db_user"
#    docker run -d --name nvx-rancher --restart=always -p 28080:8080 server:v1.6.30  \
#        --db-host "$rancher_db_host" --db-port $rancher_db_port \
#        --db-user $rancher_db_user --db-pass $rancher_db_pass --db-name $rancher_db_name

    docker run -d --name nvx-rancher-server --restart=always -v $data_path/rancher/mysql:/var/lib/mysql -p 28080:8080 rancher/server:v1.6.30
}

gunzip_package() {
    # gunzip apollo
    if [ ! -d "$work_dir/apollo" ]; then
        echo ">> start gunzip apollo"
        package_file=$(ls |grep apollo_v.*\\.tar$)
        if [ ! "${package_file}" ]; then
            echo "apollo_v*.tar not exist!"
            exit -1
        fi
        array=(${package_file//,/ })
        if [ ${#array[*]} != 1 ]; then
            echo "there are $package_file in work directory, please reserved only one"
            exit -1
        fi
        tar -xf apollo_v*.tar -C $work_dir
    fi

    # gunzip software
    if [ ! -d "$work_dir/apollo/software" ]; then
        echo ">> start gunzip software"
        if [ ! -f "$work_dir/apollo/software.tar.gz" ]; then
            echo "software.tar.gz not exist!"
            exit -1
        fi
        tar -zxf $work_dir/apollo/software.tar.gz -C $work_dir/apollo
    fi
}

run_dos2unix() {
    cd $work_dir
    if  ! type dos2unix >/dev/null 2>&1; then

        gunzip_package

        echo ">> install dos2unix [$(get_system)]"

        if [[ "$(get_system)" == "$CentOS" || "$(get_system)" == "$Redhat"  ]]; then
            echo ">> install dos2unix on centos/redhat"
            sudo rpm -ivh apollo/software/dos2unix/${DOS2UNIX_RPM_FILE}
        elif [ "$(get_system)" == "$Ubuntu" ]; then
            echo ">> install dos2unix on ubuntu"
            # sudo dpkg -i --auto-deconfigure --install libc6_2.35-0ubuntu3.1_amd64.deb
            sudo dpkg -i apollo/software/dos2unix/${DOS2UNIX_DEB_FILE}
        else
            echo "not support system: [$(get_system)]"
            exit -1
        fi
    fi

    #    dos2unix -q $(ls *.sh)

    dos2unix_convert_dir apollo
}

dos2unix_convert_dir(){
    for file in `ls $1`
    do
        if [ -d $1"/"$file ]; then
            dos2unix_convert_dir $1"/"$file
        else
            for x in ${suffix_array[*]}
            do
                # hello.tmp.txt -> tmp.txt    txt
                if [ "${file#*.}" = "$x" -o "${file##*.}" = "$x" ]; then
                    dos2unix -q $1"/"$file
                    break
                fi
            done
        fi
    done
}

get_system() {
    unix_name=`uname  -a`

    #CentOS os check
    FILE_EXE=/etc/redhat-release

    if [[ -f "$FILE_EXE" ]]; then
        redhat_release=`cat /etc/redhat-release`
        if [[ $redhat_release =~ $CentOS ]]; then
            echo $CentOS
        elif [[ $redhat_release =~ "Red" ]];then
            echo $Redhat
        else
            echo $unix_name
        fi
    elif [[ $unix_name =~ $Darwin ]];then
        echo $Darwin
    elif [[ $unix_name =~ $CentOS ]];then
        echo $CentOS
    elif [[ $unix_name =~ $Ubuntu ]];then
        echo $Ubuntu
    else
        echo $unix_name
    fi
}

install_docker() {
    cd $work_dir
    if [ ! -d apollo/tmp ]; then
        echo "mkdir apollo/tmp"
        mkdir -p apollo/tmp
    fi

    if [ "$docker_root_dir" != "$DOCKER_ROOT" ]; then
        echo ">> set docker root dir: ${docker_root_dir}"
        if [ ! -d "${docker_root_dir}" ]; then
            echo "mkdir ${docker_root_dir}"
            mkdir -p ${docker_root_dir}
        fi

        if [ ! -f "/etc/docker/daemon.json" ]; then
            echo ">> create file /etc/docker/daemon.json"

            if [ ! -d "/etc/docker" ]; then
                echo "mkdir /etc/docker"
                sudo mkdir -p /etc/docker
            fi

            sudo cp -n apollo/software/docker/daemon.json /etc/docker/
        fi

        if [ "$(grep \"data-root\" /etc/docker/daemon.json)" ]; then
            sudo sed -i "/data-root/s@:.*\"@: \"${docker_root_dir}\"@g" /etc/docker/daemon.json
        else
            #            sudo sed -i "/}/i ," /etc/docker/daemon.json
            sudo sed -i "$ i ,\"data-root\":\"${docker_root_dir}\"" /etc/docker/daemon.json
        fi
    fi

    group_name=""
    if [[ "$(get_system)" == "$CentOS" || "$(get_system)" == "$Redhat"  ]]; then
        echo ">> install docker on centos/redhat"
        # https://docs.docker.com/engine/install/centos/
        tar -zxf apollo/software/docker/redhat/${DOCKER_RPM_FILE} -C apollo/tmp
        cd apollo/tmp/docker
        sudo rpm -ivh *.rpm --force --nodeps
        sudo systemctl start docker

        group_name="docker"
        sudo usermod -aG docker $USER

        sudo systemctl enable docker --now
    elif [ "$(get_system)" == "$Ubuntu" ]; then
        echo ">> install docker on ubuntu"
        # https://docs.docker.com/engine/install/ubuntu/
        tar -zxf apollo/software/docker/debian/${DOCKER_DEB_FILE} -C apollo/tmp
        cd apollo/tmp/docker
        # containerd.io_1.6.14-1_amd64.deb docker-ce_20.10.22~3-0~ubuntu-focal_amd64.deb docker-ce-cli_20.10.22~3-0~ubuntu-focal_amd64.deb docker-compose-plugin_2.14.1~ubuntu-focal_amd64.deb
        # The Docker daemon starts automatically
        sudo dpkg -i ./containerd.io_*.deb \
          ./docker-ce_*.deb \
          ./docker-ce-cli_*.deb \
          ./docker-compose-plugin_*.deb

        group_name="docker"
        sudo usermod -aG docker $USER

        sudo systemctl enable docker --now
    else
        echo ">> install docker on linux"
        # https://docs.docker.com/engine/install/binaries/
        tar -zxf apollo/software/docker/binaries/${DOCKER_FILE} -C apollo/tmp
        sudo cp apollo/tmp/docker/* /usr/bin/
        sudo cp apollo/software/docker/docker.service /etc/systemd/system/docker.service
        sudo dockerd &
        sudo systemctl enable docker.service
    fi

    echo "remove install temp file"
    rm -rf apollo/tmp

#    if [ ! "$(sudo cat /etc/group | grep docker)" ]; then
#       sudo groupadd docker
#    fi
#    sudo usermod -a -G docker $USER

    if [ -f /var/run/docker.sock ]; then
        sudo chmod 666 /var/run/docker.sock
    fi

    sudo systemctl daemon-reload
    sudo systemctl restart docker
#    sudo systemctl reset-failed docker.service

    cd $work_dir

    if [[ -n "${group_name}" ]]; then
        echo ">> newgrp $group_name"
        LOG_WARN "如果打印这条提示之后,没有继续安装部署,请重复执行您的部署脚本"
        newgrp docker
    fi
}

install_docker_compose() {
    cd $work_dir
    sudo cp apollo/software/docker/${DOCKER_COMPOSE_FILE} /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    cd $work_dir
}

install_jdk() {
    echo ">> install_jdk"
    cd $work_dir

    if [ ! -d "$jdk_home" ]; then
        echo ">> gunzip jdk zip file"
        sudo mkdir -p /opt/java
        if [ "${JDK_FILE#*.}" = "tar.gz" -o  "${JDK_FILE#*.}" = "tgz" ]; then
            sudo tar -zxf apollo/software/${JDK_FILE} -C /opt/java
        else
            sudo tar -xf apollo/software/${JDK_FILE} -C /opt/java
        fi
    fi

    if [ ! -f "$HOME/.bash_profile" ]; then
        echo ">> create file ~/.bash_profile"
        cp apollo/software/.bash_profile $HOME/
    else
        if [ ! "$(cat $HOME/.bash_profile)" ]; then
            echo ">> add new line"
            echo "# .bash_profile" >$HOME/.bash_profile
        fi

        if [ ! "$(grep $jdk_home ~/.bash_profile)" ]; then
            sed -i '1a export JAVA_HOME=/opt/java/jdk1.8.0_351' ~/.bash_profile
        fi

        if [ ! "$(grep 'export PATH' ~/.bash_profile)" ]; then
             sed -i '$a export PATH' ~/.bash_profile
        fi

        if [ ! "$(grep $jdk_env ~/.bash_profile)" ]; then
            if [ "$(grep PATH= ~/.bash_profile)" ]; then
                sed -i '/^PATH=/a PATH=$JAVA_HOME/bin:$PATH' ~/.bash_profile
            else
                sed -i '/^export PATH/i PATH=$JAVA_HOME/bin:$PATH' ~/.bash_profile
            fi
        fi
    fi
}

install_jdk17() {
    echo ">> install_jdk17"
    cd $work_dir

    if [ ! -d "$jdk17_home" ]; then
        echo ">> gunzip jdk zip file"
        sudo mkdir -p /opt/java
        if [ "${JDK17_FILE#*.}" = "tar.gz" -o  "${JDK17_FILE#*.}" = "tgz" ]; then
            sudo tar -zxf apollo/software/${JDK17_FILE} -C /opt/java
        else
            sudo tar -xf apollo/software/${JDK17_FILE} -C /opt/java
        fi
        sudo mv /opt/java/* /opt/java/openjdk
    fi

    if [ ! -f "$HOME/.bash_profile" ]; then
        echo ">> create file ~/.bash_profile"
        cp apollo/software/.bash_profile $HOME/
        sed -i "/jdk1.8.0_351/s@=.*@=$jdk17_home@g" $HOME/.bash_profile
    else
        if [ ! "$(cat $HOME/.bash_profile)" ]; then
            echo ">> add new line"
            echo "# .bash_profile" >$HOME/.bash_profile
        fi

        if [ ! "$(grep $jdk17_home ~/.bash_profile)" ]; then
            sed -i '1a export JAVA_HOME=/opt/java/openjdk' ~/.bash_profile
        fi

        if [ ! "$(grep $jdk_env ~/.bash_profile)" ]; then
             sed -i '/^PATH=/a PATH=$JAVA_HOME/bin:$PATH' ~/.bash_profile
        fi

        if [ ! "$(grep 'export PATH' ~/.bash_profile)" ]; then
             sed -i '$a export PATH' ~/.bash_profile
        fi
    fi
}

if [ $# -lt 1 ]; then
    usage
    exit -1
else
    entry $*
fi