Skip to content
Snippets Groups Projects
PVEDiscordDark.sh 10.2 KiB
Newer Older
#!/bin/bash
# https://github.com/Weilbyte/PVEDiscordDark

Tommy's avatar
Tommy committed
umask 022

#region Consts
RED='\033[0;31m'
BRED='\033[0;31m\033[1m'
GRN='\033[92m'
WARN='\033[93m'
BOLD='\033[1m'
REG='\033[0m'
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m'

TEMPLATE_FILE="/usr/share/pve-manager/index.html.tpl"
Weilbyte's avatar
Weilbyte committed
SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/"
SCRIPTPATH="${SCRIPTDIR}$(basename "${BASH_SOURCE[0]}")"

OFFLINEDIR="${SCRIPTDIR}offline"

REPO=${REPO:-"Weilbyte/PVEDiscordDark"}
DEFAULT_TAG="master"
TAG=${TAG:-$DEFAULT_TAG}
BASE_URL="https://raw.githubusercontent.com/$REPO/$TAG"
Weilbyte's avatar
Weilbyte committed

OFFLINE=false
#endregion Consts

#region Prerun checks
Weilbyte's avatar
Weilbyte committed
if [[ $EUID -ne 0 ]]; then
    echo -e >&2 "${BRED}Root privileges are required to perform this operation${REG}";
    exit 1
fi

hash sed 2>/dev/null || { 
    echo -e >&2 "${BRED}sed is required but missing from your system${REG}";
    exit 1;
}

hash pveversion 2>/dev/null || { 
    echo -e >&2 "${BRED}PVE installation required but missing from your system${REG}";
    exit 1;
}

Weilbyte's avatar
Weilbyte committed
if test -d "$OFFLINEDIR"; then
    echo "Offline directory detected, entering offline mode."
    OFFLINE=true
Weilbyte's avatar
Weilbyte committed
else
    hash curl 2>/dev/null || { 
        echo -e >&2 "${BRED}cURL is required but missing from your system${REG}";
        exit 1;
    }
Weilbyte's avatar
Weilbyte committed
fi
Weilbyte's avatar
Weilbyte committed
if [ "$OFFLINE" = false ]; then
VoXaN24's avatar
VoXaN24 committed
    curl -sSf -f https://raw.githubusercontent.com/ &> /dev/null || {
        echo -e >&2 "${BRED}Could not establish a connection to GitHub (https://raw.githubusercontent.com)${REG}";
