Browse Source

Change setup.sh to Makefile
Create config
Change crontab task to script in /etc/cron.daily/
Change method of deleting old archives on the remote computer
Create config option for backup.sh (-c or --config).

grigruss 2 years ago
parent
commit
7a46445f88
5 changed files with 127 additions and 102 deletions
  1. 14 0
      Makefile
  2. 16 0
      backup.cfg
  3. 97 13
      backup.sh
  4. 0 17
      clearbckp.sh
  5. 0 72
      setup.sh

+ 14 - 0
Makefile

@@ -0,0 +1,14 @@
+all:
+		@ echo "Nothing to compile. Use: sudo make install, sudo make uninstall"
+
+install:
+		echo "Test"
+		install -m0755 ./backup.sh /usr/local/bin/backup.sh
+		install -d /usr/local/etc/backup.sh
+		install -m0644 ./backup.cfg /usr/local/etc/backup.sh/backup.cfg
+		@ /usr/local/bin/backup.sh -c
+
+uninstall:
+		rm -fv /usr/local/bin/backup.sh
+		rm -rfv /usr/local/etc/backup.sh/
+		rm -fv /etc/cron.daily/backup_sh

+ 16 - 0
backup.cfg

@@ -0,0 +1,16 @@
+# https://github.com/nixscript/backup.sh
+
+# login пользователя на удалённой машине
+REMOTEUSER="user"
+
+# Можно указать IP
+REMOTEHOST="example.com"
+
+# Либо создайте эту директорию на удалённой машине, либо укажите здесь другую.
+REMOTEPATH="/home/backupsdir/"
+
+# Если в корне мало места, лучше заменить на /home/$USER
+TMPDIR="/tmp"
+
+# Целевые пути, т.е. то, что бекапим. Можно несколько путей через пробел.
+TARGETS="/var/www"

+ 97 - 13
backup.sh

@@ -1,18 +1,102 @@
 #!/bin/bash
 # https://github.com/nixscript/backup.sh
