Browse Source

Added new method 'update only'.

grigruss 2 years ago
parent
commit
cf73ab4c84
4 changed files with 109 additions and 20 deletions
  1. 10 2
      README.md
  2. 3 0
      backup.cfg
  3. 80 18
      backup.sh
  4. 16 0
      test

+ 10 - 2
README.md

@@ -10,9 +10,13 @@ Download scripts archive, extract, enter to extracted directory and run `sudo ma
 
 Answer correct on the questions. You must set exist paths of remote computer! It's important!
 
-After that you can see task string for the remote computer, or you can copy script ./clearbckp.sh to remote computer and add a task for cron.
+If You choice only updates, You should not adding task for cron on the remote computer.
+
+Else, You can see task string for the remote computer, or you can copy script ./clearbckp.sh to remote computer and add a task for cron.
 
 ## on remote computer
+If You choice full archive:
+
 * Add task
 * Restart cron: `systemctl restart cron`
 
@@ -27,9 +31,13 @@ Run `sudo make uninstall` in source directory.
 
 Правильно ответьте на вопросы скрипта. Укажите существующие пути на удалённой машине! Это очень важно!
 
-После этого вы увидите строку для включения в cron на удалённом компе, или можете скопировать ./clearbckp.sh на удалённый комп и добавить задачу с ним.
+Если вы выбрали только изменения, не следует добавлять задачу в cron на удалённом компе.
+
+Иначе вы увидите строку для включения в cron на удалённом компе, или можете скопировать ./clearbckp.sh на удалённый комп и добавить задачу с ним.
 
 ## на удалённом компе
+Если выбрали полный архив:
+
 * Добавьте задачу в cron
 * Перезапустите cron: `systemctl restart cron`
 

+ 3 - 0
backup.cfg

@@ -14,3 +14,6 @@ TMPDIR="/tmp"
 
 # Целевые пути, т.е. то, что бекапим. Можно несколько путей через пробел.
 TARGETS="/var/www"
+
+# Способ архивации. Полными архивами - 1, последними изменениями - 2
+TARCHS="1"

+ 80 - 18
backup.sh

@@ -13,6 +13,7 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	read -r REMOTEUSER
 	if [[ -z "$REMOTEUSER" ]]; then
 	        echo -e "\\e[33;1mWRONG! Run script again and type login correct!\\[0m"
+	        exit
 	fi
 	if [[ $LANG == "ru_RU.UTF-8" ]]; then
 		echo "Укажите имя удалённой машины или IP-адрес:"
@@ -22,6 +23,7 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	read -r REMOTEHOST
 	if [[ -z "$REMOTEHOST" ]]; then
 	        echo -e "\\e[33;1mWRONG! Run script again and type remote host correct!\\[0m"
+	        exit
 	fi
 	if [[ $LANG == "ru_RU.UTF-8" ]]; then
 		echo "Укажите путь для бекапов на удалённой машине [/home/$REMOTEUSER/backups/]:"
@@ -32,15 +34,6 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	if [[ -z "$REMOTEPATH" ]]; then
 	        REMOTEPATH="/home/$REMOTEUSER/backups/"
 	fi
-	if [[ $LANG == "ru_RU.UTF-8" ]]; then
-		echo "Укажите существующий путь для скрипта clearbckp.sh на удалённой машине [/home/$REMOTEUSER/bin/]:"
-	else
-		echo "Type exists path for clearbckp.sh on the remote computer [/home/$REMOTEUSER/bin/]:"
-	fi
-	read -r RPATH
-	if [[ -z "$RPATH" ]]; then
-	        RPATH="/home/$REMOTEUSER/bin"
-	fi
 	if [[ $LANG == "ru_RU.UTF-8" ]]; then
 		echo "Укажите абсолютные пути к файлам и директориям, которые нужно бекапить, через пробел [Пример: /var/www/ /etc/apache2/sites-avialable]:"
 	else
@@ -49,7 +42,38 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	read -r TARGETS
 	if [[ -z "$TARGETS" ]]; then
 	        echo -e "\\e[33;1mWRONG! You must type some paths for backup! Run again.\\e[0m"
+	        exit
+	fi
+	if [[ $LANG == "ru_RU.UTF-8" ]]; then
+		echo "Как вы хотите создавать бекапы?
+		1. Полный архив
+		2. Только изменения за последние сутки
+Введите порядковый номер [default: 1]:"
+	else
+		echo "Choice method for creating backup
+		1. Full archive
+		2. Only updates
+Type the number [default: 1]:"
+	fi
+	read -rn 1 TARCHS
+	if [[ -z $TARCHS ]]; then
+		TARCHS=1
+	elif [[ $TARCHS != "1" && $TARCHS != "2" ]]; then
+		echo -e "\\e[31;1mWRONG! You must specify the number 1 or 2! Run again.\\e[0m"
+		exit
+	fi
+	if [[ $TARCHS == "1" ]]; then
+		if [[ $LANG == "ru_RU.UTF-8" ]]; then
+			echo "Укажите существующий путь для скрипта clearbckp.sh на удалённой машине [/home/$REMOTEUSER/bin/]:"
+		else
+			echo "Type exists path for clearbckp.sh on the remote computer [/home/$REMOTEUSER/bin/]:"
+		fi
+		read -r RPATH
+		if [[ -z "$RPATH" ]]; then
+			RPATH="/home/$REMOTEUSER/bin"
+		fi
 	fi
+
 	if [[ ! -f "$HOME/.ssh/id_rsa.pub" ]]; then
 	# Generate ssh-key for connect to remote computer
 	        ssh-keygen -t rsa
@@ -59,16 +83,33 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	scp "$HOME/.ssh/id_rsa.pub" "$REMOTEUSER@$REMOTEHOST:/home/$REMOTEUSER/.ssh/authorized_keys"
 	
 	# Change params into scripts
-	sed -i "s%REMOTEUSER=\"user\"%REMOTEUSER=\"$REMOTEUSER\"%; s%REMOTEHOST=\"example.com\"%REMOTEHOST=\"$REMOTEHOST\"%; s%REMOTEPATH=\"/home/backupsdir/\"%REMOTEPATH=\"$REMOTEPATH\"%; s%TARGETS=\"/var/www\"%TARGETS=\"$TARGETS\"%" /usr/local/etc/backup.sh/backup.cfg
-	{
-		echo '#!/bin/bash'
-		echo "find ${REMOTEPATH}* -mtime +7 -exec rm {} \\;"
-	} >> clearbckp.sh
+	sed -i "s%REMOTEUSER=\"user\"%REMOTEUSER=\"$REMOTEUSER\"%; s%REMOTEHOST=\"example.com\"%REMOTEHOST=\"$REMOTEHOST\"%; s%REMOTEPATH=\"/home/backupsdir/\"%REMOTEPATH=\"$REMOTEPATH\"%; s%TARGETS=\"/var/www\"%TARGETS=\"$TARGETS\"%; s%TARCHS=\"1\"%TARCHS=\"$TARCHS\"%" /usr/local/etc/backup.sh/backup.cfg
+	if [[ $TARCHS == "1" ]]; then
+		{
+			echo '#!/bin/bash'
+			echo "find ${REMOTEPATH}* -mtime +7 -exec rm {} \\;"
+		} >> clearbckp.sh
+		chmod +x clearbckp.sh
+		scp -B clearbckp.sh "$REMOTEUSER@$REMOTEHOST:$RPATH"
+		rm -f clearbckp.sh
+		echo -e "\\e[32;1mScript clearbckp.sh copyed on the remote computer to $RPATH\\e[0m"
+	fi
 	echo '#!/bin/bash' > /etc/cron.daily/backup_sh
 	{
-		echo "source <(grep = /usr/etc/backup.sh/backup.cfg)"
+		echo "source <(grep = /usr/local/etc/backup.sh/backup.cfg)"
 		echo "d=\$(date +%F)"
-		echo "tar -cvf - \$TARGETS | xz -9 --threads=0 - > \"${d}backup.tar.xz\""
+		echo "if [[ \$TARCHS == \"1\" ]]; then"
+		echo "	tar -cvf - \$TARGETS | xz -9 --threads=0 - > \"\$TMPDIR/\${d}backup.tar.xz\""
+		echo "else"
+		echo "	LIST=\"\""
+		echo "	for i in \$TARGETS"
+		echo "	do"
+		echo "		L=\$(find \"\$i\" -type f -mtime -1)"
+		echo "		LIST=\"\$LIST"
+		echo "\$L\""
+		echo "	done"
+		echo "	tar -cvf - \$LIST | xz -9 --threads=0 - > \"\$TMPDIR/\${d}backup.tar.xz\""
+		echo "fi"
 		echo "scp -B \"\$TMPDIR/\${d}backup.tar.xz\" \"$REMOTEUSER@$REMOTEHOST:$REMOTEPATH\""
 		echo "rm -f \"\$TMPDIR/\${d}backup.tar.xz\""
 	} >> /etc/cron.daily/backup_sh
@@ -81,8 +122,14 @@ if [[ $1 == "-c" || $1 == "--config" ]]; then
 	else
 		echo -e "\\e[31;1mWarning! You must restart cron!\n\\e[0m"
 	fi
-	echo -e "\\e[32;1mAdd crontab task on the remote computer like that:\n\\e[31;1m	0 1 * * * find $REMOTEPATH -mtime +7 -exec rm {} \\;\n\\e[32;1mOr copy file ./clearbckp.sh on the remote computer and add to crontab tasks.\\e[0m\n\n"
+	if [[ $TARCHS == "1" ]]; then
+		echo -e "\\e[32;1mAdd crontab task on the remote computer like that:\n\\e[31;1m	0 1 * * * find $REMOTEPATH -mtime +7 -exec rm {} \\;\n\\e[32;1mOr copy file ./clearbckp.sh on the remote computer and add to crontab tasks.\\e[0m\n\n"
+	else
+		echo "On the remote computer you not need delete any archives. You should not adding task for cron."
+	fi
 	exit
+elif [[ $1 == "-f" || $1 == "--first" ]]; then
+	tar -cvf - "$TARGETS" | xz -9 --threads=0 - > "first-backup.tar.xz"
 elif [[ ! -z $1 ]]; then
 	echo "Usage: backup.sh -c
 	backup.sh --config
@@ -92,10 +139,25 @@ elif [[ ! -z $1 ]]; then
 else
 # Загоняем текущую дату в переменную
 	d=$(date +%F)
+	if [[ $TARCHS == "1" ]]; then
 # Упаковываем файлы и прочее в TAR и XZ с максимальным сжатием
-	tar -cvf - "$TARGETS" | xz -9 --threads=0 - > "${d}backup.tar.xz"
+		tar -cvf - "$TARGETS" | xz -9 --threads=0 - > "$TMPDIR/${d}backup.tar.xz"
+# Отправляем на удалённую машину
+	elif [[ $TARCHS == "2" ]];then
+		LIST=""
+		for i in $TARGETS
+		do
+			L=$(find "$i" -type f -mtime -1)
+			LIST="$LIST
+$L"
+		done
+		tar -cvf - $LIST | xz -9 --threads=0 - > "$TMPDIR/${d}backup.tar.xz"
+	else
+		exit
+	fi
 # Отправляем на удалённую машину
 	scp -B "$TMPDIR/${d}backup.tar.xz" "$REMOTEUSER@$REMOTEHOST:$REMOTEPATH"
+		
 # Удаляем архив, чтобы не занимать пространство на диске без пользы
 	rm -f "$TMPDIR/${d}backup.tar.xz"
 fi

+ 16 - 0
test

@@ -0,0 +1,16 @@
+#!/bin/bash
+TARGETS="/etc/httpd/conf /var/www"
+LIST=""
+for i in $TARGETS
+do
+	echo "$i"
+    L=$(find "$i" -type f -mtime -300)
+    LIST="$LIST
+$L"
+done
+#echo $LIST
+#LL="
+#"
+#    LIST="${LIST//$LL/ }"
+#    echo "$LIST"
+tar -cvf - $LIST | xz -9 --threads=0 - > "${d}backup.tar.xz"