270 lines
9.9 KiB
Bash
Executable File
270 lines
9.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Author: xXx
|
|
# Purpose: Automate the process of backing up internal storage.
|
|
# Date: 4 Jan 2017 20:22:00 EET
|
|
###############################################################################
|
|
# Update: 5 Jan 2017 19:48:00 EET #
|
|
# Reason: Added support for when the user have started his machine #
|
|
# from USB. Now the right source and destination should be selected. #
|
|
# Added support for uncompressed images. #
|
|
# Added detection if the user runs already from emmc. #
|
|
###############################################################################
|
|
# Update: 6 Jan 2017 21:43:00 EET #
|
|
# Reason: Added functionality to restore images that this program creates. #
|
|
###############################################################################
|
|
# Update: 8 Mar 2017 18:30:00 EET #
|
|
# Reason: Changed yellow color to cyan for white backround terminals. #
|
|
###############################################################################
|
|
# Update: 8 Mar 2017 18:52:00 EET #
|
|
# Reason: Changed backup/restore dir to /ddbr as installer excludes this dir. #
|
|
###############################################################################
|
|
# Update: 12 Mar 2017 10:47:00 EET #
|
|
# Reason: Added the ability for the user to continue with compressed backup #
|
|
# only, and at his/her own risk, in case of lesser free space on the drive. #
|
|
# Tried to annoy the user with questions, in order to discourage him/her. #
|
|
###############################################################################
|
|
# Update: 12 Mar 2017 13:02:00 EET #
|
|
# Reason: Separated backup and restore dialogs for better handling of the #
|
|
# various situations for the program itself. Now the program ask first if a #
|
|
# backup or restore is wanted, and skips/adds some checks accordingly. #
|
|
# There should be no stops now, if a restore only wanted, and the free space #
|
|
# was too low, as this is irrelevant to the requested function. #
|
|
###############################################################################
|
|
# Update: 12 Mar 2017 16:08:00 EET #
|
|
# Reason: The program can now accept an argument for PowerUsers. #
|
|
# This argument can only be a directory, and must exists before calling the #
|
|
# program. This mode is dangerous, and most users will not need this mode, as #
|
|
# great damages can be done to your system if you use it incorrectly. #
|
|
# The argument is really the backup/restore directory that now can be forced #
|
|
# by the user, to bypass the programs checks, always at his/her own risk. #
|
|
###############################################################################
|
|
# Update: 12 Mar 2017 16:32:00 EET #
|
|
# Reason: Code cleaning. As the program have become very complex already, a #
|
|
# cleaner code was mandatory, in order to keep it safe and maintainable. If i #
|
|
# am to kill any bugs below these lines, i should be able to spot them first. #
|
|
###############################################################################
|
|
# Update: 13 Mar 2017 11:52:00 EET #
|
|
# Reason: Squashed some small bugs when running on normal Linux desktops that #
|
|
# have no EMMC or SDCARDS installed. And some more code cleaning. #
|
|
###############################################################################
|
|
# Update: 13 Mar 2017 12:40:00 EET #
|
|
# Reason: Changed the messages to darker colors for better compatibility with #
|
|
# white background terminals. Only the red color is now bright for emphasis. #
|
|
###############################################################################
|
|
|
|
_r=$(tput bold && tput setaf 1)
|
|
_g=$(tput setaf 2)
|
|
_b=$(tput setaf 4)
|
|
_c=$(tput setaf 6)
|
|
_x=$(tput sgr0)
|
|
|
|
[ $(whoami) != root ] && echo "$_r Please run this program as root""$_x" && exit 1
|
|
|
|
OUTDIR=$1
|
|
|
|
if [ "$OUTDIR" = "" ]
|
|
then
|
|
OUTDIR="/ddbr"
|
|
[ ! -d /ddbr ] && mkdir -p /ddbr
|
|
else
|
|
OUTDIR=$(echo "$OUTDIR" | sed "s,/\+$,,")
|
|
echo "$_b ARGUMENT MODE DETECTED. YOU HAVE BEEN WARNED!!! $_x"
|
|
echo "$_b NO IN/OUT SIZE CHECKS WILL BE PERFORMED IN THIS MODE. $_x"
|
|
echo "$_b YOU ARE USING THIS MODE AT YOUR OWN RISK!!! $_x"
|
|
if [ ! -d "$OUTDIR" ]
|
|
then
|
|
echo "$_r IN ARGUMENT MODE THE OUT/IN DIRECTORY MUST PRE-EXIST $_x"
|
|
echo "$_r AND IT IS BETTER TO BE ON AN MOUNTED EXTERNAL DRIVE. $_x"
|
|
echo "$_r PROGRAM EXITED DUE TO ERROR: NO DIR $OUTDIR $_x"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
dobackup(){
|
|
echo $_c" DO YOU WANT COMPRESSION ? "$_x
|
|
while true
|
|
read -p " "$_b"YES=("$_c"y"$_b") NO=("$_c"n"$_b")"$_x" " yn
|
|
do
|
|
case $yn in
|
|
y)
|
|
COMPRESS=TRUE
|
|
break;;
|
|
n)
|
|
COMPRESS=FALSE
|
|
break;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
if [ "$COMPRESS" = "TRUE" ]
|
|
then
|
|
echo "$_b SAVING AND COMPRESSING "$_g"$emmc"$_b" TO "$_g"$OUTDIR/$image.gz"$_x"..."
|
|
dd if=/dev/$emmc | pv -s $intsize"K" | gzip > $OUTDIR/$image.gz
|
|
finish
|
|
else
|
|
echo "$_b SAVING "$_g"$emmc"$_b" TO "$_g"$OUTDIR/$image"$_x"..."
|
|
dd if=/dev/$emmc | pv -s $intsize"K" | dd of=$OUTDIR/$image
|
|
finish
|
|
fi
|
|
}
|
|
|
|
dorestore(){
|
|
echo $_c" DID YOU USED COMPRESSION WHEN YOU TOOK THE BACKUP ? "$_x
|
|
while true
|
|
read -p " "$_b"YES=("$_c"y"$_b") NO=("$_c"n"$_b")"$_x" " yn
|
|
do
|
|
case $yn in
|
|
y)
|
|
COMPRESS=TRUE
|
|
break;;
|
|
n)
|
|
COMPRESS=FALSE
|
|
break;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
if [ "$COMPRESS" = "TRUE" ]
|
|
then
|
|
[ ! -f $OUTDIR/$image.gz ] && echo "$_r NO IMAGE FOUND. MAKE SURE YOU HAVE MADE A BACKUP FIRST."$_x"" && exit 1
|
|
echo "$_c YOU ARE ABOUT TO MAKE SERIOUS CHANGES TO YOUR SYSTEM!!!"
|
|
echo " FILE "$_g"$OUTDIR/$image.gz"$_c" IS GOING TO BE WRITEN TO "$_g"$emmc"$_c" "
|
|
echo " MAKE SURE EVERYTHING LOOKS OK AND:"
|
|
read -p " PRESS ENTER TO CONTINUE OR CTRL+C TO CANCEL $_x" blah
|
|
echo $_b" RESTORING $OUTDIR/$image.gz TO /dev/$emmc | PLEASE WAIT..."$_x
|
|
gunzip -c $OUTDIR/$image.gz | pv -s $intsize"K" | dd of=/dev/$emmc
|
|
finish
|
|
else
|
|
[ ! -f $OUTDIR/$image ] && echo "$_r NO IMAGE FOUND. MAKE SURE YOU HAVE MADE A BACKUP FIRST."$_x"" && exit 1
|
|
echo "$_c YOU ARE ABOUT TO MAKE SERIOUS CHANGES TO YOUR SYSTEM!!!"
|
|
echo " FILE "$_g"$OUTDIR/$image"$_c" IS GOING TO BE WRITEN TO "$_g"$emmc"$_c" "
|
|
echo " MAKE SURE EVERYTHING LOOKS OK AND:"
|
|
read -p " PRESS ENTER TO CONTINUE OR CTRL+C TO CANCEL $_x" blah
|
|
echo $_b" RESTORING $OUTDIR/$image TO /dev/$emmc | PLEASE WAIT..."$_x
|
|
dd if=$OUTDIR/$image | pv -s $intsize"K" | dd of=/dev/$emmc
|
|
finish
|
|
fi
|
|
}
|
|
|
|
compress(){
|
|
echo "$_c YOU ARE IN FORCED COMPRESSION MODE!!! $_x"
|
|
echo " THIS MODE CAN BE FROM DANGEROUS TO DESTRUCTIVE FOR YOUR $runfrom DRIVE"
|
|
echo " IF THE COMPRESSED BACKUP GROW BIGGER THAN THE FREE SPACE ON THE DRIVE"
|
|
echo " BAD THINGS MAY HAPPEN TO YOUR CURRENTLY RUNNING DRIVE $runfrom"
|
|
echo " IT IS BETTER TO USE A DRIVE WITH PLENTY OF SPACE FOR BACKING UP EMMC"
|
|
echo " BY PRESSING ENTER YOU ARE CONTINUING AT YOUR OWN RISK!!!"
|
|
read -p " CTRL+C to QUIT | ENTER TO CONTINUE " null
|
|
while true
|
|
read -p " "$_b"ARE YOU SURE? YES=("$_c"y"$_b") NO=("$_c"n"$_b")"$_x" " YN
|
|
do
|
|
case $YN in
|
|
y)
|
|
break;;
|
|
n)
|
|
exit 1
|
|
break;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
echo "$_b SAVING AND COMPRESSING "$_g"$emmc"$_b" TO "$_g"$OUTDIR/$image.gz"$_x"..."
|
|
dd if=/dev/$emmc | pv -s $intsize"K" | gzip > $OUTDIR/$image.gz
|
|
finish
|
|
}
|
|
|
|
finish(){
|
|
echo "$_g JOB FINISHED!"$_x""
|
|
exit 0
|
|
}
|
|
|
|
echo "$_c DO YOU WANT TO BACKUP OR RESTORE ? "$_x""
|
|
while true
|
|
read -p " "$_b"BACKUP=("$_c"b"$_b") RESTORE=("$_c"r"$_b")"$_x" " br
|
|
do
|
|
case $br in
|
|
b)
|
|
wantsbackup=true
|
|
break;;
|
|
r)
|
|
wantsbackup=false
|
|
break;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
|
|
### COMMON CHECKS / VARIABLES CREATION / INFO GATHERING
|
|
|
|
hasdrives=$(lsblk | grep -oE '(mmcblk[0-9])' | sort | uniq)
|
|
if [ "$hasdrives" = "" ]
|
|
then
|
|
echo "$_r UNABLE TO FIND ANY EMMC OR SD DRIVES ON THIS SYSTEM!!! $_x"
|
|
exit 1
|
|
fi
|
|
avail=$(lsblk | grep -oE '(mmcblk[0-9]|sda[0-9])' | sort | uniq)
|
|
if [ "$avail" = "" ]
|
|
then
|
|
echo "$_r UNABLE TO FIND ANY DRIVES ON THIS SYSTEM!!! $_x"
|
|
exit 1
|
|
fi
|
|
runfrom=$(lsblk | grep / | grep -oE '(mmcblk[0-9]|sda[0-9])')
|
|
if [ "$runfrom" = "" ]
|
|
then
|
|
echo "$_r UNABLE TO FIND ROOT OF THE RUNNING SYSTEM!!! $_x"
|
|
exit 1
|
|
fi
|
|
emmc=$(echo $avail | sed "s/$runfrom//" | sed "s/sd[a-z][0-9]//g" | sed "s/ //g")
|
|
if [ "$emmc" = "" ]
|
|
then
|
|
echo "$_r UNABLE TO FIND YOUR EMMC DRIVE "$_c"OR"$_r" YOU ALREADY RUN FROM EMMC!!! $_x"
|
|
exit 1
|
|
fi
|
|
if [ "$runfrom" = "$avail" ]
|
|
then
|
|
echo "$_r YOU ARE RUNNING ALREADY FROM EMMC!!! $_x"
|
|
exit 1
|
|
fi
|
|
if [ $runfrom = $emmc ]
|
|
then
|
|
echo "$_r YOU ARE RUNNING ALREADY FROM EMMC!!! $_x"
|
|
exit 1
|
|
fi
|
|
if [ "$(echo $emmc | grep mmcblk)" = "" ]
|
|
then
|
|
echo "$_r YOU DO NOT APPEAR TO HAVE AN EMMC DRIVE!!! $_x"
|
|
exit 1
|
|
fi
|
|
intsize=$(fdisk -s /dev/$emmc)
|
|
#image=$(echo $(grep -E '(Hardware|Revision)' /proc/cpuinfo | awk '{print $3}') | sed "s/ /-/g")-emmc.img
|
|
image=BACKUP-arm-64-emmc.img
|
|
|
|
### BACKUP ONLY CHECKS
|
|
|
|
if [ "$wantsbackup" = true ]
|
|
then
|
|
rootfree=$(df | grep /$ | awk '{print $4}')
|
|
[ $rootfree -le $intsize ] && echo -e "$_r NOT ENOUGH FREE SPACE! \n FORCING COMPRESSION MODE $_x" && compress=true
|
|
else
|
|
echo "$_b AVAILABLE DEVICES: "$_g"$(echo $avail)""$_x"
|
|
echo "$_b YOU ARE RUNNING "$_g"$(lsb_release -c | awk '{print $2}')"$_b" FROM "$_g"$runfrom""$_x"
|
|
dorestore
|
|
fi
|
|
|
|
echo "$_b AVAILABLE DEVICES: "$_g"$(echo $avail)""$_x"
|
|
echo "$_b YOU ARE RUNNING "$_g"$(lsb_release -c | awk '{print $2}')"$_b" FROM "$_g"$runfrom""$_x"
|
|
|
|
if [ $(echo $intsize | sed "s/ //g" | wc -c) -le 7 ]
|
|
then
|
|
echo -e "$_b INTERNAL EMMC IS: "$_g"$emmc"$_b" SIZE:\t"$_g"$intsize""$_x"
|
|
else
|
|
echo -e "$_b INTERNAL EMMC IS: "$_g"$emmc"$_b" SIZE:\t"$_g"$intsize""$_x"
|
|
fi
|
|
|
|
if [ $(echo $rootfree | sed "s/ //g" | wc -c) -le 7 ]
|
|
then
|
|
echo -e "$_b ROOT ($runfrom) FREE SPACE IS:\t\t\t"$_g"$rootfree""$_x"
|
|
else
|
|
echo -e "$_b ROOT ($runfrom) FREE SPACE IS:\t\t"$_g"$rootfree""$_x"
|
|
fi
|
|
[ "$compress" = "true" ] && compress || dobackup
|