-REMOTEUSER="user" # login пользователя на удалённой машине
-REMOTEHOST="example.com" # Можно указать IP
-REMOTEPATH="/home/backupsdir/" # Либо создайте эту директорию на удалённой машине, либо укажите здесь другую.
-TMPDIR="/tmp" # Если в корне мало места, лучше заменить на /home/$USER
-TARGETS="/var/www"
+
+#REMOTEUSER="user" # login пользователя на удалённой машине
+#REMOTEHOST="example.com" # Можно указать IP
+#REMOTEPATH="/home/backupsdir/" # Либо создайте эту директорию на удалённой машине, либо укажите здесь другую.
+#TMPDIR="/tmp" # Если в корне мало места, лучше заменить на /home/$USER
+#TARGETS="/var/www" # Целевые пути, т.е. то, что бекапим. Можно несколько путей через пробел.
+
+source <(grep = /usr/etc/backup.sh/backup.cfg)
+
+if [[ $1 == "-c" || $1 == "--config" ]]; then
+	if [[ $LANG == "ru_RU.UTF-8" ]]; then
+		echo "Укажите логин удалённой машины:"
+	else
+		echo "Type login for the remote computer:"
+	fi
+	read -r REMOTEUSER
+	if [[ -z "$REMOTEUSER" ]]; then
+	        echo -e "\\e[33;1mWRONG! Run script again and type login correct!\\[0m"
+	fi
+	if [[ $LANG == "ru_RU.UTF-8" ]]; then
+		echo "Укажите имя удалённой машины или IP-адрес:"
+	else
+		echo "Type remote host name or IP for the remote computer:"
+	fi
+	read -r REMOTEHOST
+	if [[ -z "$REMOTEHOST" ]]; then
+	        echo -e "\\e[33;1mWRONG! Run script again and type remote host correct!\\[0m"
+	fi
+	if [[ $LANG == "ru_RU.UTF-8" ]]; then
+		echo "Укажите путь для бекапов на удалённой машине [/home/$REMOTEUSER/backups/]:"
+	else
+		echo "Type remote path for backups on the remote computer [/home/$REMOTEUSER/backups/]:"
+	fi
+	read -r REMOTEPATH
+	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
+		echo "Type absolute paths files/dirs to backaup over space [example: /var/www /etc/apache2/sites-avialable]:"
+	fi
+	read -r TARGETS
+	if [[ -z "$TARGETS" ]]; then
+	        echo -e "\\e[33;1mWRONG! You must type some paths for backup! Run again.\\e[0m"
+	fi
+	if [[ ! -f "$HOME/.ssh/id_rsa.pub" ]]; then
+	# Generate ssh-key for connect to remote computer
+	        ssh-keygen -t rsa
+	fi
+	
+	# Copy public ssh-key to remote computer (need remote password)
+	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'>clearbckp.sh
+	echo "find ${REMOTEPATH}* -mtime +7 -exec rm {} \\;">>clearbckp.sh
+	echo '#!/bin/bash' > /etc/cron.daily/backup_sh
+	echo "source <(grep = /usr/etc/backup.sh/backup.cfg)" >> /etc/cron.daily/backup_sh
+	echo 'd=$(date +%F)' >> /etc/cron.daily/backup_sh
+	echo 'tar -cvf - $TARGETS | xz -9 --threads=0 - > "${d}backup.tar.xz"' >> /etc/cron.daily/backup_sh
+	echo 'scp -B "$TMPDIR/${d}backup.tar.xz" "$REMOTEUSER@$REMOTEHOST:$REMOTEPATH"' >> /etc/cron.daily/backup_sh
+	echo 'rm -f "$TMPDIR/${d}backup.tar.xz"' >> /etc/cron.daily/backup_sh
+	chmod +x /etc/cron.daily/backup_sh
+
+	if [[ -f /lib/systemd/system/cron.service ]]; then
+		systemctl restart cron
+	elif [[ -f /lib/systemd/system/crond.service ]]; then
+		systemctl restart crond
+	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"
+	exit
+elif [[ ! -z $1 ]]; then
+	echo "Usage: backup.sh -c
+	backup.sh --config
+
+	"
+	exit
+else
 # Загоняем текущую дату в переменную
-d=$(date +%F)
-# Упаковываем файлы и прочее в TAR
-# Не забудьте заменить на свои файлы и директории!
-tar -cf "$TMPDIR/${d}backup.tar" $TARGETS
-# Сжимаем максимально
-gzip -9 "$TMPDIR/${d}backup.tar"
+	d=$(date +%F)
+# Упаковываем файлы и прочее в TAR и XZ с максимальным сжатием
+	tar -cvf - $TARGETS | xz -9 --threads=0 - > "${d}backup.tar.xz"
 # Отправляем на удалённую машину
-scp -B "$TMPDIR/${d}backup.tar.gz" "$REMOTEUSER@$REMOTEHOST:$REMOTEPATH"
+	scp -B "$TMPDIR/${d}backup.tar.xz" "$REMOTEUSER@$REMOTEHOST:$REMOTEPATH"
 # Удаляем архив, чтобы не занимать пространство на диске без пользы
-rm -f "$TMPDIR/${d}backup.tar.gz"
+	rm -f "$TMPDIR/${d}backup.tar.xz"
+fi

+ 0 - 17
clearbckp.sh

@@ -1,17 +0,0 @@
-#!/bin/bash
-# https://github.com/nixscript/backup.sh
-BDIR="/home/$USER/backups" # Директория хранения бекапов
-if [[ ! -d "$BDIR" ]]; then
-  mkdir -p "$BDIR"
-fi
-# Получаем текущую дату в секундах
-d=$(date +%s)
-# Отнимаем 7 дней секундами (60 сек. * 60 мин. * 24 часа * 7 дней=604800 секунд)
-d=$(("$d" - 604800))
-# Выводим дату архива подлежащего удалению
-d=$(date --date=@$d +%Y-%m-%d)
-# Формируем имя файла архива подлежащего удалению
-n="${d}backup.tar.gz"
-# Удаляем
-echo "Удаляем бекап $n"
-rm "$BDIR/$n"

