#!/bin/bash # HELIUM BOWSER AUTO UPDATE SCRIPT WITH LOGGING ########## PREREQUISITES ########### set -e ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.8" DATE=$(date) ## 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 LOG=$LOG_PATH/log LAUNCHER_PATH=$HOME/.local/share/applications ICON=$ASSET_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS 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 APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### ### DEPENDENCIES cmd_query() { local PACKAGE="$1" if ! command -v "$PACKAGE" >/dev/null 2>&1 ; then echo " - $PACKAGE" >> $TMP/missingDeps fi } dependency_check () { DEPENDENCIES=("curl" "wget") mkdir -p $TMP for PACKAGE in "${DEPENDENCIES[@]}" ; do cmd_query "$PACKAGE" done if ! [ -f "$LOG" ] ; then mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG echo "$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 --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 --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "$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 } ### 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.backup_$DATE.tar * > /dev/null 2>&1 pbzip2 $APP_NAME.backup_$DATE.tar mkdir -p $BACKUP_PATH mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 gzip $APP_NAME.backup_$DATE.tar mkdir -p $BACKUP_PATH mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 bzip2 $APP_NAME.backup_$DATE.tar mkdir -p $BACKUP_PATH mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 mkdir -p $BACKUP_PATH mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH cd $TMP && rm -rf backup else echo "$DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG mkdir -p $BACKUP_PATH mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE cd $TMP && rm -rf backup fi echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi else echo "$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 --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit 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 "$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 --> $APP_SOURCE" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi ### COMPARE LOCAL & REMOTE VERSION SCRIPT_VERSION_NUM=$(echo $SCRIPT_VERSION | tr -d .) REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then 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 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 "$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 echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG echo "$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 $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 "$APP_SOURCE_VERSION" ]] ; then echo "$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 --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 .) APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser is up-to-date" 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 "$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 --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi } ### SCRIPT VERSION script_version() { echo -e "\n ${CYN}$APP_NAME_LONG Auto Update Script Version :${CRS} $SCRIPT_VERSION\n" } ### SHOW LOG show_log() { if [ -f "$LOG" ] ; then xdg-open $LOG else notify-send --icon="$ICON" "$NOTIFY_NAME" "No log created yet" fi } ### HELP help() { echo -e "\n${LCY}$SCRIPT_NAME${CRS}\n" echo -e "$APP_NAME_LONG launcher updater script\n" echo -e "Description: Add functionality to $APP_NAME_LONG's launcher\n" echo -e "Syntax: $SCRIPT_FILE_NAME [ -s | -S | -L | -h ]\n" echo -e "Options:\n" echo -e "\t-s\tShow script version" echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" echo -e "\t-L\tOpen log in default text editor" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" echo -e "\t${CYN}$INSTALL_PATH${CRS}\t\tInstall location" echo -e "\t${CYN}$LOG_PATH${CRS}\tLog 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() { if [ -d "$TMP" ] ; then rm -rf $TMP fi exit } ########## MAIN ########## ## 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) dependency_check update_script exit_clean ;; s) script_version exit_clean ;; L) show_log exit_clean ;; h) help exit_clean ;; *) echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help exit_clean ;; esac done ## DEPENDENCY CHECK dependency_check ## UPDATE update_helium ## CLEAN exit_clean