Rsync System Backup


rsysy-backup = Rsync System Backup

Shell-Script rsysy-backup.sh erstellen
nano /usr/local/bin/rsysy-backup.sh

/usr/local/bin/rsysy-backup.sh

#!/bin/bash

PN="rsysy"
PV="0.4.1"
P="$PN"-v"$PV"

#### Function ####

print_usage() {
echo -e "\e[0m"
cat <<EOF
 $P
 Usage: $PN [options] [configuration file]
 Options:
  -h    print this help
  -n    do not compress
  -p    compress with password (not yet implemented)
EOF
echo -e "\e[0;31m The options -p and -n can not be set at the same time!"
echo -e "\e[0m Example: /usr/local/bin/rsysy -p /home/username/config_file\n"
exit 1
}

clean_rsysy_dir() {
	echo -e "\e[32m * Removing backup directory $rsysy_dir"
	rm -rf $rsysy_dir
}

check_rsysy_conf() {
	echo -e "\e[32m * Creating backup directory $rsysy_dir"
	mkdir -p $rsysy_dir

	# remove lines beginning with # or whitespaces 
	echo -e "\e[32m * Reading $rsysy_conf_user"
	egrep -v "^\s*$|^#" $rsysy_conf_user > $rsysy_conf

	# read $rsys_conf and check if file or directory exist
	while read line; do
		if [[ "$line" == "+"* || "$line" == "-"* ]]; then
         line2=${line:1}
         if [ ! -e $line2 ]; then
            echo " File or directory does not exist: $line2" >> $rsysy_conf_error
				echo "  line must be an absolute path in $rsysy_conf_user" >> $rsysy_conf_error
				echo "  for example: +/etc/dhcpcd" >> $rsysy_conf_error
         else
            if [[ "$line" == "+"* ]]; then
               echo $line2 >> $rsync_include
            elif [[ "$line" == "-"* ]]; then
               echo $line2 >> $rsync_exclude
				fi
			fi
		else
			echo " Syntax failure in $rsysy_conf_user: =>$line" >> $rsysy_conf_error
			echo "  line can only start with '#', '+' or '-'" >> $rsysy_conf_error
		fi
   done <$rsysy_conf

	# are errors occurd, point the user to the problem and exit
	if [ -f $rsysy_conf_error ]; then
		echo ""
		echo -e "\e[1;31m *ERROR* There are failures in your file $rsysy_conf_user!\n"
		cat $rsysy_conf_error
		clean_rsysy_dir
		echo ""
		echo -e "\e[1;35m* Stopped\n"
		exit 1
	fi

	# if nothing to rsync inform the user an exit
	if [ ! -f $rsync_include ]; then
		echo -e "\e[1;31m *ERROR* Nothing to backup! Check your configuration file $rsysy_conf_user.\n"
		clean_rsysy_dir
		echo ""
		echo -e "\e[1;35m* Stopped\n"
		exit 1
	fi

	# include rsysy.sh and file $rsysy_conf_user in backup
   echo "$0" >> $rsync_include
   echo "$rsysy_conf_user" >> $rsync_include
}

backup_data() {
	mkdir $rsysy_backup
	echo -e "\e[1;32m * Starting backup data"
	echo -en "\e[1;32m  * rsync "
	[ -f $rsync_exclude ] && EXCLUDE="--exclude-from=$rsync_exclude"
	rsync --archive --recursive --files-from=$rsync_include $EXCLUDE / $rsysy_backup 2>> $rsync_error
   echo -e "\e[1;32m finshed"

	if [ -s $rsync_error ]; then
		cp $rsync_error $rsysy_backup
		echo -e "\e[1;31m  *ERROR* There are failures from rsync command!"
		counter=0
		while read line; do
			counter=$((counter+1))
			echo -e "\e[0m  # $line"
			[ $counter -eq 10 ] && echo -e "\e[0m  # ... and more ..." && break
		done <$rsync_error
	fi

	# tar with compression or no compression
	if [[ $COMPRESS = "no" ]]; then
	   echo -en "\e[1;32m  * tar without compression "
   	tar cf $backup_file -C $rsysy_backup .
	else
		backup_file="$backup_file".gz
	   echo -en "\e[1;32m  * tar with comrpession "
   	tar cfz $backup_file -C $rsysy_backup .
		#tar --create --file - --posix --gzip -- $rbbackup | openssl enc -e -aes256 -out $rbfile
	fi
	echo -e "\e[32m finished"

	clean_rsysy_dir
	echo ""
	echo -e "\e[1;32mYour backup file is located as $backup_file\n"
}



