Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1364 → Rev 1365

/fsbackup/origin/sun_backup.conf
0,0 → 1,114
$cfg_backup_name = "sun_int_26th_net";
$cfg_cache_dir = "/home/root/fsbackup/cache";
 
$prog_md5sum = "/sbin/md5";
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip";
$prog_pgp = "";
 
$cfg_checksum = "timesize";
$cfg_backup_style = "backup";
$cfg_increment_level = 100;
$cfg_save_old_backup = 1;
$cfg_type = "local";
 
$cfg_local_path = "/opt/backups/sun/sys";
 
 
$cfg_time_limit = 0;
$cfg_size_limit = 0;
$cfg_maximum_archive_size = 102400;
 
$cfg_root_path = "/";
 
# $cfg_pgp_userid = "backup";
 
$cfg_verbose = 2;
 
$cfg_stopdir_prune=0;
 
1;
#-------------------
# List of backuped path and regexp mask.
# /dir[/file] - backup file or directory.
# !/dir[/file] - NOT include this file or directory to backup.
# # - ignore this line.
# Mask:
# =~ - regexp mask for include file or directory to backup.
# f~ - regexp file mask for include file to backup.
# d~ - regexp directory mask for include directory to backup.
# =! - regexp mask for NOT include file or directory to backup.
# f! - regexp file mask for NOT include file to backup.
# d! - regexp directory mask for NOT include directory to backup.
#
# Operation priority:
#
# 1. =!
# 2. f!
# 3. f~
# 4. d!
# 5. =~
# 6. d~
# 7. !
# 8. path
#
 
__DATA__
/root/backup/temp/mnt
!/root/backup/temp/mnt/tmp
!/root/backup/temp/mnt/dev
!/root/backup/temp/mnt/entropy
!/root/backup/temp/mnt/mnt
!/root/backup/temp/mnt/proc
!/root/backup/temp/mnt/tmp
d!/root/backup/temp/mnt/.*/\.snap
d!/root/backup/temp/mnt/.*/\.svn
!/root/backup/temp/mnt/var/tmp
!/root/backup/temp/mnt/var/run
!/root/backup/temp/mnt/var/lock
!/root/backup/temp/mnt/var/log
!/root/backup/temp/mnt/var/named/var/log
!/root/backup/temp/mnt/var/spool/squid
!/root/backup/temp/mnt/usr/compat/linux/proc
!/root/backup/temp/mnt/usr/src
!/root/backup/temp/mnt/usr/obj
!/root/backup/temp/mnt/usr/ports
d!/root/backup/temp/mnt/home/[^/]*/\.recycle
!/root/backup/temp/mnt/var/db/entropy
!/root/backup/temp/mnt/etc/ntp.drift
!/root/backup/temp/mnt/var/db/portaudit/auditfile.tbz
!/root/backup/temp/mnt/home/root/svn/repos
 
# httpd logs and temp files
!/root/backup/temp/mnt/usr/local/jakarta-tomcat5.0/work
!/root/backup/temp/mnt/usr/local/jakarta-tomcat5.0/logs
d!/root/backup/temp/mnt/home/www/[^/]*/logs
 
# postgres databases
!/root/backup/temp/mnt/var/db/pgsql/data/base
!/root/backup/temp/mnt/var/db/pgsql/data/global
!/root/backup/temp/mnt/var/db/pgsql/data/pg_clog
!/root/backup/temp/mnt/var/db/pgsql/data/pg_xlog
 
# backup temp files
!/root/backup/temp/mnt/root/backup/backup.log
!/root/backup/temp/mnt/root/backup/svn/backup.log
!/root/backup/temp/mnt/backup_snapshot
!/root/backup/temp/mnt/home/backup_snapshot
!/root/backup/temp/mnt/usr/backup_snapshot
!/root/backup/temp/mnt/var/backup_snapshot
!/root/backup/temp/mnt/home/root/fsbackup
 
# saturn temp files
!/root/backup/temp/mnt/home/saturn
#!/root/backup/temp/mnt/home/saturn/root/tmp
#!/root/backup/temp/mnt/home/saturn/root/var/log
#!/root/backup/temp/mnt/home/saturn/root/var/run
#!/root/backup/temp/mnt/home/saturn/root/var/lock
#!/root/backup/temp/mnt/home/saturn/root/var/cache
#!/root/backup/temp/mnt/home/saturn/root/root/.freevo/vfs/mnt
#!/root/backup/temp/mnt/home/saturn/root/root/log
#!/root/backup/temp/mnt/home/saturn/root/root/.xine/catalog.cache
 
/fsbackup/origin/create_backup.sh
0,0 → 1,70
#!/bin/sh
# Backup planner running from crontab.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
#
#18 4 * * * /root/backup/fsbackup/create_backup.sh| mail -s"`name -n` backup report" root
 
#--------------------------------------
# Path where fsbackup installed.
#--------------------------------------
 
backup_path="/root/backup/fsbackup"
 
 
#--------------------------------------
# List of fsbackup configuration files, delimited by spaces.
# Directories for saving backup in each configuration file should differ
# ($cfg_remote_path, $cfg_local_path).
#--------------------------------------
 
config_files="sun_backup.conf"
 
 
#--------------------------------------
# 1 - run mysql_backup.sh script (you need edit mysql_backup.sh first!), 0 - not run.
#--------------------------------------
 
backup_mysql=0
 
#--------------------------------------
# 1 - run pgsql_backup.sh script (you need edit pgsql_backup.sh first!), 0 - not run.
#--------------------------------------
 
backup_pgsql=0
 
 
#--------------------------------------
# 1 - run sysbackup.sh script (you need edit sysbackup.sh first!), 0 - not run.
#--------------------------------------
 
backup_sys=0
 
 
 
#############################################################################
cd $backup_path
 
#ulimit -f 512000;ulimit -d 20000;ulimit -c 100;ulimit -m 25000;ulimit -l 15000
 
if [ $backup_mysql -eq 1 ]; then
./scripts/mysql_backup.sh
fi
 
if [ $backup_pgsql -eq 1 ]; then
./scripts/pgsql_backup.sh
fi
 
if [ $backup_sys -eq 1 ]; then
./scripts/sysbackup.sh
fi
 
for cur_conf in $config_files; do
nice -19 ./fsbackup.pl ./$cur_conf
next_iter=`echo "$config_files"| grep "$cur_conf "`
if [ -n "$next_iter" ]; then
sleep 600
fi
done
 
/fsbackup/origin/VERSION
0,0 → 1,0
1.2
/fsbackup/origin/FAQ
0,0 → 1,134
FAQ - ОТВЕТЫ НА ЧАСТО-ЗАДАВАЕМЫЕ ВОПРОСЫ
-------------------------------------------------------------------------------
Как увеличить быстродействие и снизить нагрузку на процессор при шифровании
бэкапа ?
 
При использовании шифрования через gpg, рекомендуется установить значение
$prog_gzip="" (т.е. отключить сжатие архива), так как gpg перед шифрованием
самостоятельно сжимает данные. Использование gzip приведет к двойному
сжатию и лишней нагрузке на CPU.
 
-------------------------------------------------------------------------------
Возникло опасение, что при большом количестве файлов fsbackup съест все ОЗУ.
 
Ничего подобного, одним из достоинств fsbackup является очень экономные
требования к памяти, за счет использования для хранения хэшей библиотеки
DBM. По умолчанию, используется не более 4 Мб ОЗУ.
 
-------------------------------------------------------------------------------
Как увеличить быстродействие и оптимизировать распределение памяти для
бэкапа ?
 
По умолчанию в памяти находится только 4 Мб индексов, остальное сбрасывается
на диск. Быстродействие создания бэкапа можно _на_порядок_ увеличить, за
счет увеличения размер кэша для размещения хэш таблицы в памяти.
Для этого в fsbackup.pl нужно изменить значения константы:
use constant DB_DEF_CACHE_SIZE => размер_кэша_в_байтах;
Чем больше DB_DEF_CACHE_SIZE - тем лучше.
 
-------------------------------------------------------------------------------
Собрался сменить fsbackup 1.0 на 1.1 (1.2). Не будет ли проблем с существующей
конфигурацией, при переходе на новую версию ?
 
Можно смело оставить старые файлы конфигурации, заменив только скрипты.
При желании активировать новинки, появившиеся в 1.1 (1.2), загляните в CHANGES
и добавте новые переменные в старые конфиги.
-------------------------------------------------------------------------------
Зачем было создавать свою систему бэкапа SQL таблиц, кога есть pg_dump и
mysqldump ?
 
Ни тот ни другой не умеют бэкапить все базы, с пропуском нескольких.
Например, бэкап всех баз на MySQL сервере, кроме ненужной гигобайтовой базы
словоформ для поисковика. fsbackup же опирается на три кита: полный бэкап
всех баз, бэкап только указанных в backup_db_list баз данных и бэкап всех
баз, кроме указанных в backup_db_list. Начиная с версии 1.2 fsbackup умеет
производить бэкап (или исключать из бэкапа) не только отдельные базы, но
и таблицы.
 
-------------------------------------------------------------------------------
Как наиболее грамотно организовать бэкап сервера и большим объемом данных ?
 
Рекомендуется, описать бэкап разных участков файловой системы в нескольких
файлах конфигурации.
Например, создать следующие конфигурации:
server_etc.conf - описывает создание бэкапа директории /etc и секретных
данных с использованием PGP шифрования;
server_local.conf - бэкап /usr/local, за исключением временных файлов.
server_sql.conf - бэкап БД.
server_home.conf - бэкап директорий пользователей (/home или /usr/home)
server_soft.conf - бэкап архива программ (без сжатия)
 
Внимание, директории для сохранения бэкапа в каждом конфигурационном файле
должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и
той же директории нескольких, описанных разными .conf файлами, бэкапов не
допустимо.
 
-------------------------------------------------------------------------------
Почему при указании переменной $cfg_maximum_archive_size=100, несжатые
тома архива оказываются размером немного больше или меньше 100 Кб ?
 
Переменная $cfg_maximum_archive_size учитывает реальный размер данных
в файлах плюс примерный размер атрибутов файла или директории. При этом
том завершается когда значение счетчика байт больше указанного в
конфигурации значения. Например, если последним добавляется файл размером 70Кб
и размер уже скомпанованного тома равен 90 Кб, то будет создан архивный
файл размером 90 Кб, а файл размером 70 Кб. будет помещен в следующий том.
Т.е. система старается создавать архивные тома размером чуть меньше, чем
размер указанный в файле конфигурации, за исключением случая наличия файла
размер которого больше лимита накладываемого на размер тома, в этом случае
файл целиком помещается в архивный том, несмотря на его большой размер.
Предотвратить создание архивных томов не помещающихся на накопитель,
используемый для резервирования, можно определив максимально возможный
размер файла для помещения в архив ($cfg_size_limit).
-------------------------------------------------------------------------------
Как мне не архивировать файлы из таких - то каталогов, причем сами каталоги
должны быть. Например, почтовые каталоги qmail, задаю маску: =!Maildir/cur/*
в результате не создает в архиве каталогов cur в профилях пользователя.
 
Достаточно указать:
f!.*/Maildir/new/.*
тогда все файлы внутри /Maildir/new/ не будут помещены в архив, а директория
будет добавлена в .dir файл и при восстановлении будет воссоздана. В tar архив
пустые директории не помещаются, только в .dir список.
 
-------------------------------------------------------------------------------
Почему fsbackup не делает backup каталогов, если в них нет файлов ?
Пустые каталоги просто не отражены в tar архиве (ровно как и права доступа
на все каталоги). Для хранения полного списка каталогов и прав доступа к ним,
используется .dir файл, выполненный в виде обычного shell сценария. При
восстановлении данных из backup, необходимо не только раскрыть .tar архив, но
и выполнить .dir сценарий.
 
-------------------------------------------------------------------------------
Что можите порекомендовать для бэкапа нескольких серверов ?
 
