LinuxForum.Fans
Тема

Автоматическое архивирование и удаление файлов backup

Автор: mil612 16 сообщений 5436 просмотров
#262607

Привет всем!
Суть моей проблемы следующая: с горем пополам допилил скриты для автоматического бэкапа конфигов, один скрипт запускается по cron каждый день который запускает остальные скрипты

text
#!/bin/sh

BACKUP_HOST=127.0.0.1 BACKUP_USER=admin BACKUP_DIR=/usr/local/sbin/backup/config #SPOOL_DIR=/usr/local/sbin/backup/config

PATH=/bin:/usr/bin:/usr/sfw/bin:/usr/local/sbin/backup; export PATH

#umask 026

DAY=`date '+%d'`

#if [ ! -d $BACKUP_USER ]; then # echo "Cannot find spool directory $BACKUP_USER." # exit 0 #fi

#cd $SPOOL_DIR

# # Backup configs from network devices # network_mks.sh network_msk.sh

exit 0

на примере этот, собирает конфиги с оборудования и складываются в директорию /home/ftp/config/mks в папки по датам в формате 127.0.0.1.cfg

Показать
#!/bin/sh

BACKUP_HOST=127.0.0.1
BACKUP_USER=admin
BACKUP_DIR=/home/ftp/config/mks
#SPOOL_DIR=/home/ftp/config/mks

PATH=/bin:/usr/bin:/usr/local/bin; export PATH

OBJECTS="`cat /usr/local/sbin/backup/dev_list_mks`"

umask 026

DAY=`date '+%d'`
MONTH=`date '+%m'`
mkdir /home/ftp/config/mks/$DAY.$MONTH
chmod 666 /home/ftp/config/mks/$DAY.$MONTH

if [ ! -d $BACKUP_DIR ]; then
echo "Cannot find spool directory $BACKUP_DIR."
exit 0
fi

#cd $SPOOL_DIR
cd $BACKUP_DIR

for OBJECT_IP in $OBJECTS; do
(
FILE1=$BACKUP_DIR/$DAY.$MONTH/$OBJECT_IP.cfg
/usr/local/sbin/backup/get_mks_cfg.tcl $OBJECT_IP | grep -v "show running-config" | grep -v " $>" > $FILE1 && \
#rcp $FILE1 $BACKUP_DIR/$DAY.$MONTH
chmod 666 $BACKUP_DIR/$DAY.$MONTH/$OBJECT_IP.cfg
) &
done

exit 0

и есть второй скрип backup_weekly.sh

Показать
#!/bin/sh

BACKUP_HOST=127.0.0.1
BACKUP_USER=admin
BACKUP_DIR=/backup/serv1
SPOOL_DIR=/var/adm/backup

PATH=/bin:/usr/bin:/usr/sfw/bin; export PATH

umask 026

DAY=`date '+%d'`

if [ ! -d $SPOOL_DIR ]; then
echo "Cannot find spool directory $SPOOL_DIR."
exit 0
fi

cd $SPOOL_DIR

#
# Backup /usr/local/apache2 files
#
gtar -czf $SPOOL_DIR/local_apache2_$DAY.tar.gz -C / usr/local/apache2/conf usr/local/apache2/private usr/local/apache2/vhosts
[ -f $SPOOL_DIR/local_apache2_$DAY.tar.gz ] && \
rcp $SPOOL_DIR/local_apache2_$DAY.tar.gz $BACKUP_USER@$BACKUP_HOST:$BACKUP_DIR/
rm -f $SPOOL_DIR/local_apache2_$DAY.tar.gz

exit 0

, который по cron (выставлено 0 4 1,7,14,21,28 * *) должен выполнять архивацию файлов и удалять старые бэкап.
Так вот, поскольку в скриптах я чайник, прошу помочь дописать второй скрипт, чтобы выполнял архивацию файлов каждую неделю и удалял старые архивы и файлы старше 7 дней, ну или хотя бы просто удалял старше 7 дней :)

#262618

ну я так понимаю, проблему архивации 1 раз в неделю вы решили
а

