blob: 20b994225d51c64e1cfebde78e9b8bc01186c41b [file] [log] [blame]
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
# Usage:
# curl ... | ENV_VAR=... sh -
# or
# ENV_VAR=... ./install.sh
#
# Example:
# Directory to installing StreamPipes binary (needs sudo)
# curl ... | INSTALL_SP_BIN_DIR="/usr/local/bin" sh -
#
# Environment variables:
#
# - INSTALL_SP_BIN_DIR
# Directory to install StreamPipes binary
# default: /usr/local/bin
GIT_CLI_URL=https://github.com/streampipes/streampipes-cli/tarball/master
#TODO: change SP_BACKEND_VERSION based on Maven Version in gitlab-ci.yml
#SP_BACKEND_VERSION=0.60.0
DEBUG=false
if [ "$1" = "--debug" ]; then
DEBUG=true
fi
# --- helper functions for logs ---
info(){
echo "[INFO]\t" "$@"
}
debug() {
if $DEBUG; then
echo "[DEBUG]\t" "$@"
fi
}
warning() {
echo "[WARN]\t" "$@"
}
fatal(){
echo "[ERROR]\t" "$@"
exit 1
}
install_notice() {
echo
echo
echo " StreamPipes CE will now be installed on your system"
echo
echo
}
uninstall_notice() {
echo
echo
echo " To uninstall StreamPipes CE run the following command:"
echo
echo " Linux:"
echo " \$ sudo sp-uninstall "
echo
echo " Mac:"
echo " \$ sp-uninstall "
echo
}
# --- helper functions ---
semverParseDocker() {
major_docker="${1%%.*}"
minor_docker="${1#$major_docker.}"
minor_docker="${minor_docker%%.*}"
patch_docker="${1#$major_docker.$minor_docker.}"
patch_docker="${patch_docker%%[-.]*}"
}
semverParseDockerCompose() {
major_docker_compose="${1%%.*}"
minor_docker_compose="${1#$major_docker_compose.}"
minor_docker_compose="${minor_docker_compose%%.*}"
}
command_exists() {
command -v "$@" > /dev/null 2>&1
}
check_and_add_to_path() {
SP_HOME=$1
debug "Add SP_HOME to PATH"
case ":${PATH:=$SP_HOME}:" in
*:$SP_HOME:*)
debug "SP_HOME found in PATH"
;;
*)
s=$(echo $SHELL)
currShell=${s##*/}
case $currShell in
"bash")
debug "Detected shell: $currShell"
if [ $2 = "user-only" ] ; then
debug "Check if SP_HOME exists in $HOME/.bashrc"
if grep -q SP_HOME "$HOME/.bashrc"; then
# found
info "[SKIPPED] SP_HOME already set"
else
# not found
info "Add SP_HOME to $HOME/.bashrc"
echo "export SP_HOME=$SP_HOME" >> $HOME/.bashrc
echo 'export PATH=$PATH:$SP_HOME' >> $HOME/.bashrc
fi
elif [ $2 = "system-wide" ]; then
debug "Check if SP_HOME exists in /etc/profile.d/streampipes-env.sh"
if [ -f "/etc/profile.d/streampipes-env.sh" ]; then
# found
info "[SKIPPED] SP_HOME already set"
else
# not found
info "Add SP_HOME to /etc/profile.d/streampipes-env.sh"
tee /etc/profile.d/streampipes-env.sh >/dev/null << EOF
#!/bin/sh
SP_HOME="$SP_HOME"
if [ -d "\$SP_HOME" ] ; then
PATH="\$SP_HOME:\$PATH"
fi
EOF
chmod 755 /etc/profile.d/streampipes-env.sh
fi
else
warning "SP_HOME not set for $currShell. Set manually"
fi
;;
"zsh")
debug "Detected shell: $currShell"
if [ $2 == "user-only" ]; then
debug "Check if SP_HOME exists in $HOME/.zshrc"
if grep -q SP_HOME "$HOME/.zshrc"; then
# found
info "[SKIPPED] SP_HOME already set"
else
# not found
info "Add SP_HOME to $HOME/.zshrc"
echo "export SP_HOME=$SP_HOME" >> $HOME/.zshrc
echo 'export PATH=$PATH:$SP_HOME' >> $HOME/.zshrc
fi
elif [ $2 == "system-wide" ]; then
debug "Check if SP_HOME exists in /etc/zsh/zshenv"
if grep -q SP_HOME "/etc/zsh/zshenv"; then
# found
info "[SKIPPED] SP_HOME already set"
else
# not found
info "Add SP_HOME to /etc/zsh/zshenv"
echo "export SP_HOME=$SP_HOME" >> /etc/zsh/zshenv
echo 'export PATH=$PATH:$SP_HOME' >> /etc/zsh/zshenv
fi
else
warning "SP_HOME not set for $currShell. Set manually"
fi
;;
*)
warning "Could not detect shell environment. Manually export SP_HOME=$SP_HOME and add to PATH"
;;
esac
;;
esac
}
# --- functions ---
setup_env() {
if [ $OS_TYPE = "Linux" ]; then
SP_HOME="/opt/streampipes"
if [ ! -d $SP_HOME ]; then
info "Create and set StreamPipes Home (SP_HOME): $SP_HOME"
$SUDO mkdir -p $SP_HOME
check_and_add_to_path $SP_HOME system-wide
else
info "[SKIPPED] StreamPipes Home already exists"
check_and_add_to_path $SP_HOME system-wide
fi
elif [ $OS_TYPE = "Mac" ]; then
SP_HOME="$HOME/streampipes"
if [ ! -d $SP_HOME ]; then
info "Create and set StreamPipes Home (SP_HOME): $SP_HOME"
mkdir -p $SP_HOME
check_and_add_to_path $SP_HOME user-only
else
info "[SKIPPED] StreamPipes Home already exists"
check_and_add_to_path $SP_HOME user-only
fi
fi
# --- use binary install directory if defined or create default ---
if [ -n "${INSTALL_SP_BIN_DIR}" ]; then
BIN_DIR="${INSTALL_SP_BIN_DIR}"
else
BIN_DIR="/usr/local/bin"
fi
UNINSTALL_SP_SH=sp-uninstall
# --- use sudo if we are not already root ---
SUDO=sudo
if [ `id -u` = 0 ]; then
SUDO=
fi
}
# --- fatal if no curl ---
verify_curl() {
info "Verifying curl"
if [ -z `which curl || true` ]; then
fatal "Cannot find curl for downloading files"
fi
}
# --- fatal if architecture not supported ---
verify_arch() {
info "Verifying system architecture"
ARCH=`uname -m`
case $ARCH in
amd64)
ARCH=amd64
SUFFIX=
debug "Supported architecture detected: $ARCH"
;;
x86_64)
ARCH=amd64
SUFFIX=
debug "Supported architecture detected: $ARCH"
;;
*)
fatal "Unsupported architecture: $ARCH"
esac
}
# --- fatal if OS not supported ---
verify_os() {
info "Verifying OS"
OS_TYPE="$(uname -s)"
case $OS_TYPE in
Linux*)
OS_TYPE=Linux
debug "Supported OS detected: $OS_TYPE"
;;
Darwin*)
OS_TYPE=Mac
debug "Supported OS detected: $OS_TYPE"
;;
*)
fatal "Unsupported O: $OS_TYPE"
esac
}
# --- fatal if Docker/Docker Compose not installed or version mismatch ---
verify_docker() {
info "Verifying Docker and Docker Compose"
if command_exists docker && command_exists docker-compose; then
docker_version=`docker -v | cut -d ' ' -f3 | cut -d ',' -f1`
docker_compose_version=`docker-compose -v | cut -d ' ' -f3 | cut -d ',' -f1`
MAJOR_W_DOCKER=1
MINOR_W_DOCKER=10
MAJOR_W_DOCKER_COMPOSE=1
MINOR_W_DOCKER_COMPOSE=8
semverParseDocker "$docker_version"
semverParseDockerCompose "$docker_compose_version"
shouldWarnDocker=0
if [ "$major_docker" -lt "$MAJOR_W_DOCKER" ]; then
shouldWarnDocker=1
fi
if [ "$major_docker" -le "$MAJOR_W_DOCKER" ] && [ "$minor_docker" -lt "$MINOR_W_DOCKER" ]; then
shouldWarnDocker=1
fi
shouldWarnDockerCompose=0
if [ "$major_docker_compose" -lt "$MAJOR_W_DOCKER_COMPOSE" ]; then
shouldWarnDockerCompose=1
fi
if [ "$major_docker_compose" -le "$MAJOR_W_DOCKER_COMPOSE" ] && [ "$minor_docker_compose" -lt "$MINOR_W_DOCKER_COMPOSE" ]; then
shouldWarnDockerCompose=1
fi
if [ $shouldWarnDocker -eq 1 ]; then
fatal "Docker version $docker_version detected which is not compatible. Supported Docker version from $MAJOR_W_DOCKER.$MINOR_W_DOCKER.0+"
fi
if [ $shouldWarnDockerCompose -eq 1 ]; then
fatal "Docker Compose version $docker_compose_version detected which is not compatible. Supported Docker Compose version from $MAJOR_W_DOCKER_COMPOSE.$MINOR_W_DOCKER_COMPOSE.0+"
fi
debug "Installed Docker version: $docker_version"
debug "Installed Docker Compose version: $docker_compose_version"
else
fatal "Cannot find Docker and/or Docker Compose. Please make sure Docker and Docker Compose are installed and configured properly"
fi
}
download_and_configure() {
CLI_DIR=$SP_HOME/streampipes-cli
if [ ! -d $CLI_DIR ]; then
info "Create directory for StreamPipes CLI in SP_HOME"
mkdir $CLI_DIR
fi
if [ ! "$(ls -A $CLI_DIR)" ]; then
# SP_HOME empty
info "Downloading StreamPipes CLI to SP_HOME"
curl -sSfL ${GIT_CLI_URL} | tar -xzf - -C $CLI_DIR --strip-components=1 || fatal "Error while downloading StreamPipes CLI project"
info "Copy StreamPipes CLI binary to ${BIN_DIR}/sp"
cp $CLI_DIR/sp $BIN_DIR
else
info "[SKIPPED] StreamPipes CLI already exists"
fi
}
# --- create uninstall script ---
create_uninstall() {
info "Creating StreamPipes uninstall script in ${BIN_DIR}/${UNINSTALL_SP_SH}"
tee ${BIN_DIR}/${UNINSTALL_SP_SH} >/dev/null << EOF
#!/bin/sh
# --- helper functions for logs ---
info(){
echo "[INFO]\t" "\$@"
}
fatal(){
echo "[ERROR]\t" "\$@"
exit 1
}
s=$(echo \$SHELL)
currShell=\${s##*/}
case \$currShell in
"zsh")
if [ -f \$HOME/.zshrc ]; then
info "Removing SP_HOME from \$HOME/.zshrc"
sed -i.bak '/SP_HOME/d' \$HOME/.zshrc
rm \$HOME/.zshrc.bak
elif [ -f /etc/zsh/zshenv ]; then
info "Removing SP_HOME from /etc/zsh/zshenv"
sed -i.bak '/SP_HOME/d' /etc/zsh/zshenv
rm /etc/zsh/zshenv.bak
fi
;;
"bash")
if [ -f \$HOME/.bashrc ]; then
info "Removing SP_HOME from \$HOME/.bashrc"
sed -i.bak '/SP_HOME/d' \$HOME/.bashrc
rm \$HOME/.bashrc
elif [ -f /etc/profile.d/streampipes-env.sh ]; then
info "Deleting /etc/profile.d/streampipes-env.sh"
rm /etc/profile.d/streampipes-env.sh
fi
;;
*)
fatal "Could not unset SP_HOME from \$currShell"
esac
info "Deleting StreamPipes Home directory ${SP_HOME}"
rm -rf ${SP_HOME}
info "Deleting StreamPipes CLI ${BIN_DIR}/sp"
rm -f ${BIN_DIR}/sp
info "Deleting StreamPipes uninstall script ${BIN_DIR}/${UNINSTALL_SP_SH}"
rm -rf ${BIN_DIR}/${UNINSTALL_SP_SH}
EOF
#$SUDO chmod 755 ${SP_HOME}/${UNINSTALL_SP_SH}
#$SUDO chown root:root ${SP_HOME}/${UNINSTALL_SP_SH}
chmod 755 ${BIN_DIR}/${UNINSTALL_SP_SH}
chown $USER:$USER ${BIN_DIR}/${UNINSTALL_SP_SH}
}
# --- start StreamPipes CLI script ---
start_cli() {
info "Starting StreamPipes CLI"
if command_exists sp; then
sp start
else
fatal "Could not find StreamPipes CLI binary"
fi
}
# --- run install process ---
do_install () {
install_notice
verify_curl
verify_arch
verify_os
verify_docker
setup_env
download_and_configure
create_uninstall
uninstall_notice
start_cli
}
do_install