- Выделить старую машину с большим диском под backup-сервер.
- Вынести backup-сервер с тех. площадки, рекомендуется в другое здание
(например в удаленный офис), на случай пожара, грабежа и других
форс-мажорных обстоятельств. Или периодически скидывать бэкапы с
backup-сервера на переносной носитель (лента, CDROM и т.д.) и уносить
домой.
- Рекомендую производить бэкап по FTP, при грамотной организации, не менее
безопасно, чем по SSH (при использовании PGP шифрования бэкапа и
предотвращении возможности сниффинга), а главное более быстрый и
менее ресурсоемкий способ.
- На каждом из серверов, с которых будет производится бэкап, разграничить
области файловой системы в зависимости от важности и объема данных.
Каждую область описать в отдельном файле конфигурации (см. вопросы выше).
Для самых важных данных (например, файлы паролей, секретная информация
представляющая коммерческую тайну и т.д.), используйте PGP шифрование.
Для текстовых данных большого объема и не требующих частого поднятия из
бэкапа - используйте gzip сжатие. Если потребность в доступе к данным
в бэкапе велика, можно ограничиться обычным tar архивом без сжатия.
- Настроить ftp-сервер с доступом только c хостов с которых производится
бэкап (например, через /etc/hosts.allow) и закрытым для внешнего мира.
В конфигурации ftp сервера запретите выход за пределы домашней
директории (/etc/ftpchroot). Дополнительно, через crontab, пропишите
еженедельное дублирование резервной копии на бэкап-сервере на
соседний диск (резервирование бэкапа).
/fsbackup/origin/scripts/fs_mercury_restore.sh
0,0 → 1,57
#!/bin/sh
# Script for restore files backuped by fsbackup.pl
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
 
#-------------------
# Name of backup, single word.
#-------------------
 
backup_name="mercury_26th_net"
 
 
#-------------------
# Directory with content of incremental backup.
#-------------------
 
backup_path="/home/root/fsbackup/restore_mercury/sys"
 
 
#-------------------
# Directory to save restored data.
#-------------------
 
restore_path="/opt/backups/mercury/restore"
 
 
###########################################################################
old_path=`pwd`
cd $backup_path
 
for cur_arc in `ls *.tar* | sort -n`; do
del_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.del"
dir_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.dir"
if [ -e "$del_file" ]; then
echo "Removing deleted files for $cur_arc..."
cd $restore_path
sh $backup_path/$del_file
cd $backup_path
fi
echo "Restoring $cur_arc..."
gzip_type=`ls $cur_arc|grep '.gz'`
#if [ -n "$gzip_type" ]; then
# tar -xzf $cur_arc -C $restore_path
#else
# tar -xf $cur_arc -C $restore_path
#fi
if [ -e "$dir_file" ]; then
echo "Fixing directory permissions for $cur_arc..."
cd $restore_path
sh $backup_path/$dir_file
cd $backup_path
fi
done
 
cd $old_path
 
 
/fsbackup/origin/scripts/sysrestore.sh
0,0 → 1,68
#!/bin/sh
# Script for reinstall packages stored by sysbackup.sh
# Скрипт для восстановления пакетов с программами.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
 
#-------------------
# Name of backup, single word.
# Имя бэкапа.
#-------------------
 
backup_name="sun_int_26th_net"
 
 
#-------------------
# Directory with installed packets list, stored by sysbackup.sh.
# Директория где расположен сохраненный скриптом sysbackup.sh список пакетов.
#-------------------
 
sysbackup_path="/root/backup/fsbackup/sys_backup"
 
 
#-------------------
# Directory where stored OS packages.
# Директория где располдожены файлы с пакетами программ.
# Для FreeBSD, если переменная не заполнена, пакеты будут установленны с сайта
# производителя.
#-------------------
 
packages_path="/usr/local/INST/RPMS"
 
 
############################################################################
sysname="`uname | tr '[A-Z]' '[a-z]'`"
echo "OS: $sysname"
 
if [ "_$sysname" = "_linux" ]; then
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do
echo "Installing $cur_pkg from local server..."
rpm -i --nodeps $packages_path/$cur_pkg.*.rpm
done
fi
 
if [ "_$sysname" = "_freebsd" ]; then
if [ -z "$packages_path" ]; then
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list |sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'|sort|uniq`; do
echo "Installing $cur_pkg from remote server..."
pkg_add -r $cur_pkg
done
else
export PKG_PATH=$packages_path
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do
echo "Installing $cur_pkg from local path $packages_path..."
if -f $cur_pkg; then
pkg_add $cur_pkg
else
echo "Package $cur_pkg not found, tying to install by mask..."
cur_pkg= `echo $cur_pkg| sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'`
pkg_add ${cur_pkg}-*.tgz
fi
done
fi
fi
 
 
 
 
/fsbackup/origin/scripts/sysbackup.sh
0,0 → 1,89
#!/bin/sh
# Script for store system configuration files and information about installed
# packages.
# Скрипт для сохранения списк всех файлов в системе, списка установленных пакетов
# и файлов конфигурации.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
 
#-------------------
# Name of backup, single word.
# Имя бэкапа.
#-------------------
 
backup_name="sun_int_26th_net"
 
 
#-------------------
# Directory to store system backup.
# Корневая директория куда будут помещены данные системного бэкапа.
#-------------------
 
sysbackup_path="/root/backup/fsbackup/sys_backup"
 
 
############################################################################
sysname="`uname | tr '[A-Z]' '[a-z]'`"
echo "OS: $sysname"
 
# echo "Creating ls-lR..."
# ls -lR / |gzip > $sysbackup_path/${backup_name}-ls-lR.gz
 
if [ "_$sysname" = "_linux" ]; then
echo "Creating system config archive..."
rm -f $sysbackup_path/${backup_name}-rpm_conf.tar
for cur_conf in `rpm -q -a -c`; do
tar -rf $sysbackup_path/${backup_name}-rpm_conf.tar $cur_conf 2>/dev/null
done
echo "Creating package list..."
gzip -f $sysbackup_path/${backup_name}-rpm_conf.tar
rpm -q -a > $sysbackup_path/${backup_name}-rpm.list
fi
 
if [ "_$sysname" = "_freebsd" ]; then
echo "Creating package list and install.cfg for sysinstall..."
cp -f /etc/rc.conf $sysbackup_path/${backup_name}-rc.conf
. /etc/rc.conf
interface=`echo "$network_interfaces"| awk '{print $1}'`;
eval ifconfig=\$ifconfig_$interface
ipaddr=`echo "$ifconfig"| sed 's/^.*inet \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'`
netmask=`echo "$ifconfig"| sed 's/^.*netmask \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'`
domain_name=`cat /etc/resolv.conf| grep -E "search|domain"| awk '{print $2}'|head -n1`
nameserver=`cat /etc/resolv.conf| grep 'nameserver'| awk '{print $2}'|head -n1`
cat<<ENDL>$sysbackup_path/${backup_name}-install.cfg
# Full example: /usr/src/release/sysinstall/install.cfg
debug=yes
hostname=$hostname
domainname=$domain_name
nameserver=$nameserver
defaultrouter=$defaultrouter
ipaddr=$ipaddr
netmask=$netmask
# ftp=ftp://time.cdrom.com/pub
netDev=$interface
mediaSetFTP
# dists=bin doc manpages info compat21 des src sbase ssys
dists=all
distSetCustom
# File System
## Current /etc/fstab
`cat /etc/fstab|sed 's/^/## /'`
## Exmpale
# disk=ad0
# partition=exclusive
# diskPartitionEditor
# bootManager=booteasy
# diskPartitionEditor
# ad0s1-1=ufs 40960 /
# ad0s1-2=swap 40960 none
# ad0s1-3=ufs 0 /usr 1
# diskLabelEditor
# installCommit
ENDL
ls -tr /var/db/pkg| tee $sysbackup_path/${backup_name}-pgk.list | perl -ne 'print "package=${_}packageAdd\n"'>> $sysbackup_path/${backup_name}-install.cfg
fi
 
 
 
/fsbackup/origin/scripts/mysql_backup.sh
0,0 → 1,178
#!/bin/sh
# Script for backup SQL tables from MySQL
# Скрипт для бэкапа данных хранимых в Mysql.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
#
# For restore data type:
# Восстановление производится с помощью команды: mysql < backupfile
#
 
#-------------------
# Name of backup, single word.
# Имя бэкапа.
#-------------------
 
backup_name="sun_int_26th_net"
 
 
#-------------------
# Backup method:
# full - backup full DB's structure and data.
# db - backup full DB's structure and data only for 'backup_db_list' databases.
# notdb- backup full DB's structure and data for all DB's, except
# data of 'backup_db_list' databases.
#
# Метод бэкапа:
# full - полный бэкап всех баз (рекомендуется),
# аналог запуска pg_dumpall или mysqldump --all-databases --all
#
# db - бэкап только указанных в backup_db_list баз данных, записи по
# реконструкции баз и таблиц записываются для всех баз на SQL сервере.
# notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по
# реконструкции баз и таблиц записываются для всех баз на SQL сервере.
# Возможно исключение из бэкапа выборочных таблиц, тогда формат
# списка исключаемых таблиц задается в виде:
# "trash_db1 trash_db2:table1 trash_db2:table2"
# - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и
# table2 базы trash_db2.
#
#-------------------
 
backup_method="notdb"
 
 
#-------------------
# List of databases (delimited by spaces)
# Список включаемых или исключаемых из бэкапа баз, через пробел.
# Таблицы указываются в виде: имя_базы:имя_таблицы
#-------------------
 
backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch"
 
 
#-------------------
# Auth information for MySQL.
# Имя пользователя и пароль для соединения с Mysql, для PostgreSQL скрипт
# должен запускаться из-под пользователя с правами полного доступа к базам PostgreSQL.
#-------------------
 
backup_mysqluser=""
backup_mysqlpassword=""
 
 
#-------------------
# Directory to store SQL backup. You must have enought free disk space to store
# all data from you SQL server.
# Директория куда будет помещен бэкап данных с SQL сервера.
# Внимание !!! Должно быть достаточно свободного места для бэкапа всех
# выбранных БД.
#-------------------
 
backup_path="/root/backup/fsbackup/sys_backup"
 
 
#-------------------
# Full path of mysql programs.
# Путь к программам mysql
#-------------------
 
backup_progdump_path="/usr/local/bin"
 
#-------------------
# Extra flags for mysqldump program.
# -c (--complete-insert) - Use complete insert statements.
# Дополнительные параметры для pg_dump
# -c - формировать бэкап данных в виде INSERT комманд, с указанием названий
# столбцов. Если скорость восстановления из бэкапа и размер бэкапа
# более важны, и совместимостью с другими СУБД можно пренебречь,
# используйте: extra_mysqldump_flag=""
#-------------------
 
extra_mysqldump_flag="--complete-insert"
 
############################################################################
 
if [ -n "$backup_progdump_path" ]; then
backup_progdump_path="$backup_progdump_path/"
fi
 
#-------------------------------------------------------------------------
# Полный бэкап для Mysql
if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all MySQL databases."
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
${backup_progdump_path}mysqldump --all-databases --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
exit
fi
 
#-------------------------------------------------------------------------
# Бэкап указанных баз для Mysql
if [ "_$backup_method" = "_db" ]; then
echo "Creating full backup of $backup_db_list MySQL databases."
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
cat /dev/null > $backup_path/$backup_name-mysql
 
for cur_db in $backup_db_list; do
echo "Dumping $cur_db..."
cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print \$1, \$2}else{print \$1}}'`
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql
done
gzip -f $backup_path/$backup_name-mysql
exit
fi
 
#-------------------------------------------------------------------------
# Бэкап всех баз кроме указанных для Mysql
if [ "_$backup_method" = "_notdb" ]; then
echo "Creating full backup of all MySQL databases except databases $backup_db_list."
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
cat /dev/null > $backup_path/$backup_name-mysql
for cur_db in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser| tr -d ' |'|grep -v -E '^Databases$|^\+\-\-\-'`; do
 
grep_flag=`echo " $backup_db_list"| grep " $cur_db:"`
if [ -n "$grep_flag" ]; then
# Исключение таблиц для данной базы
for cur_db_table in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db| tr -d ' |'|grep -v -E '^Tables$|^Database\:|^\+\-\-\-'`; do
 
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then
flag=0
fi
done
 
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db:$cur_db_table..."
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db $cur_db_table >> $backup_path/$backup_name-mysql
 
else
echo "Skiping $cur_db:$cur_db_table..."
fi
done
else
# Исключение базы
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db" ]; then
flag=0
fi
done
 
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db..."
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql
else
echo "Skiping $cur_db..."
fi
fi
done
gzip -f $backup_path/$backup_name-mysql
exit
fi
 