"avaddon66" написал:
удалял старые архивы и файлы старше 7 дней
text
find $path -type f -ctime +7 -delete
#262621
osorkon написал:
ну я так понимаю, проблему архивации 1 раз в неделю вы решили

нет, это я тоже не знаю как сделать

#262630
"avaddon66" написал:

gtar -czf $SPOOL_DIR/local_apache2_$DAY.tar.gz -C / usr/local/apache2/conf usr/local/apache2/private usr/local/apache2/vhosts[ -f      $SPOOL_DIR/local_apache2_$DAY.tar.gz ] && \
rcp       $SPOOL_DIR/local_apache2_$DAY.tar.gz $BACKUP_USER@$BACKUP_HOST:$BACKUP_DIR/
rm -f     $SPOOL_DIR/local_apache2_$DAY.tar.gz

ну так вот как бы оно "тарит" директории и копирует на удаленный хост, вы же сами написали
или скрипт не ваш?

#262634
osorkon написал:
[quote="avaddon66"]
gtar -czf $SPOOL_DIR/local_apache2_$DAY.tar.gz -C / usr/local/apache2/conf usr/local/apache2/private usr/local/apache2/vhosts[ -f      $SPOOL_DIR/local_apache2_$DAY.tar.gz ] && \
rcp       $SPOOL_DIR/local_apache2_$DAY.tar.gz $BACKUP_USER@$BACKUP_HOST:$BACKUP_DIR/
rm -f     $SPOOL_DIR/local_apache2_$DAY.tar.gz

ну так вот как бы оно "тарит" директории и копирует на удаленный хост, вы же сами написали
или скрипт не ваш?[/quote]
Этот скрипт писали до меня и под другие задачи, я переделываю скрипты под себя и мне отправлять на удаленный хост не надо.
Нужно, чтобы папки которые создаются по датам /home/ftp/config/mks/dd.mm архивировались например: mks_03.07.tar.gz, а через неделю удалялись вместе с папками /mks/dd.mm или же просто удались папки из директории /home/ftp/config/mks/ старше 7 дней

#262639

Данный скрипт зависит от локали.

Подробнее описывать смысла нету и так всё понятно.
Скрипт так же выполняет проверку md5

В понедельник выполняется полный бекап.
Во все остальные инкрементальные.
Делал под себя поэтому особо не замарачивался переменными.

В папке с архивами не будет больше 7 файлов, старые стираются.

Правда требует обкатки.

text
#!/usr/bin/perl
use POSIX ();
use Switch;
use Digest::MD5::File qw( file_md5_hex );
use File::Copy;
#$date = POSIX::strftime('%a', localtime);
$backupfolder = "/home/user/backup/";
$pathfolder = "/home/user/test/*";
$incrfilemonday = ("$backupfolder". ""  ."$date");
$filebackup = ("$backupfolder". "" ."$date". "" .".tar");
$newfolder = "/home/user/";
$filebackupnew = ("$newfolder". "" ."$date". "" .".tar");

if ($date && "Monday") { backmonday (); } else { if ($date && "Tuesday") { backinc (Monday); } if ($date && "Wednesday") { backinc (Tuesday); } if ($date && "Thursday") { backinc (Wednesday); } if ($date && "Friday") { backinc (Thursday); } if ($date && "Saturday") {backinc (Friday); } if ($date && "Sunday") { backinc (Saturday); } }

sub backinccc { my ($day) = @_; if(-e $incrfilemonday) { unlink $incrfilemonday; } copy("$backupfolder". "" ."$day", "$backupfolder". "" ."$date"); $pathinc = "$backupfolder". "" ."$date"; system (`/bin/tar --create --ignore-failed-read --one-file-system --preserve-permissions --recursion --sparse --gzip --file=$filebackup --listed-incremental=$pathinc $pathfolder`); mdtest ($filebackup); }

sub backmonday { if(-e $incrfilemonday) { unlink $incrfilemonday; } if(-e $filebackup) { unlink $filebackup; } system (`/bin/tar --create --ignore-failed-read --one-file-system --preserve-permissions --recursion --sparse --gzip --file=$filebackup --listed-incremental=$incrfilemonday $pathfolder`); mdtest ($filebackup); }

