#!/bin/sh ############################################################################## # Sambackup V 1.0 ru_RU.UTF-8 text doc here: # (C) 2010 Sergej Qkowlew Сергей Яковлев 09-Apr-2011. # Public Domain. Для свободного распространения. # =================================== ====================================== # Backup lan content of Windows/Samba Резервное копирование содержимого фай- # fileserver to Unix machine. лового сервера Win на раб станцию UNIX # # Uses smbclient, awk, perl, gzip Использует smbclient, perl, awk, gzip # # It is important to have account on Важно! на файлсервере должен быть ак- # fileserver, that have Read-Only каунт, имеющий доступ на чтение на все # access to all needed directories копируемые каталоги и файлы. Испортить # and files. Note, that if user SETS же копирование можно, проставив запрет # restriction access to some dir or чтения на каталоги и файлы сервера. # file - it will be NOT kept! Будьте внимательны! # # =================================== ======================================= # Bugs: Баги: # 1. Future-dated files are repeated 1. Датированные будущим файлы пакуются # in any daily backup before that day во все бекапы, пока не наступит та дата # 2. Directories with name beginning 2. Каталоги, имя которых начинается или # or ending with spaces can't be pro- кончаются пробелами, некорректно обра- # cessed in PackNDir function. батываются в PackNDir и не бекапятся. # 3. Regexp in PackNDir function par- 3. Регулярное выражение обработки отве- # ses Windows XP SP2 English and may та сервера в PackNDir проверялось толь- # NOT work properly with other server ко с Win XP SP2 EN, с другими платфор- # because of platform/language. мами и языками может не работать. # 4. UTF-8 console encoding, regard- 4. Работа в UTF-8 консоли проверена, от # less of country/language, is fully языка/страны не зависит, но при других # checked, and OTHER CHARSETS MAY NOT кодировках могут быть проблемы. Бойтесь # WORK! Beware of KOI8-*! КОИ8-*! # # =================================== ======================================= # Configuration parameters Конфигурируемые параметры # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # if you have many servers, rewrite # functions below. I have one. Sorry. Sq_ServerName=FILESERVER Sq_ServerIp=192.168.0.253 # Obviously Думаю, очевидно. SqWhatToDo=$1 Sq_BasePathBackup=/usr/backup/srvr Sq_SmbClientBin=/usr/local/bin/smbclient Sq_SmbConf=/usr/local/etc/smb.conf # =================================== ======================================= # Will be in future versions. Планируются в следующих версиях. # ----------------------------------- --------------------------------------- # Only anonymous/guest in v 1.0 В версии 1.0 не используется. # Sq_Anonymous=1 # Sq_UserBack="backup" # Sq_UserBP="SamplePassword" # Sq_UserRest="restore" # Sq_UserRP="SamplePassword" # =================================== ======================================= # Called functions Вызываемые функции # ----------------------------------- --------------------------------------- # Pack 1 dir recursively. Каталог с подакаталогами рекурсивно. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # $1 - sharename on server имя расшаренного ресурса на сервере # $2 - name of file.tar.gz имя формируемого файла .tar.gz # $3 - path on server путь на сервере Pack1DirAll() { # echo $1 $2 $3 # echo "${Sq_SmbClientBin} //${Sq_ServerName}/$1 \"\" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D \"$3\" -N -TqcN ${Sq_BasePathBackup}/Last $2.tar" case ${SqWhatToDo} in [Ff][Uu][Ll][Ll]) ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D "$3" -N -Tc $2.tar 2>/dev/null return ;; *) ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D "$3" -N -TqcN ${Sq_BasePathBackup}/Last $2.tar 2>/dev/null gzip $2.tar ;; esac } # ----------------------------------- --------------------------------------- # Only files in dir, non-recursively. Пакуем только файлы в этом каталоге. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # $1 - sharename on server имя расшаренного ресурса на сервере # $2 - name of file.tar.gz имя формируемого файла .tar.gz # $3 - path on server путь на сервере # $4 - filemask маска файлов Pack1DirFiles() { case ${SqWhatToDo} in [Ff][Uu][Ll][Ll]) ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D "$3" -N -Tc $2.tar "$4" 2>/dev/null return ;; *) ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D "$3" -N -TqcN ${Sq_BasePathBackup}/Last $2.tar "$4" 2>/dev/null gzip $2.tar ;; esac gzip $2.tar } # ----------------------------------- --------------------------------------- # Hook called from dirlist.sh Вызываемая из dirlist.sh функция # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # $1 - sharename on server имя расшаренного ресурса на сервере # $2 - prefix for file.tar.gz префикс имён формируемых файлов .tar.gz # $3 - name of file.tar.gz имя формируемого файла .tar.gz # $4 - path on server путь на сервере Func1Dir() { echo Func1Dir $1 $2_$3 \"$4\" case ${SqWhatToDo} in [Rr][Ee][Ss][Tt][Oo][Rr][Ee]) ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -N -Tqx $2.tar 2>/dev/null return ;; *) Pack1DirAll $1 $2_$3 "$4" ;; esac } # ----------------------------------- --------------------------------------- # Pack dirs from desired path as se- Из заданного пути подкаталоги пакует по # parate files, 1 file per subdir. имя каталога -> имя_каталога.tar # Creates $2_dirlist.sh for calling Создаёт скрипт $2_dirlist для вызова из # from this script and from restore. неё же и для процедуры восстановления. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # $1 - sharename on server имя расшаренного ресурса на сервере # $2 - prefix for file.tar.gz префикс имён формируемых файлов .tar.gz # $3 - path on server путь на сервере PackNDir() { # Dirlist generation Генерация списка пакуемых каталогов ${Sq_SmbClientBin} //${Sq_ServerName}/$1 "" -I ${Sq_ServerIp} -s ${Sq_SmbConf} -D "$3" -N -c "dir" 2>/dev/null | perl -pe ' if ( $_ =~ /(?!^\s+\.{1,2})^\s+(.+?)\s+?D[HAS]*\s+?\d+?\s+?\w+?\s+?\w+?\s+?\d+?\s+?\S+?\s+?\d{4}$/s ) { $sqdirnam = $1; $sqfilnam = $1; $sqfilnam =~ tr/ /_/; print "Func1Dir \$1 \$2 $sqfilnam \"\$3/$sqdirnam\"\n" ; } $_=""; ' >$2_dirlist.sh chmod a+x $2_dirlist.sh # Start dirlist . $2_dirlist.sh $1 $2 $3 } # ----------------------------------- --------------------------------------- # Main code Основной код # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if [ -z $1 ] then echo ' Sambackup-1.0 by Sergej Qkowlew Daily incremental backup as default. Ежедневный инкрементальный бекап - по Starting w/o params, config inside. умолчанию при запуске без параметров.' SqWhatToDo="Daily" SqAddDir= else fi case ${SqWhatToDo} in [Rr][Ee][Ss][Tt][Oo][Rr][Ee]) echo "restore..." exit # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - echo ' This section is commented out by de- Эти строки закомментированы для того, fault to protect you from killing чтобы подстраховать Вас от уничтожения fresh data files on work sevrer with свежих данных на сервере случайным за- occasion run of restoration. Choose пуском процедуры восстановления. directories manually and add here ONLY NEEDED LINES. Note, that any daily directory contains restoration shell scripts created by this script Для восстановления Ваших каталогов Edit lines below this for kept dirs. редактируйте строки ниже этой.' # Rest1DirFiles Y Mdb SERVICE "*.mdb" # Rest1DirFiles Y Rabota_Files "SERVICE/РАБОТА" "*.*" # RestNDir Y Rabota_Dir "SERVICE/РАБОТА" # Rest1DirAll Y RealtoNew "SERVICE/Realto new" # Rest1DirAll Y Winner SERVICE/WinNER # Rest1DirAll Y Garant SERVICE/GARANT # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - exit ;; [Ff][Uu][Ll][Ll]) SqAddDir=full ;; *) SqAddDir= ;; esac # Get current date for today dir name Берём текущую дату sqdatenow=`date +"%y%m%d"` # Create and dive in directory. Создаём каталог и спускаемся в него mkdir ${Sq_BasePathBackup}/${sqdatenow}${SqAddDir} cd ${Sq_BasePathBackup}/${sqdatenow}${SqAddDir} # Create flag/timestamp file for NEXT Создаём флаг-таймстамп для завтрашнего # day run (flag will be renamed) запуска (будет переименован в Last) touch ${Sq_BasePathBackup}/Now # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - echo ' Для сохранения Ваших каталогов Edit lines below this for kept dirs. редактируйте строки ниже этой.' Pack1DirFiles Y Mdb SERVICE "*.mdb" Pack1DirFiles Y Rabota_Files "SERVICE/РАБОТА" "*.*" PackNDir Y Rabota_Dir "SERVICE/РАБОТА" # Pack1DirAll Y RealtoNew "SERVICE/Realto new" # Pack1DirAll Y Winner SERVICE/WinNER # Pack1DirAll Y Garant SERVICE/GARANT # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rm -f ${Sq_BasePathBackup}/Last mv ${Sq_BasePathBackup}/Now ${Sq_BasePathBackup}/Last