#!/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 #----------------------------------------------------------------------------------- }