-
Notifications
You must be signed in to change notification settings - Fork 4
/
Шаблон_РезервныеКопииФайлов.os
211 lines (174 loc) · 16.2 KB
/
Шаблон_РезервныеКопииФайлов.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//*****************************************************************
// Автор: Онянов Виталий (Tavalik.ru)
// Описание:
// Скрипт выполняет резервное копирование указанных каталогов или файлов, алгоритм работы следующий:
// 1. Для каждого из каталога или файлов
// 1.1 Создается архив указанного каталога или файла в каталоге хранения архивов
// 1.2 В каталоге хранения архивов удалюятся старые копии (опционально)
// 1.3 Архив копируется на FTP-сервер (опционально)
// 1.4 На FTP-сервере удалюятся старые копии (опционально)
// 3. Отправляется электорнное сообщение о результатах выполнения задания (опционально)
// Аргументы командной строки:
// - Имя файла или каталога - Строка - Путь к каталогу или файлу для создания резервной копии
// - Каталог резеврных копий - Строка - Путь к каталогу, где храняться резервные копии
// - Количество дней хранения копий - Число - Число дней с момента создания копии, для удаления. Если 0 - копии не удаляются.
// - Каталог резерных копий на FTP-сервере - Строка - Каталог для хранения резервных копий на FTP-сервере. Если не указан, не выполняется копирование на FTP-сервер.
// - Количество дней хранения копий на FTP-сервере - Число дней с момента создания копии, для удаления. Если 0 - копии не удаляются.
//***************************************************************
// ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
// Логирование
#Использовать "TLog"
// Файловые операции
#Использовать "TFile"
// Работа с FTP
#Использовать "TFTP"
// Электронная почта
#Использовать "TMail"
//***************************************************************
// АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ
// Таблица с указанием источников копирования
ДанныеДляАрхива = Новый ТаблицаЗначений;
ДанныеДляАрхива.Колонки.Добавить("ИмяФайла");
ДанныеДляАрхива.Колонки.Добавить("КаталогРезервнойКопии");
ДанныеДляАрхива.Колонки.Добавить("КоличествоДнейХранения"); // Если 0, то не удаляются копии
ДанныеДляАрхива.Колонки.Добавить("КаталогРезервнойКопииНаFTP"); // Если путой, то не не копируется на FTP
ДанныеДляАрхива.Колонки.Добавить("КоличествоДнейХраненияНаFTP"); // Если 0, то не удалются копии
Если АргументыКоманднойСтроки.Количество() > 1 Тогда
НоваяСтрокаДляАрхива = ДанныеДляАрхива.Добавить();
НоваяСтрокаДляАрхива.ИмяФайла = АргументыКоманднойСтроки[0];
НоваяСтрокаДляАрхива.КаталогРезервнойКопии = АргументыКоманднойСтроки[1];
Если АргументыКоманднойСтроки.Количество() > 2 Тогда
НоваяСтрокаДляАрхива.КоличествоДнейХранения = АргументыКоманднойСтроки[2];
КонецЕсли;
Если АргументыКоманднойСтроки.Количество() > 3 Тогда
НоваяСтрокаДляАрхива.КаталогРезервнойКопииНаFTP = АргументыКоманднойСтроки[3];
КонецЕсли;
Если АргументыКоманднойСтроки.Количество() > 4 Тогда
НоваяСтрокаДляАрхива.КоличествоДнейХраненияНаFTP = АргументыКоманднойСтроки[4];
КонецЕсли;
//***************************************************************
// НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ
Иначе
НоваяСтрокаДляАрхива = ДанныеДляАрхива.Добавить();
НоваяСтрокаДляАрхива.ИмяФайла = "C:\Temp\_Скрипты"; //"C:\repo\Scripts";
НоваяСтрокаДляАрхива.КаталогРезервнойКопии = "C:\DATA\Backup";
НоваяСтрокаДляАрхива.КоличествоДнейХранения = 30;
НоваяСтрокаДляАрхива.КаталогРезервнойКопииНаFTP = "!BACKUP/VION/";
НоваяСтрокаДляАрхива.КоличествоДнейХраненияНаFTP = 365;
КонецЕсли;
// Каталог для хранения логов
КаталогХраненияЛогов = ".\_Logs\";
ХранитьЛогиДней = 365;
Логирование = Новый ТУправлениеЛогированием(); //TLog
Логирование.СоздатьФайлЛога("РезервныеКопииФайлов",КаталогХраненияЛогов);
// Инициируем параметры для отправки сообщения
УправлениеЭП = Новый ТУправлениеЭлектроннойПочтой(); //TMail
УчетнаяЗаписьЭП = УправлениеЭП.УчетнаяЗаписьЭП;
УчетнаяЗаписьЭП.АдресSMTP = "smtp.mydomen.com"; // Если не указан, не отправляется сообщение
УчетнаяЗаписьЭП.ПортSMTP = 465;
УчетнаяЗаписьЭП.ПользовательSMTP = "report@mydomen.com";
УчетнаяЗаписьЭП.ПарольSMTP = "pass_mail";
УчетнаяЗаписьЭП.ИспользоватьSSL = Истина;
СтруктураСообщения = УправлениеЭП.СтруктураСообщения;
СтруктураСообщения.АдресЭлектроннойПочтыПолучателя = "admin@mydomen.com;";
// Темы сообщений
СИ = Новый СистемнаяИнформация();
ТемаСообщенияПриОшибке = "ВНИМАНИЕ! Задание ""РезервныеКопииФайлов"" на сервере " + СИ.ИмяКомпьютера + " завершено с ошибками";
ТемаСообщенияПриУспехе = "Успешное выполнение задания ""РезервныеКопииФайлов"" на сервере " + СИ.ИмяКомпьютера;
// Введем параметры подключения к FTP-серверу
ОперацииСFTP = Новый ТОперацииСFTP(); //TFTP
ПараметрыFTP = ОперацииСFTP.ПараметрыFTP;
ПараметрыFTP.Адрес = "ftp.iis.mydomen.com";
ПараметрыFTP.ИмяПользователя = "username_iis";
ПараметрыFTP.ПарольПользователя = "pass_iis";
ПараметрыFTP.ПроверятьРезультат = Истина;
// Файловые операции
ФайловыеОперации = Новый ТУправлениеФайловымиОперациями(); //TFile
//***************************************************************
// ТЕЛО СКРИПТА
// Сделаем записть о начале выполнения задания
Логирование.ЗаписатьСтрокуЛога(Строка(ТекущаяДата()) + ": Начало выполнения задания ""РезервныеКопииФайлов""");
Логирование.УвеличитьУровень();
// Служебные переменные
БылиОшибки = Ложь;
// Цикл по файлам, которые необходимо скопировать
Для Каждого СтрокаДляАрхива Из ДанныеДляАрхива Цикл
Логирование.ЗаписатьСтрокуЛога();
Логирование.ЗаписатьСтрокуЛога("Попытка создания резервной копии файла: " + СтрокаДляАрхива.ИмяФайла);
// Проверим существование файла
Файл = Новый Файл(СтрокаДляАрхива.ИмяФайла);
Если Не Файл.Существует() Тогда
Логирование.ЗаписатьСтрокуЛога("ОШИБКА: Не наден файл по пути: " + СтрокаДляАрхива.ИмяФайла);
БылиОшибки = Истина;
Продолжить;
КонецЕсли;
// Создадим архив
ИмяАрхива = ОбъединитьПути(СтрокаДляАрхива.КаталогРезервнойКопии,ФайловыеОперации.ИмяФайлаНаДату(Файл.ИмяБезРасширения,"zip",,Истина));
Если ФайловыеОперации.ДобавитьВАрхив(СтрокаДляАрхива.ИмяФайла,ИмяАрхива) Тогда
Логирование.ЗаписатьСтрокуЛога("Создан архив: " + ИмяАрхива);
Иначе
Логирование.ЗаписатьСтрокуЛога("ОШИБКА: Не удалось создан архив: " + ИмяАрхива);
БылиОшибки = Истина;
Продолжить;
КонецЕсли;
// Удалим старые резервные копии
Если ЗначениеЗаполнено(СтрокаДляАрхива.КоличествоДнейХранения)
И СтрокаДляАрхива.КоличествоДнейХранения > 0 Тогда
ФайловыеОперации.УдалитьФайлыСозданныеБолееДнейНазад(СтрокаДляАрхива.КаталогРезервнойКопии,СтрокаДляАрхива.КоличествоДнейХранения,"*.zip");
Логирование.ЗаписатьСтрокуЛога("В каталоге: " + СтрокаДляАрхива.КаталогРезервнойКопии + " удалены архивы, созданные более "
+ СтрокаДляАрхива.КоличествоДнейХранения + " дней назад.");
КонецЕсли;
// Скопируем архив на FTP
Если ЗначениеЗаполнено(СтрокаДляАрхива.КаталогРезервнойКопииНаFTP) Тогда
Если ОперацииСFTP.ЗагрузитьФайлНаFTP(СтрокаДляАрхива.КаталогРезервнойКопииНаFTP,ИмяАрхива) Тогда
Логирование.ЗаписатьСтрокуЛога("Файл: " + ИмяАрхива + " загружен на FTP-сервер в каталог " + СтрокаДляАрхива.КаталогРезервнойКопииНаFTP);
Иначе
Логирование.ЗаписатьСтрокуЛога("ОШИБКА: Не удалось загрузить файл: " + ИмяАрхива + " на FTP-сервер в каталог " + СтрокаДляАрхива.КаталогРезервнойКопииНаFTP);
БылиОшибки = Истина;
Продолжить;
КонецЕсли;
// Удалим старые копии на FTP-сервере
Если ЗначениеЗаполнено(СтрокаДляАрхива.КоличествоДнейХраненияНаFTP)
И СтрокаДляАрхива.КоличествоДнейХраненияНаFTP > 0 Тогда
Если ОперацииСFTP.УдалитьФайлыНаFTPЗагруженныеБолееДнейНазад(СтрокаДляАрхива.КаталогРезервнойКопииНаFTP,СтрокаДляАрхива.КоличествоДнейХраненияНаFTP) Тогда
Логирование.ЗаписатьСтрокуЛога("На FTP-сервере в каталоге " + СтрокаДляАрхива.КаталогРезервнойКопииНаFTP + " удалены архивы, созданные более "
+ СтрокаДляАрхива.КоличествоДнейХраненияНаFTP + " дней назад.");
Иначе
Логирование.ЗаписатьСтрокуЛога("ОШИБКА: Не удалось на FTP-сервере в каталоге " + СтрокаДляАрхива.КаталогРезервнойКопииНаFTP + " удалить архивы, созданные более "
+ СтрокаДляАрхива.КоличествоДнейХраненияНаFTP + " дней назад.");
БылиОшибки = Истина;
Продолжить;
КонецЕсли
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Сделаем записть о завершении выполнения задания
Логирование.ЗаписатьСтрокуЛога();
Логирование.ЗаписатьСтрокуЛога("Результат выполнения задания: " + ?(БылиОшибки,"БЫЛИ ОШИБКИ","УСПЕШНОЕ ВЫПОЛНЕНИЕ"));
Логирование.ЗаписатьСтрокуЛога();
Логирование.УменьшитьУровень();
Логирование.ЗаписатьСтрокуЛога(Строка(ТекущаяДата()) + ": Завершение выполнения задания ""РезервныеКопииФайлов""");
// Отправляем эклектронное сообщение с файлом лога во вложении
Если ЗначениеЗаполнено(УчетнаяЗаписьЭП.АдресSMTP) Тогда
Если БылиОшибки Тогда
СтруктураСообщения.ТемаСообщения = ТемаСообщенияПриОшибке;
Иначе
СтруктураСообщения.ТемаСообщения = ТемаСообщенияПриУспехе;
КонецЕсли;
СтруктураСообщения.ТекстСообщения = СтруктураСообщения.ТемаСообщения;
// Часть имеющегося лога добавим в письмо
ИмяВременногоФайла = ФайловыеОперации.СкопироватьФайл(Логирование.ИмяФайлаЛога);
СтруктураСообщения.Вложения = ИмяВременногоФайла;
// Отправим сообщение
Логирование.ЗаписатьСтрокуЛога();
Логирование.ЗаписатьСтрокуЛога("Попытка отправки электронного сообщения:");
КопироватьФайл(Логирование.ИмяФайлаЛога,ПолучитьИмяВременногоФайла("txt"));
Если УправлениеЭП.ОтправитьСообщение() Тогда
Логирование.ЗаписатьСтрокуЛога("Отправлено электорнное сообщение на адреса: " + СтруктураСообщения.АдресЭлектроннойПочтыПолучателя);
Иначе
Логирование.ЗаписатьСтрокуЛога("ОШИБКА: Не удалось отправить электронное сообщение с smtp-сервера: " + УчетнаяЗаписьЭП.АдресSMTP);
Логирование.ЗаписатьСтрокуЛога(" по причине " + УправлениеЭП.ТекстОшибки);
БылиОшибки = Истина;
КонецЕсли;
УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;