sub mdtest { my ($file) = @_; copy($file, $filebackupnew) or die mdtest (); $mdnew = file_md5_hex($filebackupnew); $mdold = file_md5_hex($file);

if ($mdnew == $mdold) {} else { unlink $filebackupnew; copy($file, $filebackupnew) or die mdtest (); } }

#262651
"Kettler" написал:
Подробнее описывать смысла нету и так всё понятно.

сомневаюсь, ведь ТС сам сказал:

"avaddon66" написал:
в скриптах я чайник,
.
поэтому, возможно, что бы не разбирать чужой код заточеный под себя и связанные с этим косяки, есть смысл поставить backuppc ?
ну а если уж ОЧЕНЬ хочется поковыряться, могу предложить еще один вариант скрипта. он чуть проще для и короче.
#262653

поэтому, возможно, что бы не разбирать чужой код заточеный под себя и связанные с этим косяки, есть смысл поставить backuppc ?
ну а если уж ОЧЕНЬ хочется поковыряться, могу предложить еще один вариант скрипта. он чуть проще для и короче.

хорошо, давай посмотрим твой вариант, попробуем разобраться

#262659

отредавктировал и добавил коментарии

text
  GNU nano 2.3.1                                      Файл: /Serv/backup-sys                                                                                 

#! /bin/sh

#Config section log="/var/log/backup-sys.log" #логирование процесса tmp=/Store/BACKUP/SYSbackup/`date +%m-%d-%y`-$RANDOM/ list="/Serv/.system-file.list" #список файлов для копирования # echo "Sys backup started at `date +%D` -- `date +%T`: " >>$log mkdir $tmp echo -n" `date +%T`: Copying files to $tmp..." >>$log while read LINE; do #построчное чтение списка rsync -qvaRpogt $LINE $tmp 2>>$log #копирование элементов списка во временную папку done < $list echo " `date +%T`: Done." >>$log cd $tmp PWD=`pwd` Zname=`basename $PWD` cd .. echo " `date +%T`: Compressing $Zname..." >>$log zip -vr9 $Zname.zip $tmp #архивирование файлов. в оригинале архив запаролен и заливается на удаленный фтп, поэтому zip echo " `date +%T`: Done.">>$log rm -rf $tmp 2>> $log echo "Sysyem backup ended at `date +%D` -- `date +%T`: ">>$log

#262912

Попробовал для начала с простого

text
#!/bin/sh

BACKUP_DIR=/home/ftp/config/test

PATH=/bin:/usr/bin:/usr/sfw/bin; export PATH

#umask 26

DAY=`date '+%d'` MONTH=`date '+%m'`

#if [ ! -d $BACKUP_DIR ]; then # echo "Cannot find spool directory $BACKUP_DIR." # exit 0 #fi

#cd $BACKUP_DIR

find $BACKUP_DIR/$DAY.$MONTH -type f -mtime +1 -exec rm {} \;

exit 0

скрипт выполняется, но каталоги не удаляет, что не так?

#262914
"avaddon66" написал:
но каталоги не удаляет, что не так?

А где в этом скрипте должен удаляться каталог?

#262938

А где в этом скрипте должен удаляться каталог?

find $BACKUP_DIR/$DAY.$MONTH -type f -mtime +1 -exec rm {} \;
удалять созданные каталоги $DAY.$MONTH в папке /home/ftp/config/test

#262943
osorkon написал:

могу предложить еще один вариант скрипта. он чуть проще для и короче.

Угу короче но и проверки нету md5 что для меня очень важно когда работа ведеться с сетью
Так же у вас не создаются инкрементальные архивы.
Добавил коментарии.
Но требует обкатки.

text
#!/usr/bin/perl
use POSIX ();
use Switch;
use Digest::MD5::File qw( file_md5_hex );
use File::Copy;
#$date = POSIX::strftime('%a', localtime); #узнаём день недели
$backupfolder = "/home/user/backup/"; #папка куда ложить бекапы
$pathfolder = "/home/user/test/*"; #что архивируем
$incrfilemonday = ("$backupfolder". ""  ."$date"); # тут путь и название инкрементального архива
$filebackup = ("$backupfolder". "" ."$date". "" .".tar"); #полный бекап по понедельникам
$newfolder = "/home/user/";
$filebackupnew = ("$newfolder". "" ."$date". "" .".tar"); #переменная куда копируем полный бекап