echo "Configuration error. Not valid parameters in backup_method or backup_sqltype."
 
 
/fsbackup/origin/scripts/pgsql_backup.sh
0,0 → 1,179
#!/bin/sh
# Script for backup SQL tables from PostreSQL
# Скрипт для бэкапа данных хранимых в PostgreSQL
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
#
# For restore data type:
# Восстановление производится с помощью команды: psql -d template1 -f backupfile
#
 
#-------------------
# Name of backup, single word.
# Имя бэкапа.
#-------------------
 
backup_name="sun_int_26th_net"
 
#-------------------
# Backup method:
# full - backup full DB's structure and data.
# db - backup full DB's structure and data only for 'backup_db_list' databases.
# notdb- backup full DB's structure and data for all DB's, except
# data of 'backup_db_list' databases.
#
# Метод бэкапа:
# full - полный бэкап всех баз (рекомендуется),
# аналог запуска pg_dumpall или mysqldump --all-databases --all
#
# db - бэкап только указанных в backup_db_list баз данных, записи по
# реконструкции баз и таблиц записываются для всех баз на SQL сервере.
# notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по
# реконструкции баз и таблиц записываются для всех баз на SQL сервере.
# Возможно исключение из бэкапа выборочных таблиц, тогда формат
# списка исключаемых таблиц задается в виде:
# "trash_db1 trash_db2:table1 trash_db2:table2"
# - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и
# table2 базы trash_db2.
#
#
#-------------------
 
backup_method="notdb"
 
#-------------------
# List of databases (delimited by spaces)
# Список включаемых или исключаемых из бэкапа баз, через пробел.
# Таблицы указываются в виде: имя_базы:имя_таблицы
#-------------------
 
backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch"
 
 
#-------------------
# Auth information for MySQL.
# Имя пользователя и пароль для соединения с Mysql, для PostgreSQL скрипт
# должен запускаться из-под пользователя с правами полного доступа к базам PostgreSQL.
#-------------------
 
backup_mysqluser=""
backup_mysqlpassword=""
 
 
#-------------------
# Directory to store SQL backup. You must have enought free disk space to store
# all data from you SQL server.
# Директория куда будет помещен бэкап данных с SQL сервера.
# Внимание !!! Должно быть достаточно свободного места для бэкапа всех
# выбранных БД.
#-------------------
 
backup_path="/root/backup/fsbackup/sys_backup"
 
 
#-------------------
# Full path of postgresql programs.
# Путь к программам postgresql
#-------------------
 
backup_progdump_path="/usr/local/bin"
 
#-------------------
# Extra flags for pg_dump program.
# -D - Dump data as INSERT commands with explicit column names
# Дополнительные параметры для pg_dump
# -D - формировать бэкап данных в виде INSERT комманд, с указанием названий
# столбцов. Если скорость восстановления из бэкапа и размер бэкапа
# более важны, и совместимостью с другими СУБД можно пренебречь,
# используйте: extra_pg_dump_flag=""
#-------------------
 
extra_pg_dump_flag="-D"
 
############################################################################
 
if [ -n "$backup_progdump_path" ]; then
backup_progdump_path="$backup_progdump_path/"
fi
 
#-------------------------------------------------------------------------
# Полный бэкап для Postgresql
if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all PostgreSQL databases."
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql
${backup_progdump_path}pg_dumpall $extra_pg_dump_flag|gzip > $backup_path/$backup_name-pgsql.gz
exit
 
fi
 
#-------------------------------------------------------------------------
# Бэкап указанных баз для Postgresql
if [ "_$backup_method" = "_db" ]; then
echo "Creating full backup of $backup_db_list PostgreSQL databases."
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql
cat /dev/null > $backup_path/$backup_name-pgsql
 