#### Main ####

# check for necessary tools
echo ""
echo -e "\e[1;35m* Running $P\n"
if [ ! -x /usr/bin/rsync ]; then
   echo -e "\e[1;31m *ERROR* Please install rsync with your package manager!\n"
	echo -e "\e[1;35m* Stopped\n"
   exit 1
fi
if [ ! -x /bin/egrep ]; then
   echo -e "\e[1;31m *ERROR* Please install grep with your package manager!\n"
	echo -e "\e[1;35m* Stopped\n"
   exit 1
fi

# default settings
COMPRESS="yes"
PASSWORD="no"

rsysy_string=`hostname`_`date +"%Y%m%d_%H-%M-%S"`

# default path configuration
rsysy_dir=/tmp/rsysy
rsysy_backup=$rsysy_dir/backup
rsysy_conf=$rsysy_dir/rsysy_conf
rsysy_conf_error=$rsysy_dir/rsysy_conf_error
rsync_include=$rsysy_dir/rsync_include
rsync_exclude=$rsysy_dir/rsync_exclude
rsync_error=$rsysy_dir/rsync_error
backup_file=/tmp/rsysy-backup_$rsysy_string.tar

# get options and the user configuration for rsysy
while getopts :nph option; do
   case "$option" in
      n) COMPRESS="no"
         ;;
      p) PASSWORD="yes"
			# not supported at the moment, so print usage and exit
			print_usage
         ;;
      h) print_usage
         ;;
      \?) echo -e "\e[1;31m *ERROR* Invalid option -$OPTARG!\n"
			 print_usage
         ;;
   esac
done
shift $(($OPTIND-1))
rsysy_conf_user="$1"

if [[ $COMPRESS == "n" && $PASSWORD == "y" ]]; then
   print_usage
fi

if [ -z $rsysy_conf_user ]; then
   echo -e "\e[1;31m *ERROR* Please specify a file with your files and directories to backup!\n"
	echo -e "\e[1;35m* Stopped\n"
   exit 1
elif [ ! -f $rsysy_conf_user ]; then
   echo -e "\e[1;31m *ERROR* File $rsysy_conf_user does not exist!\n"
	echo -e "\e[1;35m* Stopped\n"
   exit 1
fi

check_rsysy_conf

backup_data

echo -e "\e[1;35m* Finsh\n"

die Konfiguartionsdatei erstellen, zum Beispiel im Home-Verzeichnis
nano /home/username/rsysy-backup.conf

/home/username/rsysy-backup.conf

# System
+/etc
-/etc/X11

# Boot
+/boot
-/boot/grub/

# Home
+/home/useranme/
-/home/username/unimportant_directory

  • # comment
  • + include in backup
  • - exclude from backup

rsysy-backup.sh ausführen
/usr/local/bin/rsysy-backup.sh /home/michael/rsysy-backup.conf

/usr/local/bin/rsysy-backup.sh /home/michael/rsysy-backup.conf

* Running rsysy-v0.4.1

 * Creating backup directory /tmp/rsysy
 * Reading /home/michael/rsysy_backup.conf
 * Starting backup data
  * rsync  finshed
  * tar with comrpession  finished
 * Removing backup directory /tmp/rsysy

Your backup file is located as /tmp/rsysy-backup_zero_20150602_18-52-07.tar.gz

* Finsh