+ 0 - 72
setup.sh

@@ -1,72 +0,0 @@
-#!/bin/bash
-# https://github.com/nixscript/backup.sh
-echo "Type login for the remote computer:"
-read -r REMOTEUSER
-if [[ -z "$REMOTEUSER" ]]; then
-        echo -e "\\e[33;1mWRONG! Run script again and type login correct!\\[0m"
-fi
-echo "Type remote host name or IP for the remote computer:"
-read -r REMOTEHOST
-if [[ -z "$REMOTEHOST" ]]; then
-        echo -e "\\e[33;1mWRONG! Run script again and type remote host correct!\\[0m"
-fi
-echo "Type remote path for backups on the remote computer [/home/$REMOTEUSER/backups/]:"
-read -r REMOTEPATH
-if [[ -z "$REMOTEPATH" ]]; then
-        REMOTEPATH="/home/$REMOTEUSER/backups/"
-fi
-echo "Type exists path for clearbckp.sh on the remote computer [/home/$REMOTEUSER/bin/]:"
-read -r RPATH
-if [[ -z "$RPATH" ]]; then
-        RPATH="/home/$REMOTEUSER/bin"
-fi
-echo "Type absolute paths files/dirs to backaup over space [example: /var/www /etc/apache2/sites-avialable]:"
-read -r TARGETS
-if [[ -z "$TARGETS" ]]; then
-        echo -e "\\e[33;1mWRONG! You must type some paths for backup! Run again.\\e[0m"
-fi
-if [[ ! -f "$HOME/.ssh/id_rsa.pub" ]]; then
-# Generate ssh-key for connect to remote computer
-        ssh-keygen -t rsa
-fi
-
-# Copy public ssh-key to remote computer (need remote password)
-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%ARCHS=\"/var/www\"%ARCHS=\"$TARGETS\"%" ./backup.sh
-sed -i "s%BDIR=\"/home/\$USER/backups\"%BDIR=\"$REMOTEPATH\"%" ./clearbckp.sh
-
-if [[ ! -d "$HOME/bin" ]]; then
-        mkdir -p "$HOME/bin"
-fi
-
-# Copy shell script in to home-directory
-cp ./backup.sh "$HOME/bin/backup.sh"
-
-# Change rights to execute
-chmod +x "$HOME/bin/backup.sh"
-chmod +x ./clearbckp.sh
-
-DIST=$(uname -a | grep -i debian)
-if [[ -z "$DIST" ]]; then
-# Example target for cron. At 01:00 AM every night.
-        SPOOL="/var/spool/cron/root"
-else
-        SPOOL="/var/spool/cron/crontabs/root"
-fi
-# Example target for cron. At 01:00 AM every night.
-CHCK=$(grep -i "/bin/backup.sh" < "$SPOOL")
-if [[ -z "$CHCK" ]]; then
-        echo "0 1 * * * $HOME/bin/backup.sh" >> $SPOOL
-else
-        sed "s%$CHCK%0 1 * * * $HOME/bin/backup.sh%" "$SPOOL"
-fi
-systemctl restart cron
-scp -B ./clearbckp.sh "$REMOTEUSER@$REMOTEHOST:$RPATH"
-
-echo -e "\\e[32;1mOn the remote computer run:\\e[33;1m
-        export EDITOR=nano | crontab -e\\e[32;1m
-add type next string\\e[33;1m
-        0 1 * * * $RPATH/clearbckp.sh\\e[32;1m
-save and exit.\\e[0m\n"