Необходимо выполнить резервное копирование нескольких файловых бд 1С из каталога содержащего множество различных бд 1С на удаленный linux сервер доступ к которому реализован посредствлм ssh.
Написал соответствующий скрипт. Хотелось бы услышать конструктивную критику. Можно ли данный скрипт улучшить?
Также есть вопрос как сравнить md5 сумму созданного архива локально и того который залился на удаленный хост. Целесообразно ли это вообще?
Код:

@Echo OFF
SetLocal EnableExtensions EnableDelayedExpansion
cls
goto :q1
###########################################
# #
# Скрипт резервного копирования 1С #
# #
###########################################
Выполняет следующие действия:
1. Проверка существования каталогов и бд 1С заданных в параметрах.
2. Копирование бд 1С на другой раздел. Запись в лог результата.
3. Архивация каталогов 1С и во временный каталог. Запись в лог результата.
4. Тестирование архива. Запись в лог результата.
5. Копирование созданного архива на удаленный хост посредством протокола SСP. Запись в лог результата.
6. Копирование ежедневного архива локально в каталог для хранения. Запись в лог результата.
7. Удаление копии выполненной на 1 шаге. Запись в лог результата.
8. Оставляем в каталоге для хранения 7 новейших файлов, т. е. удаляем старые резервные копии. Запись в лог результата.
? 9. Проверка md5sum архива на локальном и удаленном хосте.
--------------------------------------------------------------------------------
=== Для запуска скрипта выполнить компанду ===
bak.cmd параметр1. параметр2. ... параметрN
гле
параметр1 - каталог, где находятся рабочие бд 1С
параметр2 - каталог в который копируются бд 1С
параметр3 - каталог, куда производится архивация
параметр4 - каталог, в котором хранятся упакованные резервные копии
параметр5 - путь к архиватору 7-zip
параметр6 - лог
параметр7 - путь к PSCP
параметр8 - путь к приватному ключу
параметр9 - параметры удаленного хоста на который производится копирование архива (юзер, сервер, куда копировать)
параметр10 - имя БД 1С для бекапа
параметр11 - имя БД 1С для бекапа
...
параметрN - имя БД 1С для бекапа
Например:
bak.cmd e:\database d:\ f:\backup\temp\database f:\Backup\database "%programfiles%\7-Zip\7z" f:\Backup\database\arch.log 7 "C:\temp\bak_script\putty\pscp.exe" "C:\temp\bak_script\putty\private_key.ppk" bak@192.168.37.2:/var/ftp/pub/backup/test 1SBUKR 1SKASSA LTL Optimus
:q1
rem -=====[ Решение проблем с датой ]=======-
:: Code by Herbert Kleebauer
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>d_t.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>d_t.com
echo LisqMz`wGH@wKuur`G@w?ogBgGG}G?j_egoNOG?w?`gBLksqgG`w?WgBgG>>d_t.com
echo G}G?R_MgoNMy?wSx@W?s?W?@zAB`LrFuBLyt~vuco{@LuKooD?BFHqrIcP>>d_t.com
echo _sdDxb1T??=?rILO_sdDqx1T??=?rILO_sdDnl1T??=?rILO_sdD`c1T??>>d_t.com
echo =?rILO_sdDgg1T??=?rILO_sdDll1T??=?rILO_sdDrr1T??=??IL?0xxx>>d_t.com
FOR /F "delims=" %%i IN ('d_t.com') DO %%i
del d_t.com
goto :q2
echo century: %_cy%
echo year: %_yr%
echo month: %_mo%
echo day: %_da%
echo hour: %_hh%
echo minute: %_mm%
echo second: %_ss%
echo all: %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%
echo.
echo %DATE% %TIME%
===========================================================
:q2
rem Проверка существования первого параметра
set Errors=0
if [%1]==[] (
set Errors=1
echo.
echo.
echo #################################
echo # #
echo # NE UKAZANI PARAMETRI #
echo # #
echo #################################
echo.
echo.
)
if %Errors% EQU 1 goto :EOF
rem Проверка существования 10 параметра
set Errors=0
if [%10]==[] (
set Errors=1
echo.
echo.
echo #########################################
echo # #
echo # NE UKAZAN ODIN IZ PARAMETROV #
echo # #
echo #########################################
echo.
echo.
)
if %Errors% EQU 1 goto :EOF
goto :q3
-========[ Объявление переменных ]===========-
db_dir - каталог, где находятся рабочие бд 1С
temp_dir - каталог для копирования 1С
arch_temp_dir - каталог, куда производится архивация
arch_dir - каталог, в котором хранятся упакованные резервные копии
path_7z - путь к архиватору 7-zip
log - имя файла, в который записываются сообщения об ошибках
path_pscp - путь к pscp.exe
path_key - путь к приватному ключу
backup_server - пользователь, сервер и место на сервере куда производится копирование
%10, %11,...%N - каталоги, в которых находятся БД 1С
n_files - количество файлов которое оставляем в локальном хранилище архивов
:q3
set db_dir=%1
set temp_dir=%2
set arch_temp_dir=%3
set arch_dir=%4
set path_7z=%5
set log=%6
set path_pscp=%7
set path_key=%8
set backup_server=%9
set n_files=7
echo. >> %log%
echo. >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% ############### Start script ############### >> %log%
rem При желании логирования указанных параметров убрать метку с этого блока
rem goto :q4
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p1 = %1 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p2 = %2 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p3 = %3 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p4 = %4 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p5 = %5 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p6 = %6 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p7 = %7 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p8 = %8 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% p9 = %9 >> %log%
Set K=0
For %%I In (%*) Do (
If !K!==9 (
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Имя БД 1С для копирования = %%I >> %log%
) Else (
Set /A K += 1
)
)
rem :q4
rem Проверка указанной через параметры имени хотя бы одной бд 1С
set Errors=0
if [%11]==[] (
set Errors=1
echo.
echo.
echo #########################################
echo # #
echo # NE UKAZANA NI ODNA BAZA 1C #
echo # #
echo #########################################
echo.
echo.
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% ОШИБКА - Не указана ни одна база 1С >> %log%
)
if %Errors% EQU 1 goto end
rem -=================================================-
rem -===[ Проверка доступности каталогов, указанных при объявлении переменных ]===-
set Errors=0
if not exist %db_dir% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог db_dir=%db_dir% не существует или недоступен >> %log%
)
if not exist %temp_dir% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог temp_dir=%temp_dir% не существует или недоступен >> %log%
)
if not exist %arch_temp_dir% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог arch_temp_dir=%arch_temp_dir% не существует или недоступен >> %log%
)
if not exist %arch_dir% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог arch_dir=%arch_dir% не существует или недоступен >> %log%
)
if not exist %path_7z% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог path_7z=%path_7z% не существует или недоступен >> %log%
)
if not exist %path_pscp% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог path_pscp=%path_pscp% не существует или недоступен >> %log%
)
if not exist %path_key% (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог path_key=%path_key% не существует или недоступен >> %log%
)
if %Errors% EQU 1 goto end
rem -===[ Проверка доступности каталогов 1С, указанных через параметры ]===-
set Errors=0
Set K=0
For %%I In (%*) Do (
If !K!==9 (
if not exist %db_dir%\%%I (
set Errors=1
echo.
echo.
echo #########################################################################
echo # #
echo # Dir %db_dir%\%%I is unavailable or does not exist #
echo # #
echo #########################################################################
echo.
echo.
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог %db_dir%\%%I НЕ существует или недоступен>> %log%
)
) Else (
Set /A K += 1
)
)
if %Errors% EQU 1 goto end
rem удаление старого архива из каталога TEMP
if exist %arch_temp_dir%\*.7z (
DEL /Q %arch_temp_dir%\*.7z & echo file 7z DELETE exist %arch_temp_dir%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Файл *.7z удален из каталога %arch_temp_dir% >> %log%
) else (
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Файл *.7z не существует в каталоге %arch_temp_dir% >> %log%
)
rem Чистка временного каталога куда будут копироваться бд 1С (в случае, если там по каким либо причинам что то осталось)
Set K=0
For %%I In (%*) Do (
If !K!==9 (
if exist %temp_dir%\%%I (
rmdir /s /q %temp_dir%\%%I & echo Dir %%I DELETE exist %temp_dir%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Удаление каталога %arch_temp_dir%\%%I >> %log%
)
) Else (
Set /A K += 1
)
)
rem Копирование каталогов содержащих базы 1С в место определенное соответствующим параметром
Set K=0
For %%I In (%*) Do (
If !K!==9 (
xcopy %db_dir%\%%I %temp_dir%\%%I /e /i /q /h
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог %db_dir%\%%I успешно скопирован в %temp_dir%\%%I >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При копировании каталога %db_dir%\%%I возникла ОШИбКА >> %log%
)
) Else (
Set /A K += 1
)
)
if %Errors% EQU 1 goto end
rem архивация каталогов 1С и во временную папку c нормальным сжатием, паролем, шифрованием заголовков
set Errors=0
Set K=0
For %%I In (%*) Do (
If !K!==9 (
%path_7z% a %arch_temp_dir%\%_cy%%_yr%-%_mo%-%_da%_%_hh%-%_mm%.7z -ppass -mhe -ssw %temp_dir%\%%I > nul
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог %temp_dir%\%%I добавлен в архив %arch_temp_dir%\%_cy%%_yr%-%_mo%-%_da%_%_hh%-%_mm%.7z >> %log%
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Архивация каталога %temp_dir%\%%I выполнена успешно >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При архивации каталога %temp_dir%\%%I возникла ОШИбКА >> %log%
)
) Else (
Set /A K += 1
)
)
if %Errors% EQU 1 goto end
rem Тестирование созданного архива
set Errors=0
%path_7z% t %arch_temp_dir%\*.7z -r -ppass > nul
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Тестирование созданного архива выполнено успешно >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При тестировании созданного архива возникла ОШИбКА >> %log%
)
if %Errors% EQU 1 goto end
rem Копирование архива на удаленный сервер через протокол scp
%path_pscp% -i %path_key% %arch_temp_dir%\*.7z %backup_server%
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Архив успешно скопирован на удаленный сервер %backup_server% >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При копировании архива на удаленный сервер %backup_server% возникла ОШИбКА >> %log%
)
rem копирование ежедневного архива локально в каталог arch_dir
set Errors=0
XCOPY %arch_temp_dir%\*.7z %arch_dir% /y
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Архив %arch_temp_dir%\*.7z успешно скопирован в %arch_dir% >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При копировании архива %arch_temp_dir%\*.7z возникла ОШИбКА >> %log%
)
if %Errors% EQU 1 goto end
rem -=====[ Оставить в каталоге arch_dir указанное (n_files )количество новейших файлов ]=========-
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Оставить в каталоге %arch_temp_dir% %n_files% новейших файлов>> %log%
FOR /F "SKIP=%n_files% TOKENS=*" %%I IN ('DIR /B /O:-D "%arch_dir%"\*.7z') DO (
ERASE "%arch_dir%"\%%I
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Файл %arch_dir%\%%I удален успешно >> %log%
If Errorlevel 1 (
set Errors=1
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% При попытке удалить файл %arch_dir%\%%I возникла ОШИбКА >> %log%
)
)
if %Errors% EQU 1 goto end
rem Чистка временного каталога куда были скопированы бд 1С
Set K=0
For %%I In (%*) Do (
If !K!==9 (
if exist %temp_dir%\%%I (
rmdir /s /q %temp_dir%\%%I & echo Dir %%I DELETE exist %temp_dir%\%%I
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Удаление каталога %temp_dir%\%%I >> %log%
) else (
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% Каталог %temp_dir%\%%I не существует >> %log%
)
) Else (
Set /A K += 1
)
)
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% ############## End script normal ############ >> %log%
exit /b
:end
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss% ############# End script ERROR ########### >> %log%
Создаем для запуска второй скрипт.
Код:

