#!/bin/bash
{
	#////////////////////////////////////
	# DietPi Backup
	#
	#////////////////////////////////////
	# Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com
	#
	#////////////////////////////////////
	#
	# Info:
	# - filename /DietPi/dietpi/dietpi-backup
	# - Allows for a complete system back and restore of the linux filesystem (/)
	#
	# Usage:
	# - /DietPi/dietpi/dietpi-backup -1 = Restore
	# - /DietPi/dietpi/dietpi-backup    = Menu
	# - /DietPi/dietpi/dietpi-backup  1 = Backup
	#
	# $2 = optional directory location to use with backup/restore input:
	# - /DietPi/dietpi/dietpi-backup -1 /mnt/MyDirectoryTarget = Restore
	# - /DietPi/dietpi/dietpi-backup  1 /mnt/MyDirectoryTarget = Backup
	#////////////////////////////////////

	#Grab Input
	INPUT=0
	if [[ $1 =~ ^-?[0-9]+$ ]]; then
		INPUT=$1
	fi

	#Import DietPi-Globals ---------------------------------------------------------------
	. /DietPi/dietpi/func/dietpi-globals
	G_CHECK_ROOT_USER
	G_CHECK_ROOTFS_RW
	export G_PROGRAM_NAME='DietPi-Backup'
	#Import DietPi-Globals ---------------------------------------------------------------

	#/////////////////////////////////////////////////////////////////////////////////////
	# MENUS
	#/////////////////////////////////////////////////////////////////////////////////////
	WHIP_BACKTITLE='DietPi-Backup'
	WHIP_TITLE=''
	MENU_LASTITEM=''
	CHOICE=0
	OPTION=0
	TARGETMENUID=0

	#TARGETMENUID=0
	Menu_Main(){

		local backup_last_completed_system='System backup not found. Create one.'
		if [ -f "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM" ]; then

			backup_last_completed_system=$(grep 'Completed' "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM" | tail -1)

		fi

		local backup_last_completed_userdata='User data backup not found (requires "Full" backup mode)'
		if [ -f "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA" ]; then

			backup_last_completed_userdata=$(grep 'Completed' "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA" | tail -1)

		fi

		local text_backup_mode='System only'
		local text_start_mode_desc='system'
		if (( $BACKUP_MODE == 1 )); then

			text_backup_mode='Full'
			text_start_mode_desc='system and user data'

		fi

		WHIP_TITLE='DietPi-Backup'
		OPTION=$(whiptail --title "$WHIP_TITLE" --menu "Current backup and restore location:\n - $FP_TARGET_BACKUP\n - $backup_last_completed_system\n - $backup_last_completed_userdata" --cancel-button "Exit" --default-item "$MENU_LASTITEM" --backtitle "$WHIP_BACKTITLE" 16 80 5 \
		"Help" "What does DietPi-Backup do?" \
		"Location" "Change where your backup will be saved and restored from." \
		"Backup mode" ": $text_backup_mode" \
		"Backup" "Create (or update) a backup of this system." \
		"Restore" "Restore this system from a previous backup." 3>&1 1>&2 2>&3)

		CHOICE=$?
		if (( $CHOICE == 0 )); then

			MENU_LASTITEM="$OPTION"

			case "$OPTION" in

				Location)

					TARGETMENUID=1

				;;

				"Backup mode")

					OPTION=$(whiptail --title "$WHIP_TITLE" --menu "Please select a backup mode:\n\n - System only\nOnly the system is backed up and restored, this does not include your DietPi user data ($G_FP_DIETPI_USERDATA).\n\n - Full:\nSystem and user data ($G_FP_DIETPI_USERDATA) is backed up and restored.\n\nMore information on what DietPi user data is:\nhttp://dietpi.com/phpbb/viewtopic.php?f=8&t=478#p2087" --cancel-button "Exit" --default-item "$BACKUP_MODE" --backtitle "$WHIP_BACKTITLE" 20 80 2 \
					"0" "System only" \
					"1" "Full (includes user data)" 3>&1 1>&2 2>&3)
					CHOICE=$?
					if (( $CHOICE == 0 )); then

						BACKUP_MODE=$OPTION

					fi

				;;

				Help)

					whiptail --title "DietPi-Backup Help" --msgbox "DietPi-Backup is a program that allows you to Backup and Restore your DietPi system.\n\nIf you have broken your system, or want to reset your system to an earlier date, this can all be done with DietPi-Backup.\n\nSimply choose a location where you want to save and restore your backups from, then, select Backup or Restore.\n\nMore information:\n - http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=256#p255" --backtitle "$WHIP_BACKTITLE" 20 75

				;;

				Backup)

					WHIP_TITLE=' Start backup? '
					whiptail --title "$WHIP_TITLE" --yesno "Your $text_start_mode_desc will be backed up to:\n$FP_TARGET_BACKUP\n\nDo you wish to continue?" --yes-button "Ok" --no-button "Back" --defaultno --backtitle "$WHIP_BACKTITLE" 11 65
					CHOICE=$?
					if (( $CHOICE == 0 )); then

						Run_Backup

					fi

				;;

				Restore)

					WHIP_TITLE=' Start restore? '
					whiptail --title "$WHIP_TITLE" --yesno "Your $text_start_mode_desc will be restored from:\n$FP_TARGET_BACKUP\n\nDo you wish to continue?" --yes-button "Ok" --no-button "Back" --defaultno --backtitle "$WHIP_BACKTITLE" 11 65
					CHOICE=$?
					if (( $CHOICE == 0 )); then

						Run_Restore

					fi

				;;

			esac

		else

			Menu_Exit

		fi

	}

	Menu_Exit(){

		WHIP_TITLE=' Exit DietPi-Backup? '
		whiptail --title "$WHIP_TITLE" --yesno "$WHIP_TITLE" --yes-button "Ok" --no-button "Back" --defaultno --backtitle "$WHIP_BACKTITLE" 10 50
		CHOICE=$?

		#Exit
		if (( $CHOICE == 0 )); then

			TARGETMENUID=-1

		fi

	}

	#TARGETMENUID=1
	Menu_Set_Directory(){

		local current_directory="$FP_TARGET_BACKUP"

		WHIP_TITLE='Select your backup and restore location'
		OPTION=$(whiptail --title "$WHIP_TITLE" --menu "Please select the location where your system backup will be saved, and restored from.\n\nYour current location:\n$FP_TARGET_BACKUP" --cancel-button "Back" --backtitle "$WHIP_BACKTITLE" 15 75 3 \
		"Search" "Find previous backups in /mnt/*" \
		"List" "Select from a list of available mounts/drives" \
		"Manual" "Manually type a directory to use." 3>&1 1>&2 2>&3)
		CHOICE=$?

		if (( $CHOICE == 0 )); then

			case "$OPTION" in

				Search)

					local fp_search_results="/tmp/.dietpi-backup_search_results"
					echo -e "\n\nSearching /mnt/* for previous backups, please wait... \n \n"
					find /mnt -type f -name "$BACKUP_STATS_FILENAME_SYSTEM" > "$fp_search_results"

					#Do we have any results?
					if (( $(cat "$fp_search_results" | wc -l) > 0 )); then

						readarray search_results_list < "$fp_search_results"
						#Create List for Whiptail
						local search_results_whiptail=()
						for ((i=0; i<${#search_results_list[@]}; i++))
						do

							local last_backup_date=$( grep 'Completed' ${search_results_list[$i]} | tail -1 | sed 's/.*: //' ) # Date of last backup for this backup
							local backup_directory=$( echo -e ${search_results_list[$i]} | sed 's/\/'"$BACKUP_STATS_FILENAME_SYSTEM"'//g' ) # Backup directory (minus the backup file), that we can use for target backup directory.
							search_results_whiptail+=("$backup_directory" ": $last_backup_date")

						done

						OPTION=$(whiptail --title "Backups found." --menu "Please select a previous backup to use:" --cancel-button "Back" --backtitle "$WHIP_BACKTITLE" 12 70 3 "${search_results_whiptail[@]}" 3>&1 1>&2 2>&3)
						CHOICE=$?
						if (( $CHOICE == 0 )); then

							FP_TARGET_BACKUP="$OPTION"

						fi

						#delete[] array
						unset search_results_list
						unset search_results_whiptail
						rm "$fp_search_results" &> /dev/null

					else

						whiptail --title "No results" --msgbox "No previous backups were found in /mnt/*" --backtitle "$WHIP_BACKTITLE" 10 60

					fi

				;;

				Manual)

					Input_User_Directory

				;;

				List)

					/DietPi/dietpi/dietpi-drive_manager 1
					FP_TARGET_BACKUP="$(cat /tmp/dietpi-drive_manager_selmnt)"
					if [ "$FP_TARGET_BACKUP" = "/" ]; then

						FP_TARGET_BACKUP='/mnt'

					fi

					FP_TARGET_BACKUP+='/dietpi-backup'

				;;

			esac

		else

			#Return to main menu
			TARGETMENUID=0

		fi

		Check_Supported_Directory_Location
		# - Not supported, reset directory target to previous
		if (( $TARGET_DIRECTORY_SUPPORTED == 0 )); then

			FP_TARGET_BACKUP="$current_directory"

		fi

	}

	Input_User_Directory(){

		OPTION=$(whiptail --inputbox "Please enter the filepath to your directory. \neg: /mnt/dietpi-backup\n - Must be located inside /mnt/* \n - Must be symlink compatible filesystem (ext2/3/4)" 10 70 "$FP_TARGET_BACKUP" --title "Manual backup directory" --backtitle "$WHIP_BACKTITLE" 3>&1 1>&2 2>&3)
		CHOICE=$?
		if (( $CHOICE == 0 )); then

			FP_TARGET_BACKUP="$OPTION"

		fi

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Errors
	#/////////////////////////////////////////////////////////////////////////////////////
	Error_Filesystem_Not_Supported(){

		G_DIETPI-NOTIFY 1 "Filesystem not supported in $FP_TARGET_BACKUP"

		if (( $G_USER_INPUTS )); then

			whiptail --title "Error" --msgbox "$FP_TARGET_BACKUP Has a filesystem of: $TARGET_FILESYSTEM_TYPE, and is not supported.\n\nThe filesystem must be EXT2/3/4 for symlink compatibility." --backtitle "$WHIP_BACKTITLE" 11 70

		fi

	}

	Error_Not_Mnt_Directory(){

		G_DIETPI-NOTIFY 1 "Target directory is not inside /mnt ($FP_TARGET_BACKUP)"

		if (( $G_USER_INPUTS )); then

			whiptail --title "Directory not supported" --msgbox "$FP_TARGET_BACKUP\n\nYour current location is not supported.\nThe location must be inside the /mnt/* directory.\n - eg: /mnt/dietpi-backup" --backtitle "$WHIP_BACKTITLE" 11 70

		fi

	}

	Error_DietpiUserdata_Directory(){

		G_DIETPI-NOTIFY 1 "Target directory can not be contained within DietPi user data location ($FP_TARGET_BACKUP)"

		if (( $G_USER_INPUTS )); then

			whiptail --title "Directory not supported" --msgbox "$FP_TARGET_BACKUP\n\nYour current location is not supported.\nTarget directory can not be contained within DietPi user data location ($G_FP_DIETPI_USERDATA)" --backtitle "$WHIP_BACKTITLE" 13 70

		fi

	}

	Error_Rsync_Already_Running(){

		G_DIETPI-NOTIFY 1 "Another Rsync process is already running."

		echo -e "$RSYNC_MODE_TEXT failed: $(date +"%d-%m-%Y_%H%M"). Rsync is already running." >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"

		#Menu
		if (( $G_USER_INPUTS )); then

			whiptail --title "$RSYNC_MODE_TEXT Error" --msgbox "A $RSYNC_MODE_TEXT could not be started as rsync is already running." --backtitle "$WHIP_BACKTITLE" 13 60

		fi

	}

	Error_Rsync_Failed(){

		G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT failed."

		#Menu
		if (( $G_USER_INPUTS )); then

			whiptail --title "$RSYNC_MODE_TEXT failed" --msgbox "Your $RSYNC_MODE_TEXT has failed. Please see the Log file for more information:\n\n$LOGFILE" --backtitle "$WHIP_BACKTITLE" 12 60

		fi

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Backup System
	#/////////////////////////////////////////////////////////////////////////////////////
	RSYNC_MODE_TEXT=0
	BACKUP_MODE=1 #0=system only, 1=full (system and userdata)

	#LOGFILE
	LOGFILE='/var/log/dietpi-backup.log'

	#Backup Filepaths
	FP_SOURCE_SYSTEM='/'
	FP_TARGET_BACKUP='/mnt/dietpi-backup'
	G_FP_DIETPI_USERDATA_ACTUAL="$(readlink -f /mnt/dietpi_userdata)"

	#file applied to successful backups (stored in "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"
	BACKUP_STATS_FILENAME_SYSTEM='.dietpi-backup_system_stats'
	BACKUP_STATS_FILENAME_USERDATA='.dietpi-backup_userdata_stats'

	#Exclude/include file
	FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP='/tmp/.dietpi-backup_filter_inc_exc'
	FP_EXCLUDE_USER='/DietPi/dietpi/.dietpi-backup_exclude'
	FP_INCLUDE_USER='/DietPi/dietpi/.dietpi-backup_include'

	#Supported filesystems
	TARGET_FILESYSTEM_TYPE=0
	TARGET_DIRECTORY_SUPPORTED=0
	aSUPPORTED_FILESYSTEMS=(
		'ext4'
		'ext3'
		'ext2'
		'nfs'
		'nfs4'
		'btrfs'
	)

	#rsync options
	RSYNC_RUN_OPTIONS_SYSTEM_BACKUP="-alHpvP --delete --log-file=$LOGFILE --include-from=$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"
	RSYNC_RUN_OPTIONS_USERDATA_BACKUP="-alHpvP --delete --log-file=$LOGFILE"

	#Sucessful backup/restore states
	BACKUP_RESTORE_FAILED=0

	#Date format for logs
	Print_Date(){

		echo -e "$(date +"%d-%m-%Y %H:%M")"

	}

	Create_Filter_Include_Exclude(){

		#Include
		cat << _EOF_ > "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"
#INCLUDE
#Global - Folders
#+ /example/
_EOF_

		# - Add users additional list
		if [ -f "$FP_INCLUDE_USER" ]; then

			echo -e "\n#User include file" >> "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"

			while read -r line
			do

				echo -e "+ $line" >> "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"

			done < "$FP_INCLUDE_USER"

		fi

		#Exclude
		cat << _EOF_ >> "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"

#EXCLUDE
#Global - Folders
- $FP_TARGET_BACKUP/
- /mnt/
- /media/
- /dev/
- /proc/
- /sys/
- /tmp/
- /run/

#Apt package cache (.deb)
- /var/cache/apt/archives/

#Manpages / Docs
- /usr/share/man/
- /usr/share/doc/

#Global - Files
- $LOGFILE
- $FP_DIETPIBACKUP_SETTINGS
- $BACKUP_STATS_FILENAME_SYSTEM
- $BACKUP_STATS_FILENAME_USERDATA
- /var/swap
- fake-hwclock.data
- *.tmp

#MS Windows specific
- Thumbs.db
- desktop.ini
_EOF_

		#Add users additional list
		if [ -f "$FP_EXCLUDE_USER" ]; then

			echo -e "\n#User exclude file" >> "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"
			while read -r line
			do

				echo -e "- $line" >> "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP"

			done < "$FP_EXCLUDE_USER"

		fi

		#DEBUG
		cp "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP" /tmp/.dietpi-backup_inc_exc_list

	}

	Services_Stop(){
		/DietPi/dietpi/dietpi-services stop
	}

	Services_Start(){
		/DietPi/dietpi/dietpi-services start
	}

	Run_Backup(){

		RSYNC_MODE_TEXT="Backup"

		G_DIETPI-NOTIFY 3 DietPi-Backup "$RSYNC_MODE_TEXT"

		#Check valid FS
		Check_Supported_Directory_Location

		#Filesystem supported
		if (( $TARGET_DIRECTORY_SUPPORTED == 1 )); then

			#Generate target dir.
			mkdir -p "$FP_TARGET_BACKUP"

			#Error: Unable to create target folder.
			if [ ! -d "$FP_TARGET_BACKUP" ]; then

				if (( $G_USER_INPUTS )); then

					whiptail --title "$RSYNC_MODE_TEXT failed." --msgbox "Unable to create $FP_TARGET_BACKUP" --backtitle "$WHIP_BACKTITLE" 10 60

				fi

			#Error: Rsync is already running
			elif (( $(ps aux | grep -ci -m1 "[r]sync") == 1 )); then

				Error_Rsync_Already_Running

			else

				#Start Backup

				echo -e "DietPi-Backup Log File. $(date +"%d-%m-%Y_%H%M")\n\n" > "$LOGFILE"

				#Generate Exclude/Include lists
				Create_Filter_Include_Exclude

				Services_Stop

				G_DIETPI-NOTIFY 2 "Backing up to: $FP_TARGET_BACKUP"

				BACKUP_RESTORE_FAILED=0

				while true
				do

					# - system
					RSYNC_MODE_TEXT='Backup (system)'

					rsync $RSYNC_RUN_OPTIONS_SYSTEM_BACKUP "$FP_SOURCE_SYSTEM" "$FP_TARGET_BACKUP"/dietpi-backup_system/
					if (( $? == 0 )); then


						G_DIETPI-NOTIFY 0 "$RSYNC_MODE_TEXT Completed.\n"
						echo -e "$RSYNC_MODE_TEXT Completed    : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"

					else

						G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT FAILED.\n"
						echo -e "$RSYNC_MODE_TEXT FAILED       : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"
						BACKUP_RESTORE_FAILED=1
						break

					fi

					# - userdata
					RSYNC_MODE_TEXT='Backup (user data)'

					if (( $BACKUP_MODE == 1 )); then

						rsync $RSYNC_RUN_OPTIONS_USERDATA_BACKUP "$G_FP_DIETPI_USERDATA_ACTUAL"/ "$FP_TARGET_BACKUP"/dietpi-backup_userdata/
						if (( $? == 0 )); then


							G_DIETPI-NOTIFY 0 "$RSYNC_MODE_TEXT Completed.\n"
							echo -e "$RSYNC_MODE_TEXT Completed : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA"

						else

							G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT FAILED.\n"
							echo -e "$RSYNC_MODE_TEXT FAILED    : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA"
							BACKUP_RESTORE_FAILED=1
							break

						fi

					fi

					# - done
					break

				done

				if (( $BACKUP_RESTORE_FAILED )); then

					Error_Rsync_Failed

				else

					if (( $G_USER_INPUTS )); then

						RSYNC_MODE_TEXT='Backup'
						whiptail --title "$RSYNC_MODE_TEXT completed" --msgbox "Your $RSYNC_MODE_TEXT was saved to:\n$FP_TARGET_BACKUP\n\nLog file: $LOGFILE" --backtitle "$WHIP_BACKTITLE" 11 60

					fi

				fi

				Services_Start

				#return to main menu
				TARGETMENUID=0

			fi
		fi

	}

	Run_Restore(){

		RSYNC_MODE_TEXT="Restore"

		G_DIETPI-NOTIFY 3 DietPi-Backup "$RSYNC_MODE_TEXT"

		#Check valid FS
		Check_Supported_Directory_Location

		#Filesystem supported
		if (( $TARGET_DIRECTORY_SUPPORTED == 1 )); then

			#Error: Backup not found
			if [ ! -f "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM" ]; then

				G_DIETPI-NOTIFY 2 "No Backup was found in $FP_TARGET_BACKUP"
				G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT Failed.\n"
				if (( $G_USER_INPUTS )); then

					whiptail --title "$RSYNC_MODE_TEXT failed" --msgbox "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM does not exist\n\nHave you created a backup?" --backtitle "$WHIP_BACKTITLE" 11 70

				fi

			#Error: Rsync is already running
			elif (( $(ps aux | grep -ci -m1 "[r]sync") == 1 )); then

				Error_Rsync_Already_Running

			#Restore
			else

				#Generate Exclude/Include lists
				Create_Filter_Include_Exclude

				Services_Stop

				G_DIETPI-NOTIFY 2 "Restoring from: $FP_TARGET_BACKUP"

				BACKUP_RESTORE_FAILED=0

				while true
				do

					# - System
					RSYNC_MODE_TEXT='Restore (system)'

					rsync $RSYNC_RUN_OPTIONS_SYSTEM_BACKUP "$FP_TARGET_BACKUP"/dietpi-backup_system/ "$FP_SOURCE_SYSTEM"
					if (( $? == 0 )); then

						G_DIETPI-NOTIFY 0 "$RSYNC_MODE_TEXT Completed.\n"
						echo -e "$RSYNC_MODE_TEXT Completed    : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"

					else

						G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT FAILED.\n"
						echo -e "$RSYNC_MODE_TEXT FAILED       : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_SYSTEM"
						BACKUP_RESTORE_FAILED=1
						break

					fi

					# - User data
					RSYNC_MODE_TEXT='Restore (user data)'

					if (( $BACKUP_MODE == 1 )); then

						# - Only restore userdata if a backup exists
						if [ -f "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA" ]; then

							rsync $RSYNC_RUN_OPTIONS_USERDATA_BACKUP "$FP_TARGET_BACKUP"/dietpi-backup_userdata/ "$G_FP_DIETPI_USERDATA_ACTUAL"/
							if (( $? == 0 )); then

								G_DIETPI-NOTIFY 0 "$RSYNC_MODE_TEXT Completed.\n"
								echo -e "$RSYNC_MODE_TEXT Completed : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA"

							else

								G_DIETPI-NOTIFY 1 "$RSYNC_MODE_TEXT FAILED.\n"
								echo -e "$RSYNC_MODE_TEXT FAILED    : $(Print_Date)" >> "$FP_TARGET_BACKUP/$BACKUP_STATS_FILENAME_USERDATA"
								BACKUP_RESTORE_FAILED=1
								break

							fi

						else

							G_DIETPI-NOTIFY 2 "$RSYNC_MODE_TEXT: No backup exists, skipping...\n"

						fi

					fi

					# - done
					break

				done

				if (( $BACKUP_RESTORE_FAILED )); then

					Error_Rsync_Failed

				else

					if (( $G_USER_INPUTS )); then

						RSYNC_MODE_TEXT='Restore'
						whiptail --title "$RSYNC_MODE_TEXT completed" --msgbox "$RSYNC_MODE_TEXT completed from:\n$FP_TARGET_BACKUP\n\nLog file: $LOGFILE\n\nA Reboot is required." --backtitle "$WHIP_BACKTITLE" 13 60

					fi

				fi

				Services_Start

				#return to main menu
				TARGETMENUID=0

			fi

		fi

	}

	Check_Install_PreReqs(){

		G_AG_CHECK_INSTALL_PREREQ rsync

	}

	Check_Supported_Directory_Location(){

		TARGET_DIRECTORY_SUPPORTED=0

		#Disallow dietpi_userdata location, due to includes in that location
		if [[ "$FP_TARGET_BACKUP" == "$G_FP_DIETPI_USERDATA"* ]] || [[ "$FP_TARGET_BACKUP" == "$G_FP_DIETPI_USERDATA_ACTUAL"* ]] ; then

			Error_DietpiUserdata_Directory

		#Check location contains /mnt/
		elif [[ "$FP_TARGET_BACKUP" == "/mnt/"* ]]; then

			#Generate the target directory if it doesnt exist. So we can check what filesystem it will be.
			local directory_generated=0
			if [ ! -d "$FP_TARGET_BACKUP" ]; then

				mkdir -p "$FP_TARGET_BACKUP"
				directory_generated=1

			fi

			TARGET_FILESYSTEM_TYPE="$( df -T $FP_TARGET_BACKUP | sed -n '2p' | awk '{print $2}')"
			for ((i=0; i<${#aSUPPORTED_FILESYSTEMS[@]}; i++))
			do

				if [ "$TARGET_FILESYSTEM_TYPE" = "${aSUPPORTED_FILESYSTEMS[$i]}" ]; then

					TARGET_DIRECTORY_SUPPORTED=1
					break

				fi

			done

			#Delete directory if tested
			if (( $directory_generated == 1 )); then

				rm -R "$FP_TARGET_BACKUP"

			fi

			#Not ext2/3/4
			if (( $TARGET_DIRECTORY_SUPPORTED == 0 )); then

				Error_Filesystem_Not_Supported

			fi

		#Not inside /mnt
		else

			Error_Not_Mnt_Directory

		fi

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Settings File
	#/////////////////////////////////////////////////////////////////////////////////////
	#Settings File
	FP_DIETPIBACKUP_SETTINGS="/DietPi/dietpi/.dietpi-backup_settings"

	Write_Settings_File(){

		cat << _EOF_ > "$FP_DIETPIBACKUP_SETTINGS"
FP_TARGET_BACKUP=$FP_TARGET_BACKUP
BACKUP_MODE=$BACKUP_MODE
_EOF_

	}

	Read_Settings_File(){

		if [ -f "$FP_DIETPIBACKUP_SETTINGS" ]; then

			. "$FP_DIETPIBACKUP_SETTINGS"

		fi

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Main Loop
	#/////////////////////////////////////////////////////////////////////////////////////

	#pre-reqs, install if required.
	Check_Install_PreReqs

	#Read settings file
	Read_Settings_File

	# $2 Optional directory input.
	if [ -n "$2" ]; then

		FP_TARGET_BACKUP=$2

	fi

	#-----------------------------------------------------------------------------
	#Run Backup
	if (( $INPUT == 1 )); then

		Run_Backup

	#Run Restore
	elif (( $INPUT == -1 )); then

		Run_Restore

	#-----------------------------------------------------------------------------
	#Run menu
	elif (( $INPUT == 0 )); then

		while (( $TARGETMENUID > -1 )); do

			clear

			if (( $TARGETMENUID == 0 )); then

				Menu_Main

			elif (( $TARGETMENUID == 1 )); then

				Menu_Set_Directory

			fi

		done

		#Save settings
		Write_Settings_File
	fi

	#-----------------------------------------------------------------------------------
	#Cleaup left over tmp files
	rm "$FP_FILTER_INCLUDE_EXCLUDE_SYSTEM_BACKUP" &> /dev/null
	#-----------------------------------------------------------------------------------
	#delete[] array
	unset aSUPPORTED_FILESYSTEMS
	#-----------------------------------------------------------------------------------
	exit 0
	#-----------------------------------------------------------------------------------
}