the script is now split up in parts that will be fetched from github on demand. fixes #4047
272 lines
5.1 KiB
Bash
272 lines
5.1 KiB
Bash
#!/usr/bin/env bash
|
|
# to be included by install.sh
|
|
|
|
|
|
#### ####
|
|
# #
|
|
# FUNCTIONS, etc. #
|
|
# #
|
|
#### ####
|
|
|
|
|
|
# heredoc for variables - very readable, http://stackoverflow.com/a/8088167
|
|
# use like this:
|
|
# define VAR <<'EOF'
|
|
# somecontent
|
|
# EOF
|
|
define(){ IFS='\n' read -r -d '' ${1}; }
|
|
|
|
|
|
# add padding to the left of a given string to
|
|
# fill to a given amount of characters with a
|
|
# given char or space
|
|
# example:
|
|
# lpad 7 "test" "-"
|
|
lpad() {
|
|
LEN=$1
|
|
TXT=$2
|
|
CHR=$3
|
|
PAD=""
|
|
|
|
L_PAD=$(($LEN - ${#TXT}))
|
|
if [ $L_PAD -ne 0 ] ; then
|
|
PAD=$(printf "%*s" ${L_PAD} " ")
|
|
fi
|
|
if [ ${#CHR} -ne 0 ] ; then
|
|
PAD=$(printf "$PAD" | tr " " "$CHR")
|
|
fi
|
|
PAD="${PAD}${TXT}"
|
|
|
|
printf "%s" "$PAD"
|
|
}
|
|
|
|
|
|
# log function
|
|
# prints a given message with the given log level to STDOUT
|
|
logf() {
|
|
MSG=$1
|
|
LVL=$2
|
|
L_LEN=7
|
|
|
|
if [ ${#LVL} -ne 0 ] ; then
|
|
LVL="[$(lpad $(($L_LEN-2)) $LVL " ")]"
|
|
else
|
|
LVL=$(lpad $L_LEN "" "-")
|
|
fi
|
|
|
|
printf "%s -- %s\\n" "$LVL" "$MSG"
|
|
}
|
|
|
|
# short functions for various log levels
|
|
log_err() {
|
|
logf "$1" "error"
|
|
}
|
|
|
|
log_wrn() {
|
|
logf "$1" "warn"
|
|
}
|
|
|
|
log_dbg() {
|
|
logf "$1" "debug"
|
|
}
|
|
|
|
log_inf() {
|
|
logf "$1" "info"
|
|
}
|
|
|
|
|
|
# run a command or print the error
|
|
run_or_error() {
|
|
eval "$1"
|
|
if [ $? -ne 0 ]; then
|
|
error "executing '$1' failed."
|
|
fi
|
|
}
|
|
|
|
# nicely output error messages and quit
|
|
error() {
|
|
log_err "$1"
|
|
logf "have a look at our wiki: $D_WIKI_URL"
|
|
logf "or join us on IRC: $D_IRC_URL"
|
|
exit 1
|
|
}
|
|
|
|
|
|
# check for functions
|
|
fn_exists() {
|
|
type -t $1 | grep -q 'function'
|
|
}
|
|
|
|
|
|
# shell interactive or not
|
|
interactive_check() {
|
|
fd=0 #stdin
|
|
if [[ -t "$fd" || -p /dev/stdin ]]; then
|
|
# all is well
|
|
printf "\n"
|
|
else
|
|
# non-interactive
|
|
TMPFILE=`mktemp`
|
|
curl -s -o "$TMPFILE" "$D_INSTALL_SCRIPT_URL"
|
|
chmod +x "$TMPFILE"
|
|
exec 0< /dev/tty
|
|
bash -i "$TMPFILE"
|
|
rm "$TMPFILE"
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
|
|
# check if this script is run as root
|
|
root_check() {
|
|
if [ `id -u` -eq 0 ] ; then
|
|
error "don't run this script as root!"
|
|
fi
|
|
}
|
|
|
|
|
|
# check if all necessary binaries are available
|
|
binaries_check() {
|
|
for exe in "${!BINARIES[@]}"; do
|
|
LOG_MSG="checking for $exe... "
|
|
log_inf "$LOG_MSG"
|
|
|
|
EXE_PATH=$(which "${BINARIES[$exe]}")
|
|
if [ $? -ne 0 ]; then
|
|
error "you are missing the '${BINARIES[$exe]}' command, please install '$exe'";
|
|
else
|
|
printf "$ONE_UP"
|
|
log_inf "$LOG_MSG found"
|
|
fi
|
|
done
|
|
printf "\n"
|
|
}
|
|
|
|
|
|
# check for rvm
|
|
rvm_check() {
|
|
LOG_MSG="checking for rvm... "
|
|
log_inf "$LOG_MSG"
|
|
|
|
fn_exists rvm
|
|
if [ $? -eq 0 ] ; then
|
|
RVM_DETECTED=true
|
|
|
|
# seems we don't have it loaded, try to do so
|
|
elif [ -s "$HOME/.rvm/scripts/rvm" ] ; then
|
|
source "$HOME/.rvm/scripts/rvm" >/dev/null 2>&1
|
|
RVM_DETECTED=true
|
|
elif [ -s "/usr/local/rvm/scripts/rvm" ] ; then
|
|
source "/usr/local/rvm/scripts/rvm" >/dev/null 2>&1
|
|
RVM_DETECTED=true
|
|
fi
|
|
|
|
if $RVM_DETECTED ; then
|
|
printf "$ONE_UP"
|
|
log_inf "$LOG_MSG found"
|
|
else
|
|
log_wrn "not found"
|
|
logf "$RVM_MSG"
|
|
read -p "Press [Enter] to continue without RVM or abort this script and install RVM..."
|
|
fi
|
|
printf "\n"
|
|
}
|
|
|
|
|
|
# prepare ruby with rvm
|
|
install_or_use_ruby() {
|
|
if ! $RVM_DETECTED ; then
|
|
return
|
|
fi
|
|
|
|
# make sure we have the correct ruby version available
|
|
LOG_MSG="checking your ruby version... "
|
|
log_inf "$LOG_MSG"
|
|
|
|
rvm use $D_RUBY_VERSION >/dev/null 2>&1
|
|
if [ $? -ne 0 ] ; then
|
|
log_wrn "not ok"
|
|
rvm --force install $D_RUBY_VERSION
|
|
else
|
|
printf "$ONE_UP"
|
|
log_inf "$LOG_MSG ok"
|
|
fi
|
|
|
|
printf "\n"
|
|
}
|
|
|
|
|
|
# trust and load rvmrc
|
|
# do this in a directory that has a .rvmrc, only :)
|
|
load_rvmrc() {
|
|
if ! $RVM_DETECTED || [[ ! -s ".rvmrc" ]] ; then
|
|
return
|
|
fi
|
|
|
|
# trust rvmrc
|
|
rvm rvmrc is_trusted
|
|
if [ $? -ne 0 ] ; then
|
|
rvm rvmrc trust
|
|
fi
|
|
|
|
# load .rvmrc
|
|
LOG_MSG="loading .rvmrc ... "
|
|
log_inf "$LOG_MSG"
|
|
|
|
. ".rvmrc"
|
|
#rvm rvmrc load
|
|
if [ $? -eq 0 ] ; then
|
|
printf "$ONE_UP"
|
|
log_inf "$LOG_MSG ok"
|
|
else
|
|
log_wrn "not ok"
|
|
fi
|
|
printf "\n"
|
|
}
|
|
|
|
|
|
# rvm doesn't need sudo, otherwise we do have to use it :(
|
|
rvm_or_sudo() {
|
|
if $RVM_DETECTED ; then
|
|
run_or_error "$1"
|
|
else
|
|
eval "$1"
|
|
if [ $? -ne 0 ] ; then
|
|
log_wrn "running '$1' didn't succeed, trying again with sudo..."
|
|
run_or_error "sudo $1"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
# we need a valid js runtime...
|
|
js_runtime_check() {
|
|
LOG_MSG="checking for a JavaScript runtime... "
|
|
log_inf "$LOG_MSG"
|
|
|
|
# Node.js
|
|
which node >/dev/null 2>&1
|
|
if [ $? -eq 0 ] ; then
|
|
JS_RUNTIME_DETECTED=true
|
|
fi
|
|
|
|
# TheRubyRacer
|
|
(printf "require 'v8'" | ruby) >/dev/null 2>&1
|
|
if [ $? -eq 0 ] ; then
|
|
JS_RUNTIME_DETECTED=true
|
|
fi
|
|
|
|
##
|
|
# add a check for your favourite js runtime here...
|
|
##
|
|
|
|
if $JS_RUNTIME_DETECTED ; then
|
|
printf "$ONE_UP"
|
|
log_inf "$LOG_MSG found"
|
|
else
|
|
log_err "not ok"
|
|
printf "$JS_RT_MSG"
|
|
error "can't continue without a JS runtime"
|
|
fi
|
|
printf "\n"
|
|
}
|