#Проверяем день недели if ($date && "Mon") { backmonday (); } else { if ($date && "Tue") { backinc (Mon); } if ($date && "Wed") { backinc (Tue); } if ($date && "Thu") { backinc (Wed); } if ($date && "Fri") { backinc (Thu); } if ($date && "Sat") {backinc (Fri); } if ($date && "Sun") { backinc (Sat); } }

#Функия создания инкрементального архива sub backinccc { my ($day) = @_; if(-e $incrfilemonday) #если есть инкрементальный архив тогда { unlink $incrfilemonday; # удаляем его } copy("$backupfolder". "" ."$day", "$backupfolder". "" ."$date"); #копируем список файлов для для дальнейшего создания инкременльного архива $pathinc = "$backupfolder". "" ."$date"; #путь до файла system (`/bin/tar --create --ignore-failed-read --one-file-system --preserve-permissions --recursion --sparse --gzip --file=$filebackup --listed-incremental=$pathinc $pathfolder`); #архивируем tar mdtest ($filebackup); #отправляем на проверку md5 и копирование в католог в сети (например) }

#Функия создания полного архива по понедельникам sub backmonday { if(-e $incrfilemonday) { unlink $incrfilemonday; } if(-e $filebackup) { unlink $filebackup; } system (`/bin/tar --create --ignore-failed-read --one-file-system --preserve-permissions --recursion --sparse --gzip --file=$filebackup --listed-incremental=$incrfilemonday $pathfolder`); mdtest ($filebackup); #отправляем на проверку Яmd5 }

#Фунция проверки md5 sub mdtest { my ($file) = @_; copy($file, $filebackupnew) or die mdtest (); #копируем например на сетевой диск $mdnew = file_md5_hex($filebackupnew); #получаем значения md5 архива в сети $mdold = file_md5_hex($file); #получаем значения md5 локального архива

if ($mdnew == $mdold) # если значение md5 совпадают тогда всё ок иначе начинаем по новому {} else { unlink $filebackupnew; copy($file, $filebackupnew) or die mdtest (); } }

#262948

Нет.
Это значит — найти в каталоге (который, кстати, в скрипте явно нигде не создаётся, я имею в виду его часть $DAY.$MONTH) файлы (именно обычные файлы — -type f) с временем модификации более суток и удалить.

#262961

Lupo Alberto
Скрипт создающий фалы

text
#!/bin/sh
#network 
BACKUP_DIR=/home/ftp/config/test/
PATH=/bin:/usr/bin:/usr/local/bin; export PATH
MKS_IP_OBJECTS="`cat /backup/dev_list_ip`"
umask 026
DAY=`date '+%d'`
MONTH=`date '+%m'`
mkdir /home/ftp/config/test/$DAY.$MONTH
chmod 666 /home/ftp/config/test/$DAY.$MONTH

if [ ! -d $BACKUP_DIR ]; then echo "Cannot find spool directory $BACKUP_DIR." exit 0 fi

cd $BACKUP_DIR

for OBJECT_IP in $MKS_IP_OBJECTS; do ( FILE1=$BACKUP_DIR/$DAY.$MONTH/$OBJECT_IP.cfg /backup/get_ip_cfg.tcl $OBJECT_IP | grep -v "show running-config" | grep -v " $>" > $FILE1 && \ chmod 666 $BACKUP_DIR/$DAY.$MONTH/$OBJECT_IP.cfg ) & done

exit 0

файлы это ip с расширением cfg и формируются в таком виде
/home/ftp/config/test/03.07/127.0.0.1.cfg
/home/ftp/config/test/04.07/127.0.0.1.cfg и нужно чтобы сами каталоги старше 7 дней удалялись

Войдите или зарегистрируйтесь, чтобы ответить.