Категорії
FreeBSD Misc, staff, other

[shell, perl] Быстрый и простой бэкап.

В этой статье будет представлен скрипт, который делает резервные копии папок. Они использует файлы crontab и newsyslog.conf.

Пару слов скажу о самом скрипте. Написан он на языке perl и не использует никаких специфических модулей, поэтому должен работать на всех системах, где имеется интерпретатор perl.

Ниже приведу параметры запуска скрипта (запускать нужно от пользователя root):

– разрешаем бэкапирование (на самом деле в файлы crontab, newsyslog.conf добавляются соответствующие строчки для бэкапа)

#/scripts/backup.pl -e

– запрещаем бэкапирование (соответственно удаляются строчки)

#/scripts/backup.pl -e

– делаем бэкап

#/scripts/backup.pl -b

Теперь кратко, о настройках. Они расположены в самом скрипте и меняются там же. И так:

$path_backup - путь, где будут храниться бэкапы
%backup_dirs - массив пар: папка и название архива, которые нужно бэкапить
$cron_file - путь к файлу crontab (по умолчанию /etc/crontab)
$newsyslog_file - путь к файлу newsyslog.conf (по умолчанию /etc/newsyslog.conf)
$cron_str - параметры создания архива (в формате crontab: время, дата, команда)
$newsyslog_str - ротациия архивов (в формате newsyslog.conf)

А вот и сам скрипт:

#!/usr/bin/perl
use Switch;
#path to backup
my $path_backup='/var/backups';
#dirs, that need backup in next format:
#name, path
my %backup_dirs = (
'etc' => '/etc',
'usr_local_etc' => '/usr/local/etc'
);
#path to crontab, newsyslog.conf
my $cron_file='/tmp/crontab';
my $newsyslog_file='/tmp/newsyslog.conf';
#settings for backup
my $cron_str="0 23 * * * root /scripts/backup.pl -b";
my $newsyslog_str=$path_backup."/*/*.tar 644 5 * T00 JGN";
if ($#ARGV == 0) {
switch ($ARGV[0]) {
case "-e" {
open F,'>>'.$cron_file;
print F $cron_str."\n";
close F;
open F,'>>'.$newsyslog_file;
print F $newsyslog_str."\n";
close F;
}
case "-d" {
del_str($cron_file,$cron_str);
del_str($newsyslog_file,$newsyslog_str);
}
case "-b" {
foreach $backup_dirs (keys %backup_dirs){
system "/bin/rm -f $path_backup/$backup_dirs/$backup_dirs.tar";
system "cd $backup_dirs{$backup_dirs};/usr/bin/tar cf $path_backup/$backup_dirs/$backup_dirs.tar ./*";
}
}
else {
error_use;
}
}
}
else {
error_use;
}
exit 0;
sub error_use();
{
print "Error in use \n";
print "use: backup.pl -e|d|b \n ";
print "\t -e : enable \n";
print "\t -d : disable \n";
print "\t -b : backup \n";
exit 1;
}
sub good_str
{
my $str = shift;
$str=~ s[\s][\\s]g;
$str=~ s[\*][\\*]g;
return $str;
}
sub del_str
{
my($file, $str) = @_;
open F, $file; @f=; close F;
open F, '>'.$file;
$str=good_str($str);
foreach $str_str (@f) {
print F $str_str if $str_str !~ m%^$str$%;
}
close F;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff