|
|
@@ -1,14 +1,343 @@
|
|
|
-#!/bin/bash
|
|
|
-
|
|
|
-NORMAL="\Zn"
|
|
|
-BLACK="\Z0"
|
|
|
-RED="\Z1"
|
|
|
-GREEN="\Z2"
|
|
|
-YELLOW="\Z3"
|
|
|
-BLUE="\Z4"
|
|
|
-MAGENTA="\Z5"
|
|
|
-CYAN="\Z6"
|
|
|
-WHITE="\Z7"
|
|
|
-BOLD="\Zb"
|
|
|
-REVERSE="\Zr"
|
|
|
-UNDERLINE="\Zu"
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+
|
|
|
+# define colors for output
|
|
|
+NORMAL="\Zn"
|
|
|
+BLACK="\Z0"
|
|
|
+RED="\Z1"
|
|
|
+GREEN="\Z2"
|
|
|
+YELLOW="\Z3"
|
|
|
+BLUE="\Z4"
|
|
|
+MAGENTA="\Z5"
|
|
|
+CYAN="\Z6"
|
|
|
+WHITE="\Z7"
|
|
|
+BOLD="\Zb"
|
|
|
+REVERSE="\Zr"
|
|
|
+UNDERLINE="\Zu"
|
|
|
+
|
|
|
+
|
|
|
+# global variables
|
|
|
+url="https://raw.githubusercontent.com/Jandalf81/rclone_script"
|
|
|
+branch="beta"
|
|
|
+remotebasedir = ""
|
|
|
+
|
|
|
+backtitle="RCLONE_SCRIPT installer"
|
|
|
+
|
|
|
+
|
|
|
+# Welcome dialog
|
|
|
+dialog \
|
|
|
+ --backtitle "${backtitle}" \
|
|
|
+ --title "Welcome" \
|
|
|
+ --ascii-lines \
|
|
|
+ --colors \
|
|
|
+ --no-collapse \
|
|
|
+ --cr-wrap \
|
|
|
+ --yesno \
|
|
|
+ "\nThis script will configure RetroPie so that your savefiles and statefiles are synchronized with a remote destination. Several packages and scripts will be installed, see\n\n https://github.com/Jandalf81/rclone_script/blob/master/ReadMe.md\n\nfor a rundown.\n\nAre you sure you wish to continue?" \
|
|
|
+ 28 110 2>&1 > /dev/tty \
|
|
|
+ || exit
|
|
|
+
|
|
|
+
|
|
|
+# Warn the user if they are using the BETA branch
|
|
|
+function dialogBetaWarning ()
|
|
|
+{
|
|
|
+ dialog \
|
|
|
+ --backtitle "${backtitle}" \
|
|
|
+ --title "Beta Warning" \
|
|
|
+ --ascii-lines \
|
|
|
+ --colors \
|
|
|
+ --no-collapse \
|
|
|
+ --cr-wrap \
|
|
|
+ --yesno \
|
|
|
+ "\n${RED}${UNDERLINE}WARNING!${NORMAL}\n\nYou are about to install a beta version!\nAre you ${RED}REALLY${NORMAL} sure you want to continue?" \
|
|
|
+ 10 50 2>&1 > /dev/tty \
|
|
|
+ || exit
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+# Installer
|
|
|
+function installer ()
|
|
|
+{
|
|
|
+ local retval
|
|
|
+
|
|
|
+ initSteps
|
|
|
+ dialogShowProgress 0
|
|
|
+
|
|
|
+# 1a. Testing for RCLONE binary
|
|
|
+ updateStep "1a" "in progress" 0
|
|
|
+
|
|
|
+ 1aTestRCLONE
|
|
|
+ if [[ $? -eq 0 ]]
|
|
|
+ then
|
|
|
+ updateStep "1a" "found" 5
|
|
|
+ updateStep "1b" "skipped" 10
|
|
|
+ else
|
|
|
+ updateStep "1a" "not found" 5
|
|
|
+
|
|
|
+# 1b. Getting RCLONE binary
|
|
|
+ updateStep "1b" "in progress" 5
|
|
|
+
|
|
|
+ 1bInstallRCLONE
|
|
|
+ if [[ $? -eq 0 ]]
|
|
|
+ then
|
|
|
+ updateStep "1b" "done" 10
|
|
|
+ else
|
|
|
+ updateStep "1b" "failed" 5
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+# 1c. Testing RCLONE configuration
|
|
|
+ updateStep "1c" "in progress" 10
|
|
|
+
|
|
|
+ 1cTestRCLONEremote
|
|
|
+ if [[ $? -eq 0 ]]
|
|
|
+ then
|
|
|
+ updateStep "1c" "found" 15
|
|
|
+ updateStep "1d" "skipped" 20
|
|
|
+ else
|
|
|
+ updateStep "1c" "not found" 15
|
|
|
+
|
|
|
+# 1d. Create RCLONE remote
|
|
|
+ updateStep "1d" "in progress" 15
|
|
|
+ 1dCreateRCLONEremote
|
|
|
+ updateStep "1d" "done" 20
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+# Initialize array $STEPS()
|
|
|
+# OUTPUT
|
|
|
+# $steps()
|
|
|
+function initSteps ()
|
|
|
+{
|
|
|
+ steps[1]="1. RCLONE"
|
|
|
+ steps[2]=" 1a. Testing for RCLONE binary [ waiting... ]"
|
|
|
+ steps[3]=" 1b. Getting RCLONE binary [ waiting... ]"
|
|
|
+ steps[4]=" 1c. Testing RCLONE remote [ waiting... ]"
|
|
|
+ steps[5]=" 1d. Create RCLONE remote [ waiting... ]"
|
|
|
+ steps[6]="2. PNGVIEW"
|
|
|
+ steps[7]=" 2a. Testing for PNGVIEW binary [ waiting... ]"
|
|
|
+ steps[8]=" 2b. Getting PNGVIEW source [ waiting... ]"
|
|
|
+ steps[9]=" 2c. Compiling PNGVIEW [ waiting... ]"
|
|
|
+ steps[10]="3. IMAGEMAGICK"
|
|
|
+ steps[11]=" 3a. Testing for IMAGEMAGICK [ waiting... ]"
|
|
|
+ steps[12]=" 3b. Getting IMAGEMAGICK [ waiting... ]"
|
|
|
+ steps[13]="4. RCLONE_SCRIPT"
|
|
|
+ steps[14]=" 4a. Getting RCLONE_SCRIPT [ waiting... ]"
|
|
|
+ steps[15]=" 4b. Creating RCLONE_SCRIPT menu item [ waiting... ]"
|
|
|
+ steps[16]=" 4c. Configure RCLONE_SCRIPT [ waiting... ]"
|
|
|
+ steps[17]="5. RUNCOMMAND"
|
|
|
+ steps[18]=" 5a. RUNCOMMAND-ONSTART [ waiting... ]"
|
|
|
+ steps[19]=" 5b. RUNCOMMAND-ONEND [ waiting... ]"
|
|
|
+ steps[20]="6. Local SAVEFILE directory"
|
|
|
+ steps[21]=" 6a. Test for local SAVEFILE directory [ waiting... ]"
|
|
|
+ steps[22]=" 6b. Create local SAVEFILE directory [ waiting... ]"
|
|
|
+ steps[23]="7. Remote SAVEFILE directory"
|
|
|
+ steps[24]=" 7a. Test for local SAVEFILE directory [ waiting... ]"
|
|
|
+ steps[25]=" 7b. Create local SAVEFILE directory [ waiting... ]"
|
|
|
+ steps[26]="8. Configure RETROARCH"
|
|
|
+ steps[27]=" 8a. Setting local SAVEFILE directory [ waiting... ]"
|
|
|
+ steps[28]="9. Finalizing"
|
|
|
+ steps[29]=" 9a. Saving configuration [ waiting... ]"
|
|
|
+}
|
|
|
+
|
|
|
+# Build progress from array $STEPS()
|
|
|
+# INPUT
|
|
|
+# $steps()
|
|
|
+# OUTPUT
|
|
|
+# $progress
|
|
|
+function buildProgress ()
|
|
|
+{
|
|
|
+ progress=""
|
|
|
+
|
|
|
+ for ((i=0; i<=${#steps[*]}; i++))
|
|
|
+ do
|
|
|
+ progress="${progress}${steps[i]}\n"
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+# Show Progress dialog
|
|
|
+# INPUT
|
|
|
+# 1 > Percentage to show in dialog
|
|
|
+# $backtitle
|
|
|
+# $progress
|
|
|
+function dialogShowProgress ()
|
|
|
+{
|
|
|
+ local percent="$1"
|
|
|
+
|
|
|
+ buildProgress
|
|
|
+
|
|
|
+ echo "${percent}" | dialog \
|
|
|
+ --stdout \
|
|
|
+ --colors \
|
|
|
+ --ascii-lines \
|
|
|
+ --no-collapse \
|
|
|
+ --cr-wrap \
|
|
|
+ --backtitle "${backtitle}" \
|
|
|
+ --title "Installer" \
|
|
|
+ --gauge "${progress}" 36 90 0 \
|
|
|
+ 2>&1 > /dev/tty
|
|
|
+
|
|
|
+ sleep 1
|
|
|
+}
|
|
|
+
|
|
|
+# Update item of $STEPS() and show updated progress dialog
|
|
|
+# INPUT
|
|
|
+# 1 > Number of step to update
|
|
|
+# 2 > New status for step
|
|
|
+# 3 > Percentage to show in progress dialog
|
|
|
+# $steps()
|
|
|
+# OUTPUT
|
|
|
+# $steps()
|
|
|
+function updateStep ()
|
|
|
+{
|
|
|
+ local step="$1"
|
|
|
+ local newStatus="$2"
|
|
|
+ local percent="$3"
|
|
|
+ local oldline
|
|
|
+ local newline
|
|
|
+
|
|
|
+ # translate and colorize $NEWSTATUS
|
|
|
+ case "${newStatus}" in
|
|
|
+ "waiting") newStatus="[ ${NORMAL}WAITING...${NORMAL} ]" ;;
|
|
|
+ "in progress") newStatus="[ ${NORMAL}IN PROGRESS${NORMAL} ]" ;;
|
|
|
+ "done") newStatus="[ ${GREEN}DONE${NORMAL} ]" ;;
|
|
|
+ "found") newStatus="[ ${GREEN}FOUND${NORMAL} ]" ;;
|
|
|
+ "not found") newStatus="[ ${RED}NOT FOUND${NORMAL} ]" ;;
|
|
|
+ "failed") newStatus="[ ${RED}FAILED${NORMAL} ]" ;;
|
|
|
+ "skipped") newStatus="[ ${YELLOW}${BOLD}SKIPPED${NORMAL} ]" ;;
|
|
|
+ *) newStatus="[ ${RED}UNDEFINED${NORMAL} ]" ;;
|
|
|
+ esac
|
|
|
+
|
|
|
+ # search $STEP in $STEPS
|
|
|
+ for ((i=0; i<${#steps[*]}; i++))
|
|
|
+ do
|
|
|
+ if [[ ${steps[i]} =~ .*$step.* ]]
|
|
|
+ then
|
|
|
+ # update $STEP with $NEWSTATUS
|
|
|
+ oldline="${steps[i]}"
|
|
|
+ oldline="${oldline%%[*}"
|
|
|
+ newline="${oldline}${newStatus}"
|
|
|
+ steps[i]="${newline}"
|
|
|
+
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ # show progress dialog
|
|
|
+ dialogShowProgress ${percent}
|
|
|
+}
|
|
|
+
|
|
|
+# Checks if RCLONE is installed
|
|
|
+# RETURN
|
|
|
+# 0 > RCLONE is installed
|
|
|
+# 1 > RCLONE is not installed
|
|
|
+function 1aTestRCLONE ()
|
|
|
+{
|
|
|
+ if [ -f /usr/bin/rclone ]
|
|
|
+ then
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# Installs RCLONE
|
|
|
+# RETURN
|
|
|
+# 0 > RCLONE has been installed
|
|
|
+# 1 > Error while installing RCLONE
|
|
|
+function 1bInstallRCLONE ()
|
|
|
+{
|
|
|
+ # TODO get RCLONE for 64bit
|
|
|
+ { # try
|
|
|
+ # get binary
|
|
|
+ wget -q -P ~ https://downloads.rclone.org/rclone-current-linux-arm.zip &&
|
|
|
+ unzip -q ~/rclone-current-linux-arm.zip -d ~ &&
|
|
|
+
|
|
|
+ cd ~/rclone-v* &&
|
|
|
+
|
|
|
+ # move binary
|
|
|
+ retval=$(sudo mv rclone /usr/bin 2>&1) &&
|
|
|
+ retval=$(sudo chown root:root /usr/bin/rclone 2>&1) &&
|
|
|
+ retval=$(sudo chmod 755 /usr/bin/rclone 2>&1) &&
|
|
|
+
|
|
|
+ cd ~ &&
|
|
|
+
|
|
|
+ # remove temp files
|
|
|
+ rm ~/rclone-current-linux-arm.zip > /dev/null &&
|
|
|
+ rm -r ~/rclone-v* > /dev/null &&
|
|
|
+
|
|
|
+ return 0
|
|
|
+ } || { #catch
|
|
|
+ # remove temp files
|
|
|
+ rm ~/rclone-current-linux-arm.zip > /dev/null &&
|
|
|
+ rm -r ~/rclone-v* > /dev/null &&
|
|
|
+
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+# Checks if there's a RCLONE remote called RETROPIE
|
|
|
+# RETURN
|
|
|
+# 0 > remote RETROPIE has been found
|
|
|
+# 1 > no remote RETROPIE found
|
|
|
+function 1cTestRCLONEremote ()
|
|
|
+{
|
|
|
+ local remotes=$(rclone listremotes)
|
|
|
+
|
|
|
+ local retval=$(grep -i "^retropie:" <<< ${remotes})
|
|
|
+
|
|
|
+ if [ "${retval}" == "retropie:" ]
|
|
|
+ then
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# Tells the user to create a new RCLONE remote called RETROPIE
|
|
|
+# RETURN
|
|
|
+# 0 > remote RETROPIE has been created (no other OUTPUT possible)
|
|
|
+function 1dCreateRCLONEremote ()
|
|
|
+{
|
|
|
+ dialog \
|
|
|
+ --stdout \
|
|
|
+ --colors \
|
|
|
+ --ascii-lines \
|
|
|
+ --no-collapse \
|
|
|
+ --cr-wrap \
|
|
|
+ --backtitle "${backtitle}" \
|
|
|
+ --title "Installer" \
|
|
|
+ --msgbox "\nPlease create a new remote within RCLONE now. Name that remote ${RED}retropie${NORMAL}. Please consult the RCLONE documentation for further information:\n https://www.rclone.org\n\nOpening RCLONE CONFIG now..." 20 50 \
|
|
|
+ 2>&1 > /dev/tty
|
|
|
+
|
|
|
+ rclone config
|
|
|
+
|
|
|
+ 1cTestRCLONEremote
|
|
|
+ if [[ $? -eq 1 ]]
|
|
|
+ then
|
|
|
+ dialog \
|
|
|
+ --stdout \
|
|
|
+ --colors \
|
|
|
+ --ascii-lines \
|
|
|
+ --no-collapse \
|
|
|
+ --cr-wrap \
|
|
|
+ --backtitle "${backtitle}" \
|
|
|
+ --title "Installer" \
|
|
|
+ --msgbox "\nNo remote ${RED}retropie${NORMAL} found.\nPlease try again." 20 50 \
|
|
|
+ 2>&1 > /dev/tty
|
|
|
+
|
|
|
+ 1dCreateRCLONEremote
|
|
|
+ else
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+# main
|
|
|
+if [ "${branch}" == "beta" ]
|
|
|
+then
|
|
|
+ dialogBetaWarning
|
|
|
+fi
|
|
|
+
|
|
|
+installer
|