Ubuntu. Скрипт резервного копирования

27.04.2011 12:33

Иногда проще сделать самому, чем искать что-то подобное... Так думал я когда сделал первую версию скрипта резервного копирования. Благодаря помощи angel2s2, который приоткрыл мне дао bash программирования, родилась эта версия скрипта.


Итак, как работает этот скрипт:
- архивирует и пакует необходимые папки и файлы в папку $BDIR, 
- делает дамп ваших баз данных (mysql) и пакует их в папку $BDIR;
- все, что напаковал сжимает одним файлом ($BFILE) в $BDIR;
- затем, с помощью curlftpfs монтирует ftp папку для бекапов в папку на компьютере и заливает туда $BFILE;
- удаляет старые бэкапы на фтп и на жестком диске;
- о проделанных действиях генерирует сообщение на почту и пишет в лог;
- в случае ошибки приостанавливает выполнение скрипта.



Для нормальной работы скрипта необходимы: ssmtp и curlftpfs. По настройке ssmtp читаем тут, а по curlftpfsтут и тут. Так же, необходимо не забыть создать папку, в которую будем подмонтировать ftp.

Сам скрипт:

 

 #!/bin/bash
  
    # папка, в которую будем складывать бэкапы
    DATE=`date +%F_%H-%M`
    mkdir /media/D/backup/laptop/backup-$DATE
    BDIR="/media/D/backup/laptop/backup-$DATE"
    # имя бэкап файла
    BFILE="/media/D/backup/laptop/backup-$DATE.tar.gz"
    # домашняя папка
    HDIR="/home/homedir"
    # лог файл
    LFILE="$HDIR/.log/backup.log"
    # для ошибок
    ERROR=""
    # для сообщений
    MESSAGE=""
    # для почты
    MAIL=""

    # функция завершения скрипта
    _exit() {
	# тема почтового сообщения
	if [[ $1 -gt 0 ]]; then
		MAIL="Subject: `date +%H:%M` ERROR: Generate backup\n"
	else
		MAIL="Subject: New backup file from $DATE\n"
	fi
        MESSAGE="$MESSAGE\n[-------- `date +%F_%T` Generate files backup finish -]\n"
        MAIL="$MAIL\n$MESSAGE"
        # отправляем на почту
	echo -e "$MAIL" | ssmtp account@example.com
        # пишем в лог
        echo -e "$MESSAGE" >> $LFILE
	
	exit $1
  }

  # функция для проверки ошибок
  _check_error(){
        if [[ $? -gt 0 ]]; then
   		MESSAGE="$MESSAGE\n$ERROR"
		MESSAGE="$MESSAGE\n`date +%H:%M` ERROR: $1."
		_exit 1
	else
		MESSAGE="$MESSAGE\n`date +%H:%M` $2."
	fi
	ERROR=""
  }

  # функция для сжатия логов
  _compress_log(){
  	# если лог файл существует
  	if [ -e $1 ]; then
    		# если его размер больше 1Mb
    		if [ $(stat -c %s $1) -gt 1048576 ]; then 
             		# сжимаем
             		ERROR="$(tar cvpzf "$HDIR/.log/backup-$DATE.log.tar.gz" "$1" 2>&1 > /dev/null)"
			_check_error "compress a log file failed" "compress a log file successfull"
               		# удаляем
             		rm -f "$1"
             		# создаем новый пустой лог файл
             		touch "$1"
     		fi    
 	else
    		# если лог файл не существует, то создаем новый пустой лог файл
    		touch "$1" 
	fi
  }

  # создаем лог
  _compress_log $LFILE

  # старт!
  # бэкапим домашнюю папку 
  MESSAGE="[-------- `date +%F_%T` Generate files backup --------]"
  MESSAGE="$MESSAGE\n`date +%H:%M` 1. Home dir backup."
  ERROR="$(tar cvpzf "$BDIR/home.tar.gz" --exclude=$HDIR/Загрузки \
  --exclude=$HDIR/Видео --exclude=$HDIR/Музыка \
  --exclude=$HDIR/Картинки --exclude=$HDIR/.wine/drive_c/temp \
  --exclude=$HDIR/.wine/drive_c/windows/temp --exclude=$HDIR/.Trash-0 \
  --exclude=$HDIR/.cache \
  --exclude=$HDIR/.local/share/Trash "$HDIR" 2>&1 > /dev/null)"
  _check_error "home dir backup failed" "home dir backup successfull"
  .....
  # Делаем бекап настроек апача и пхп
  MESSAGE="$MESSAGE\n`date +%H:%M` 2. Webserver's configs backup."
  ERROR="$(tar cvpzf "$BDIR/apache2.tar.gz" /etc/apache2 2>&1 > /dev/null)"
  _check_error "apache2 backup failed" "apache2 backup successfull"
 
  ERROR="$(tar cvpzf "$BDIR/php5.tar.gz" /etc/php5 2>&1 > /dev/null)"
  _check_error "php5 backup failed" "php backup successfull"
  
  # Тут бекапим свои файлы, например я бекаплю флешку
  MESSAGE="$MESSAGE\n`date +%H:%M` 3. Web projects backup."
  ERROR="$(tar cvpzf "$BDIR/open_projects.tar.gz" "/media/Transcend/open project" 2>&1 > /dev/null)"
 _check_error "open project dir backup failed" "open project dir backup successfull"
 
  ERROR="$(tar cvpzf "$BDIR/personal.tar.gz" /media/Transcend/Personal 2>&1 > /dev/null)"
 _check_error "personal files backup failed" "personal dir backup successfull"

  # бэкапим базы данных
  MESSAGE="$MESSAGE\n`date +%H:%M` 4. Databases backup."
  ERROR="$(mysqldump --user=username --host=localhost --password=pass --default-character- set=utf8 db1 2>&1 > "$BDIR/db1.sql")"
 _check_error "db1 database backup failed" "db1 database backup successfull"

  ERROR="$(mysqldump --user=username --host=localhost --password=pass --default-character-set=utf8 db2 2>&1 > "$BDIR/db2.sql")"
 _check_error "db2 database backup failed" "db2 database backup successfull"

 # сжимаем все полученные бэкапы в один файл
 MESSAGE="$MESSAGE\n`date +%H:%M` 5. Compress backup files."
 ERROR="$(tar cvpzf "$BFILE" "$BDIR" 2>&1 > /dev/null)"
 _check_error "compress backup files failed" "compress backup files successfull"

 ERROR="$(rm -rf "$BDIR" 2>&1 > /dev/null)"
 _check_error "delete backup dir failed" "delete backup dir successfull"

 # заливаем все на фтп
 MESSAGE="$MESSAGE\n`date +%H:%M` 6. Uploading the backup file to ftp server."
 # монтируем фтп как папку
 ERROR="$(curlftpfs ftp://username:password@servername/backup/laptop "$HDIR/.ftp" 2>&1 > /dev/null)"
 _check_error "ftp mount failed" "ftp mount successfull"
 # заливаем (причем копируем, чтобы на харде тоже копия осталась)
 ERROR="$(cp -f "$BFILE" "$HDIR/.ftp" 2>&1 > /dev/null)"
 _check_error "ftp upload failed" "ftp upload successfull"

 # удаляем бэкап файлы на фтп старше 21 дня
 F="$(ls -1 "$HDIR"/.ftp/backup* | wc -l)"
 ERROR="$(find "$HDIR"/.ftp/backup* -mtime +22 -delete 2>&1 > /dev/null)"
 F1="$(ls -1 "$HDIR"/.ftp/backup* | wc -l)"
 MESSAGE="$MESSAGE\nFiles on ftp: $F1, deleted: $(($F-$F1))."
 _check_error "delete files on ftp failed" "delete files on ftp successfull"

 # размонтируем
 ERROR="$(fusermount -u "$HDIR/.ftp" 2>&1 > /dev/null)"
 _check_error "ftp umount failed" "ftp umount successfull"

 # удаляем старые бэкапы на харде
 MESSAGE="$MESSAGE\n`date +%H:%M` 7. Delete backup files on the hard disk."
 ERROR="$(find /media/D/backup/laptop/backup* -mtime +8 -delete 2>&1 > /dev/null)"
 _check_error "delete backup file failed" "delete backup file successfull"

 # финиш
 _exit 0

Скачать можно отсюда.

Автор: andrvm

Источник: http://andrvm.livejournal.com/8463.html

Отредактировано andrvm 27 апреля 2011 12:35

0 983
    icon   icon   icon   icon   icon
Комментариев нет

Войдите чтобы оставить комментарий

Лучшие

Популярные