174 lines
6.2 KiB
Bash
Executable File
174 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# $1 Auto updater
|
|
# $2 Disable TUI
|
|
# $3 Init
|
|
|
|
AUTO_UPDATER_ENABLED=${1:-false}
|
|
DISABLE_TUI=${2:-false}
|
|
INIT=${3:-false}
|
|
|
|
SUDO=${CH_SUDO:-sudo}
|
|
|
|
set -e
|
|
|
|
configfile="./scripts/updater-preferences"
|
|
|
|
# Verify that we aren't root
|
|
if [ $(id -u) -eq 0 ]; then
|
|
echo -e "\033[1;33m \n \nThis script mustn't be run as root!\n\033[0m"
|
|
exit 1
|
|
fi
|
|
|
|
LOCKFILE=/tmp/chupdater.lock
|
|
if [ -e ${LOCKFILE} ] && ps -p `cat ${LOCKFILE}` >/dev/null && [ -z "$CH_UPDATER_SELFUPDATE" ]; then
|
|
echo -e "\033[1;33m \n \nUpdater: Updater already running!\n\033[0m"
|
|
exit 1
|
|
fi
|
|
|
|
# make sure the lockfile is removed when we exit and then claim it
|
|
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
|
|
echo $$ > ${LOCKFILE}
|
|
|
|
. ./scripts/config.shlib
|
|
|
|
# If the config file doesn't exist, create it
|
|
if [ ! -e ${configfile} ]; then
|
|
touch ${configfile}
|
|
fi
|
|
|
|
#Check if TUI is available
|
|
tui=true
|
|
dialog=true
|
|
if [ ! -t 0 ]; then
|
|
tui=false
|
|
fi
|
|
if [ "$DISABLE_TUI" == "true" ]; then
|
|
tui=false
|
|
fi
|
|
if [ ! -x "$(command -v dialog)" ] || [ "$tui" == false ]; then
|
|
dialog=false
|
|
fi
|
|
|
|
# Run migrations if not a developer
|
|
exists=true
|
|
cfg_haskey $configfile update_channel || exists=false
|
|
if [ "$exists" == true ]; then
|
|
update_channel="$(cfg_read $configfile update_channel)"
|
|
fi
|
|
if [ "$update_channel" != "developer" ]; then
|
|
./scripts/migrations $tui $INIT true || exit 1
|
|
fi
|
|
|
|
# Ask the user if they want to enable the auto updater
|
|
exists=true
|
|
cfg_haskey $configfile autoupdater || exists=false
|
|
if [ "$dialog" == true ] && [ "$exists" == false ]; then
|
|
value=false
|
|
response=255
|
|
while [ "$response" != 0 ] && [ "$response" != 1 ]; do
|
|
dialog --keep-tite --title "Updater" --yesno "Do you want to enable the cathook auto updater?" 10 25 || { response=$?; continue; }
|
|
response=$?
|
|
done
|
|
if [ "$response" == 0 ]; then
|
|
value=true
|
|
fi
|
|
cfg_write $configfile autoupdater $value
|
|
fi
|
|
|
|
# Send notice about auto updater, terminate script if its not enabled
|
|
exists=true
|
|
cfg_haskey $configfile autoupdater || exists=false
|
|
if [ "$AUTO_UPDATER_ENABLED" == "true" ]; then
|
|
if [ $exists == false ] || [ "$(cfg_read $configfile autoupdater)" == false ]; then
|
|
exit 0;
|
|
fi
|
|
AUTOUPDATER=true
|
|
tui=false
|
|
echo -e "\033[1;34m \n \nAuto Updater: Updating cathook in the background\n\033[0m"
|
|
fi
|
|
|
|
function performupdate() {
|
|
# If init, then update_channel isn't set yet. Assume stable.
|
|
if [ "$INIT" == true ]; then
|
|
update_channel="stable"
|
|
else
|
|
#get update channel from config
|
|
exists=true
|
|
cfg_haskey $configfile update_channel || exists=false
|
|
if [ "$exists" == true ]; then
|
|
update_channel="$(cfg_read $configfile update_channel)"
|
|
else
|
|
update_channel="invalid"
|
|
fi
|
|
fi
|
|
|
|
# Store info about the currently checked out updater script hash
|
|
OLD_UPDATE="$(git rev-parse HEAD:scripts/updater || echo invalid)"
|
|
|
|
if [ "$update_channel" == "stable" ]; then
|
|
git fetch --force --depth 1 origin refs/tags/stable:refs/tags/stable && git reset --hard stable || { echo -e "\033[1;33m\nFailed to pull from github! Trying alternative pull (legacy)\n\033[0m"; git fetch --depth 1 && git reset --hard @{upstream} || { echo -e "\033[1;31m\nFailed to pull from github! A reinstall is recommended. https://cathook.club\n\033[0m"; exit 1; } }
|
|
elif [ "$update_channel" == "master" ]; then
|
|
git fetch --force --depth 1 origin && git reset --hard origin/master || { echo -e "\033[1;33m\nFailed to pull from github! Trying alternative pull (legacy)\n\033[0m"; git fetch --depth 1 && git reset --hard @{upstream} || { echo -e "\033[1;31m\nFailed to pull from github! A reinstall is recommended. https://cathook.club\n\033[0m"; exit 1; } }
|
|
elif [ "$update_channel" == "developer" ]; then
|
|
echo -e "\033[1;33m\nWarning! Running in developer mode! Expect issues!\n\033[0m" && git pull origin --rebase=false || { echo -e "\033[1;31m\n\nFailed to pull from github!\n\033[0m"; exit 1; }
|
|
else
|
|
if [ "$dialog" == true ]; then
|
|
value=true
|
|
dialog --keep-tite --title "Updater" --yesno "Unknown update channel or version. Restore to stable update channel and reset version?" 10 25 || value=false
|
|
if [ "$value" == true ]; then
|
|
# force reinit
|
|
./scripts/migrations $tui true false || exit 1
|
|
fi
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
# Run migrations, idk if it's a good idea to let this execute outside of the reach of the updater script self updater
|
|
if [ "$update_channel" != "developer" ] && [ -e ./scripts/migrations ]; then
|
|
./scripts/migrations $tui $INIT false || exit 1
|
|
fi
|
|
|
|
NEW_UPDATE=$(git rev-parse HEAD:scripts/updater)
|
|
|
|
# Check if the updater script hash has changed. If yes, re-execute yourself (this automates the "double updates" that are sometimes required
|
|
if [ "$OLD_UPDATE" != "$NEW_UPDATE" ]; then
|
|
echo -e "\033[1;33m\nWarning: Update script self update!\n\033[0m"
|
|
CH_UPDATER_SELFUPDATE=1 exec $0 $@
|
|
fi
|
|
|
|
# Check if all required packages are installed
|
|
./scripts/dependencycheck
|
|
|
|
# Submodules
|
|
if [ "$update_channel" == "developer" ]; then
|
|
git submodule update --init --recursive
|
|
else
|
|
git submodule sync > /dev/null
|
|
git submodule update --depth 1 --init --recursive
|
|
fi
|
|
|
|
# Make sure that the auto updater only uses 1 core for compiling
|
|
proccount=$(grep -c '^processor' /proc/cpuinfo)
|
|
if [ "$AUTOUPDATER" == true ]; then
|
|
proccount=1
|
|
fi
|
|
|
|
#Create build folder in case it doesn't exist
|
|
mkdir -p ./build
|
|
# Update cathook
|
|
pushd build && cmake .. && cmake --build . --target cathook -- -j$proccount || { echo -e "\033[1;31m \n \nFailed to compile cathook\n\033[0m"; exit 1; }
|
|
# Update data
|
|
cwd="$(pwd)"
|
|
cmake --build . --target data || { echo -e "\033[1;31m\nFailed to update /opt/cathook/data directory! Trying with root rights!\n\033[0m"; $SUDO bash -c "cd \"$cwd\"; cmake --build . --target data" || { echo -e "\033[1;31m\nFailed to update /opt/cathook/data directory\n\033[0m"; exit 1; } }
|
|
popd
|
|
echo -e "\n\033[1;34mCathook updated successfully\n\033[0m"
|
|
rm -f ${LOCKFILE}
|
|
}
|
|
|
|
if [ $AUTOUPDATER ]; then
|
|
performupdate &
|
|
else
|
|
performupdate
|
|
fi
|