for cur_db in $backup_db_list; do
echo "Dumping $cur_db..."
cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print "-t", \$2, \$1}else{print \$1}}'`
${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql
done
gzip -f $backup_path/$backup_name-pgsql
 
exit
 
fi
 
#-------------------------------------------------------------------------
# Бэкап всех баз кроме указанных для Postgresql
if [ "_$backup_method" = "_notdb" ]; then
echo "Creating full backup of all PostgreSQL databases except databases $backup_db_list."
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql
cat /dev/null > $backup_path/$backup_name-pgsql
 
for cur_db in `${backup_progdump_path}psql -A -q -t -c "select datname from pg_database" template1 | grep -v '^template1$' `; do
 
grep_flag=`echo " $backup_db_list"| grep " $cur_db:"`
if [ -n "$grep_flag" ]; then
# Исключение таблиц для данной базы
for cur_db_table in `echo '\d'| ${backup_progdump_path}psql -A -q -t $cur_db |cut -d'|' -f1`; do
 
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then
flag=0
fi
done
 
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db:$cur_db_table..."
${backup_progdump_path}pg_dump $extra_pg_dump_flag -t $cur_db_table $cur_db >> $backup_path/$backup_name-pgsql
else
echo "Skiping $cur_db:$cur_db_table..."
fi
done
else
# Исключение базы
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db" ]; then
flag=0
fi
done
 
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db..."
${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql
else
echo "Skiping $cur_db..."
fi
fi
done
gzip -f $backup_path/$backup_name-pgsql
exit
fi
 
echo "Configuration error. Not valid parameters in backup_method or backup_sqltype."
 
 
/fsbackup/origin/scripts/fsrestore.sh
0,0 → 1,63
#!/bin/sh
# Script for restore files backuped by fsbackup.pl
# Восстановление данных из инкрементального бэкапа.
# Внимание, данные предварительно должны быть расшифрованы в случае использования PGP
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
 
#-------------------
# Name of backup, single word.
# Имя бэкапа.
#-------------------
 
backup_name="sun_int_26th_net"
 
 
#-------------------
# Directory with content of incremental backup.
# Директория где находится бэкап.
#-------------------
 
backup_path="/mnt/backup"
 
 
#-------------------
# Directory to save restored data.
# Корневая директория куда будут помещены данные восстановленные из бэкапа.
#-------------------
 
restore_path="/var/backup"
 
 
###########################################################################
old_path=`pwd`
cd $backup_path
 
for cur_arc in `ls *.tar* | sort -n`; do
del_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.del"
dir_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.dir"
if [ -e "$del_file" ]; then
echo "Removing deleted files for $cur_arc..."
cd $restore_path
sh $backup_path/$del_file
cd $backup_path
fi
echo "Restoring $cur_arc..."
gzip_type=`ls $cur_arc|grep '.gz'`
if [ -n "$gzip_type" ]; then
tar -xzf $cur_arc -C $restore_path
else
tar -xf $cur_arc -C $restore_path
fi
if [ -e "$dir_file" ]; then
echo "Fixing directory permissions for $cur_arc..."
cd $restore_path
sh $backup_path/$dir_file
cd $backup_path
fi
done
 
cd $old_path
 
 
/fsbackup/origin/fsbackup.pl
0,0 → 1,721
#!/usr/bin/perl
# fsbackup - file system backup and synchronization utility.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001-2002 by Maxim Chirkov. <mc@tyumen.ru>
#
# Ключи:
# -n - создаем новый архив независимо от состояния хэша.
# -f - full_backup - полный бэкап в архив, без хэша.
# -h - hash - только генерация хэша, без помещения файлов в архив.
# -c - clean - очиска хранилища с инкрементальным бэкапом и создание нового бэкапа.
 
#############################################
use constant DB_DEF_CACHE_SIZE => 40960000; # Размер кэша для размежения хэша в памяти
 
use POSIX;
use File::Find;
use Digest::MD5 qw(md5_base64);
use DB_File;
 
use constant VERB_SILENT => 0; # Silent mode, suspend all output.
use constant VERB_ERROR => 1; # Output all errors and warnings.
use constant VERB_ALL => 2; # Output all the available data.
 
my $list_lines_cnt = 0;
my $del_lines_cnt = 0;
my $cur_time = time();
my %active_hash_last;
my %active_hash_new;
my $cfg_new_flag = 0;
my $cfg_clean_flag = 0;
my $config = 0;
my $cur_backup_size = 1536; # Размер блока tar
my $backup_file_base;
my $prog_gzip_filter;
my $arc_ext;
my $cur_increment_level;
my $cur_dir;
my $cur_path;
my $cur_file;
my $cur_pathitem;
my $file_fullpath;
my $file_fullpath_md5;
my $key;
my $dbobj_new;
my $dbobj_last;
my $db_hashinfo;
my $db_hashinfo2;
my $file;
my @volume_position=(0);
my @fs_path=(); # /dir[/file] - путь к файлу/директории для бэкапа.
my @fs_notpath=(); # ! - отрицание пути, не помещать в бэкап. Всегда должен быть первым символом.
my @fs_mask=(); # =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
my @fs_filemask=(); # f~ - маска для файла. Первый или второй символ.
my @fs_dirmask=(); # d~ - маска для директории. Первый или второй символ.
my @fs_notmask=(); # =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
my @fs_notfilemask=(); # f! - "НЕ" маска для файла. Первый или второй символ.
my @fs_notdirmask=(); # d! - "НЕ" маска для директории. Первый или второй символ.
 
# ------------- Обработка параметров командной строки
 
if ($ARGV[0] eq "-n" || $ARGV[0] eq "-h" || $ARGV[0] eq "-f" || $ARGV[0] eq "-c"){
$cfg_new_flag=1;
$config = $ARGV[1];
} else {
$cfg_new_flag=0;
$config = $ARGV[0];
}
 
if ( ! -f $config){
die "Usage: fsbackup.pl [-n|-f|-h|-c] config_name\n";
}
 
 
require "$config";
 
if ( ! -d $cfg_cache_dir){
die "\$cfg_cache_dir ($cfg_cache_dir) not found. Set \$cfg_cache_dir varisble in fsbackup.pl\n";
}
 
$cfg_time_limit *= 60 * 60 * 24; # Дни в секунды.
$cfg_size_limit *= 1024; # Килобайты в байты.
$cfg_maximum_archive_size *= 1024; # Килобайты в байты.
 
chdir($cfg_root_path);
 
if ($ARGV[0] eq "-h"){
$cfg_backup_style = "hash";
}
if ($ARGV[0] eq "-f" ){
$cfg_backup_style = "full_backup";
}
 
if ($ARGV[0] eq "-c" ){
$cfg_clean_flag=1;
} else {
$cfg_clean_flag=0;
}
 
#------------------- Проверяем переменные в файле конфигурации.
if ($cfg_backup_name !~ /^[\w\d\_]+$/){
die "Found illegal characters in $cfg_backup_name ($cfg_backup_name).";
}
 
if (! grep {$_ eq $cfg_checksum} ("md5", "timesize")){
die "Unknown checksum method:\$cfg_checksum=$cfg_checksum (allowed md5 or timesize)\n";
}
 
if (! grep {$_ eq $cfg_backup_style} ("backup", "full_backup", "sync", "hash")){
die "Unknown backup_style:\$cfg_backup_style=$cfg_backup_style\n";
}
 
 
if ($cfg_backup_style eq "full_backup" || $cfg_backup_style eq "hash"){
$cfg_new_flag=1;
$cfg_clean_flag=1;
}
 
die "Can't find \$cfg_local_path ($cfg_local_path)";
 
if ($cfg_backup_style eq "backup"){
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($cur_time);
$backup_file_base = sprintf ("%s-%4.4d.%2.2d.%2.2d.%2.2d.%2.2d.%2.2d",
$cfg_backup_name,$year+1900,$mon+1,$mday,$hour,$min,$sec);
}else{
$backup_file_base="$cfg_backup_name";
}
 
print "Creating local $cfg_backup_style: $cfg_backup_name\n" if ($cfg_verbose == &VERB_ALL);
 
if ($prog_gzip ne ""){
$prog_gzip_filter="| $prog_gzip";
$arc_ext=".gz";
} else {
$prog_gzip_filter="";
$arc_ext="";
 
}
 
if (! -d "$cfg_cache_dir/$cfg_backup_name"){
mkdir("$cfg_cache_dir/$cfg_backup_name", 0700);
}
 
#----------- Вычисляем уровень инкрементальности.
if ($cfg_increment_level != 0 && $cfg_backup_style eq "backup"){
$cur_increment_level=0;
 
opendir( DIR, "$cfg_local_path");
while ($cur_dir = readdir DIR){
if ($cur_dir =~ /\-0\.tar${arc_ext}$/){
$cur_increment_level++;
}
}
closedir (DIR);
 
if ($cur_increment_level >= $cfg_increment_level){
$cfg_new_flag=1;
$cfg_clean_flag=1;
}
print "Current increment number: $cur_increment_level\n" if ($cfg_verbose == &VERB_ALL);
}
################################################
#----------- Считываем хэш в память.
 
if ( (-f "$cfg_cache_dir/$cfg_backup_name/.hash" ) && $cfg_new_flag == 0){
# Считываем текущий хеш в память.
 
rename ("$cfg_cache_dir/$cfg_backup_name/.hash", "$cfg_cache_dir/$cfg_backup_name/.hash.last");
 
$db_hashinfo = new DB_File::HASHINFO ;
$db_hashinfo->{'cachesize'} = DB_DEF_CACHE_SIZE;
if (! ($dbobj_last = tie(%active_hash_last, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash.last", O_RDWR|O_CREAT, 0644, $db_hashinfo )))
{
print "WARNING: Error in hash, creating full backup.\n" if ($cfg_verbose >= &VERB_ERROR);
unlink "$cfg_cache_dir/$cfg_backup_name/.hash.last";
$dbobj_last = tie(%active_hash_last, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash.last", O_RDWR|O_CREAT, 0644, $db_hashinfo )||print "Can't create or open DB File!";
}
 
#Создаем новый хеш.
unlink("$cfg_cache_dir/$cfg_backup_name/.hash");
$db_hashinfo2 = new DB_File::HASHINFO ;
$db_hashinfo2->{'cachesize'} = 100000;
$dbobj_new = tie(%active_hash_new, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash", O_RDWR|O_CREAT, 0644, $db_hashinfo2) || print "Can't create or open DB File!\n";
 
# Создаем список файлов для помещения в архив.
open (LIST, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list).\n";
flock (LIST, 2);
 
# Создаем список директорий в архиве.
open (DIRS, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir).\n";
flock (DIRS, 2);
 
# Считываем список подлежащих бэкапу директорий в память.
 
while(<DATA>){
chomp;
$cur_path = $_;
if ($cur_path =~ /^\!(.*)$/){ # !
push @fs_notpath, $1;
 
} elsif ($cur_path =~ /^\=\~(.*)$/){ # =~
push @fs_mask, $1;
 
} elsif ($cur_path =~ /^f\~(.*)$/){ # f~
push @fs_filemask, $1;
 
} elsif ($cur_path =~ /^d\~(.*)$/){ # d~
push @fs_dirmask, $1;
 
} elsif ($cur_path =~ /^\=\!(.*)$/){ # =!
push @fs_notmask, $1;
 
} elsif ($cur_path =~ /^f\!(.*)$/){ # f!
push @fs_notfilemask, $1;
 
} elsif ($cur_path =~ /^d\!(.*)$/){ # d!
push @fs_notdirmask, $1;
 
} elsif ($cur_path =~ /^#/ || $cur_path =~ /^\s*$/){ # comment
next;
 
} elsif ($cur_path =~ /[\/\w]+/) { # /dir[/file]
push @fs_path, $cur_path;
 
} else {
print STDERR "Syntax error: $cur_path, ingnored.\n" if ($cfg_verbose >= &VERB_ALL);
}
}
 
#--------------------------------------------------------------------
# Последовательно просматририваем весь список директорий отмеченных для бэкапа
 
 
foreach $cur_pathitem (@fs_path){
print "Adding $cur_pathitem....\n" if ($cfg_verbose == &VERB_ALL);
find (\&add_to_backup, $cur_pathitem);
print "done\n" if ($cfg_verbose == &VERB_ALL);
}
close (LIST);
close (DIRS);
#------------
# Составляем список удаленных файлов.
 
open (DEL, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del).\n";
flock (DEL, 2);
if ($cfg_backup_style ne "hash"){
while(($file, $key)= each(%active_hash_last)){
$file =~ s/\'/\'\\\'\'/g;
$file =~ s/^\/(.*)$/$1/;
print DEL "rm -rf '$file'\n";
$del_lines_cnt++;
}
}
close(DEL);
 
# Записываем хэш на диск.
$dbobj_new->sync();
untie %active_hash_new;
untie %active_hash_last;
 
chdir ("/"); # Переходим в корень, так как все пути у нас без корневого /
 
#------------
# Если только обновляем хэш, то записываем его и выходим.
 
if ($cfg_backup_style eq "hash"){ # Только создать хэшь без архивирования.
 
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/.hash") == 0 || print "Local FS copy hash failed: $?";
exit (0);
}
 
#------------
# Архивируем и передаем в хранилище.
 
if ($list_lines_cnt == 0 && $del_lines_cnt == 0){
print "WARNING: Nothing to backup.\n" if ($cfg_verbose >= &VERB_ALL);
exit;
}
 
print "Storing local backup...\n" if ($cfg_verbose == &VERB_ALL);
if ($cfg_backup_style eq "sync"){
if ($cfg_clean_flag == 1){ # Удалить старые копии
print "WARNING: If you really shure to delete $cfg_local_path before sync operatioun uncomment line 'system( \"find \$cfg_local_path -not -path '\$cfg_local_path' -maxdepth 1 -exec \$prog_rm -rf \{\} \\;\");'" if ($cfg_verbose >= &VERB_ALL);
}
 
system( "cd $cfg_local_path; sh $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del");
system( "$prog_tar -c -f - -T $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list| $prog_tar -xf - -C $cfg_local_path") == 0 || print "Local FS sync failed (tar|untar): $?\n";
system( "cd $cfg_local_path; sh $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir");
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/$backup_file_base.hash") == 0 || print "Local FS copy failed: $?\n";
 
} else {
if ($cfg_clean_flag == 1){ # Удалить старые копии
if ($cfg_save_old_backup == 0){
system( "$prog_rm -f $cfg_local_path/*");
} else {
if (! -d "$cfg_local_path/OLD"){
system( "mkdir $cfg_local_path/OLD");
}
system( "$prog_rm -f $cfg_local_path/OLD/*");
system( "mv -f $cfg_local_path/$cfg_backup_name* $cfg_local_path/OLD/");
}
}
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list $cfg_local_path/$backup_file_base.list") == 0 || print "Local FS .list copy failed: $?\n";
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir $cfg_local_path/$backup_file_base.dir") == 0 || print "Local FS .dir copy failed: $?\n";
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del $cfg_local_path/$backup_file_base.del") == 0 || print "Local FS .del copy failed: $?\n";
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/$backup_file_base.hash") == 0 || print "Local FS .hash copy failed: $?\n";
# Обрабатываем разбиение на тома
for ($arc_block_level=0; $arc_block_level <= $#volume_position; $arc_block_level++){
my $tmp_list_file = crate_tmp_list($arc_block_level, $volume_position[$arc_block_level], $volume_position[$arc_block_level+1], "$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list");
system( "$prog_tar -c -f - -T $tmp_list_file $prog_gzip_filter > $cfg_local_path/$backup_file_base-$arc_block_level.tar${arc_ext}") == 0 || print "Local FS tar backup failed: $?\n";
}
}
 
print "***** Backup successful complete.\n" if ($cfg_verbose == &VERB_ALL);
exit (0);
 
 
########################################
sub add_to_backup{
my($file_name, $file_dir, $md5_checksum_stat, $checksum_stat);
my($tmp, $stat_mode, $stat_uid, $stat_gid, $stat_size, $stat_mtime, $stat_time);
 
$file_name = $_;
$file_fullpath = $File::Find::name;
$file_dir = $File::Find::dir;
my $file_fullpath_esc = $file_fullpath;
$file_fullpath_esc =~ s/\'/\'\\\'\'/g;
 
# Создаем список директорий
if ((-d $file_fullpath) && (! -l $file_fullpath)){
if (check_path($file_dir, $file_name) == 1){
if ($cfg_backup_style ne "hash"){
($tmp, $tmp, $stat_mode, $tmp, $stat_uid, $stat_gid, $tmp, $stat_size, $tmp, $stat_mtime, $stat_time) = stat($file_fullpath);
$stat_mode = sprintf ("%04o", $stat_mode & 07777);
$file_fullpath_esc =~ s/^\/(.*)$/$1/;
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($stat_time);
$stat_time = sprintf ("%4.4d%2.2d%2.2d%2.2d%2.2d.%2.2d",
$year+1900,$mon+1,$mday,$hour,$min,$sec);
print DIRS "mkdir '$file_fullpath_esc'\n";
print DIRS "chmod $stat_mode '$file_fullpath_esc'\n";
print DIRS "chown $stat_uid:$stat_gid '$file_fullpath_esc'\n";
print DIRS "touch -t $stat_time '$file_fullpath_esc'\n";
$active_hash_new{$file_fullpath} = "D";
delete $active_hash_last{$file_fullpath};
$cur_backup_size += int(length($file_fullpath)/100.0 + 1)*512;
if ($cfg_maximum_archive_size > 0 && $cur_backup_size + 10240 >= $cfg_maximum_archive_size){
my $old_val = $cur_backup_size - $stat_size - int(length($file_fullpath)/100.0 + 1)*512;
my $tmp_pos= $#volume_position+1;
print "Volume $tmp_pos Done. Size: $old_val\n" if ($cfg_verbose == &VERB_ALL);
$cur_backup_size = $stat_size + int(length($file_fullpath)/100.0 + 1)*512 + 1536;
push @volume_position, $list_lines_cnt;
}
}
} else {
if ($cfg_stopdir_prune == 1){
$File::Find::prune = 1;
return;
}
}
# Работаем с файлами
} elsif ((-f $file_fullpath) || (-l $file_fullpath)){
if (check_path($file_dir, $file_name) == 1){
($tmp, $tmp, $stat_mode, $tmp, $stat_uid, $stat_gid, $tmp, $stat_size, $tmp, $stat_mtime) = stat($file_fullpath);
$checksum_stat= md5_base64("$stat_mtime/$stat_size/$stat_mode/$stat_uid/$stat_gid");
# $file_fullpath_md5 = md5_base64($file_fullpath);
$file_fullpath_md5 = $file_fullpath;
if ($cfg_time_limit != 0 && $cur_time - $cfg_time_limit > $stat_mtime){
print "Time limit: $cur_time - $cfg_time_limit > $stat_mtime, file $file_fullpath ignored.\n" if ($cfg_verbose == &VERB_ALL);
next;
}
if ($cfg_size_limit != 0 && $cfg_size_limit < $stat_size){
print "Size limit: $cfg_size_limit < $stat_size, file $file_fullpath ignored.\n" if ($cfg_verbose == &VERB_ALL);
next;
}
 
if (($cfg_checksum eq "md5") && (! -l $file_fullpath)){
($md5_checksum_stat, $tmp) = split(/\s+/, `$prog_md5sum '$file_fullpath_esc'`);
$active_hash_new{$file_fullpath_md5} = "$checksum_stat/$md5_checksum_stat";
check_update($file_fullpath, "$checksum_stat/$md5_checksum_stat", $file_fullpath_md5, $stat_size);
} else {
$active_hash_new{$file_fullpath} = $checksum_stat;
check_update($file_fullpath, $checksum_stat, $file_fullpath, $stat_size);
}
}
}
}
 
###############################################
# Проверяем изменился ли файл или нет, если да апдейтим лог.
sub check_update{
my ($file, $checksum, $filesum, $stat_size) = @_;
 
if ( $active_hash_last{$filesum} ne $checksum){
if ($cfg_backup_style ne "hash"){
$file =~ s/^\/(.*)$/$1/;
print LIST "$file\n";
 
# Обрабатываем случай разбиения гиганских архивов.
if (-l "/$file"){
$stat_size = 0;
}
$cur_backup_size += $stat_size + int(length($file)/100.0 + 1)*512;
# print "$cur_backup_size:$stat_size:$file\n";
if ($cfg_maximum_archive_size > 0 && $cur_backup_size + 10240 >= $cfg_maximum_archive_size){
my $old_val = $cur_backup_size - $stat_size - int(length($file)/100.0 + 1)*512;
my $tmp_pos= $#volume_position+1;
print "Volume $tmp_pos Done. Size: $old_val\n" if ($cfg_verbose == &VERB_ALL);
$cur_backup_size = $stat_size + int(length($file)/100.0 + 1)*512 + 1536;
push @volume_position, $list_lines_cnt;
}
 
}
$list_lines_cnt++;
}
delete $active_hash_last{$filesum};
if (defined $dbobj_last){
$dbobj_last->del($filesum);
}
}
 
###############################################
# 0 - не добавлять файл
# 1 - добавть файл
 
sub check_path {
my ($dir_name, $file_name) = @_;
my ($item, $path);
 
$path = "$dir_name/$file_name";
 
 
 
foreach $item (@fs_notmask){
if ($path =~ /$item/){
return 0;
}
}
 
foreach $item (@fs_notfilemask){
if ($file_name =~ /$item/){
return 0;
}
}
 
foreach $item (@fs_filemask){
if ($file_name =~ /$item/){
return 1;
}
}
 
foreach $item (@fs_notdirmask){
if ($dir_name =~ /$item/){
return 0;
}
}
 
 
foreach $item (@fs_mask){
if ($path =~ /$item/){
return 1;
}
}
 
foreach $item (@fs_dirmask){
if ($dir_name =~ /$item/){
return 1;
}
}
 
 
foreach $item (@fs_notpath){
if (($dir_name eq $item) || ($path eq $item) || ($dir_name =~ /^$item\//)){
return 0;
}
}
 
return 1;
}
###############################################
# Содание списка файлов для помещения в определенный том многотомного архива.
 
sub crate_tmp_list{
my ($arc_block_level, $position1, $position2, $full_list_path) = @_;
my ($tmp_list_path, $pos_counter);
 
if ($arc_block_level == 0 && $position1 == 0 && $position2 eq ''){
$tmp_list_path = $full_list_path;
} else {
$pos_counter = 0;
$tmp_list_path = "$full_list_path.$arc_block_level";
open(FULL_LIST, "<$full_list_path")|| die "Can't open full list $full_list_path\n";
flock(FULL_LIST, 1);
open(TMP_LIST, ">$tmp_list_path")|| die "Can't create temp list $tmp_list_path\n";
flock(TMP_LIST, 2);
while(<FULL_LIST>){
if (($pos_counter >= $position1) && ($pos_counter < $position2 || $position2 eq '')){
print TMP_LIST $_;
}
$pos_counter++;
}
close(TMP_LIST);
close(FULL_LIST);
}
return $tmp_list_path;
}
###############################################
###############################################
 
__END__
 
=head1 NAME
 
fsbackup - file system backup and synchronization utility.
 
=head1 SYNOPSIS
 
fsbackup.pl [options] <configuration file>
 
=head1 DESCRIPTION
 
C<fsbackup.pl> is a incremental backup creation utility.
C<fsbackup.pl> support backup compression and encryption. Some addition
scripts allow backups SQL tables from PostgreSQL and MySQL (C<pgsql_backup.sh>
and C<mysql_backup.sh>)), save system configuration files and list of installed
packages (C<sysbackup.sh>).
Backuped with C<fsbackup.pl> files can be recovered by script C<fsrestore.sh>,
backuped with C<sysbackup.sh> system packeges can be reinstalled by C<sysrestore.sh>
 
=head1 OPTIONS
 
The following command-line options can be used with C<fsbackup.pl>:
 
=over
 
=item C<-n>
 
Create new backup without checking files in previously stored hash.
 
=item C<-f>
 
Create full backup, like as C<-n> option.
 
=item C<-h>
 
Only rebuild hash, no storing files in backup archive.
 
=item C<-c>
 
Clean incremental backup storage and create new full backup without checking
$cfg_increment_level config parameter.
 
=head1 ADDITION SCRIPTS
 
=item C<create_backup.sh>
 
Backup planner running from C<crontab>. For example:
 
18 4 * * * /root/backup/fsbackup/create_backup.sh
 
=item C<install.pl>
 
Script to install fsbackup package and some required perl modules.
 
=item C<fsbackup.pl>
 
File system backup utility.
 
=item C<cfg_example>
 
Example of configuration file.
 
=item C<scripts/pgsql_backup.sh>
 
=item C<scripts/mysql_backup.sh>
 
Script for backup SQL tables from PostreSQL and MySQL.
 
=item C<scripts/sysbackup.sh>
 
Script for store system configuration files and information about installed
packages.
 
=item C<scripts/fsrestore.sh>
 
Script for restore files backuped by C<fsbackup.pl>.
 
=item C<scripts/sysrestore.sh>
 
Script for reinstall packages stored by C<sysbackup.sh>.
 
 
=head1 CONFIGURATION FILE
 
=item B<$cfg_backup_name> = 'test_host'
 
Name of backup, single word.
 
=item B<$cfg_cache_dir> = '/root/backup/fsbackup/cache'
 
Path of internal cache directory for local backup method.
 
=item B<$prog_md5sum> = 'md5sum -b'
 
=item B<$prog_tar> = 'tar'
 
=item B<$prog_rm> = 'rm'
 
=item B<$prog_gzip> = 'gzip'
 
Full path of some external program running from C<fsbackup.pl>.
B<$prog_gzip = ''> - not use compression
 
=item B<$cfg_checksum> = 'timesize'
 
File checksum method:
 
timesize - checksum of file attributes (default, best speed)
 
md5 - checksum of file attributes + MD5 checksum of file content.
 
=item B<$cfg_backup_style> = 'backup'
 
Backup style:
 
backup - incremental backup (copy only new and changed files).
 
full_backup - full backup (copy all files).
 
sync - file tree synchronization.
 
hash - hash creation without storing archive (spying for new or changed files).
 
=item B<$cfg_increment_level> = 7
 
Incremental level (after how many incremental copy make full refresh of backup)
 
=item B<$cfg_local_path> = '/var/backup/'
 
Path of directory to store backup on local file system for local storage type.
 
=item B<$cfg_time_limit> = 0
 
Limit of file creation time in days. If not 0, don't backup files created or
modified later then $cfg_time_limit (days).
 
=item B<$cfg_size_limit> = 0
 
Limit of maximum file size. If not 0, don't backup files witch size more then
$cfg_time_limit kilobytes.
 
=item B<$cfg_root_path> = '/'
 
Root path for initial chdir.
 
=item B<$cfg_verbose> = 3
 
Verbose level.
 
0 - Silent mode, suspend all output, except fatal configuration errors.
1 - Output errors and warnings.
2 - Output all the available data.
 
=item B<$cfg_save_old_backup> = 1
 
Save previous backup to OLD directory before rotation or before storing full backup.
 
0 - don't save old backup
1 - save old backup.
 
=item B<$cfg_maximum_archive_size> = 0
 
Size of maximum size (in KiloBytes) of single unpacked archive file (0 - unlimited file size).
 
=item B<$cfg_stopdir_prune> = 0
 
Recursive review of the prohibited directories.
0 - Recursively to view all contents of directories marked for backup, including contents of directories prohibited by '!', '!d' and '=! rules.
1 - not use a recursive entrance to directory prohibited for backup (speed is increased, reduces flexibility of customization).
 
=item B<__DATA__> - list of backuped path and regexp mask.
 
/dir[/file] - backup file or directory.
!/dir[/file] - NOT include this file or directory to backup.
# - ignore this line.
 
Mask:
 
=~ - regexp mask for include file or directory to backup.
f~ - regexp file mask for include file to backup.
d~ - regexp directory mask for include directory to backup.
=! - regexp mask for NOT include file or directory to backup.
f! - regexp file mask for NOT include file to backup.
d! - regexp directory mask for NOT include directory to backup.
 
 
Operation priority:
 
1. =!
2. f!
3. f~
4. d!
5. =~
6. d~
7. !path
8. path
 
 
=head1 COPYRIGHT
 
Copyright (c) 2001 by Maxim Chirkov <mc@tyumen.ru>
http://www.opennet.ru/dev/fsbackup/
 
=head1 BUGS
 
Look TODO file.
 
=head1 AUTHORS
 
Maxim Chirkov <mc@tyumen.ru>
 
=cut
/fsbackup/origin/cfg_example
0,0 → 1,373
# Example of configuration file.
# Пример файла конфигурации.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
#
 
#-------------------
# Name of backup, single word.
# Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания.
#-------------------
 
$cfg_backup_name = "sun_int_26th_net";
 
 
#-------------------
# Path of internal cache directory for local backup method.
# Директория для помещения текущих хэшей для локального метода бэкапа, или
# временных хешей для других методов.
#-------------------
 
$cfg_cache_dir = "/root/backup/fsbackup/cache";
 
 
#-------------------
# Full path of some external program running from C<fsbackup.pl>.
# $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption.
# Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется
# не полениться и прописать полный путь к каждой программе.
# Внимание ! При использовании шифрования через gpg, рекомендуется
# установить значение $prog_gzip="", так как gpg перед шифрованием сжимает
# данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU.
#-------------------
 
$prog_md5sum = "md5sum -b";
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip"; # Если равно "", то не использовать сжатие.
$prog_pgp = "gpg"; # Если равно "", то не применять шифрование.
 
 
#-------------------
# Checksum method:
# timesize - checksum of file attributes (default, best speed)
# md5 - checksum of file attributes + MD5 checksum of file content.
# Метод вычисления контрольных сумм для определения изменений в файле.
# timesize - учитывается время последнего изменения файла, его размер,
# атрибуты файла, но не учитывается содержимое. Как правило
# учета данных факторов достаточно для определения необходимости
# обновления файла в бэкапе. Наиболее быстрый метод.
# md5 - все параметры timesize + контрольная сумма содержимого
# файла. Наиболее ресурсоемкий и медленный метод.
#-------------------
 
$cfg_checksum = "timesize";
 
 
#-------------------
# Backup style:
# backup - incremental backup (copy only new and changed files).
# full_backup - full backup (copy all files).
# sync - file tree synchronization.
# hash - hash creation without storing archive (spying for new or changed files).
# Определение типа операции, вида бэкапа.
# backup - инкрементальный бэкап в архив (т.е. копируются только
# изменившиеся с момента последнего бэкапа файлы)..
# full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются
# все файлы).
# sync - синхронизация дерева (только для типа хранилища ssh или local).
# hash - только генерация хэша, без помещения файлов в архив
# (пометка помещения файлов в бэкап, без физического перемещения)
#-------------------
 
$cfg_backup_style = "backup";
 
 
#-------------------
# Incremental level (after how many incremental copy make full refresh of backup)
# Число копий бэкапа, при инкрементальном бэкапе, после которых производится
# полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения,
# на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз.
#-------------------
 
$cfg_increment_level = 7;
 
 
#-------------------
# Save previous backup to OLD directory before rotation or before storing
# full backup.
# 0 - don't save old backup
# 1 - save old backup.
# Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или
# заменой текущего неинкрементального бэкапа новой версией.
# Старая версия помещается в подкаталог OLD.
# 0 - не сохранять предыдущую версию.
# 1 - сохранять предыдущую версию
#-------------------
 
$cfg_save_old_backup = 1;
 
 
#-------------------
# Type of backup storage:
# local - store backup on local file system.
# remote_ssh - store backup on remote host over SSH connection.
# remote_ftp - store backup on remote FTP server.
# Тип хранилища для бэкапа. Описание см. в файле README.
# local - хранение бэкапа в локальной файловой системе.
# remote_ssh - копирование бэкапа на удаленную машину с использованием SSH
# remote_ftp - копирование бэкапа на удаленную машину по FTP
#-------------------
 
$cfg_type = "local";
 
 
#-------------------
# Connection parameters for remote_ssh storage type.
# Параметры необходимые для копирования бэкапа через ssh и ftp:
#-------------------
 
$cfg_remote_host = "backup-server.test.ru";
$cfg_remote_login = "backup_login";
$cfg_remote_path = "/home/backup_login/backup";
 
 
#-------------------
# Password of remote login for remote_ftp storage type.
# Параметры необходимые для копирования бэкапа по ftp:
#-------------------
 
$cfg_remote_password = "Test1234";
 
 
#-------------------
# Path of directory to store backup on local file system for local storage type.
# Параметры необходимые для хранения бэкапа на локальной ФС:
#-------------------
 
$cfg_local_path = "/root/backup/fsbackup/cache";
 
 
#-------------------
# Limit of file creation time in days.
# If not 0, don't backup files created or modified later then $cfg_time_limit days.
# Время в днях, файлы созданные ранее которого не будут помещаться в бэкап.
# 0 - помещаем все фалы независимо от времени их создания.
#-------------------
 
$cfg_time_limit = 0;
 
 
#-------------------
# Limit of maximum file size.
# If not 0, don't backup files witch size more then $cfg_time_limit kilobytes.
# Максимально допустимый размер файла в Kb для помещения в бэкап.
# 0 - помещаем все фалы независимо от их размера.
#-------------------
 
$cfg_size_limit = 0;
 
#-------------------
# Size of maximum size (in KiloBytes) of single unpacked archive file (volume).
# 0 - unlimited file size.
# Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном
# файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих
# в ограничение файловой системы или при последующей записи архивов на CD-ROM
# или другие накопители небольшого размера.
# При превышении заданного размера, запись продолжается в следующий файл c
# идентификатором '-2', '-3' и т.д.
# 0 - размер архива не ограничен.
#-------------------
 
$cfg_maximum_archive_size = 0;
 
 
#-------------------
# Root path for initial chdir.
# Корневая директория, относительно которой файлы помещаются в бэкап и
# относительно которой описаны пути для помещения файлов.
#-------------------
 
$cfg_root_path = "/";
 
 
#-------------------
# Name of user in public key ring with public key will be used for PGP encryption.
# Not use encryption if not set.
# Шифрования бэкапа с помощью PGP.
# Если поле не заполнено, то pgp не применяется.
# Иначе поле содержит UserId записи в public key ring.
#-------------------
 
# $cfg_pgp_userid = "backup";
 
 
#-------------------
# Verbose level.
# 0 - Silent mode, suspend all output, except fatal configuration
# errors.
# 1 - Output errors and warnings.
# 2 - Output all the available data.
#
# Уровень "говорливости", регулирует объем выводимых программой сообщений.
# 0 - Подавить вывод любых сообщений.
# 1 - Выводить сообщения об ошибках и предупреждения
# 2 - Выводить все сообщения
#-------------------
 
$cfg_verbose = 2;
 
#-------------------
# Recursive review of the prohibited directories.
# 0 - Recursively to view all contents of directories marked for
# backup, including contents of directories prohibited by
# '!', '!d' and '=! rules.
# 1 - not use a recursive entrance to directory prohibited for
# backup (speed is increased, reduces flexibility of customization).
#
# Рекурсивный просмотр запрещенных директорий.
# 0 - рекурсивно просматривать все содержимое директорий помеченных
# для бэкапа, в том числе и содержимое директорий запрещенных
# правилами '!', '!d' и '=!'.
# 1 - не использовать рекурсивный вход в запрещенные для
# бэкапа директории (увеличивается скорость бэкапа, уменьшает
# гибкость настройки).
#-------------------
 
$cfg_stopdir_prune=0;
 
1;
#-------------------
# List of backuped path and regexp mask.
# /dir[/file] - backup file or directory.
# !/dir[/file] - NOT include this file or directory to backup.
# # - ignore this line.
# Mask:
# =~ - regexp mask for include file or directory to backup.
# f~ - regexp file mask for include file to backup.
# d~ - regexp directory mask for include directory to backup.
# =! - regexp mask for NOT include file or directory to backup.
# f! - regexp file mask for NOT include file to backup.
# d! - regexp directory mask for NOT include directory to backup.
#
#
#
# Список файлов и условий для помещения в бэкап.
# (описываются после директивы __DATA__):
# /dir[/file] - путь к файлу/директории для бэкапа.
# !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь.
# # - комментарий
# Маски:
# =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f~ - маска для файла. Первый или второй символ.
# d~ - маска для директории. Первый или второй символ.
# Маски отрицания:
# =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f! - "НЕ" маска для файла. Первый или второй символ.
# d! - "НЕ" маска для директории. Первый или второй символ.
#
#
# Бэкап проходит только в рамках директорий и файлов описанных в путях.
# Отрицания путей имеют более высокий приоритет чем пути.
# Маски имеют более высокий приоритет, чем пути или отрицание путей,
# маски "НЕ" имеют более высокий приоритет, чем обычные маски:
#
#
# Таблица приоритетов:
# Operation priority:
#
# 1. =!
# 2. f!
# 3. f~
# 4. d!
# 5. =~
# 6. d~
# 7. !
# 8. path
#
# Пример:
# /usr/home # Объявляем /usr/home как пустой путь,
# !/usr/home # для работы масок.
# d~public_html
# /var
# d!var/log
# f~netconf\.log.*
#
# при этом только /usr/home/*/public_html будет добавлено в архив,
# а файлы директории /var/log/var/log/, за исключением messages, нет.
# Но, /usr/local/home/user/public_html добавлено в
# архив не будет ! Для поиска только по маскам нужно объявить:
# /
# !/
# d~public_html
# d~cgi-bin
# d~/etc/
#-------------------
 
__DATA__
/root/backup/fsbackup
!/root/backup/fsbackup/cache
f!\.core$
f!^core$
f!\.o$
f!\.log$
#d~public_html
#d!/log
#f~netconf\.log.*
 
# Linux
/usr/src/linux/.config
 
# BSD
/var/db/pkg
/usr/src/sys/i386/conf
 
# Users
/home
/root
!/home/ftp
=!\.netscape/cache/
=!\.mozilla/.*/Cache/
=!\.mozilla/.*/NewCache/
=!\.mozilla/.*/News/
f!.*\.avi$
f!.*\.mpeg$
f!.*\.mpg$
f!.*\.mp3$
 
# System configuration
/etc
/var/cron/tabs
/var/spool/cron
/usr/local/etc
 
# Installed packages
/usr/local/bin
/usr/local/include
/usr/local/lib
/usr/local/libdata
/usr/local/libexec
/usr/local/sbin
/usr/local/share
/var/ucd-snmp
 
# Programs from source
/usr/local/apache/bin
/usr/local/apache/conf
/usr/local/apache/cgi-bin
/usr/local/apache/htdocs
/usr/local/apache/libexec
/usr/local/apache/src
/usr/local/www
/usr/local/mysql/bin
/usr/local/mysql/include
/usr/local/mysql/lib
/usr/local/mysql/libexec
/usr/local/mysql/var/mysql
/usr/local/pgsql/bin
/usr/local/pgsql/share
/usr/local/pgsql/lib
/usr/local/pgsql/include
/usr/local/pgsql/data
!/usr/local/pgsql/data/base
!/usr/local/pgsql/data/pg_xlog
/usr/local/squid/bin
/usr/local/squid/etc
/usr/local/news/etc
/usr/local/news/bin
/usr/local/news/lib
/usr/local/samba/bin
/usr/local/samba/lib
 
/fsbackup/origin/README
0,0 → 1,470
FSBACKUP - file system backup and synchronization utility.
 
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY WARRANTIES *
 
For english documentation type 'perldoc fsbackip.pl'
 
---------------------------------------------------------------------------
 
FSBACKUP - система инкрементального резервного копирования и синхронизации ФС.
http://www.opennet.ru/dev/fsbackup/
По всем вопросам обращайтесь к автору: Maxim Chirkov <mc@tyumen.ru>
 
---------------------------------------------------------------------------
СОДЕРЖАНИЕ:
Назначение.
Комплект поставки.
Выполняемые функции.
Установка.
Файл конфигурации.
Восстановление данных.
Виды бэкапа.
Типы хранилища для архива бэкапа.
Шифрование бэкапа.
Благодарности.
 
---------------------------------------------------------------------------
Назначение:
 
Система fsbackup была создана для обеспечения резервного копирования серверов
разного масштаба на специально отведенном сервере бэкапа.
 
Достоинствами метода резервного копирования на специально отведенном сервере,
с использованием fsbackup, является:
- высокая производительность (скорость передачи по 100Мбит сети намного
выше скорости записи на ленточный накопитель), низкая себестоимость
(цена Мб на современных жестких IDE дисках достаточно низкая);
 
- надежность (возможность параллельного хранения нескольких резервных
копий за разные моменты времени);
 
- безопасность (применение PGP шифрования резервных копий перед записью на
бэкап сервер);
- автономность (один раз настроив систему бэкап будет производится
автоматически, не нужно обслуживать стриммер),
 
- возможность сохранения только измененных с последнего бэкапа данных, без
затрат на копирования не изменившейся информации.
- простота настройки и установки (как правило система способна
функционировать сразу после запуска инсталляционного скрипта)
 
- простота восстановления (открытый формат для хранения резервных копий
(tar), позволяет восстановить данные без использования входящих в
комплект утилит восстановления).
 
- гибкость задания масок для помещения файлов и каталогов в архив.
- поддержка бэкапа баз данных хранимых в MySQL и PostgreSQL.
 
fsbackup может выполнять создание как полного образа сервера, так и резервных
копий основных подсистем, исключая операционную систему. В случае полного бэкапа,
полное восстановление работоспособности происходит в течении нескольких десятков
минут, в случае частичного бэкапа для восстановления требуется несколько часов.
 
В отличие от многих систем автоматического резервного копирования, в fsbackup
применяется гибкая система построения масок (с использованием regex) для
принятия решения о помещении файлов в бэкап.
 
---------------------------------------------------------------------------
Комплект поставки:
 
create_backup.sh
Скрипт для периодического запуска всей подсистемы резервного
копирования из crontab.
 
install.pl
Скрипт для установки программы и всех недостающих Perl модулей.
 
fsbackup.pl
Основной скрипт для бэкапа и синхронизации.
 
cfg_example
Пример файла конфигурации и документация по всем конфигурационным
директивам.
 
cache/
Образ директории для помещения временных хэшей.
sys_backup/
Образ директории для помещения бэкапов созданных sysbackup.sh.
 
modules/
Perl модули которые требуются для функционирования fsbackup.pl.
scripts/
Директория со вспомогательными скриптами.
scripts/mysql_backup.sh
scripts/pgsql_backup.sh
Скрипты для создания полного и частичного бэкапа базы данных
хранимой в PostgreSQL или MySQL.
Поддерживаются режимы работы:
1. полный бэкап всех баз и структур;
2. полный бэкап структур всех баз + бэкап данных в избранных базах/таблицах;
3. полный бэкап структур всех баз + бэкап данных во всех базах,
кроме избранных баз/таблиц;
 
scripts/sysbackup.sh
Скрипт для сохранения списка всех установленных в системе пакетов
для FreeBSD и Linux, для Linux использующих rpm - сохранение файлов
конфигурации всех установленных в системе пакетов.
 
scripts/sysrestore.sh
Скрипт для автоматической установки всех пакетов, список которых
был сохранен скриптом sysbackup.sh, в свеже-установленной системе.
scripts/fsrestore.sh
Скрипт для восстановления данных из инкрементального бэкапа.
 
---------------------------------------------------------------------------
Выполняемые функции:
 
- 2 метода вычисления контрольных сумм:
timesize - по атрибутам (дата, время, размер, права доступа...)
md5 - по содержимому файла.
 
- 4 вида бэкапа:
backup - инкрементальный бэкап в архив (т.е. копируются только
изменившиеся с момента последнего бэкапа файлы).
full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются
все файлы).
sync - синхронизация дерева.
hash - только генерация хэша, без помещения файлов в архив (может
использоваться для определения какие файлы были изменены)
 
- 3 типа хранилища бэкапа:
local - хранение бэкапа в локальной файловой системе.
remote_ssh - копирование бэкапа на удаленную машину с использованием SSH
remote_ftp - копирование бэкапа на удаленную машину по FTP.
 
- 8 встроенных операторов (можно использовать regex) для описания
помещаемых в бэкап (или игнорируемых для помещения в бэкап) файлов:
/dir[/file] - путь к файлу/директории для бэкапа.
!/dir[/file] - отрицание пути, не помещать в бэкап (не маска, а реальный путь).
# - комментарий
=~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
f~ - маска для файла. Первый или второй символ.
d~ - маска для директории. Первый или второй символ.
=! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
f! - "НЕ" маска для файла. Первый или второй символ.
d! - "НЕ" маска для директории. Первый или второй символ.
Ограничен по времени создания и размеру
 
- Возможность шифрования бэкапа с помощью PGP.
 
- Гибкое задание уровня инкрементальности. Например, при = 7 - 6 раз
будут помещаться только изменения, на 7 раз бэкап будет объединен в
один файл.
 
- Скрипт для сохранения списка всех установленных в системе пакетов
для FreeBSD и Linux.
 
- Скрипты для создания полного и частичного бэкапа базы данных
хранимой в PostgreSQL или MySQL. Поддерживаются режимы работы:
- полный бэкап всех баз и структур;
- полный бэкап структур всех баз + бэкап данных в избранных базах;
- полный бэкап структур всех баз + бэкап данных во всех базах,
кроме избранных баз;
 
 
---------------------------------------------------------------------------
Установка:
 
Для установки достаточно запустить скрипт ./install.pl
Программа автоматически скопируется в заданный директивой --prefix каталог,
по умолчанию установка производится в каталог /usr/local/fsbackup.
После установки достаточно переименовать и отредактировать файл конфигурации
cfg_example, следуя приведенным внутри cfg_example инструкциям.
Затем, отредактируйте скрипт запуска "create_backup.sh", при необходимости
измените путь к хранилищу бэкапа и название список используемых файлов
конфигурации.
Активируйте периодический запуск подсистема бэкапа в crontab:
18 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s"`name -n` backup report" root
При использовании бэкапа SQL сервера или системы отредактируйте скрипты
в директории ./scripts (mysql_backup.sh, pgsql_backup.sh, sysbackup.sh).
 
Например:
>su
# ./install.pl
# cd /usr/local/fsbackup
# vi cfg_example
# mv cfg_example server_backup.conf
# vi create_backup.sh
# crontab -e
# cd scripts
# vi sysbackup.sh
# vi pgsql_backup.sh
# exit
>
--------------------------------------------------------------------------
Файл конфигурации:
 
Подробное описание всех параметров файла конфигурации смотрите в файле
cfg_example.
 
Внимание, при описании директорий для бэкапа нельзя указывать путь к символической
ссылке, только полный путь к реальной директории. Например, если указано
/home, а это символическая ссылка на /usr/home, то в бэкап будет помещены
данные о символической ссылке, а не содержание директории.
 
Рекомендуется, описать бэкап разных участков файловой системы в нескольких
файлах конфигурации. Например, мной используется следующие несколько файлов
конфигурации:
server_etc.conf - описывает создание бэкапа директории /etc и секретных
данных с использованием PGP шифрования;
server_local.conf - бэкап /usr/local, за исключением временных файлов,
бэкап БД.
server_home.conf - бэкап директорий пользователей (/home или /usr/home)
 
Внимание, директории для сохранения бэкапа в каждом конфигурационном файле
должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и
той же директории нескольких, описанных разными .conf файлами, бэкапов не
допустимо.
 
---------------------------------------------------------------------------
Восстановление данных:
 
Полная резервная копия может быть восстановлена в короткий промежуток времени
без использования дополнительных, входящих в комплект fsbackup утилит.
Например, если архив бэкапа сохранен в директории /mnt/full_backup, для полного
восстановления достаточно набрать:
# cd /
# tar xzf /mnt/full_backup/full_backup.tar.gz
# sh /mnt/full_backup/full_backup.dir
 
Для полного восстановления данных из инкрементального бэкапа может
использоваться скрипт scripts/fsrestore.sh, для восстановления просто
отредактируйте пути внутри скрипта и запустите его.
 
В случае частичного бэкапа файловой системы, без бэкапа файлов операционный
системы, восстановить исходный набор установленных в момент бэкапа пакетов
(должен быть разрешен запуск scripts/sysbackup.sh в create_backup.sh) поможет
скрипт scripts/sysrestore.sh. После установки ОС, скрипт автоматически
установит недостающие пакеты для FreeBSD и Linux.
 
При бэкапе данных с SQL сервера PostgreSQL или Mysql, восстановление производится
командами: psql -d template1 -f sqlbackupfile или mysql < sqlbackupfile.
 
Таким образом можно привести типовой процесс полного восстановления системы:
- базовая установка ОС (без дополнительных пакетов)
- монтирование диска с бэкапом.
- редактирование путей и запуск scripts/sysrestore.sh для установки нужных
пакетов.
- редактирование путей и запуск scripts/fsrestore.sh
- запуск SQL сервера и восстановление баз.
 
 
Назначение файлов при инкрементальном бэкапе (для не инкрементального - формат
"имя.ext"):
имя-время-том.tar.gz архив - бэкапа
(имя_бэкапа-YYYY.MM.DD.HH.MM.SS-номер_тома.tar.gz).
имя-время.del список удаленных с момента предыдущего бэкапа файлов
имя-время.hash хэш таблица с контрольными суммами.
имя-время.list список файлов в архиве.
имя-время.dir команды для восстановления прав доступа и пустых директорий.
 
 
---------------------------------------------------------------------------
Виды бэкапа:
 
 
Вид бэкапа в файле конфигурации определяется параметром $cfg_backup_style:
backup - инкрементальный бэкап в архив. Копируются только
изменившиеся с момента последнего бэкапа файлы, уровень
инкрементальности задается параметром $cfg_increment_level,
параметр определяет через какого числа итераций файлы с
инкрементальными копиями будут объединены в один файл. Например,
при $cfg_increment_level = 7 - 6 раз будут помещаться только
изменения, на 7 раз бэкап будет объединен в один файл.
0 - сколько угодно раз, без объединения. Достоинства - возможность
отследить изменения (и восстановить данные) на любой момент со
времени первой итерации, в архив копируются только измененные и
новые данные, что значительно экономит трафик и место на диске.
Подходит для ежедневного бэкапа динамично меняющейся или критичной
к потере информации.
full_backup - полный бэкап в архив, без хэша. В бэкап всегда помещаются
все файлы отмеченные в файле конфигурации для резервного
копирования). На сервере где сохраняется бэкап рекомендуется
проводить вторичное резервирование, например, в crontab раз
в неделю дублировать бэкап в другую директорию. Недостатки -
огромный трафик для копирования бэкапа по сети и высокие
требования к объему хранилища бэкапа. Достоинство - экономия
процессорных ресурсов и памяти на создание и поддерживание хэша.
Прекрасно подходит для бэкапа маломощных машин с ограниченными
ресурсами или при статичности резервируемых данных (например,
бэкап выносных рутеров раз в месяц).
 
sync - синхронизация дерева (только для типа хранилища ssh или local).
Почти то же, что и full_backup или backup (в зависимости от задания
ключа -c при запуске fsbackup.pl), за исключением того, что копия
не хранится в архиве, а область файловой системы отмеченная для
бэкапа полностью воссоздается в заданной директории на бэкап сервере.
Предназначено для параллельного хранения (синхронизации дерева)
исходных текстов, содержимого web-сервера, синхронизации проектов
с рабочей машины разработчика на сервер и т.д.
 
hash - только генерация хэша, без помещения файлов в архив (опция -h).
Может применяться для пометки помещения файлов в бэкап, без
физического их перемещения, для отслеживания изменений в файловой
системе для обнаружения подмены файлов злоумышленниками и т.д.
 
 
Скрипт fsbackup.pl, поддерживает ряд ключей задаваемых в командной строке:
fsbackup.pl [-n|-f|-h|-c] файл_конфигурации
-n - создаем новый архив независимо от состояния хэша.
-f - full_backup - полный бэкап в архив, без хэша.
-h - hash - только генерация хэша, без помещения файлов в архив.
-c - clean - очистка хранилища с инкрементальным бэкапом и создание
нового бэкапа.
 
---------------------------------------------------------------------------
Типы хранилища для архива бэкапа:
 
Определение типа хранилища для бэкапа определяется в файле конфигурации
переменной $cfg_type. Поддерживается 3 типа хранилищ: local, remote_ssh
и remote_ftp.
 
- local - сохранение бэкапа в локальной файловой системе.
Конфигурация:
$cfg_type="local";
$cfg_local_path="/var/backup"; # Путь к хранилищу.
 
- remote_ssh - сохранение бэкапа на удаленном компьютере, данные передаются
через шифрованное соединение организованное с использованием SSH.
На системе с которой производится бэкап должен быть установлен ssh клиент,
на удаленном - ssh сервер. Метод remote_ssh является наиболее защищенным,
но и достаточно ресурсоемким. Предварительно необходимо настроить доступ
бэкап клиента на сервер с использованием шифрованных ключей, без ввода
пароля. Это делается следующим образом:
 
Примем: локальная машина - машина с которой будет производиться бэкап и
на которой будем запускать скрипт fsbackup.pl. Удаленная машина - машина
на которую будут копироваться файлы с бэкапом.
Запускаем на локальной машине программу ssh-keygen, на все задаваемые
вопросы принимаем значения по умолчанию (поле passphrase оставляем
пустым). Далее, запускаем программу ssh-copy-id user@remotehost, где
user - пользователь удаленной машины remotehost - адрес удаленной машины,
( или вручную, на удаленной машине в директории ~/.ssh, создаем файл
authorized_keys, куда копируем содержимое файла identity.pub с локальной
машины). Для увеличения безопасности в файл ~/.ssh/authorized_keys на
удаленной машине добавляем перед ключом (разделив пробелом) строку
from="localhost", где localhost - адрес локальной машины
(from="localhost" 1024 23 1343.....).
 
Конфигурация:
 
$cfg_type="remote_ssh";
$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
- remote_ftp - сохранение бэкапа на удаленном компьютере, данные передаются
по протоколу ftp, на удаленном хосте должен быть запущен ftp сервер.
Так как пароль хранится в файле конфигурации в открытом виде, желательно
ограничить доступ к хосту к удаленному хосту через tcpwrapper или firewall,
а так же ограничить вход пользователя, под которым будет храниться бэкап,
только через chroot ftp. Положительными сторонами копирования по ftp,
является высокая производительность закачки и небольшая нагрузка на CPU.
 
Конфигурация:
 
$cfg_type="remote_ftp";
$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
$cfg_remote_password="Test1234"; # пароль для входа по ftp.
$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
 
---------------------------------------------------------------------------
Шифрование бэкапа:
 
Для шифрования бэкапа в системе должна быть установлена программа PGP шифрования
GnuPG: http://www.gnupg.org (рекомендуется) или PGP: http://www.pgpi.org
 
Далее:
Локальная машина - машина на которой производится резервное копирование.
Удаленная машина - машина куда сохраняется архив бэкапа.
 
Рекомендации по работе с PGP программами для создания шифрованного бэкапа
(для pgp2.6, pgp5.0, gnupg):
 
Для создания публичного и секретного ключей наберите (на удаленной машине):
pgp2.6> pgp -kg
pgp5.0> pgpk -g
gnupg> gpg --gen-key # если генерация ключа занимает слишком много времени
воспользуйтесь ключом gpg --quick-random
 
Экспортируйте созданный публичный ключ в файл (на удаленной машине):
pgp2.6> pgp -akx <UserID> <файл куда будет записан ключ>
pgp5.0> pgpk -ax <UserID> <файл куда будет записан ключ>
gnupg> gpg --export -a <UserID> > <файл куда будет записан ключ>
 
Затем, добавте созданный публичный ключ (на локальной машине):
pgp2.6>pgp -ka <файл с ключом с удаленной машины>
pgp5.0>pgpk -a <файл с ключом с удаленной машины>
gnupg>gpg --import <файл куда будет записан ключ>
# Для pgupg необходимо заверить ключ:
gnupg>gpg --sign-key <имя ключа>
 
Для расшифровки необходимо запустить (на удаленной машине):
pgp2.6>cat encrypted.tar.gz | pgp -f -z'пароль' > расшифрованный.tar.gz
pgp5.0>cat encrypted.tar.gz | pgpv -f -z'пароль' > расшифрованный.tar.gz
gnupg>cat encrypted.tar.gz | gpg --decrypt > расшифрованный.tar.gz
 
Для шифрования используется (на локальной машине):
pgp2.6>cat input| pgp -ef userid > output
pgp5.0>cat input| pgpe -f userid > output
gnupg>cat input| gpg -e -r userid > output
 
 
 
---------------------------------------------------------------------------
Благодарности:
Alex Sokoloff. <sokoloff@mail.ru>
- Предложение о введении уровней говорливости (verbose mode).
- Изменить запуск программы (ввести проверку на длину
письма), вынести ее в файл fsbackup.cron.
- Написал небольшой скрипт fsfind.pl для поиска файла в архивах он
просматривает файлы list в директории с архивами. Может кому-то
будет полезен. Работает с локальными архивами.
- скрипт для бэкапа Interbase баз.
Oleg S. Gints <oleg@cec.amur.elektra.ru>:
- Предложение по введению дополнительного резервирования при
использовании инкрементального бэкапа.
- Обнаружение ошибки в mysql_backup.sh (для варианта полного архива
пропущен ключ --all-databases)
- Сообщение о неправильном определении уровня инкрементальности для
локального бэкапа.
- Замечание об отсутствии лидирующих нулей в новом формате именования
файлов в бэкапе.
 
Носков Илья <phantom@highway.ru>, Сергей Баукин <teq@highway.ru>:
- Идея разбивки слишком больших файлов на несколько частей,
предложения и патчи по создания архивов занимающих несколько Гб.
 
Aleksey Kuznetsov <ahk@spb.edu>
- Сообщение о пропуске ключа --all-databases в mysql_backup.sh
 
Pavel Stoliarov <admin@tzto.infopac.ru>
- Исправление ошибки приводящей к некорректной работе при локальном
бэкапе.
- Предложение по сохранению старых бэкапов после инкремента.
 
Alexandr Zhukov <sacha@ic.vrn.ru>
- Замечание по неправильной работе правила для исключения
директории из бэкапа.
 
Zherdev Anatoly <tolyar@mx.ru>
- Патч и идея введения директивы $cfg_stopdir_prune, для отключения
рекурсивного просмотра директорий, запрещаемых для помещения в бэкап.
Priamikov Alexei <apriam@info.novsu.ac.ru>
- Обнаружение ошибки в fsrestore.sh
/fsbackup/origin/fsbackup.1
0,0 → 1,362
.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sh \" Subsection heading
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. | will give a
.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
.\" expand to `' in nroff, nothing in troff, for use with C<>.
.tr \(*W-|\(bv\*(Tr
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.\"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.hy 0
.if n .na
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "FSBACKUP 1"
.TH FSBACKUP 1 "2002-05-16" "perl v5.8.5" "User Contributed Perl Documentation"
.SH "NAME"
fsbackup \- file system backup and synchronization utility.
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 1
\& fsbackup.pl [options] <configuration file>
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\f(CW\*(C`fsbackup.pl\*(C'\fR is a incremental backup creation utility.
\&\f(CW\*(C`fsbackup.pl\*(C'\fR support backup compression and encryption. Backup can be stored
on local file system and on remote host stored over \s-1SSH\s0 or \s-1FTP\s0. Some addition
scripts allow backups \s-1SQL\s0 tables from PostgreSQL and MySQL (\f(CW\*(C`pgsql_backup.sh\*(C'\fR
and \f(CW\*(C`mysql_backup.sh\*(C'\fR)), save system configuration files and list of installed
packages (\f(CW\*(C`sysbackup.sh\*(C'\fR).
Backuped with \f(CW\*(C`fsbackup.pl\*(C'\fR files can be recovered by script \f(CW\*(C`fsrestore.sh\*(C'\fR,
backuped with \f(CW\*(C`sysbackup.sh\*(C'\fR system packeges can be reinstalled by \f(CW\*(C`sysrestore.sh\*(C'\fR
.SH "OPTIONS"
.IX Header "OPTIONS"
The following command-line options can be used with \f(CW\*(C`fsbackup.pl\*(C'\fR:
.ie n .IP """\-n""" 4
.el .IP "\f(CW\-n\fR" 4
.IX Item "-n"
Create new backup without checking files in previously stored hash.
.ie n .IP """\-f""" 4
.el .IP "\f(CW\-f\fR" 4
.IX Item "-f"
Create full backup, like as \f(CW\*(C`\-n\*(C'\fR option.
.ie n .IP """\-h""" 4
.el .IP "\f(CW\-h\fR" 4
.IX Item "-h"
Only rebuild hash, no storing files in backup archive.
.ie n .IP """\-c""" 4
.el .IP "\f(CW\-c\fR" 4
.IX Item "-c"
Clean incremental backup storage and create new full backup without checking
\&\f(CW$cfg_increment_level\fR config parameter.
.SH "ADDITION SCRIPTS"
.IX Header "ADDITION SCRIPTS"
.ie n .IP """create_backup.sh""" 4
.el .IP "\f(CWcreate_backup.sh\fR" 4
.IX Item "create_backup.sh"
Backup planner running from \f(CW\*(C`crontab\*(C'\fR. For example:
.Sp
18 4 * * * /usr/local/fsbackup/create_backup.sh
.ie n .IP """install.pl""" 4
.el .IP "\f(CWinstall.pl\fR" 4
.IX Item "install.pl"
Script to install fsbackup package and some required perl modules.
.ie n .IP """fsbackup.pl""" 4
.el .IP "\f(CWfsbackup.pl\fR" 4
.IX Item "fsbackup.pl"
File system backup utility.
.ie n .IP """cfg_example""" 4
.el .IP "\f(CWcfg_example\fR" 4
.IX Item "cfg_example"
Example of configuration file.
.ie n .IP """scripts/pgsql_backup.sh""" 4
.el .IP "\f(CWscripts/pgsql_backup.sh\fR" 4
.IX Item "scripts/pgsql_backup.sh"
.PD 0
.ie n .IP """scripts/mysql_backup.sh""" 4
.el .IP "\f(CWscripts/mysql_backup.sh\fR" 4
.IX Item "scripts/mysql_backup.sh"
.PD
Script for backup \s-1SQL\s0 tables from PostreSQL and MySQL.
.ie n .IP """scripts/sysbackup.sh""" 4
.el .IP "\f(CWscripts/sysbackup.sh\fR" 4
.IX Item "scripts/sysbackup.sh"
Script for store system configuration files and information about installed
packages.
.ie n .IP """scripts/fsrestore.sh""" 4
.el .IP "\f(CWscripts/fsrestore.sh\fR" 4
.IX Item "scripts/fsrestore.sh"
Script for restore files backuped by \f(CW\*(C`fsbackup.pl\*(C'\fR.
.ie n .IP """scripts/sysrestore.sh""" 4
.el .IP "\f(CWscripts/sysrestore.sh\fR" 4
.IX Item "scripts/sysrestore.sh"
Script for reinstall packages stored by \f(CW\*(C`sysbackup.sh\*(C'\fR.
.SH "CONFIGURATION FILE"
.IX Header "CONFIGURATION FILE"
.IP "\fB$cfg_backup_name\fR = 'test_host'" 4
.IX Item "$cfg_backup_name = 'test_host'"
Name of backup, single word.
.IP "\fB$cfg_cache_dir\fR = '/usr/local/fsbackup/cache'" 4
.IX Item "$cfg_cache_dir = '/usr/local/fsbackup/cache'"
Path of internal cache directory for local backup method.
.IP "\fB$prog_md5sum\fR = 'md5sum \-b'" 4
.IX Item "$prog_md5sum = 'md5sum -b'"
.PD 0
.IP "\fB$prog_tar\fR = 'tar'" 4
.IX Item "$prog_tar = 'tar'"
.IP "\fB$prog_ssh\fR = 'ssh'" 4
.IX Item "$prog_ssh = 'ssh'"
.IP "\fB$prog_rm\fR = 'rm'" 4
.IX Item "$prog_rm = 'rm'"
.IP "\fB$prog_gzip\fR = 'gzip'" 4
.IX Item "$prog_gzip = 'gzip'"
.IP "\fB$prog_pgp\fR = 'gpg'" 4
.IX Item "$prog_pgp = 'gpg'"
.PD
Full path of some external program running from \f(CW\*(C`fsbackup.pl\*(C'\fR.
\&\fB$prog_gzip = ''\fR \- not use compression, \fB$prog_pgp = ''\fR \- not use
encryption.
.IP "\fB$cfg_checksum\fR = 'timesize'" 4
.IX Item "$cfg_checksum = 'timesize'"
File checksum method:
.Sp
timesize \- checksum of file attributes (default, best speed)
.Sp
md5 \- checksum of file attributes + \s-1MD5\s0 checksum of file content.
.IP "\fB$cfg_backup_style\fR = 'backup'" 4
.IX Item "$cfg_backup_style = 'backup'"
Backup style:
.Sp
backup \- incremental backup (copy only new and changed files).
.Sp
full_backup \- full backup (copy all files).
.Sp
sync \- file tree synchronization.
.Sp
hash \- hash creation without storing archive (spying for new or changed files).
.IP "\fB$cfg_increment_level\fR = 7" 4
.IX Item "$cfg_increment_level = 7"
Incremental level (after how many incremental copy make full refresh of backup)
.IP "\fB$cfg_type\fR = 'remote_ssh'" 4
.IX Item "$cfg_type = 'remote_ssh'"
Type of backup storage:
.Sp
.Vb 3
\& local - store backup on local file system.
\& remote_ssh - store backup on remote host over SSH connection.
\& remote_ftp - store backup on remote FTP server.
.Ve
.IP "\fB$cfg_remote_host\fR = 'backup\-server.test.ru'" 4
.IX Item "$cfg_remote_host = 'backup-server.test.ru'"
.PD 0
.IP "\fB$cfg_remote_login\fR = 'backup_login'" 4
.IX Item "$cfg_remote_login = 'backup_login'"
.IP "\fB$cfg_remote_path\fR = '/home/backup_login/backup'" 4
.IX Item "$cfg_remote_path = '/home/backup_login/backup'"
.PD
Connection parameters for remote_ssh storage type.
.IP "\fB$cfg_remote_password\fR = 'Test1234'" 4
.IX Item "$cfg_remote_password = 'Test1234'"
Password of remote login for remote_ftp storage type.
.IP "\fB$cfg_local_path\fR = '/var/backup/'" 4
.IX Item "$cfg_local_path = '/var/backup/'"
Path of directory to store backup on local file system for local storage type.
.IP "\fB$cfg_time_limit\fR = 0" 4
.IX Item "$cfg_time_limit = 0"
Limit of file creation time in days. If not 0, don't backup files created or
modified later then \f(CW$cfg_time_limit\fR (days).
.IP "\fB$cfg_size_limit\fR = 0" 4
.IX Item "$cfg_size_limit = 0"
Limit of maximum file size. If not 0, don't backup files witch size more then
\&\f(CW$cfg_time_limit\fR kilobytes.
.IP "\fB$cfg_root_path\fR = '/'" 4
.IX Item "$cfg_root_path = '/'"
Root path for initial chdir.
.IP "\fB$cfg_pgp_userid\fR = ''" 4
.IX Item "$cfg_pgp_userid = ''"
Name of user in public key ring with public key will be used for \s-1PGP\s0 encryption.
Not use encryption if not set.
.IP "\fB$cfg_verbose\fR = 3" 4
.IX Item "$cfg_verbose = 3"
Verbose level.
.Sp
.Vb 3
\& 0 - Silent mode, suspend all output, except fatal configuration errors.
\& 1 - Output errors and warnings.
\& 2 - Output all the available data.
.Ve
.IP "\fB$cfg_save_old_backup\fR = 1" 4
.IX Item "$cfg_save_old_backup = 1"
Save previous backup to \s-1OLD\s0 directory before rotation or before storing full backup.
.Sp
.Vb 2
\& 0 - don't save old backup
\& 1 - save old backup.
.Ve
.IP "\fB$cfg_maximum_archive_size\fR = 0" 4
.IX Item "$cfg_maximum_archive_size = 0"
Size of maximum size (in KiloBytes) of single unpacked archive file (0 \- unlimited file size).
.IP "\fB$cfg_stopdir_prune\fR = 0" 4
.IX Item "$cfg_stopdir_prune = 0"
Recursive review of the prohibited directories.
0 \- Recursively to view all contents of directories marked for backup, including contents of directories prohibited by '!', '!d' and '=! rules.
1 \- not use a recursive entrance to directory prohibited for backup (speed is increased, reduces flexibility of customization).
.IP "\fB_\|_DATA_\|_\fR \- list of backuped path and regexp mask." 4
.IX Item "__DATA__ - list of backuped path and regexp mask."
.Vb 3
\& /dir[/file] - backup file or directory.
\& !/dir[/file] - NOT include this file or directory to backup.
\& # - ignore this line.
.Ve
.Sp
Mask:
.Sp
.Vb 6
\& =~ - regexp mask for include file or directory to backup.
\& f~ - regexp file mask for include file to backup.
\& d~ - regexp directory mask for include directory to backup.
\& =! - regexp mask for NOT include file or directory to backup.
\& f! - regexp file mask for NOT include file to backup.
\& d! - regexp directory mask for NOT include directory to backup.
.Ve
.Sp
Operation priority:
.Sp
.Vb 8
\& 1. =!
\& 2. f!
\& 3. f~
\& 4. d!
\& 5. =~
\& 6. d~
\& 7. !path
\& 8. path
.Ve
.SH "COPYRIGHT"
.IX Header "COPYRIGHT"
Copyright (c) 2001 by Maxim Chirkov <mc@tyumen.ru>
http://www.opennet.ru/dev/fsbackup/
.SH "BUGS"
.IX Header "BUGS"
Look \s-1TODO\s0 file.
.SH "AUTHORS"
.IX Header "AUTHORS"
Maxim Chirkov <mc@tyumen.ru>