From d54e52b1a8a0afaebedcfd2e4cef2d778e6ddff1 Mon Sep 17 00:00:00 2001 From: Brandon Wulf Date: Fri, 27 Mar 2020 18:58:04 -0700 Subject: [PATCH] Desktop: Cleaning up the install / update script (#2719) * Cleaning up the install script * New `--force` option always downloads the latest version * New `--notes` option shows the release notes * Actually print the version installed at the end * Show download progress, but not extra garbage * Blue logo * refactor and cleanup * Handle space, but no args --- Joplin_install_and_update.sh | 250 +++++++++++++++++++++-------------- 1 file changed, 149 insertions(+), 101 deletions(-) diff --git a/Joplin_install_and_update.sh b/Joplin_install_and_update.sh index 6b9417949..92b6ac7b7 100755 --- a/Joplin_install_and_update.sh +++ b/Joplin_install_and_update.sh @@ -6,142 +6,190 @@ set -e #----------------------------------------------------- COLOR_RED=`tput setaf 1` COLOR_GREEN=`tput setaf 2` +COLOR_YELLOW=`tput setaf 3` +COLOR_BLUE=`tput setaf 4` COLOR_RESET=`tput sgr0` SILENT=false +ALLOW_ROOT=false +SHOW_CHANGELOG=false print() { - if [[ "$SILENT" == false ]] ; then - echo "$1" + if [[ "${SILENT}" == false ]] ; then + echo -e "$@" fi } +showLogo() { + print "${COLOR_BLUE}" + print " _ _ _ " + print " | | ___ _ __ | (_)_ __ " + print " _ | |/ _ \| '_ \| | | '_ \ " + print "| |_| | (_) | |_) | | | | | |" + print " \___/ \___/| .__/|_|_|_| |_|" + print " |_|" + print "" + print "Linux Installer and Updater" + print "${COLOR_RESET}" +} + +showHelp() { + showLogo + print "Available Arguments:" + print "\t" "--help" "\t" "Show this help information" "\n" + print "\t" "--allow-root" "\t" "Allow the install to be run as root" + print "\t" "--changelog" "\t" "Show the changelog after installation" + print "\t" "--force" "\t" "Always download the latest version" + + if [[ ! -z $1 ]]; then + print "\n" "${COLOR_RED}ERROR: " "$*" "${COLOR_RESET}" "\n" + else + exit 0 + fi + +} + #----------------------------------------------------- -# ARGUMENTS +# PARSE ARGUMENTS #----------------------------------------------------- -# --allow-root -## Check and warn if running as root. -if [[ $EUID = 0 ]] ; then - if [[ $* != *--allow-root* ]] ; then - echo "${COLOR_RED}It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'${COLOR_RESET}" - exit 1 +optspec=":h-:" +while getopts "${optspec}" OPT; do + [ "${OPT}" = " " ] && continue + if [ "${OPT}" = "-" ]; then # long option: reformulate OPT and OPTARG + OPT="${OPTARG%%=*}" # extract long option name + OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty) + OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=` fi -fi + case "${OPT}" in + h | help ) showHelp ;; + allow-root ) ALLOW_ROOT=true ;; + silent ) SILENT=true ;; + force ) FORCE=true ;; + changelog ) SHOW_CHANGELOG=true ;; + [^\?]* ) showHelp "Illegal option --${OPT}"; exit 2 ;; + \? ) showHelp "Illegal option -${OPTARG}"; exit 2 ;; + esac +done +shift $((OPTIND-1)) # remove parsed options and args from $@ list -# --silent -## Mutes messages by console -if [[ $* == *--silent* ]] ; then - SILENT=true +## Check and warn if running as root. +if [[ $EUID = 0 ]] && [[ "${ALLOW_ROOT}" != true ]]; then + showHelp "It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'" + exit 1 fi #----------------------------------------------------- # START #----------------------------------------------------- +showLogo -# Title -print " _ _ _ " -print " | | ___ _ __ | (_)_ __ " -print " _ | |/ _ \| '_ \| | | '_ \ " -print "| |_| | (_) | |_) | | | | | |" -print " \___/ \___/| .__/|_|_|_| |_|" -print " |_|" -print "" -print "Linux Installer and Updater" - +print "Checking architecture..." # Architecture check if ! [[ -x "$(command -v uname)" ]] ; then - print "Can't get system architecture, skipping check" + print "${COLOR_YELLOW}WARNING: Can't get system architecture, skipping check${COLOR_RESET}" else ## this actually gives more information than needed, but it contains all architectures (hardware and software) ARCHITECTURE=$(uname -a) if [[ $ARCHITECTURE =~ .*aarch.*|.*arm.* ]] ; then - echo "${COLOR_RED}Arm systems are not officially supported by Joplin,${COLOR_RESET} please search the forum (https://discourse.joplinapp.org/) for more information" + showHelp "Arm systems are not officially supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information" exit 1 elif [[ $ARCHITECTURE =~ .*i.86.* ]] ; then - echo "${COLOR_RED}32-bit systems are not supported by Joplin,${COLOR_RESET} please search the forum (https://discourse.joplinapp.org/) for more information" + showHelp "32-bit systems are not supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information" exit 1 fi fi #----------------------------------------------------- -# Download Joplin -#----------------------------------------------------- - -# Get the latest version to download +print "Checking latest version..." RELEASE_VERSION=$(wget -qO - "https://api.github.com/repos/laurent22/joplin/releases/latest" | grep -Po '"tag_name": "v\K.*?(?=")') # Check if it's in the latest version -if [[ ! -e ~/.joplin/VERSION ]] || [[ $(< ~/.joplin/VERSION) != "$RELEASE_VERSION" ]]; then - - print 'Downloading Joplin...' - # Delete previous version (in future versions joplin.desktop shouldn't exist) - rm -f ~/.joplin/*.AppImage ~/.local/share/applications/joplin.desktop ~/.joplin/VERSION - - # Creates the folder where the binary will be stored - mkdir -p ~/.joplin/ - - # Download the latest version - wget -nv --show-progress -O ~/.joplin/Joplin.AppImage https://github.com/laurent22/joplin/releases/download/v$RELEASE_VERSION/Joplin-$RELEASE_VERSION.AppImage - - # Gives execution privileges - chmod +x ~/.joplin/Joplin.AppImage - - print "${COLOR_GREEN}OK${COLOR_RESET}" - - #----------------------------------------------------- - # Icon - #----------------------------------------------------- - - # Download icon - print 'Downloading icon...' - mkdir -p ~/.local/share/icons/hicolor/512x512/apps - wget -nv -O ~/.local/share/icons/hicolor/512x512/apps/joplin.png https://joplinapp.org/images/Icon512.png - print "${COLOR_GREEN}OK${COLOR_RESET}" - - # Detect desktop environment - if [ "$XDG_CURRENT_DESKTOP" = "" ] - then - DESKTOP=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/') - else - DESKTOP=$XDG_CURRENT_DESKTOP - fi - DESKTOP=${DESKTOP,,} # convert to lower case - - # Create icon for Gnome - echo 'Create Desktop icon.' - if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cinnamon.*|.*deepin.* ]] - then - : "${TMPDIR:=/tmp}" - # This command extracts to squashfs-root by default and can't be changed... - # So we run it in the tmp directory and clean up after ourselves - (cd $TMPDIR && ~/.joplin/Joplin.AppImage --appimage-extract joplin.desktop &> /dev/null) - APPIMAGE_VERSION=$(grep "^X-AppImage-Version=" $TMPDIR/squashfs-root/joplin.desktop | head -n 1 | cut -d "=" -f 2) - rm -rf $TMPDIR/squashfs-root - # Only delete the desktop file if it will be replaced - rm -f ~/.local/share/applications/appimagekit-joplin.desktop - - # On some systems this directory doesn't exist by default - mkdir -p ~/.local/share/applications - echo -e "[Desktop Entry]\nEncoding=UTF-8\nName=Joplin\nComment=Joplin for Desktop\nExec=/home/$USER/.joplin/Joplin.AppImage\nIcon=joplin\nStartupWMClass=Joplin\nType=Application\nCategories=Office;\n#$APPIMAGE_VERSION" >> ~/.local/share/applications/appimagekit-joplin.desktop - # Update application icons - [[ `command -v update-desktop-database` ]] && update-desktop-database ~/.local/share/applications - print "${COLOR_GREEN}OK${COLOR_RESET}" - else - print "${COLOR_RED}NOT DONE${COLOR_RESET}" - fi - - #----------------------------------------------------- - # Finish - #----------------------------------------------------- - # Informs the user that it has been installed and cleans variables - print "${COLOR_GREEN}Joplin version${COLOR_RESET}" $RELEASE_VERSION "${COLOR_GREEN}installed.${COLOR_RESET}" - - # Add version - echo $RELEASE_VERSION > ~/.joplin/VERSION +if [[ -e ~/.joplin/VERSION ]] && [[ $(< ~/.joplin/VERSION) == "${RELEASE_VERSION}" ]]; then + print "${COLOR_GREEN}You already have the latest version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}" + ([[ "$FORCE" == true ]] && print "Forcing installation...") || exit 0 else - print "${COLOR_GREEN}You already have the latest version${COLOR_RESET}" $version "${COLOR_GREEN}installed.${COLOR_RESET}" + [[ -e ~/.joplin/VERSION ]] && CURRENT_VERSION=$(< ~/.joplin/VERSION) + print "The latest version is ${RELEASE_VERSION}, but you have ${CURRENT_VERSION:-no version} installed." fi -# Goodbye -print 'Bye!' +#----------------------------------------------------- +print 'Downloading Joplin...' +TEMP_DIR=$(mktemp -d) +wget -qnv --show-progress -O ${TEMP_DIR}/Joplin.AppImage https://github.com/laurent22/joplin/releases/download/v${RELEASE_VERSION}/Joplin-${RELEASE_VERSION}.AppImage +wget -qnv --show-progress -O ${TEMP_DIR}/joplin.png https://joplinapp.org/images/Icon512.png + +#----------------------------------------------------- +print 'Installing Joplin...' +# Delete previous version (in future versions joplin.desktop shouldn't exist) +rm -f ~/.joplin/*.AppImage ~/.local/share/applications/joplin.desktop ~/.joplin/VERSION + +# Creates the folder where the binary will be stored +mkdir -p ~/.joplin/ + +# Download the latest version +mv ${TEMP_DIR}/Joplin.AppImage ~/.joplin/Joplin.AppImage + +# Gives execution privileges +chmod +x ~/.joplin/Joplin.AppImage + +print "${COLOR_GREEN}OK${COLOR_RESET}" + +#----------------------------------------------------- +print 'Installing icon...' +mkdir -p ~/.local/share/icons/hicolor/512x512/apps +mv ${TEMP_DIR}/joplin.png ~/.local/share/icons/hicolor/512x512/apps/joplin.png +print "${COLOR_GREEN}OK${COLOR_RESET}" + +# Detect desktop environment +if [ "$XDG_CURRENT_DESKTOP" = "" ] +then + DESKTOP=$(echo "${XDG_DATA_DIRS}" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/') +else + DESKTOP=$XDG_CURRENT_DESKTOP +fi +DESKTOP=${DESKTOP,,} # convert to lower case + +#----------------------------------------------------- +echo 'Create Desktop icon...' +if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cinnamon.*|.*deepin.* ]] +then + : "${TMPDIR:=$TEMP_DIR}" + # This command extracts to squashfs-root by default and can't be changed... + # So we run it in the tmp directory and clean up after ourselves + (cd $TMPDIR && ~/.joplin/Joplin.AppImage --appimage-extract joplin.desktop &> /dev/null) + APPIMAGE_VERSION=$(grep "^X-AppImage-Version=" $TMPDIR/squashfs-root/joplin.desktop | head -n 1 | cut -d "=" -f 2) + rm -rf $TMPDIR/squashfs-root + # Only delete the desktop file if it will be replaced + rm -f ~/.local/share/applications/appimagekit-joplin.desktop + + # On some systems this directory doesn't exist by default + mkdir -p ~/.local/share/applications + echo -e "[Desktop Entry]\nEncoding=UTF-8\nName=Joplin\nComment=Joplin for Desktop\nExec=/home/${USER}/.joplin/Joplin.AppImage\nIcon=joplin\nStartupWMClass=Joplin\nType=Application\nCategories=Office;\n#${APPIMAGE_VERSION}" >> ~/.local/share/applications/appimagekit-joplin.desktop + # Update application icons + [[ `command -v update-desktop-database` ]] && update-desktop-database ~/.local/share/applications + print "${COLOR_GREEN}OK${COLOR_RESET}" +else + print "${COLOR_RED}NOT DONE, unknown desktop '${DESKTOP}'${COLOR_RESET}" +fi + +#----------------------------------------------------- +# FINISH INSTALLATION +#----------------------------------------------------- + +# Informs the user that it has been installed +print "${COLOR_GREEN}Joplin version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}" + +# Record version +echo $RELEASE_VERSION > ~/.joplin/VERSION + +#----------------------------------------------------- +if [[ "$SHOW_CHANGELOG" == true ]]; then + NOTES=$(wget -qO - https://api.github.com/repos/laurent22/joplin/releases/latest | grep -Po '"body": "\K.*(?=")') + print "${COLOR_BLUE}Changelog:${COLOR_RESET}\n${NOTES}" +fi + +#----------------------------------------------------- +print "Cleaning up..." +rm -rf $TEMP_DIR +print "${COLOR_GREEN}OK${COLOR_RESET}"