diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba7230e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +test.sh +binaries \ No newline at end of file diff --git a/README.md b/README.md index ac7a87d..19548bb 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,76 @@ # Helium Bowser installer & updater ## Purpose -This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source like AppImages, binaries, etc... +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... It's supposed to run in user space and is (Linux) distro independent I suppose. + +With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... +## Usage +### Help +```sh +./helium_helper.sh -h +``` +--- +### First Install +To initally install Helium browser via this script, download `helium_helper.sh` and make it executable: +```sh +wget https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh && chmod +x helium_helper.sh +``` +Run script with install parameter _-i_ +- Default install directory = `$HOME/.apps/Helium` +```sh +./helium_helper.sh -i +``` + +**OPTIONAL** : Add alias to `.shellrc` | _working in zsh, bash & fish_ +- Default alias = `update-helium` +```sh +./helium_helper.sh -a +``` + +--- +### Updating +**From launcher** (if added during install or by running `./helium_helper.sh -l`) + +Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files and configuration and write a log. + +**Terminal** + +Updating can also be done by running: +- Update Helium Browser +```sh +./helium_helper.sh -u +``` +- Update Helium Helper +```sh +./helium_helper.sh -S +``` +--- +### Backing up +Backing up, by default, pulls all important files, folders & configuration and compresses an archive, which is stored in `$HOME/.apps/Helium/assets` +- Default backup +```sh +./helium_helper.sh -b +``` +- Backup to custom path +```sh +./helium_helper.sh -b +``` +**NOTE:** The backup path specified won't be overridden within the script yet. Working on it... + +**Since this script is interactive, it doesn't keep logs.** ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script -- Installs to `/home//.apps/Helium` | changeable in line 28 `INSTALL_PATH` +- Installs to `$HOME/.apps/Helium` | changeable in line 32 `INSTALL_PATH` - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 28 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 32 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update -- Adds desktop launcher to `/home//.local/share/applications` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` +- Adds desktop launcher to `$HOME/.local/share/applications` - Adds options to launcher which are run by `helium_launcher_updater.sh` - Update Helium - Update Script @@ -24,13 +80,14 @@ This script was initially designed to just update my Helium browser but over tim ### Helium_Launcher_Update.sh - Update Helium from launcher - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 19 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 21 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Loggs to `/home//.apps/Helium/assets/logs` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update -- Run `helium_launcher_update.sh -h` for help \ No newline at end of file +- Loggs to `$HOME/.apps/Helium/assets/logs` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` +- Run `helium_launcher_update.sh -h` for help +  \ No newline at end of file diff --git a/assets/workflow/merge.yml b/assets/workflow/merge.yml new file mode 100644 index 0000000..4289a64 --- /dev/null +++ b/assets/workflow/merge.yml @@ -0,0 +1,3 @@ +on: + pull_requests: + pull_request_target: \ No newline at end of file diff --git a/todo.md b/devdoc.md similarity index 74% rename from todo.md rename to devdoc.md index e7d063a..7a6784c 100644 --- a/todo.md +++ b/devdoc.md @@ -6,6 +6,7 @@ - Launcher has an update option now - Launcher installer refined - Clean Up +--- - Script updater - Remote script check simplified - Remover function extended @@ -18,16 +19,39 @@ - Show log option added - Variables universalized - Wiki created +--- +- sed command fixed in remover +- ARCH variable added +- APP_SOURCE variable changed +- BRANCH variable added +- FILE_EXTENSION variable added +- Readme updated +- Documentation/Wiki updated +--- +- Shell detection added +- Alias support for fish added +- Removal process refined and adapted to fish +- Browser config backup +--- +- Arch detection working +- Clean Up +- Copy Paste mistake fixed +- Backup process rewritten + - Custom backup method to pass as argument + - Custom backup path to pass as argument + - Default if left blank +- Removal process adjusted +- $1 verifier added +- Readme updated +--- +- Notification adjusted for KDE & GNOME + ## Add/To Do -- Architecture detection -- Set alias --> Partially - - shell recognition missing - Roll back from backup -- Config check -- Simplification & Clean Up - Update Readme - Make functional launcher optional +- Variable transfer script ## Repo - Merge workflow diff --git a/helium_helper.sh b/helium_helper.sh index c7c90f1..881985b 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -1,7 +1,5 @@ #!/bin/bash - # Helium BOWSER INSTALL & UPDATE SCRIPT ---> INTERACTIVE - ########## PREREQUISITES ########### set -e @@ -11,21 +9,29 @@ YEL="\e[0;33m" RED="\e[0;31m" GRN="\e[0;32m" LCY="\e[1;36m" +WHT="\e[1;37m" CRS="\e[0m" ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -SOURCE="GitHub" +FILE_EXTENSION="AppImage" +APP_SOURCE="GitHub" +ARCH_OVERRIDE="" +BACKUP_METHOD="full" +BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.6" -ALIAS="update-helium" +SCRIPT_VERSION="0.5.9.1" +ALIAS="helium-helper" +DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME -INSTALL_PATH=$HOME/.apps/$APP_NAME +INSTALL_PATH=$HOME/.apps/$APP_NAME\1 +APP_CONFIG_FOLDER="net.imput.helium" +APP_CONFIG_PATH=$HOME/.config/$APP_CONFIG_FOLDER ASSET_PATH=$INSTALL_PATH/assets BACKUP_PATH=$ASSET_PATH/backup LOG_PATH=$ASSET_PATH/logs @@ -34,24 +40,22 @@ LAUNCHER_PATH=$HOME/.local/share/applications SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS -REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_REPO_BRANCH="main" +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/$REMOTE_REPO_BRANCH REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME -SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest +APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest -########## FUNCTIONS ########### +########################### FUNCTIONS ############################ -### DEPENDENCIES +#################### DEPENDENCY CHECK #################### cmd_query() { - local PACKAGE="$1" - - if ! command -v "$PACKAGE" >/dev/null 2>&1 ; then - echo " - $PACKAGE" >> $TMP/missingDeps - + if ! command -v $PACKAGE > /dev/null 2>&1 ; then + echo " - $PACKAGE" >> $TMP/missingDeps fi } dependency_check () { - DEPENDENCIES=("curl" "wget") + DEPENDENCIES=("curl" "wget" "tar") mkdir -p $TMP for PACKAGE in "${DEPENDENCIES[@]}" ; do @@ -60,90 +64,148 @@ dependency_check () { done if [ -f "$TMP/missingDeps" ] ; then - MISSING=$(cat $TMP/missingDeps) - echo -e "\n ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}" + echo -e " ${RED}Following dependencies are missing :\n\n${CRS}$(cat $TMP/missingDeps)\n\n ${CYN}Please install and re-run script !${CRS}\n" exit_clean - fi } -### CHECK LOCAL INSTALL +#################### SHELL CHECK #################### +shell_query() { + if [ "$(echo $SHELL | grep "$SHELL_OPTION")" ] ; then + ACTIVE_SHELL=$SHELL_OPTION + fi + +} + +shell_check() { + SHELLS=("bash" "fish" "zsh") + + for SHELL_OPTION in "${SHELLS[@]}" ; do + shell_query "$SHELL_OPTION" + done +} + +#################### ARCH CHECK #################### +arch_check() { + if [ "$ARCH_OVERRIDE" ] ; then + ARCH=$ARCH_OVERRIDE + + else + ARCH=$(uname -m) + if [ "$ARCH" == "aarch64" ] ; then + ARCH="arm64" + + elif [ "$ARCH" == "amd64" ] ; then + ARCH="x86_64" + fi + fi + + if ! [[ "$ARCH" == "arm64" || "$ARCH" == "x86_64" ]] ; then + echo -e "\n ${CYN}$ARCH ${RED}unsupported! Only ${CYN}x86_68 ${RED}or ${CYN}arm64 ${RED}architecture are supported!${CRS}\n" + exit + fi +} + +#################### LOCAL INSTALL CHECK #################### local_check() { if ! [ -d "$INSTALL_PATH" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory not found!${CRS}" - install_helium + echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" + install_application exit - elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.AppImage${RED}!${CRS}" - install_helium + elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + echo -e "\n ${YEL}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${YEL}!${CRS}\n" + install_application exit - fi } -### INSTALL -install_helium() { - if [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" - update_helium - exit +#################### VARIABLE CHECK #################### +path_correction() { + if [ "$TARGET" == "INSTALL" ] ; then + TARGET_PATH=$INSTALL_PATH + elif [ "$TARGET" == "BACKUP" ] ; then + TARGET_PATH=$BACKUP_PATH + fi + + if ! [ ${TARGET_PATH:0:1} == "/" ] ; then + TARGET_PATH=$(pwd)/$TARGET_PATH + fi + + REVERSE_PATH=$(echo $TARGET_PATH | rev) + if [ "${REVERSE_PATH:0:1}" == "/" ] ; then + TARGET_PATH=$(echo $TARGET_PATH | sed "s|.$||") + fi + + if [ "$TARGET" == "INSTALL" ] ; then + INSTALL_PATH=$TARGET_PATH + + elif [ "$TARGET" == "BACKUP" ] ; then + BACKUP_PATH=$TARGET_PATH + fi +} + +#################### INSTALL #################### +install_application() { + if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + echo -e " ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" + update_application + exit fi while true ; do - read -p " Download and install $APP_NAME_LONG from $SOURCE? (Y/n) : " CONFIRM_INSTALL - echo + read -p " Download and install $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM_INSTALL if [[ "$CONFIRM_INSTALL" == "" || "$CONFIRM_INSTALL" == "y" || "$CONFIRM_INSTALL" == "Y" ]] ; then - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q + chmod +x $TMP/$APP_SOURCE_FILENAME mkdir -p $INSTALL_PATH - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION add_launcher echo -e "\n ${GRN}$APP_NAME_LONG is installed!${CRS}\n" break elif [[ "$CONFIRM_INSTALL" == "n" || "$CONFIRM_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}\n" break else - echo -e " ${YEL}Invalid response!${CRS}\n" - + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done } -### LAUNCHER +#################### LAUNCHER #################### add_launcher() { if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then echo -e "\n ${YEL}${APP_NAME}.desktop already exists!${CRS}" - elif [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + elif [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER - echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=$REMOTE_REPO_URL/assets/launcher/helium.desktop.template ICON_URL=$REMOTE_REPO_URL/assets/icon/helium.png AUTO_SCRIPT_URL=$REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $ASSET_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then - wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress + echo -e "\n - Downloading ${CYN}$AUTO_SCRIPT_FILE_NAME${CRS}..." + wget -P $TMP $AUTO_SCRIPT_URL -q chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH fi - wget -P $TMP $LAUNCHER_URL -q --show-progress - wget -P $TMP $ICON_URL -q --show-progress - sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template + echo -e "\n - Downloading ${CYN}launcher files${CRS}..." + wget -P $TMP $LAUNCHER_URL -q + wget -P $TMP $ICON_URL -q + sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$ASSET_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template @@ -160,192 +222,580 @@ add_launcher() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done else echo -e "\n ${RED}$APP_NAME_LONG AppImage not found! Can't add launcher...${CRS}" - install_helium + install_application exit - fi } -### ALIAS -add_alias() { ### WORKS BUT NEEDS WORK +#################### ALIAS #################### +add_alias() { if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then mkdir -p $SCRIPT_PATH wget -P $TMP $REMOTE_SCRIPT_URL -q chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH fi - - if [ -f "$HOME/.zshrc" ] ; then + + if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc" - exit - fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.zshrc${CRS}\n" - elif [ -f "$HOME/.bashrc" ] ; then - if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc" - exit + else + echo "### $APP_NAME_LONG Alias zsh ###" >> $HOME/.zshrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc + echo >> $HOME/.zshrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.zshrc${CRS}\n" + fi + + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.bashrc${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias bash ###" >> $HOME/.bashrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.bashrc + echo >> $HOME/.bashrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.bashrc${CRS}\n" + fi + + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.config/fish/config.fish${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish + echo "end" >> $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish + echo -e "\n ${LCY}$ALIAS ${CRS}added to ${CYN}$HOME/.config/fish/config.fish${CRS}\n" fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc" else - echo -e "\n ${RED}No .shellrc file found!${CRS}" - + echo -e "\n ${LCY}$ACTIVE_SHELL${RED}shell is not yet supported!${CRS}\n" + echo -e " ${CRS}Working implementation are available for bash, zsh & fish!${CRS}\n" fi } -### UPDATE -update_helium() { - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') +#################### UPDATE #################### +update_application() { + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" + if [ -z "$APP_SOURCE_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$LOCAL_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}\n" exit - fi ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is already up-to-date!${CRS}\n" - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + app_version_info while true ; do - read -p " Download and update $APP_NAME_LONG from $SOURCE? (Y/n) : " CONFIRM - echo + read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old - fi - mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + mkdir -p $TMP + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q + ${BACKUP_METHOD}_backup + chmod +x $TMP/$APP_SOURCE_FILENAME + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop + echo -e " ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}\n" exit else - echo -e " ${YEL}Invalid response!${CRS}\n" - + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + app_version_info echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit - - fi - -} - -### AUTOMATIC UPDATE --> TO DO? -auto_update() { - if ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${RED}$APP_NAME AppImage not found! Can't add auto update script...${CRS}" - exit - - else - echo -e "\n ${RED}Not implemented yet...${CRS}" - fi } -### REMOVE -remove_helium() { - if [ -d "$INSTALL_PATH" ] ; then +#################### BACKUP #################### +call_backup() { + BACKUP_COUNT=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* 2> /dev/null | wc -l) + if [[ "$BACKUP_COUNT" -gt "0" ]] ; then + echo -e "\n ${CYN}A $BACKUP_METHOD backup already exists!${CRS}\n" while true ; do - read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE + read -p " Overwrite backup? (y/N) : " OVERWRITE_BACKUP - if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - rm -rf $INSTALL_PATH - if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then - rm $LAUNCHER_PATH/$APP_NAME.desktop - fi + if [[ "$OVERWRITE_BACKUP" == "" || "$OVERWRITE_BACKUP" == "n" || "$OVERWRITE_BACKUP" == "N" ]] ; then + echo -e "\n ${YEL}Skipping backup process...${CRS}\n" + break - if [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - rm $SCRIPT_PATH/$SCRIPT_FILE_NAME - fi - - if [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then - rm $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME - fi - - if [ -f "$HOME/.zshrc" ] ; then - sed -i "s|$ALIAS|d|" $HOME/.zshrc - - elif [ -f "$HOME/.bashrc" ] ; then - sed -i "s|$ALIAS|d|" $HOME/.bashrc - - fi - - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" - exit - - elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" - exit + elif [[ "$OVERWRITE_BACKUP" == "y" || "$OVERWRITE_BACKUP" == "Y" ]] ; then + echo -e "\n ${YEL}Overwriting backup...${CRS}" + rm -rf $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* + ${BACKUP_METHOD}_backup + break else - echo -e " ${YEL}Invalid response!${CRS}\n" - + echo -e "\n ${YEL}Invalid response!${CRS}\n" + fi + done + + else + ${BACKUP_METHOD}_backup + fi +} + +backup_logger() { + echo "### $APP_NAME_LONG CONFIG SNAPSHOT $(date) ###" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + echo -e "\n - ${CRS}Creating ${CYN}config log${CRS}...${CRS}" + shell_check + + if [ "$ACTIVE_SHELL" == "zsh" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log + fi + + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log + fi + + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log + fi + + else + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : FALSE" >> $TMP/backup/conf_log + fi + + LOGGABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + + for LOG_ITEM in ${LOGGABLE[@]} ; do + if [ -d "$LOG_ITEM" ] ; then + echo " # Folder : $LOG_ITEM" >> $TMP/backup/conf_log + + elif [ -f "$LOG_ITEM" ] ; then + echo " # File : $LOG_ITEM" >> $TMP/backup/conf_log + + else + echo " # N/A : $LOG_ITEM" >> $TMP/backup/conf_log + fi + done + + echo >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + echo "### $SCRIPT_FILE_NAME VARIABLES ###" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + echo "INSTALL_PATH=$INSTALL_PATH" >> $TMP/backup/conf_log + echo "SCRIPT_PATH=$SCRIPT_PATH" >> $TMP/backup/conf_log + echo "LAUNCHER_PATH=$LAUNCHER_PATH" >> $TMP/backup/conf_log + echo "APP_CONFIG_PATH=$APP_CONFIG_PATH" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log +} + +backup_file_collector() { + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + backup_logger +} + +script_backup() { + if [ -d "$SCRIPT_PATH" ] ; then + BACKUPABLE=("$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +app_backup() { + if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +config_backup() { + if [[ -d "$LAUNCHER_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +full_backup() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +pack_backup() { + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + + if [[ -f "*.sh" ]] ; then + chmod -x *.sh + + elif [[ -f "*.$FILE_EXTENSION" ]] ; then + chmod -x *.$FILE_EXTENSION + fi + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + else + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in "${COMPRESSION_METHOD[@]}" ; do + + if command -v $COMPRESSION_TYPE > /dev/null 2>&1 ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + echo -e "\n - ${CRS}Packing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" + cd $CWD + fi +} + +#################### RESTORE BACKUP #################### +select_backup() { + BACKUP_COUNT=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_TYPE.backup_* 2> /dev/null | wc -l) + if [ "$BACKUP_COUNT" -gt "1" ] ; then + i=1 + mkdir -p $TMP/backup_restore + CWD=$(pwd) + cd $BACKUP_PATH + RESTORE_OPTIONS=$(ls -lt $APP_NAME\.$BACKUP_TYPE\.backup_* | awk '{print $9}') + + for RESTORE_TARGET in ${RESTORE_OPTIONS[@]} ; do + echo " $i - $RESTORE_TARGET" >> $TMP/backup_restore/options + i=$(($i+1)) + done + + cd $CWD + echo -e "\n ${CYN}Choose one of the $BACKUP_COUNT options below${CRS}\n" + echo -e "$(cat $TMP/backup_restore/options)\n" + + while true ; do + read -p " Enter backup ID (1-$BACKUP_COUNT) or exit : " RESTORE_SELECT + + if [[ "$RESTORE_SELECT" -le "$BACKUP_COUNT" && "$RESTORE_SELECT" -gt "0" ]] ; then + RESTORE_FILE=$(sed -n $RESTORE_SELECT\p $TMP/backup_restore/options | awk '{print $3}') + BACKUP_TYPE=$(echo $RESTORE_FILE | awk -F'.' '{print $2}') + RESTORE_SOURCE=$BACKUP_PATH/$RESTORE_FILE + break + + elif [[ "$RESTORE_SELECT" == "exit" || "$RESTORE_SELECT" == "EXIT" ]] ; then + echo + exit_clean + + else + echo -e "\n ${YEL}Invalid response!${CRS}\n" + fi + done + + elif [ "$BACKUP_COUNT" -lt "1" ] ; then + echo -e " ${RED}No backup archive found in ${CYN}$BACKUP_PATH${RED}!${CRS}\n" + exit_clean + + else + RESTORE_SOURCE=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_TYPE.backup_*) + RESTORE_FILE=$(echo $RESTORE_SOURCE | rev | awk -F'/' '{print $1}' | rev) + + if [ "$BACKUP_TYPE" == "*" ] ; then + BACKUP_TYPE=$(file $RESTORE_SOURCE | awk '{print $1}' | awk -F'.' '{print $2}') + fi + fi + + BACKUP_COMPRESSION=$(file $RESTORE_SOURCE | awk '{print $2}') + decompress_backup + configure_restore + restore_backup +} + +decompress_backup() { + CWD=$(pwd) + mkdir -p $TMP/backup_restore + cd $TMP/backup_restore + echo -e "\n - ${CRS}Decompressing backup archive ${CYN}$RESTORE_FILE${CRS}...${CRS}\n" + cp $RESTORE_SOURCE . + + if [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -xjf $APP_NAME.*.backup_*.tar.bz2 + rm $APP_NAME.*.backup_*.tar.bz2 + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -xzf $APP_NAME.*.backup_*.tar.gz + rm $APP_NAME.*.backup_*.tar.gz + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + unzip $APP_NAME.*.backup_*.tar.zip + tar -xf $APP_NAME.*.backup_*.tar + rm $APP_NAME.*.backup_*.tar.zip $APP_NAME.*.backup_*.tar.zip + + else + echo -e " ${YEL}TBA...${CRS}\n" ####################################################################### + fi +} + +configure_restore() { + echo -e " - ${CRS}Analysing ${CYN}$BACKUP_TYPE${CRS} backup content...${CRS}\n" + + RESTORABLE=("$APP_NAME.$FILE_EXTENSION" "$SCRIPT_FILE_NAME" "$AUTO_SCRIPT_FILE_NAME" "$APP_NAME.desktop" "$APP_CONFIG_FOLDER") + + for RESTORE_ITEM in ${RESTORABLE[@]} ; do + if [ -d "$RESTORE_ITEM" ] ; then + if [ -d "$APP_CONFIG_PATH" ] ; then + echo " - Folder : $RESTORE_ITEM | already present" >> $TMP/restore_conf + echo $RESTORE_ITEM >> $TMP/restore_check + + else + echo " - Folder : $RESTORE_ITEM | not present" >> $TMP/restore_conf fi + elif [ -f "$RESTORE_ITEM" ] ; then + if [[ -f "$INSTALL_PATH/$RESTORE_ITEM" || -f "$SCRIPT_PATH/$RESTORE_ITEM" || -f "$LAUNCHER_PATH/$RESTORE_ITEM" ]] ; then + echo " - File : $RESTORE_ITEM | already present" >> $TMP/restore_conf + echo "\"$RESTORE_ITEM\"" >> $TMP/restore_check + + else + echo " - File : $RESTORE_ITEM | not present" >> $TMP/restore_conf + fi + fi + done + + RESTORE_PATH=("INSTALL_PATH" "SCRIPT_PATH" "LAUNCHER_PATH" "APP_CONFIG_PATH") + ################################################################################################# + for CHANGED in ${RESTORE_PATH[@]} ; do + LOCAL_PATH=$(echo \$$CHANGED) + echo $LOCAL_PATH + if [ "$(cat conf_log | grep $RESTORE_PATH | awk -F '=' '{print $2}')" == "$LOCAL_PATH" ] ; then + echo $(cat conf_log | grep "${CHANGED}_PATH") >> $TMP/restore_path_change + echo "${CHANGED}_PATH" + + else + echo "BAD" + echo $(cat conf_log | grep "${CHANGED}_PATH") + fi + done +} + +restore_backup() { + echo -e " ${LCY}Backup Content Summary${CRS}\n" + echo -e "$(cat $TMP/restore_conf)\n" + + if [ -f "$TMP/restore_check" ] ; then + echo -e " ${RED}WARNING: Some items are existing on your system!${CRS}\n" + + while true ; do + read -p " Overwrite existing? (y/N) : " RESTORE_OVERWRITE + + if [[ "$RESTORE_OVERWRITE" == "" || "$RESTORE_OVERWRITE" == "n" || "$RESTORE_OVERWRITE" == "N" ]] ; then + echo -e "\n ${RED}Cancelled!${CRS}\n" + break + + elif [[ "$RESTORE_OVERWRITE" == "y" || "$RESTORE_OVERWRITE" == "Y" ]] ; then + EXISTING=$(cat $TMP/restore_check) + + for REPLACE in ${EXISTING[@]} ; do + rm -rf $REPLACE + done + fi done else - echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" - exit + echo -e " ${CYN}The content above is about to be restored...${CRS}\n" + while true ; do + read -p " Proceed with changes? (Y/n) : " RESTORE_CONFIRM + + if [[ "$RESTORE_CONFIRM" == "" || "$RESTORE_CONFIRM" == "y" || "$RESTORE_CONFIRM" == "Y" ]] ; then + echo -e " - ${CRS}Copying ${CYN}$BACKUP_TYPE${CRS} backup files...${CRS}\n" + + elif [[ "$RESTORE_CONFIRM" == "n" || "$RESTORE_CONFIRM" == "N" ]] ; then + echo -e "\n ${RED}Cancelled!${CRS}\n" + break + fi + done fi } -### SCRIPT VERSION -script_version() { - echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" - exit - +#################### REMOVE #################### +remove_application() { + if [ -d "$INSTALL_PATH" ] ; then + + while true ; do + read -p " Remove $APP_NAME_LONG incl. backups, configuration and launcher? (Y/n) : " CONFIRM_REMOVE + + if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME_LONG${CRS} files, directories and configuration...${CRS}" + + for RM_PATH in "${REMOVABLE[@]}" ; do + if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then + rm -rf "$RM_PATH" + fi + done + + shell_check + + if [ "$ACTIVE_SHELL" == "zsh" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.zshrc + sed -i "/$ALIAS/d" $HOME/.zshrc + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" + fi + + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.bashrc + sed -i "/$ALIAS/d" $HOME/.bashrc + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" + fi + + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + sed -i "/$ALIAS/d" $HOME/.config/fish/config.fish + rm $HOME/.config/fish/$ALIAS.fish + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" + fi + fi + + echo -e "\n ${YEL}$APP_NAME_LONG removed!${CRS}\n" + break + + elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then + echo -e "\n ${RED}Cancelled!${CRS}" + exit + + else + echo -e "\n ${YEL}Invalid response!${CRS}\n" + fi + done + + else + echo -e " ${RED}Can't remove $APP_NAME_LONG! ${CYN}$INSTALL_PATH ${RED}directory not found...${CRS}\n" + exit + fi +} + +#################### SCRIPT VERSION #################### +script_version() { + echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version : ${CRS}$SCRIPT_VERSION\n" +} + +#################### UPDATE SCRIPT #################### +scrip_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$SCRIPT_VERSION" + echo -e " - ${CYN}Remote Version :\t${CRS}$REMOTE_SCRIPT_VERSION" + echo -e " - ${CYN}Update Branch :\t${CRS}$REMOTE_REPO_BRANCH\n" } -### UPDATE SCRIPT update_script() { - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" @@ -354,40 +804,34 @@ update_script() { read -p " Copy script to $SCRIPT_PATH? (Y/n) : " CONFIRM_SCRIPT_INSTALL if [[ "$CONFIRM_SCRIPT_INSTALL" == "" || "$CONFIRM_SCRIPT_INSTALL" == "y" || "$CONFIRM_SCRIPT_INSTALL" == "Y" ]] ; then - if ! [ -d "$SCRIPT_PATH" ] ; then - mkdir -p $SCRIPT_PATH - fi - mkdir -p $TMP + mkdir -p $SCRIPT_PATH $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH - echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" - exit_clean + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH + echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}\n" + break elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e " ${RED}Cancelled!${CRS}\n" exit else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done - fi REMOTE_SCRIPT_VERSION=$(curl -s $REMOTE_SCRIPT_URL | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local script${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local script${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}\n" exit - fi ### COMPARE LOCAL & REMOTE VERSION @@ -398,164 +842,224 @@ update_script() { echo -e "\n ${GRN}$SCRIPT_FILE_NAME is already up-to-date!${CRS}\n" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$SCRIPT_FILE_NAME is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + echo -e "\n ${LCY}$SCRIPT_FILE_NAME is updatable!${CRS}\n" + scrip_version_info while true ; do read -p " Update $SCRIPT_FILE_NAME? (Y/n) : " CONFIRM_SCRIPT_UPDATE - echo if [[ "$CONFIRM_SCRIPT_UPDATE" == "" || "$CONFIRM_SCRIPT_UPDATE" == "y" || "$CONFIRM_SCRIPT_UPDATE" == "Y" ]] ; then if ! [ -d "$BACKUP_PATH" ] ; then mkdir -p $BACKUP_PATH fi mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old - mkdir -p $TMP + mv $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME $BACKUP_PATH/$AUTO_SCRIPT_FILE_NAME.old wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" break elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}\n" break else - echo -e " ${YEL}Invalid response!${CRS}\n" - + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + scrip_version_info echo -e " ${RED}Updating script failed...${CRS}\n" - fi } -### COMPARE APPIMAGE VERSION -compare_version() { - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') +#################### COMPARE APP VERSION #################### +app_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$LOCAL_VERSION" + echo -e " - ${CYN}$APP_SOURCE Version :\t${CRS}$APP_SOURCE_VERSION\n" +} - ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" +compare_version() { + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') + + if [ -z "$APP_SOURCE_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$LOCAL_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}\n" exit - fi - ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" - exit + app_version_info - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" - exit + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" + app_version_info else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" - echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" - exit - + app_version_info fi } -### HELP +#################### HELP #################### help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -r | -c | -s | -S | -h ]\n" # | -U | + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -b | -B | -r | -c | -s | -S | -h ]\n" echo -e "Options:\n" - echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" + echo -e "\t-i\tInstall $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh & bash${CRS}" - echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" - #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" + echo -e "\t-u\tUpdate $APP_NAME_LONG from $APP_SOURCE" + echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" + echo -e "\t-B\tRestore $APP_NAME_LONG & configuration from backup" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" - echo -e "\t-h\tPrint this help page.\n" - echo -e "Configured locations:\n" + echo -e "\t-h\tPrint this help page\n" + echo -e "Configured directories:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" } -### EXIT CLEAN +#################### EXIT CLEAN #################### exit_clean() { if [ -d "$TMP" ] ; then rm -rf $TMP - fi exit } -########## MAIN ########## +########################### MAIN ########################### + +while getopts ":i,:l,:a,:u,:b,:B,:r,:c,:s,:S,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi -## GET OPTIONS -while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) - echo -e "\n ${CYN}Installing $APP_NAME_LONG...${CRS}" + TARGET="INSTALL" + echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ -d "$PARAMETER" ] ; then + INSTALL_PATH=$PARAMETER + fi + done + fi dependency_check - install_helium + arch_check + path_correction + install_application exit_clean ;; l) - echo -e "\n ${CYN}Adding $APP_NAME_LONG launcher...${CRS}" + echo -e "\n ${YEL}Adding $APP_NAME_LONG launcher...${CRS}" dependency_check local_check add_launcher exit_clean ;; a) - echo -e "\n ${CYN}Adding alias...${CRS}" + echo -e "\n ${YEL}Adding alias...${CRS}" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ "$PARAMETER" ] ; then + ALIAS=$PARAMETER + fi + done + fi + shell_check add_alias exit ;; u) - echo -e "\n ${CYN}Updating $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Updating $APP_NAME_LONG...${CRS}" dependency_check + arch_check local_check - update_helium + update_application exit_clean ;; - U) - echo -e "\n ${CYN}Enabling automatic updates...${CRS}" + b) + TARGET="BACKUP" + echo -e "\n ${YEL}Backing up $APP_NAME_LONG...${CRS}" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [[ "$PARAMETER" == "script" || "$PARAMETER" == "config" || "$PARAMETER" == "app" || "$PARAMETER" == "full" ]] ; then + BACKUP_METHOD=$PARAMETER + + elif [[ "$PARAMETER" == "pbzip2" || "$PARAMETER" == "gzip" || "$PARAMETER" == "bzip2" || "$PARAMETER" == "zip" ]] ; then + BACKUP_COMPRESSION_OVERRIDE=$PARAMETER + + elif [[ -d "$PARAMETER" || -d "$(pwd)/$PARAMETER" ]] ; then + BACKUP_PATH=$PARAMETER + fi + done + fi + path_correction + call_backup + exit_clean ;; + + B) + TARGET="BACKUP" + echo -e "\n ${YEL}Restoring $APP_NAME_LONG from backup...${CRS}" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [[ "$PARAMETER" == "script" || "$PARAMETER" == "config" || "$PARAMETER" == "app" || "$PARAMETER" == "full" ]] ; then + BACKUP_TYPE=$PARAMETER + + elif [[ -d $PARAMETER || -d $(pwd)/$PARAMETER ]] ; then + BACKUP_PATH=$PARAMETER + + else + BACKUP_TYPE=* + fi + done + + else + BACKUP_TYPE=* + + fi dependency_check - local_check - auto_update + path_correction + select_backup exit_clean ;; r) - echo -e "\n ${CYN}Removing $APP_NAME_LONG...${CRS}" - remove_helium + echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" + remove_application exit ;; c) - echo -e "\n ${CYN}Comparing remote to local version...${CRS}" + echo -e "\n ${YEL}Comparing remote to local version...${CRS}" dependency_check local_check compare_version @@ -566,7 +1070,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do exit ;; S) - echo -e "\n ${CYN}Updating script...${CRS}" + echo -e "\n ${YEL}Updating script...${CRS}" dependency_check update_script exit_clean ;; @@ -579,19 +1083,18 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help exit ;; - esac - done -## DEPENDENCY CHECK +## ENVIRONMENT CHECK dependency_check +arch_check -## CHECK FOR LOCAL INSTALL +## CHECK LOCAL INSTALL local_check ## UPDATE -update_helium +update_application ## CLEAN exit_clean diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 35a5500..0f2d1c2 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -1,22 +1,28 @@ #!/bin/bash - # HELIUM BOWSER AUTO UPDATE SCRIPT WITH LOGGING - ########## PREREQUISITES ########### set -e ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -SOURCE="GitHub" -SCRIPT_NAME="$APP_NAME launcher updater" +ARCH="x86_64" +FILE_EXTENSION="AppImage" +APP_SOURCE="GitHub" +SCRIPT_NAME="$APP_NAME Launcher Updater" +PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.6" -DATE=$(date) +SCRIPT_VERSION="0.5.9.1" +LOG_DATE=$(date) +DATE=$(date +"%d%m%y") + +## NOTIFICATIONS +NOTIFY_NAME="Helium Helper" ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME +APP_CONFIG_PATH=$HOME/.config/net.imput.helium ASSET_PATH=$INSTALL_PATH/assets BACKUP_PATH=$ASSET_PATH/backup LOG_PATH=$ASSET_PATH/logs @@ -26,9 +32,10 @@ ICON=$ASSET_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS -REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_REPO_BRANCH="main" +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/$REMOTE_REPO_BRANCH REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME -SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest +APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -55,39 +62,131 @@ dependency_check () { mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG - echo "${DATE} | Log created" >> $LOG + echo "$LOG_DATE | Log created" >> $LOG fi if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo "${DATE} | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + echo "$LOG_DATE | Failed to update - missing dependencies : $MISSING" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit_clean fi if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH - echo "${DATE} | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + echo "$LOG_DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit - elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo "${DATE} | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + echo "$LOG_DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit fi } +### DE CHECK +desktop_environment() { + ALTERNATIVE_NOTIFY="--app-name="$NOTIFY_NAME"" + + if [[ "$(echo $XDG_CURRENT_DESKTOP | grep -iF "kde")" || "$(echo $XDG_CURRENT_DESKTOP | grep -iF "gnome")" ]] ; then + NOTIFY_NAME=$ALTERNATIVE_NOTIFY + fi +} + +### BACKUP +backup_helium() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.auto_backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.auto_backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.auto_backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.auto_backup_$DATE.tar.zip $APP_NAME.auto_backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo "$LOG_DATE | Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.auto_backup_$DATE + cd $TMP && rm -rf backup + fi + + echo "$LOG_DATE | Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" + cd $CWD + fi + + else + echo "$LOG_DATE | Failed to backup - Nothing worth backing up found" >> $LOG + fi +} + ### UPDATE SCRIPT update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - echo "${DATE} | Failed to update script - local file not found" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$LOG_DATE | Failed to update script - local file not found" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -96,13 +195,13 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo "${DATE} | Failed to update script - Empty version tag --> local" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$LOG_DATE | Failed to update script - Empty version tag --> local" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo "${DATE} | Failed to update script - Empty version tag --> $SOURCE" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$LOG_DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -112,68 +211,66 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send -i "$ICON" "Helium Helper" "Script is up-to-date" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH - echo "${DATE} | Script updated to $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script updated to $REMOTE_SCRIPT_VERSION" + wget -P $TMP $REMOTE_REPO_URL/$PARENT_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH + echo "$LOG_DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else - echo "${DATE} | Failed to update - Malformed version tags" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details\n$REMOTE_SCRIPT_VERSION $SCRIPT_VERSION" - + echo "$LOG_DATE | Failed to update - Malformed version tags" >> $LOG + echo "$LOG_DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Local Version: $SCRIPT_VERSION" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" fi } ### UPDATE update_helium() { - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [[ -z "$SOURCE_VERSION" ]] ; then - echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + if [[ -z "$APP_SOURCE_VERSION" ]] ; then + echo "$LOG_DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then - echo "${DATE} | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + echo "$LOG_DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send -i "$ICON" "Helium Helper" "Browser is up-to-date" + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser is up-to-date" - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.AppImage.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.AppImage.old - fi - mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.AppImage.old - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "${DATE} | $APP_NAME updated to ${SOURCE_VERSION}" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser updated to $SOURCE_VERSION" + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + mkdir -p $TMP + wget -P $TMP $DOWNLOAD_URL -q + chmod +x $TMP/$APP_SOURCE_FILENAME + backup_helium + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop + echo "$LOG_DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else - echo "${DATE} | Failed to update - Version tags malformed" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + echo "$LOG_DATE | Failed to update - Version tags malformed" >> $LOG + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -192,7 +289,7 @@ show_log() { xdg-open $LOG else - notify-send -i "$ICON" "Helium Helper" "No log created yet" + notify-send --icon="$ICON" "$NOTIFY_NAME" "No log created yet" fi } @@ -229,6 +326,13 @@ exit_clean() { ## GET OPTIONS while getopts ":a,:s,:S,:L,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi + case $OPTION in S) @@ -260,8 +364,11 @@ done ## DEPENDENCY CHECK dependency_check +## DE CHECK +desktop_environment + ## UPDATE update_helium ## CLEAN -exit_clean \ No newline at end of file +exit_clean