C:\temp\bak_script\bak.cmd "C:\temp\test\db dir" "C:\temp\test\temp_dir" "C:\temp\test\arch_temp_dir" "C:\temp\test\arch_dir" "%programfiles%\7-Zip\7z.exe" "C:\temp\test\arch.log" "C:\temp\bak_script\putty\pscp.exe" "C:\temp\bak_script\putty\private_key.ppk" bak@192.168.37.2:/var/ftp/pub/backup/test LTL Optimus
Также необходимо наличие приватного ключа в недовормате putty, т. к. утилита pscp.exe не поддерживает работу с приватными ключами в стандартном формате openssh.
Пример лога
Цитата:
2010-01-18 15:43:08 ############### Start script ###############
2010-01-18 15:43:08 p1 = "C:\temp\test\db dir"
2010-01-18 15:43:08 p2 = "C:\temp\test\temp_dir"
2010-01-18 15:43:08 p3 = "C:\temp\test\arch_temp_dir"
2010-01-18 15:43:08 p4 = "C:\temp\test\arch_dir"
2010-01-18 15:43:08 p5 = "C:\Program Files\7-Zip\7z.exe"
2010-01-18 15:43:08 p6 = "C:\temp\test\arch.log"
2010-01-18 15:43:08 p7 = "C:\temp\bak_script\putty\pscp.exe"
2010-01-18 15:43:08 p8 = "C:\temp\bak_script\putty\private_key.ppk"
2010-01-18 15:43:08 p9 = bak@192.168.37.2:/var/ftp/pub/backup/test
2010-01-18 15:43:08 Имя БД 1С для копирования = LTL
2010-01-18 15:43:08 Имя БД 1С для копирования = Optimus
2010-01-18 15:43:08 Файл *.7z удален из каталога "C:\temp\test\arch_temp_dir"
2010-01-18 15:43:08 Каталог "C:\temp\test\db dir"\LTL успешно скопирован в "C:\temp\test\temp_dir"\LTL
2010-01-18 15:43:08 Каталог "C:\temp\test\db dir"\Optimus успешно скопирован в "C:\temp\test\temp_dir"\Optimus
2010-01-18 15:43:08 Каталог "C:\temp\test\temp_dir"\LTL добавлен в архив "C:\temp\test\arch_temp_dir"\2010-01-18_15-43.7z
2010-01-18 15:43:08 Архивация каталога "C:\temp\test\temp_dir"\LTL выполнена успешно
2010-01-18 15:43:08 Каталог "C:\temp\test\temp_dir"\Optimus добавлен в архив "C:\temp\test\arch_temp_dir"\2010-01-18_15-43.7z
2010-01-18 15:43:08 Архивация каталога "C:\temp\test\temp_dir"\Optimus выполнена успешно
2010-01-18 15:43:08 Тестирование созданного архива выполнено успешно
2010-01-18 15:43:08 Архив успешно скопирован на удаленный сервер bak@192.168.37.2:/var/ftp/pub/backup/test
2010-01-18 15:43:08 Архив "C:\temp\test\arch_temp_dir"\*.7z успешно скопирован в "C:\temp\test\arch_dir"
2010-01-18 15:43:08 Оставить в каталоге "C:\temp\test\arch_temp_dir" 7 новейших файлов
2010-01-18 15:43:08 Файл "C:\temp\test\arch_dir"\2010-01-15_15-20.7z удален успешно
2010-01-18 15:43:08 Удаление каталога "C:\temp\test\temp_dir"\LTL
2010-01-18 15:43:08 Удаление каталога "C:\temp\test\temp_dir"\Optimus
2010-01-18 15:43:08 ############## End script normal ############
|