aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2020-03-11 22:23:55 +0100
committercbdev <cb@cbcdn.com>2020-03-11 22:23:55 +0100
commit9ec65119e11941d81a641f6387cdb542b4e8070e (patch)
treedc34000416450f5984d7dcdbbca0e9a0fcd9f0d6
parentabb1ffd367f4046d77ac62b0b017b407997bc43b (diff)
downloadmidimonster-9ec65119e11941d81a641f6387cdb542b4e8070e.tar.gz
midimonster-9ec65119e11941d81a641f6387cdb542b4e8070e.tar.bz2
midimonster-9ec65119e11941d81a641f6387cdb542b4e8070e.zip
Refactor installer
-rw-r--r--.travis-ci.sh8
-rwxr-xr-xinstaller.sh356
2 files changed, 160 insertions, 204 deletions
diff --git a/.travis-ci.sh b/.travis-ci.sh
index 763e558..3b7d7f5 100644
--- a/.travis-ci.sh
+++ b/.travis-ci.sh
@@ -3,10 +3,10 @@
if [ "$TASK" = "spellcheck" ]; then
result=0
# Create list of files to be spellchecked
- spellcheck_files=$(find -type f | grep -v ".git/")
+ spellcheck_files=$(find . -type f | grep -v ".git/")
# Run spellintian to find spelling errors
- sl_results=$(spellintian $spellcheck_files 2>&1)
+ sl_results=$(xargs spellintian 2>&1 <<< "$spellcheck_files")
sl_errors=$(wc -l <<< "$sl_results")
sl_errors_dups=$((grep "\(duplicate word\)" | wc -l) <<< "$sl_results")
@@ -21,7 +21,7 @@ if [ "$TASK" = "spellcheck" ]; then
fi
# Run codespell to find some more
- cs_results=$(codespell --check-hidden --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" $spellcheck_files 2>&1)
+ cs_results=$(xargs codespell --quiet 2 --regex "[a-zA-Z0-9][\\-'a-zA-Z0-9]+[a-zA-Z0-9]" <<< "$spellcheck_files" 2>&1)
cs_errors=$(wc -l <<< "$cs_results")
if [ "$cs_errors" -ne 0 ]; then
printf "Codespell found %s errors:\n\n" "$cs_errors"
@@ -100,7 +100,7 @@ else
cp ./backends/*.md ./deployment/docs/
cp -r ./configs ./deployment/
cd ./deployment
- tar czf "midimonster-$(git describe)-$TRAVIS_OS_NAME.tgz" *
+ tar czf "midimonster-$(git describe)-$TRAVIS_OS_NAME.tgz" ./
find . ! -iname '*.tgz' -delete
travis_fold end "deploy_unix"
fi
diff --git a/installer.sh b/installer.sh
index f8fad18..b2ca958 100755
--- a/installer.sh
+++ b/installer.sh
@@ -1,16 +1,30 @@
#!/bin/bash
################################################ SETUP ################################################
-deps=(libasound2-dev libevdev-dev liblua5.3-dev libjack-jackd2-dev pkg-config libssl-dev gcc make wget git)
-user=$(whoami) # for bypassing user check replace "$(whoami)" with "root".
-
-tmp_path=$(mktemp -d) # Repo download path
-updater_dir=/etc/midimonster-updater # Updater download + config path
-updater_file=$updater_dir/updater.conf
-
-latest_version=$(curl --silent "https://api.github.com/repos/cbdevnet/midimonster/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
-
-makeargs=all # Build args
+deps=(
+ libasound2-dev
+ libevdev-dev
+ liblua5.3-dev
+ libjack-jackd2-dev
+ pkg-config
+ libssl-dev
+ python3-dev
+ gcc
+ make
+ wget
+ git
+)
+# Replace this with 'root' to bypass the user check
+user="$(whoami)"
+# Temporary directory used for repository clone
+tmp_path="$(mktemp -d)"
+# Installer/updater install directory
+updater_dir="/etc/midimonster-updater"
+
+latest_version="$(curl --silent "https://api.github.com/repos/cbdevnet/midimonster/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')"
+
+# make invocation arguments
+makeargs="all"
normal=$(tput sgr0)
dim=$(tput dim)
@@ -20,66 +34,56 @@ c_red=$(tput setaf 1)
c_green=$(tput setaf 2)
c_mag=$(tput setaf 5)
-VAR_DESTDIR="" # Unused
-VAR_PREFIX="/usr"
-VAR_PLUGINS="$VAR_PREFIX/lib/midimonster" # Reassigned in func. ARGS to update "$VAR_PREFIX" when an argument is set.
-VAR_DEFAULT_CFG="/etc/midimonster/midimonster.cfg"
-VAR_EXAMPLE_CFGS="$VAR_PREFIX/share/midimonster" # Reassigned in func. ARGS to update "$VAR_PREFIX" when an argument is set.
-
-
-################################################ SETUP ################################################
+DEFAULT_PREFIX="/usr"
+DEFAULT_PLUGINPATH="/lib/midimonster"
+DEFAULT_CFGPATH="/etc/midimonster/midimonster.cfg"
+DEFAULT_EXAMPLES="/share/midimonster"
############################################## FUNCTIONS ##############################################
+assign_defaults(){
+ VAR_PREFIX="${VAR_PREFIX:-$DEFAULT_PREFIX}"
+ VAR_PLUGINS="${VAR_PLUGINS:-$VAR_PREFIX$DEFAULT_PLUGINPATH}"
+ VAR_DEFAULT_CFG="${VAR_DEFAULT_CFG:-$DEFAULT_CFGPATH}"
+ VAR_EXAMPLE_CFGS="${VAR_EXAMPLE_CFGS:-$VAR_PREFIX$DEFAULT_EXAMPLES}"
+}
-ARGS () {
- for i in "$@"
- do
+ARGS(){
+ for i in "$@"; do
case $i in
--prefix=*)
VAR_PREFIX="${i#*=}"
- VAR_PREFIX_I="1"
- VAR_PLUGINS="$VAR_PREFIX/lib/midimonster"
- VAR_EXAMPLE_CFGS="$VAR_PREFIX/share/midimonster"
- VAR_EXAMPLE_CFGS="$VAR_PREFIX/share/midimonster"
;;
--plugins=*)
VAR_PLUGINS="${i#*=}"
- VAR_PLUGINS_I="1"
;;
--defcfg=*)
VAR_DEFAULT_CFG="${i#*=}"
- VAR_DEFAULT_CFG_I="1"
;;
--examples=*)
VAR_EXAMPLE_CFGS="${i#*=}"
- VAR_EXAMPLE_CFGS_I="1"
;;
--dev)
NIGHTLY=1
- NIGHTLY_I="1"
;;
-d|--default)
- VAR_PREFIX_I="1"
- VAR_PLUGINS_I="1"
- VAR_DEFAULT_CFG_I="1"
- VAR_EXAMPLE_CFGS_I="1"
- NIGHTLY_I="1"
- NIGHTLY=1
+ assign_defaults
;;
-fu|--forceupdate)
UPDATER_FORCE="1"
- ;;
- -h|--help|*) # Help messages
+ ;;
+ -h|--help|*)
+ assign_defaults
printf "${bold}Usage:${normal} ${0} ${c_green}[OPTIONS]${normal}"
- printf "\n ${c_green}--prefix${normal} ${c_red}<path>${normal} Sets the prefix ${c_mag}Default:${normal} ${dim}%s ${normal}" "$VAR_PREFIX"
- printf "\n ${c_green}--plugins${normal} ${c_red}<path>${normal} Sets the plugin path ${c_mag}Default:${normal} ${dim}%s ${normal}" "$VAR_PLUGINS"
- printf "\n ${c_green}--defcfg${normal} ${c_red}<path>${normal} Sets the config path ${c_mag}Default:${normal} ${dim}%s ${normal}" "$VAR_DEFAULT_CFG"
- printf "\n ${c_green}--examples${normal} ${c_red}<path>${normal} Sets the example configs path ${c_mag}Default:${normal} ${dim}%s ${normal}\n" "$VAR_EXAMPLE_CFGS"
- printf "\n ${c_green}--dev${normal} Install nightly version"
- printf "\n ${c_green}-d, --default${normal} Use default values to install"
- printf "\n ${c_green}-fu, --forceupdate${normal} Force the updater to update without a version check"
- printf "\n ${c_green}-h, --help${normal} Show this message"
- printf "\n ${uline}${bold}${c_mag}Each argument can be overwritten by another, the last one is used!${normal}\n"
+ printf "\n\t${c_green}--prefix${normal} ${c_red}<path>${normal}\t\tSet the installation prefix\t\t${c_mag}Default:${normal} ${dim}%s${normal}" "$VAR_PREFIX"
+ printf "\n\t${c_green}--plugins${normal} ${c_red}<path>${normal}\tSet the plugin install path\t\t${c_mag}Default:${normal} ${dim}%s${normal}" "$VAR_PLUGINS"
+ printf "\n\t${c_green}--defcfg${normal} ${c_red}<path>${normal}\t\tSet the default configuration path\t${c_mag}Default:${normal} ${dim}%s${normal}" "$VAR_DEFAULT_CFG"
+ printf "\n\t${c_green}--examples${normal} ${c_red}<path>${normal}\tSet the path for example configurations\t${c_mag}Default:${normal} ${dim}%s${normal}\n" "$VAR_EXAMPLE_CFGS"
+ printf "\n\t${c_green}--dev${normal}\t\t\tInstall nightly version"
+ printf "\n\t${c_green}-d, --default${normal}\t\tUse default values to install"
+ printf "\n\t${c_green}-h, --help${normal}\t\tShow this message"
+ printf "\n\t${c_green}-fu, --forceupdate${normal}\tForce the updater to update without a version check"
+ printf "\n\t${uline}${bold}${c_mag}Each argument can be overwritten by another, the last one is used!${normal}\n"
+ rmdir "$tmp_path"
exit 1
;;
esac
@@ -87,21 +91,49 @@ ARGS () {
done
}
-INSTALL-DEPS () { # Install deps from array "$deps"
- for t in ${deps[@]}; do
- if [ $(dpkg-query -W -f='${Status}' $t 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
- printf "Installing %s\n" "$t"
- apt-get install $t;
- printf "Done.\n";
- else
- printf "%s already installed!\n" "$t"
- fi
+# Install unmatched dependencies
+install_dependencies(){
+ for dependency in ${deps[@]}; do
+ if [ "$(dpkg-query -W -f='${Status}' "$dependency" 2>/dev/null | grep -c "ok installed")" -eq 0 ]; then
+ printf "Installing %s\n" "$dependency"
+ apt-get install $dependency
+ else
+ printf "%s already installed!\n" "$dependency"
+ fi
done
printf "\n"
}
-NIGHTLY_CHECK () { # Asks for nightly version
- if [ -z "$NIGHTLY_I" ]; then
+ask_questions(){
+ printf "${bold}If you don't know what you're doing, just hit enter a few times.${normal}\n\n"
+ if [ -z "$VAR_PREFIX" ]; then
+ read -e -i "$DEFAULT_PREFIX" -p "PREFIX (Install root directory): " input
+ VAR_PREFIX="${input:-$VAR_PREFIX}"
+ fi
+
+ if [ -z "$VAR_PLUGINS" ]; then
+ read -e -i "$VAR_PREFIX$DEFAULT_PLUGINPATH" -p "PLUGINS (Plugin directory): " input
+ VAR_PLUGINS="${input:-$VAR_PLUGINS}"
+ fi
+
+ if [ -z "$VAR_DEFAULT_CFG" ]; then
+ read -e -i "$DEFAULT_CFGPATH" -p "Default config path: " input
+ VAR_DEFAULT_CFG="${input:-$VAR_DEFAULT_CFG}"
+ fi
+
+ if [ -z "$VAR_EXAMPLE_CFGS" ]; then
+ read -e -i "$VAR_PREFIX$DEFAULT_EXAMPLES" -p "Example config directory: " input
+ VAR_EXAMPLE_CFGS="${input:-$VAR_EXAMPLE_CFGS}"
+ fi
+}
+
+# Clone the repository and select the correct version
+prepare_repo(){
+ printf "Cloning the repository\n"
+ git clone "https://github.com/cbdevnet/midimonster.git" "$tmp_path"
+
+ # If not set via argument, ask whether to install development build
+ if [ -z "$NIGHTLY" ]; then
read -p "Do you want to install the latest development version? (y/n)? " magic
case "$magic" in
y|Y)
@@ -119,182 +151,106 @@ NIGHTLY_CHECK () { # Asks for nightly version
esac
fi
- # Roll back to last tag if we're not on a nightly build
+ # Roll back to last tag if a stable version was requested
if [ "$NIGHTLY" != 1 ]; then
cd "$tmp_path"
printf "Finding latest stable version...\n"
- Iversion=$(git describe --abbrev=0)
- printf "Starting Git checkout to %s...\n" "$Iversion"
- git checkout -f -q $Iversion
+ last_tag=$(git describe --abbrev=0)
+ printf "Checking out %s...\n" "$last_tag"
+ git checkout -f -q $last_tag
fi
}
-INSTALL-PREP () {
- (
- printf "Starting download...\n"
- git clone https://github.com/cbdevnet/midimonster.git "$tmp_path" # Gets Midimonster
- printf "\nInitializing repository...\n"
- cd $tmp_path
- git init $tmp_path
- printf "\n"
- )
- NIGHTLY_CHECK
- printf "Preparation done.\n\n"
- printf "${bold}If you don't know what you're doing, just hit enter a few times.${normal}\n\n"
- if [ -z "$VAR_PREFIX_I" ]; then
- read -e -i "$VAR_PREFIX" -p "PREFIX (Install root directory): " input # Reads VAR_PREFIX then update containing vars
- VAR_PREFIX="${input:-$VAR_PREFIX}"
- VAR_PLUGINS="$VAR_PREFIX/lib/midimonster" # Update prefix-containing variables.
- VAR_EXAMPLE_CFGS="$VAR_PREFIX/share/midimonster" # Update prefix-containing variables.
- fi
+# Build and install the software
+build(){
+ # Export variables for make
+ export PREFIX="$VAR_PREFIX"
+ export PLUGINS="$VAR_PLUGINS"
+ export DEFAULT_CFG="$VAR_DEFAULT_CFG"
+ export EXAMPLES="$VAR_EXAMPLE_CFGS"
- if [ -z "$VAR_PLUGINS_I" ]; then
- read -e -i "$VAR_PLUGINS" -p "PLUGINS (Plugin directory): " input # Reads VAR_PLUGINS
- VAR_PLUGINS="${input:-$VAR_PLUGINS}"
- fi
-
- if [ -z "$VAR_DEFAULT_CFG_I" ]; then
- read -e -i "$VAR_DEFAULT_CFG" -p "Default config path: " input # Reads VAR_DEFAULT_CFG
- VAR_DEFAULT_CFG="${input:-$VAR_DEFAULT_CFG}"
- fi
-
- if [ -z "$VAR_EXAMPLE_CFGS_I" ]; then
- read -e -i "$VAR_EXAMPLE_CFGS" -p "Example config directory: " input # Reads VAR_EXAMPLE_CFGS
- VAR_EXAMPLE_CFGS="${input:-$VAR_EXAMPLE_CFGS}"
- fi
-
- UPDATER_SAVE
-
- export PREFIX=$VAR_PREFIX
- export PLUGINS=$VAR_PLUGINS
- export DEFAULT_CFG=$VAR_DEFAULT_CFG
- export DESTDIR=$VAR_DESTDIR
- export EXAMPLES=$VAR_EXAMPLE_CFGS
-}
-
-UPDATER-PREP () {
- (
- printf "Starting download...\n"
- git clone https://github.com/cbdevnet/midimonster.git "$tmp_path" # Gets Midimonster
- printf "\nInitializing repository...\n"
- cd $tmp_path
- git init $tmp_path
- )
- NIGHTLY_CHECK
- printf "Preparation done.\n\n"
- rm -rf "$VAR_PLUGINS/"
-
- UPDATER_SAVE
-
- export PREFIX=$VAR_PREFIX
- export PLUGINS=$VAR_PLUGINS
- export DEFAULT_CFG=$VAR_DEFAULT_CFG
- export DESTDIR=$VAR_DESTDIR
- export EXAMPLES=$VAR_EXAMPLE_CFGS
-}
-
-UPDATER () {
- installed_version="$(midimonster --version)"
- #installed_version="MIDIMonster v0.3-40-gafed325" # FOR TESTING ONLY!
- if [[ "$installed_version" =~ "$latest_version" ]]; then
- printf "Newest Version is already installed! ${bold}($installed_version)${normal}\n\n"
- ERROR
- else
- printf "The installed Version ${bold}´$installed_version´${normal} equals not the newest stable version ${bold}´$latest_version´${normal} (Maybe you are running a development(NIGHTLY) version?)\n\n"
- fi
-
- UPDATER-PREP
- INSTALL-RUN
- DONE
-}
-
-INSTALL-RUN () { # Build
cd "$tmp_path"
make clean
- make $makeargs
+ make "$makeargs"
make install
}
-UPDATER_SAVE () { # Saves file for the auto updater in this script
+# Save data for the updater
+save_config(){
rm -rf $updater_dir
- printf "Saving updater to %s/updater.sh\n" "$update_dir"
+ printf "Copying updater to %s/updater.sh\n" "$updater_dir"
mkdir -p "$updater_dir"
- wget https://raw.githubusercontent.com/cbdevnet/midimonster/master/installer.sh -O $updater_dir/updater.sh
- printf "Creating symlink to updater in /usr/bin/midimonster-updater\n"
+ cp "$0" "$updater_dir/updater.sh"
+ printf "Creating symlin /usr/bin/midimonster-updater\n"
ln -s "$updater_dir/updater.sh" "/usr/bin/midimonster-updater"
chmod +x "$updater_dir/updater.sh"
- printf "Exporting updater config to %s\n" "$updater_file"
- printf "VAR_PREFIX=%s\nVAR_PLUGINS=%s\nVAR_DEFAULT_CFG=%s\nVAR_DESTDIR=%s\nVAR_EXAMPLE_CFGS=%s\n" "$VAR_PREFIX" "$VAR_PLUGINS" "$VAR_DEFAULT_CFG" "$VAR_DESTDIR" "$VAR_EXAMPLE_CFGS" > $updater_file
+ printf "Exporting updater config\n"
+ printf "VAR_PREFIX=%s\nVAR_PLUGINS=%s\nVAR_DEFAULT_CFG=%s\nVAR_DESTDIR=%s\nVAR_EXAMPLE_CFGS=%s\n" "$VAR_PREFIX" "$VAR_PLUGINS" "$VAR_DEFAULT_CFG" "$VAR_DESTDIR" "$VAR_EXAMPLE_CFGS" > "$updater_dir/updater.conf"
}
-ERROR () {
- printf "\nAborting...\n"
- CLEAN
- printf "Exiting...\n"
+error_handler(){
+ printf "\nAborting\n"
exit 1
}
-DONE () {
- printf "\nDone.\n"
- CLEAN
- exit 0
-}
-
-CLEAN () {
- printf "\nCleaning...\n"
- rm -rf $tmp_path
+cleanup() {
+ if [ -d "$tmp_path" ]; then
+ printf "Cleaning up temporary files...\n"
+ rm -rf "$tmp_path"
+ fi
}
-############################################## FUNCTIONS ##############################################
-
-
################################################ Main #################################################
-trap ERROR SIGINT SIGTERM SIGKILL
-ARGS "$@" # Parse arguments
+trap error_handler SIGINT SIGTERM
+trap cleanup EXIT
+
+# Parse arguments
+ARGS "$@"
clear
-# Check if $user = root!
+# Check whether we have the privileges to install stuff
if [ "$user" != "root" ]; then
- printf "Installer must be run as root\n"
- ERROR
+ printf "The installer requires root privileges to install the midimonster system-wide\n"
+ exit 1
fi
-if [ $(wget -q --spider http://github.com) $? -eq 1 ]; then
- printf "You need a connection to the internet\n"
- ERROR
+# Check if we can download the sources
+if [ "$(wget -q --spider http://github.com)" ]; then
+ printf "The installer requires internet connectivity to download the midimonster sources\n"
+ exit 1
fi
-# Forceupdate # Now only with default config because source imports all and overwrites the args.. [WIP!]
-if [ "$UPDATER_FORCE" = "1" ]; then
- printf "Forcing the updater to start...\n\n"
- if [ -f $updater_file ]; then
- . $updater_file
- ARGS "$@" # Parse arguments again to compensate overwrite from source /\
- printf "Successfully imported settings from %s\n" "$updater_file"
+# Check whether the updater needs to run
+if [ -f "$updater_dir/updater.conf" ] || [ "$UPDATER_FORCE" = "1" ]; then
+ if [ -f "$updater_dir/updater.conf" ]; then
+ . "$updater_dir/updater.conf"
+ # Parse arguments again to compensate overwrite from source
+ ARGS "$@"
+ printf "Imported settings from %s/updater.conf\n" "$updater_dir"
fi
- UPDATER-PREP
- INSTALL-RUN
- DONE
-fi
-
-# Check if updater config file exist and import it (overwrites default values!)
-if [ -f $updater_file ]; then
- printf "Starting updater...\n\n"
- . $updater_file
- ARGS "$@" # Parse arguments again to compensate overwrite from source /\
- printf "Successfully imported settings from %s\n" "$updater_file"
-
- # Check if binary $VAR_PREFIX/bin/midimonster exist. If yes start updater else skip.
- if [ -x "$VAR_PREFIX/bin/midimonster" ]; then
- UPDATER
- else
- printf "MIDIMonster binary not found, skipping updater.\nYou can force an update with --forceupdate\n"
+ if [ -n "$UPDATER_FORCE" ]; then
+ printf "Forcing the updater to start...\n\n"
+ elif [ -x "$VAR_PREFIX/bin/midimonster" ]; then
+ installed_version="$(midimonster --version)"
+ if [[ "$installed_version" =~ "$latest_version" ]]; then
+ printf "The installed version ${bold}$installed_version${normal} seems to be up to date\nDoing nothing\n\n"
+ exit 0
+ else
+ printf "The installed version ${bold}$installed_version${normal} does not match the latest version ${bold}$latest_version${normal}\nMaybe you are running a development version?\n\n"
+ fi
fi
+
+ # Run updater steps
+ prepare_repo
+ build
+else
+ # Run installer steps
+ install_dependencies
+ prepare_repo
+ ask_questions
+ save_config
+ build
fi
+exit 0
-#Normal install
-INSTALL-DEPS
-INSTALL-PREP
-INSTALL-RUN
-DONE