1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
2020-02-28 09:18:13 -07:00

516 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
HYPERGLASS_VERSION="1.0.0b1"
MIN_PYTHON_MAJOR="3"
MIN_PYTHON_MINOR="6"
MIN_NODE_MAJOR="13"
MIN_YARN_MAJOR="1"
MIN_REDIS_MAJOR="4"
APT_INSTALL="apt-get install -y"
APT_UPDATE="apt update"
YUM_INSTALL="yum install -y"
YUM_UPDATE="yum update"
BREW_INSTALL="brew install"
BREW_UPDATE="brew update"
INSTALL_MAP=(["apt"]="$APT_INSTALL" ["yum"]="$YUM_INSTALL" ["brew"]="$BREW_INSTALL")
UPDATE_MAP=(["apt"]="$APT_UPDATE" ["yum"]="$YUM_UPDATE" ["brew"]="$BREW_UPDATE")
INSTALLER=""
NEEDS_UPDATE="0"
NEEDS_PYTHON="1"
NEEDS_NODE="1"
NEEDS_YARN="1"
NEEDS_REDIS="1"
has_cmd () {
which $1 > /dev/null
if [[ $? == 0 ]]; then
echo "0"
else
echo "1"
fi
}
clean_temp () {
echo "Cleaning up temporary files..."
rm -rf /tmp/yarnkey.gpg
rm -rf /tmp/nodesetup.sh
}
catch_interrupt () {
echo "Stopping..."
exit 1
}
semver () {
local ver_raw=$(echo "$1" | egrep -o '\d+\.\d+\.\d+')
local ver_digits=( ${ver_raw//./ } )
echo ${ver_digits[@]}
}
parse_redis_version () {
local one=$(echo "$@" | egrep -o 'v=\d+\.\d+\.\d+')
local two=$(echo $one | egrep -o '\d+\.\d+\.\d+')
echo $two
}
python3_version () {
local ver_digits=($(semver "$(python3 --version)"))
local major="${ver_digits[0]}"
local minor="${ver_digits[1]}"
if [[ $major != $MIN_PYTHON_MAJOR ]]; then
echo "1"
return 1
elif [[ $major == $MIN_PYTHON_MAJOR && $minor -lt $MIN_PYTHON_MINOR ]]; then
echo "1"
return 1
elif [[ $major == $MIN_PYTHON_MAJOR && $minor -ge $MIN_PYTHON_MINOR ]]; then
echo "0"
return 0
else
echo "1"
return 1
fi
}
node_version () {
local ver_digits=($(semver "$(node --version)"))
local major=${ver_digits[0]}
if [[ $major < $MIN_NODE_MAJOR ]]; then
echo "1"
elif [[ $major -ge $MIN_NODE_MAJOR ]]; then
echo "0"
else
echo "1"
fi
}
needs_python () {
local has_python3=$(has_cmd "python3")
if [[ $has_python3 == 1 ]]; then
NEEDS_PYTHON="1"
elif [[ $has_python3 == 0 ]]; then
local needs_upgrade=$(python3_version)
if [[ $needs_upgrade == 1 ]]; then
NEEDS_PYTHON="1"
elif [[ $needs_upgrade == 0 ]]; then
NEEDS_PYTHON="0"
else
NEEDS_PYTHON="1"
fi
else
NEEDS_PYTHON="1"
fi
}
needs_node () {
local has_node=$(has_cmd node)
if [[ $has_node == 1 ]]; then
NEEDS_NODE="1"
elif [[ $has_node == 0 ]]; then
local needs_upgrade=$(node_version)
if [[ $needs_upgrade == 1 ]]; then
NEEDS_NODE="1"
elif [[ $needs_upgrade == 0 ]]; then
NEEDS_NODE="0"
else
NEEDS_NODE="1"
fi
else
NEEDS_NODE="1"
fi
}
needs_yarn () {
local has_yarn=$(has_cmd yarn)
if [[ $has_yarn == 1 ]]; then
NEEDS_YARN="1"
elif [[ $has_yarn == 0 ]]; then
NEEDS_YARN="0"
else
NEEDS_YARN="1"
fi
}
needs_redis () {
local has_redis=$(has_cmd redis-server)
if [[ $has_redis == 1 ]]; then
NEEDS_REDIS="1"
elif [[ $has_redis == 0 ]]; then
NEEDS_REDIS="0"
else
NEEDS_REDIS="1"
fi
}
get_platform () {
local use_apt=$(has_cmd apt-get)
local use_yum=$(has_cmd yum)
local use_brew=$(has_cmd brew)
if [[ $use_apt == 0 ]]; then
INSTALLER="apt"
elif [[ $use_yum == 0 ]]; then
INSTALLER="yum"
elif [[ $use_brew == 0 ]]; then
INSTALLER="brew"
else
echo "[ERROR] Unable to identify this system's package manager"
exit 1
fi
}
python_post () {
if [[ $1 == 0 ]]; then
local successful=$(needs_python)
if [[ $successful == 0 ]]; then
echo "[SUCCESS] Installed $(python --version)"
else
echo "[ERROR] Tried to install Python 3, but post-install check failed."
fi
else
echo '[ERROR] Tried to install Python 3, but encountered an error. Consult the Python 3 installation instructions for your system.'
fi
}
node_post () {
if [[ $1 == 0 ]]; then
local successful=$(needs_node)
if [[ $successful == 0 ]]; then
echo "[SUCCESS] Installed NodeJS $(node --version | egrep -o '\d+\.\d+\.\d+')"
else
echo "[ERROR] Tried to install NodeJS, but post-install check failed."
fi
else
echo '[ERROR] Tried to install NodeJS, but encountered an error.'
fi
}
yarn_post () {
if [[ $1 == 0 ]]; then
local successful=$(needs_yarn)
if [[ $successful == 0 ]]; then
echo "[SUCCESS] Installed Yarn $(yarn --version | egrep -o '\d+\.\d+\.\d+')"
else
echo "[ERROR] Tried to install Yarn, but post-install check failed."
fi
else
echo '[ERROR] Tried to install Yarn, but encountered an error.'
fi
}
redis_post () {
if [[ $1 == 0 ]]; then
local successful=$(needs_redis)
if [[ $successful == 0 ]]; then
echo "[SUCCESS] Installed Redis $(parse_redis_version $(redis-server --version))"
else
echo "[ERROR] Tried to install Redis, but post-install check failed."
fi
else
echo '[ERROR] Tried to install Redis, but encountered an error.'
fi
}
node_apt_prepare () {
curl -sL https://deb.nodesource.com/setup_13.x -o /tmp/nodesetup.sh
sleep 1
bash /tmp/nodesetup.sh
NEEDS_UPDATE="1"
}
yarn_apt_prepare () {
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg -o /tmp/yarnkey.gpg
sleep 1
apt-key add /tmp/yarnkey.gpg
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
NEEDS_UPDATE="1"
}
node_yum_prepare () {
curl -sL https://rpm.nodesource.com/setup_13.x -o /tmp/nodesetup.sh
bash /tmp/nodesetup.sh
sleep 1
NEEDS_UPDATE="1"
}
yarn_yum_prepare () {
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
sleep 1
NEEDS_UPDATE="1"
}
node_apt () {
apt-get install -y nodejs
sleep 1
node_post $?
}
node_yum () {
yum -y install gcc-c++ make nodejs
sleep 1
node_post $?
}
node_brew () {
brew install node
sleep 1
node_post $?
}
yarn_apt () {
apt-get install -y yarn
sleep 1
yarn_post $?
}
yarn_yum () {
yum -y install gcc-c++ make yarn
sleep 1
yarn_post $?
}
yarn_brew () {
brew install yarn
sleep 1
yarn_post $?
}
python_apt () {
apt-get install -y python3.6-dev python3-pip > /dev/null
sleep 1
# curl -sSL http://mirrors.kernel.org/ubuntu/pool/main/p/python3.6/python3.6_3.6.9-1~18.04_amd64.deb -o /tmp/python3.deb
# curl -sSL http://mirrors.kernel.org/ubuntu/pool/universe/p/python-pip/python3-pip_9.0.1-2_all.deb -o /tmp/pip3.deb
# apt-get install -y /tmp/python3.deb
# apt-get install -y /tmp/pip3.deb
# source $HOME/.profile
python_post $?
}
python_yum () {
yum install centos-release-scl
yum install rh-python36
sleep 1
python_post $?
}
python_brew () {
brew install python3
sleep 1
python_post $?
}
redis_apt () {
apt-get install -y redis-server
sleep 1
redis_post $?
}
redis_yum () {
yum -y install redis
sleep 1
redis_post $?
}
redis_brew () {
brew install redis
sleep 1
redis_post $?
}
update_repo () {
if [[ $INSTALLER == "apt" ]]; then
apt-get update
elif [[ $INSTALLER == "yum" ]]; then
yum update
elif [[ $INSTALLER == "brew" ]]; then
brew update
fi
}
install_python () {
if [[ $NEEDS_PYTHON == "1" ]]; then
echo "[INFO] Installing Python..."
if [[ $INSTALLER == "apt" ]]; then
python_apt
elif [[ $INSTALLER == "yum" ]]; then
python_yum
elif [[ $INSTALLER == "brew" ]]; then
python_brew
fi
elif [[ $NEEDS_PYTHON == "0" ]]; then
echo "[INFO] Your system is running $(python3 --version) (Minimum is $MIN_PYTHON_MAJOR.$MIN_PYTHON_MINOR+)."
else
echo "[ERROR] Unable to determine if your system needs Python."
exit 1
fi
}
install_node () {
if [[ $NEEDS_NODE == "1" ]]; then
echo "[INFO] Installing NodeJS..."
if [[ $INSTALLER == "apt" ]]; then
node_apt
elif [[ $INSTALLER == "yum" ]]; then
node_yum
elif [[ $INSTALLER == "brew" ]]; then
node_brew
fi
elif [[ $NEEDS_NODE == "0" ]]; then
echo "[INFO] Your system is running NodeJS $(node --version) (Minimum is $MIN_NODE_MAJOR+)."
else
echo "[ERROR] Unable to determine if your system needs NodeJS."
exit 1
fi
}
install_yarn () {
if [[ $NEEDS_YARN == "1" ]]; then
echo "[INFO] Installing Yarn..."
if [[ $INSTALLER == "apt" ]]; then
yarn_apt
elif [[ $INSTALLER == "yum" ]]; then
yarn_yum
elif [[ $INSTALLER == "brew" ]]; then
yarn_brew
fi
elif [[ $NEEDS_YARN == "0" ]]; then
echo "[INFO] Your system is running Yarn $(yarn --version) (Minimum is $MIN_YARN_MAJOR+)."
else
echo "[ERROR] Unable to determine if your system needs Yarn."
exit 1
fi
}
install_redis () {
if [[ $NEEDS_REDIS == "1" ]]; then
echo "[INFO] Installing Redis..."
if [[ $INSTALLER == "apt" ]]; then
redis_apt
elif [[ $INSTALLER == "yum" ]]; then
redis_yum
elif [[ $INSTALLER == "brew" ]]; then
redis_brew
fi
elif [[ $NEEDS_REDIS == "0" ]]; then
echo "[INFO] Your system is running Redis $(parse_redis_version $(redis-server --version)) (Minimum is $MIN_REDIS_MAJOR+)."
else
echo "[ERROR] Unable to determine if your system needs Redis."
exit 1
fi
}
install_app () {
echo "[INFO] Installing hyperglass..."
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -o /tmp/get-poetry.py
python3 /tmp/get-poetry.py -f -y > /dev/null
sleep 1
source $HOME/.profile
[ -d "/tmp/hyperglass" ] && rm -rf /tmp/hyperglass
[ -d "/tmp/build" ] && rm -rf /tmp/build
git clone --branch v1.0.0 --depth 1 https://github.com/checktheroads/hyperglass.git /tmp/hyperglass
cd /tmp/hyperglass
poetry build
mkdir /tmp/build
local build_tarball="/tmp/hyperglass/dist/hyperglass-$HYPERGLASS_VERSION.tar.gz"
local build_dir="/tmp/build/hyperglass-$HYPERGLASS_VERSION"
tar -xvf $build_tarball -C /tmp/build
cd $build_dir
pip3 install . > /dev/null
if [[ ! $? == 0 ]]; then
echo "[ERROR] An error occurred while trying to install hyperglass."
exit 1
else
source $HOME/.profile
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
local successful=$(has_cmd "hyperglass")
if [[ $successful == 0 ]]; then
echo "[SUCCESS] Installed hyperglass."
else
echo "[ERROR] hyperglass installation succeeded, but the hyperglass command was not found."
exit 1
fi
fi
rm -rf /tmp/build
}
trap catch_interrupt SIGINT
while true; do
PID=$!
if (($EUID != 0)); then
echo 'hyperglass installer must be run with root privileges. Try running with `sudo`'
exit 1
fi
get_platform
needs_python
needs_node
needs_yarn
needs_redis
if [[ $NEEDS_YARN == "1" && $INSTALLER == "apt" ]]; then
yarn_apt_prepare
elif [[ $NEEDS_YARN == "1" && $INSTALLER == "yum" ]]; then
yarn_yum_prepare
fi
if [[ $NEEDS_NODE == "1" && $INSTALLER == "apt" ]]; then
node_apt_prepare
elif [[ $NEEDS_NODE == "1" && $INSTALLER == "yum" ]]; then
node_yum_prepare
fi
if [[ $NEEDS_UPDATE == "1" ]]; then
update_repo
fi
install_python
install_node
install_yarn
install_redis
if [[ $? == 0 ]]; then
clean_temp
echo "[SUCCESS] Finished installed dependencies."
else
clean_temp
echo "[ERROR] An error occurred while attempting to install dependencies."
exit 1
fi
install_app
echo 'hyperglass installation was successful! You can now run `hyperglass --help` to see available commands.'
exit 0
done