Weilbyte's avatar
Weilbyte committed
        exit 1;
    }

    if [ $TAG != $DEFAULT_TAG ]; then
        if !([[ $TAG =~ [0-9] ]] && [ ${#TAG} -ge 7 ] && (! [[ $TAG =~ ['!@#$%^&*()_+.'] ]]) ); then 
            echo -e "${WARN}It appears like you are using a non-default tag. For security purposes, please use the SHA-1 hash of said tag instead${REG}"
        fi
    fi
fi
#endregion Prerun checks

PVEVersion=$(pveversion --verbose | grep pve-manager | cut -c 14- | cut -c -6) # Below pveversion pre-run check
PVEVersionMajor=$(echo $PVEVersion | cut -d'-' -f1)

#region Helper functions
function checkSupported {   
Weilbyte's avatar
Weilbyte committed
    if [ "$OFFLINE" = false ]; then
        local SUPPORTED=$(curl -f -s "$BASE_URL/meta/supported")
    else
        local SUPPORTED=$(cat "$OFFLINEDIR/meta/supported")
    fi

    if [ -z "$SUPPORTED" ]; then 
Weilbyte's avatar
Weilbyte committed
        if [ "$OFFLINE" = false ]; then
            echo -e "${WARN}Could not reach supported version file ($BASE_URL/meta/supported). Skipping support check.${REG}"
        else
            echo -e "${WARN}Could not find supported version file ($OFFLINEDIR/meta/supported). Skipping support check.${REG}"
        fi
    else 
        local SUPPORTEDARR=($(echo "$SUPPORTED" | tr ',' '\n'))
        if ! (printf '%s\n' "${SUPPORTEDARR[@]}" | grep -q -P "$PVEVersionMajor"); then
            echo -e "${WARN}You might encounter issues because your version ($PVEVersionMajor) is not matching currently supported versions ($SUPPORTED)."
            echo -e "If you do run into any issues on >newer< versions, please consider opening an issue at https://github.com/Weilbyte/PVEDiscordDark/issues.${REG}"
        fi
    fi
}

function isInstalled {
    if (grep -Fq "<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>" $TEMPLATE_FILE &&
        grep -Fq "<script type='text/javascript' src='/pve2/js/dd_patcher.js'></script>" $TEMPLATE_FILE &&
        [ -f "/usr/share/pve-manager/css/dd_style.css" ] && [ -f "/usr/share/pve-manager/js/dd_patcher.js" ]); then 
        true
    else 
        false
    fi
}

#endregion Helper functions

#region Main functions
function usage {
    if [ "$_silent" = false ]; then
        echo -e "Usage: $0 [OPTIONS...] {COMMAND}\n"
        echo -e "Manages the PVEDiscordDark theme."
        echo -e "  -h --help            Show this help"
        echo -e "  -s --silent          Silent mode\n"
        echo -e "Commands:"
        echo -e "  status               Check current theme status (returns 0 if installed, and 1 if not installed)"
        echo -e "  install              Install the theme"
        echo -e "  uninstall            Uninstall the theme"
        echo -e "  update               Update the theme (runs uninstall, then install)"
    #    echo -e "  utility-update       Update this utility\n" (to be implemented)
        echo -e "Exit status:"
        echo -e "  0                    OK"
        echo -e "  1                    Failure"
        echo -e "  2                    Already installed, OR not installed (when using install/uninstall commands)\n"
        echo -e "Report issues at: <https://github.com/Weilbyte/PVEDiscordDark/issues>"
    fi
}

function status {
    if [ "$_silent" = false ]; then
        echo -e "Theme"
        if isInstalled; then
            echo -e "  Status:      ${GRN}present${REG}"
        else
            echo -e "  Status:      ${RED}not present${REG}"
        fi
        echo -e "  CSS:         $(sha256sum /usr/share/pve-manager/css/dd_style.css 2>/dev/null  || echo N/A)"
        echo -e "  JS:          $(sha256sum /usr/share/pve-manager/js/dd_patcher.js 2>/dev/null  || echo N/A)\n"
        echo -e "PVE"
        echo -e "  Version:     $PVEVersion (major $PVEVersionMajor)\n"
        echo -e "Utility hash:  $(sha256sum $SCRIPTPATH 2>/dev/null  || echo N/A)"
Weilbyte's avatar
Weilbyte committed
        echo -e "Offline mode:  $OFFLINE"
    if isInstalled; then exit 0; else exit 1; fi
}

function install {
    if isInstalled; then
        if [ "$_silent" = false ]; then echo -e "${RED}Theme already installed${REG}"; fi
        exit 2
    else
        if [ "$_silent" = false ]; then checkSupported; fi

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Backing up template file"; fi
        cp $TEMPLATE_FILE $TEMPLATE_FILE.bak

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Downloading stylesheet"; fi
Weilbyte's avatar
Weilbyte committed

        if [ "$OFFLINE" = false ]; then
            curl -s $BASE_URL/PVEDiscordDark/sass/PVEDiscordDark.css > /usr/share/pve-manager/css/dd_style.css
        else
            cp "$OFFLINEDIR/PVEDiscordDark/sass/PVEDiscordDark.css" /usr/share/pve-manager/css/dd_style.css
        fi

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Downloading patcher"; fi
Weilbyte's avatar
Weilbyte committed
        if [ "$OFFLINE" = false ]; then
            curl -s $BASE_URL/PVEDiscordDark/js/PVEDiscordDark.js > /usr/share/pve-manager/js/dd_patcher.js
        else
            cp "$OFFLINEDIR/PVEDiscordDark/js/PVEDiscordDark.js" /usr/share/pve-manager/js/dd_patcher.js
        fi

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Applying changes to template file"; fi
        if !(grep -Fq "<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>" $TEMPLATE_FILE); then
            echo "<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>" >> $TEMPLATE_FILE
        fi 
        if !(grep -Fq "<script type='text/javascript' src='/pve2/js/dd_patcher.js'></script>" $TEMPLATE_FILE); then
            echo "<script type='text/javascript' src='/pve2/js/dd_patcher.js'></script>" >> $TEMPLATE_FILE
        fi 
Weilbyte's avatar
Weilbyte committed
        if [ "$OFFLINE" = false ]; then
            local IMAGELIST=$(curl -f -s "$BASE_URL/meta/imagelist")
        else 
            local IMAGELIST=$(cat "$OFFLINEDIR/meta/imagelist")
        fi

        local IMAGELISTARR=($(echo "$IMAGELIST" | tr ',' '\n'))
        if [ "$_silent" = false ]; then echo -e "Downloading images (0/${#IMAGELISTARR[@]})"; fi
        ITER=0
        for image in "${IMAGELISTARR[@]}"
        do
Weilbyte's avatar
Weilbyte committed
                if [ "$OFFLINE" = false ]; then
                    curl -s $BASE_URL/PVEDiscordDark/images/$image > /usr/share/pve-manager/images/$image
                else
                    cp "$OFFLINEDIR/PVEDiscordDark/images/$image" /usr/share/pve-manager/images/$image
                fi
                ((ITER++))
                if [ "$_silent" = false ]; then echo -e "\e[1A\e[KDownloading images ($ITER/${#IMAGELISTARR[@]})"; fi
        done
        if [ "$_silent" = false ]; then echo -e "\e[1A\e[K${CHECKMARK} Downloading images (${#IMAGELISTARR[@]}/${#IMAGELISTARR[@]})"; fi

        if [ "$_silent" = false ]; then echo -e "Theme installed."; fi
        if [ "$_noexit" = false ]; then exit 0; fi
    fi
}

function uninstall {
    if ! isInstalled; then
        echo -e "${RED}Theme not installed${REG}"
        exit 2
    else
        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Removing stylesheet"; fi
        rm /usr/share/pve-manager/css/dd_style.css

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Removing patcher"; fi
        rm /usr/share/pve-manager/js/dd_patcher.js

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Reverting changes to template file"; fi
        sed -i "/<link rel='stylesheet' type='text\/css' href='\/pve2\/css\/dd_style.css'>/d" /usr/share/pve-manager/index.html.tpl
        sed -i "/<script type='text\/javascript' src='\/pve2\/js\/dd_patcher.js'><\/script>/d" /usr/share/pve-manager/index.html.tpl

        if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Removing images"; fi
        rm /usr/share/pve-manager/images/dd_*

        if [ "$_silent" = false ]; then echo -e "Theme uninstalled."; fi
        if [ "$_noexit" = false ]; then exit 0; fi
    fi
}

#endregion Main functions

_silent=false
_command=false
_noexit=false

parse_cli()
{
	while test $# -gt -0
	do
		_key="$1"
		case "$_key" in
			-h|--help)
				usage
				exit 0
				;;
            -s|--silent)
                _silent=true
                ;;
            status) 
                if [ "$_command" = false ]; then
                    _command=true
                    status
                fi
                ;;
            install) 
                if [ "$_command" = false ]; then
                    _command=true
                    install
                    exit 0
                fi
                ;;
            uninstall)
                if [ "$_command" = false ]; then
                    _command=true
                    uninstall
                    exit 0
                fi
                ;;
            update)
                if [ "$_command" = false ]; then
                    _command=true
                    _noexit=true
                    uninstall
                    install
                    exit 0
                fi
                ;;
	     *)
				echo -e "${BRED}Error: Got an unexpected argument \"$_key\"${REG}\n"; 
                usage;
                exit 1;
				;;
		esac
		shift
	done
}

parse_cli "$@"