|
| 1 | +#!/bin/bash |
| 2 | +# Description: This script is used to install hyper cli and hyperd |
| 3 | +# Usage: |
| 4 | +# install from remote |
| 5 | +# wget -qO- https://cli.hyper.sh/install | bash |
| 6 | +# curl -sSL https://cli.hyper.sh/install | bash |
| 7 | +# install from local |
| 8 | +# ./bootstrap.sh |
| 9 | +WORK_DIR=$(pwd) |
| 10 | +BASE_DIR=$(cd "$(dirname "$0")"; pwd); cd ${BASE_DIR} |
| 11 | +SLEEP_SEC=10 |
| 12 | +set -e |
| 13 | +########## Variable ########## |
| 14 | +CURRENT_USER=$(id -un 2>/dev/null || true) |
| 15 | +BOOTSTRAP_DIR="/tmp/hypercli-pkg-${CURRENT_USER}" |
| 16 | +BASH_C="bash -c" |
| 17 | +########## Parameter ########## |
| 18 | +S3_URL="http://hyper-install.s3.amazonaws.com" |
| 19 | +PKG_FILE_LINUX="hyper-1.10-x86_64.tar.gz" |
| 20 | +PKG_FILE_MACOSX="hyper-1.10-mac.bin.zip" |
| 21 | +SUPPORT_EMAIL="support@hyper.sh" |
| 22 | +#Color Constant |
| 23 | +RED=`tput setaf 1` |
| 24 | +GREEN=`tput setaf 2` |
| 25 | +YELLOW=`tput setaf 3` |
| 26 | +BLUE=`tput setaf 4` |
| 27 | +WHITE=`tput setaf 7` |
| 28 | +LIGHT=`tput bold ` |
| 29 | +RESET=`tput sgr0` |
| 30 | +#Error Message |
| 31 | +ERR_NOT_SUPPORT_OS=(10 "Sorry, hypercli support Linux and MacOSX only!") |
| 32 | +ERR_FETCH_PKG_FAILED=(20 "Fetch hypercli package failed, please retry!") |
| 33 | +ERR_PKG_MD5_ERROR=(30 "Checksum of install package error, please retry!") |
| 34 | +ERR_UNKNOWN=99 |
| 35 | +########## Helper Function Definition ########## |
| 36 | +display_support() { |
| 37 | + echo "Sorry, we are suffering from some technical issue($1), please contact ${SUPPORT_EMAIL}" |
| 38 | + if [ $# -eq 0 ];then exit ${ERR_UNKNOWN} |
| 39 | + else exit $1 |
| 40 | + fi |
| 41 | +} |
| 42 | +command_exist() { |
| 43 | + type "$@" > /dev/null 2>&1 |
| 44 | +} |
| 45 | +get_curl() { |
| 46 | + CURL_C=""; USE_WGET="false" |
| 47 | + if (command_exist curl);then |
| 48 | + CURL_C='curl -# -SL -o ' |
| 49 | + elif (command_exist wget);then |
| 50 | + USE_WGET="true" |
| 51 | + CURL_C='wget -O ' |
| 52 | + fi |
| 53 | + echo "${USE_WGET}|${CURL_C}" |
| 54 | +} |
| 55 | +show_message() { |
| 56 | + case "$1" in |
| 57 | + debug) echo -e "\n[${BLUE}DEBUG${RESET}] : $2";; |
| 58 | + info) echo -e -n "\n${WHITE}$2${RESET}" ;; |
| 59 | + warn) echo -e "\n[${YELLOW}WARN${RESET}] : $2" ;; |
| 60 | + done|success) echo -e "${LIGHT}${GREEN}$2${RESET}" ;; |
| 61 | + error|failed) echo -e "\n[${RED}ERROR${RESET}] : $2" ;; |
| 62 | + esac |
| 63 | +} |
| 64 | +########## Main Function Definition ########## |
| 65 | +main() { |
| 66 | + check_os_type |
| 67 | + fetch_hypercli |
| 68 | + extract_hypercli |
| 69 | + exit 0 |
| 70 | +} |
| 71 | +check_os_type() { |
| 72 | + OS_TYPE=$(uname -a | awk '{print $1}') |
| 73 | + case "${OS_TYPE}" in |
| 74 | + Linux) PKG_FILE="${PKG_FILE_LINUX}";; |
| 75 | + Darwin) PKG_FILE="${PKG_FILE_MACOSX}";; |
| 76 | + *) show_message error "${ERR_NOT_SUPPORT_OS[1]}" && exit "${ERR_NOT_SUPPORT_OS[0]}" |
| 77 | + ;; |
| 78 | + esac |
| 79 | +} |
| 80 | +fetch_hypercli() { |
| 81 | + show_message info "Fetch checksum and package...\n" |
| 82 | + set +e |
| 83 | + ${BASH_C} "ping -c 3 -W 2 hyper-install.s3.amazonaws.com >/dev/null 2>&1" |
| 84 | + if [ $? -ne 0 ];then |
| 85 | + S3_URL="http://mirror-hyper-install.s3.amazonaws.com" |
| 86 | + else |
| 87 | + S3_URL="http://hyper-install.s3.amazonaws.com" |
| 88 | + fi |
| 89 | + local SRC_URL="${S3_URL}/${PKG_FILE}" |
| 90 | + local TGT_FILE="${BOOTSTRAP_DIR}/${PKG_FILE}" |
| 91 | + local USE_WGET=$(echo $(get_curl) | awk -F"|" '{print $1}') |
| 92 | + local CURL_C=$(echo $(get_curl) | awk -F"|" '{print $2}') |
| 93 | + show_message info "${SRC_URL} => ${TGT_FILE}\n" |
| 94 | + mkdir -p ${BOOTSTRAP_DIR} && cd ${BOOTSTRAP_DIR} |
| 95 | + if [ -s ${TGT_FILE} ];then |
| 96 | + if [ "${USE_WGET}" == "true" ];then |
| 97 | + ${CURL_C} ${SRC_URL}.md5 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk '{printf("\b\b\b\b%4s", $2)}' |
| 98 | + else |
| 99 | + ${CURL_C} ${TGT_FILE}.md5 ${SRC_URL}.md5 |
| 100 | + fi |
| 101 | + if [ -s "${TGT_FILE}.md5" ];then |
| 102 | + case "${OS_TYPE}" in |
| 103 | + Linux) |
| 104 | + NEW_MD5=$(cat ${TGT_FILE}.md5 | awk '{print $1}') |
| 105 | + OLD_MD5=$(md5sum ${TGT_FILE} | awk '{print $1}') |
| 106 | + ;; |
| 107 | + Darwin) |
| 108 | + NEW_MD5=$(cat ${TGT_FILE}.md5 | awk '{print $NF}') |
| 109 | + OLD_MD5=$(md5 ${TGT_FILE} | awk '{print $NF}') |
| 110 | + ;; |
| 111 | + esac |
| 112 | + if [[ ! -z ${OLD_MD5} ]] && [[ ! -z ${NEW_MD5} ]] && [[ "${OLD_MD5}" != "${NEW_MD5}" ]];then |
| 113 | + show_message info "${LIGHT}Found new hypercli version, will download it now!\n" |
| 114 | + ${BASH_C} "\rm -rf ${BOOTSTRAP_DIR}/*" |
| 115 | + elif [[ ! -z ${OLD_MD5} ]] && [[ "${OLD_MD5}" == "${NEW_MD5}" ]];then #no update |
| 116 | + echo -n |
| 117 | + else |
| 118 | + ${BASH_C} "\rm -rf ${BOOTSTRAP_DIR}/*" |
| 119 | + fi |
| 120 | + fi |
| 121 | + elif [ -f ${TGT_FILE} ];then |
| 122 | + ${BASH_C} "\rm -rf ${BOOTSTRAP_DIR}/*" |
| 123 | + fi |
| 124 | + if [ ! -f ${TGT_FILE} ];then |
| 125 | + \rm -rf ${TGT_FILE}.md5 >/dev/null 2>&1 |
| 126 | + if [ "${USE_WGET}" == "true" ];then |
| 127 | + ${CURL_C} ${SRC_URL}.md5 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk '{printf("\b\b\b\b%4s", $2)}' |
| 128 | + ${CURL_C} ${SRC_URL} 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk '{printf("\b\b\b\b%4s", $2)}' |
| 129 | + else |
| 130 | + ${CURL_C} ${TGT_FILE}.md5 ${SRC_URL}.md5 |
| 131 | + ${CURL_C} ${TGT_FILE} ${SRC_URL} |
| 132 | + fi |
| 133 | + if [ $? -ne 0 ];then |
| 134 | + show_message error "${ERR_FETCH_PKG_FAILED[1]}" && exit "${ERR_FETCH_PKG_FAILED[0]}" |
| 135 | + else |
| 136 | + case "${OS_TYPE}" in |
| 137 | + Linux) MD5_REMOTE=$(cat ${TGT_FILE}.md5 | awk '{print $1}') |
| 138 | + MD5_LOCAL=$(md5sum ${TGT_FILE} | awk '{print $1}') |
| 139 | + ;; |
| 140 | + Darwin) MD5_REMOTE=$(cat ${TGT_FILE}.md5 | awk '{print $NF}') |
| 141 | + MD5_LOCAL=$(md5 ${TGT_FILE} | awk '{print $NF}') |
| 142 | + ;; |
| 143 | + esac |
| 144 | + if [ ${MD5_REMOTE} != ${MD5_LOCAL} ];then |
| 145 | + echo "required checksum: ${MD5_REMOTE}, but downloaded package is ${MD5_LOCAL}" |
| 146 | + show_message error "${ERR_PKG_MD5_ERROR[1]}" && exit "${ERR_PKG_MD5_ERROR[0]}" |
| 147 | + fi |
| 148 | + fi |
| 149 | + fi |
| 150 | + set -e |
| 151 | +} |
| 152 | +extract_hypercli() { |
| 153 | + case "${OS_TYPE}" in |
| 154 | + Linux) PKG_FILE="${PKG_FILE_LINUX}" |
| 155 | + ${BASH_C} "tar xzf ${BOOTSTRAP_DIR}/${PKG_FILE} -C ${WORK_DIR}" |
| 156 | + ;; |
| 157 | + Darwin) PKG_FILE="${PKG_FILE_MACOSX}" |
| 158 | + ${BASH_C} "unzip -o ${BOOTSTRAP_DIR}/${PKG_FILE} -d ${WORK_DIR}" |
| 159 | + ;; |
| 160 | + *) show_message error "${ERR_NOT_SUPPORT_OS[1]}" && exit "${ERR_NOT_SUPPORT_OS[0]}" |
| 161 | + ;; |
| 162 | + esac |
| 163 | + chmod +x ${WORK_DIR}/hyper |
| 164 | + cat <<EOF |
| 165 | +hypercli '${WORK_DIR}/hyper' is ready |
| 166 | +
|
| 167 | +QuickStart: |
| 168 | + ./hyper --help |
| 169 | + ./hyper config |
| 170 | + ./hyper pull ubuntu |
| 171 | + ./hyper images |
| 172 | + ./hyper run --name hello -it ubuntu echo hello world |
| 173 | + ./hyper ps -l |
| 174 | +
|
| 175 | +For more information, please go to https://docs.hyper.sh |
| 176 | +EOF |
| 177 | +} |
| 178 | + |
| 179 | +################# |
| 180 | +main |
0 commit comments