Skip to content

Commit

Permalink
Шаг 5. Уведомления
Browse files Browse the repository at this point in the history
  • Loading branch information
leobrn committed Jan 12, 2025
1 parent 0d3252d commit df1b953
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 9 deletions.
1 change: 1 addition & 0 deletions main.os
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

Монитор = Новый Монитор(Конфигурация);
Монитор.ЗапуститьМониторинг();
Монитор.ОтправитьУведомления();

КонецПроцедуры

Expand Down
10 changes: 8 additions & 2 deletions Классы/Конфигурация.os
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#Использовать logos

Перем ИмяФайла;
Перем Настройки;
Перем Лог;

Процедура ПриСозданииОбъекта()

Лог = Мониторинг.Лог();
ИмяФайла = ПараметрыПриложения.ИмяФайлаКонфигурации();
Лог = Мониторинг.Лог();

Если Не РаботаСФайлами.Существует(ИмяФайла) Тогда
ВызватьИсключение "Не найден файл конфигурации: " + ИмяФайла;
Expand All @@ -18,7 +19,8 @@

Процедура Инициализировать() Экспорт

Настройки = РаботаСФайлами.ПрочитатьФайлJSON(ПараметрыПриложения.ИмяФайлаКонфигурации());
Лог.Отладка("Читаю настройки из " + ИмяФайла);
Настройки = РаботаСФайлами.ПрочитатьФайлJSON(ИмяФайла);

Мониторинг.ДобавитьВыводЛогаВФайл(ФайлЛога());

Expand All @@ -32,4 +34,8 @@
Возврат Настройки["ФайлЛога"];
КонецФункции

Функция НастройкиУведомлений() Экспорт
Возврат Настройки["Уведомления"];
КонецФункции

#КонецОбласти
39 changes: 39 additions & 0 deletions Классы/Монитор.os
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,43 @@

КонецЦикла;

Лог.Закрыть();

КонецПроцедуры

Процедура ОтправитьУведомления() Экспорт

ФайлЛога = _Конфигурация.ФайлЛога();

ЛогУведомления = Уведомления.Лог();
ОшибкиМониторинга = Мониторинг.ОшибкиМониторинга(ФайлЛога);

Если Не ЗначениеЗаполнено(ОшибкиМониторинга) Тогда
ЛогУведомления.Отладка("Нет ошибок для отправки уведомлений");
Возврат;
КонецЕсли;

СистемнаяИнформация = Новый СистемнаяИнформация;
ИмяКомпьютера = СистемнаяИнформация.ИмяКомпьютера;

ПараметрыУведомления = Уведомления.ПараметрыУведомления();
ПараметрыУведомления["Тема"] = "Результат мониторинга сервера " + ИмяКомпьютера;
ПараметрыУведомления["Текст"] = Мониторинг.ТекстУведомления(ОшибкиМониторинга);
ПараметрыУведомления["Вложение"] = ФайлЛога;

НастройкиУведомлений = _Конфигурация.НастройкиУведомлений();

Для Каждого НастройкаУведомления Из НастройкиУведомлений Цикл

ИмяТранспорта = НастройкаУведомления.Ключ;
НастройкиТранспорта = НастройкаУведомления.Значение;

Уведомления.ОтправитьУведомление(
ИмяТранспорта,
НастройкиТранспорта,
ПараметрыУведомления
);

КонецЦикла;

КонецПроцедуры
44 changes: 44 additions & 0 deletions Модули/Мониторинг.os
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,50 @@

#КонецОбласти

#Область РезультатМониторинга

Функция ОшибкиМониторинга(ПутьФайла) Экспорт

Лог = Лог();

Если Не РаботаСФайлами.Существует(ПутьФайла) Тогда
Лог.Отладка("Не найден файл для получения ошибок мониторинга");
Возврат Новый Массив;
КонецЕсли;

Ошибки = Новый Массив;
Читатель = Новый ЧтениеТекста(ПутьФайла);

Пока Истина Цикл

СтрокаЛога = Читатель.ПрочитатьСтроку();
Если СтрокаЛога = Неопределено Тогда
Прервать;
КонецЕсли;

Если Найти(СтрокаЛога, "ОШИБКА") > 0 Тогда
Ошибки.Добавить(СтрокаЛога);
КонецЕсли;

КонецЦикла;

Читатель.Закрыть();

Возврат Ошибки;

КонецФункции

Функция ТекстУведомления(Ошибки) Экспорт

Тема = СтрШаблон("<b>Количество ошибок: %1</b>", Ошибки.Количество());
Тело = СтрШаблон("<pre>%1</pre>", СтрСоединить(Ошибки, Символы.ПС + Символы.ПС));

Возврат Тема + Символы.ПС + Тело;

КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс
Expand Down
7 changes: 0 additions & 7 deletions Модули/РаботаСФайлами.os
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
#Использовать logos

Перем Лог;

Функция Существует(ИмяФайла) Экспорт

Файл = Новый Файл(ИмяФайла);
Expand All @@ -12,9 +8,6 @@

Функция ПрочитатьФайлJSON(ИмяФайла) Экспорт

Лог = Мониторинг.Лог();
Лог.Отладка("Читаю настройки из " + ИмяФайла);

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ИмяФайла);

Expand Down
83 changes: 83 additions & 0 deletions Модули/Уведомления.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#Использовать logos

Перем Лог;

#Область ПрограмммныйИнтерфейс

Процедура ОтправитьУведомление(ИмяТранспорта, НастройкиТранспорта, ПараметрыУведомления) Экспорт

Лог = Уведомления.Лог();

Если Не НастройкиТранспорта["Использовать"] Тогда
Лог.Отладка("Отправка уведомлений через ""%1"" отключена", ИмяТранспорта);
Возврат;
КонецЕсли;

Попытка

Менеджер = МенеджерТранспорта(ИмяТранспорта);
Менеджер.ОтправитьУведомление(НастройкиТранспорта, ПараметрыУведомления);

Лог.Информация("Уведомление через ""%1"" отправлено", ИмяТранспорта);

Исключение

ТекстОшибки = "Ошибка отправки уведомления через ""%1"": "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке());

Лог.Ошибка(ТекстОшибки, ИмяТранспорта);

КонецПопытки;

КонецПроцедуры

Функция ПараметрыУведомления() Экспорт

Параметры = Новый Соответствие;
Параметры.Вставить("Тема");
Параметры.Вставить("Текст");
Параметры.Вставить("Вложение");
Параметры.Вставить("ТипТекста", ТипыТекста().html);

Возврат Параметры;

КонецФункции

Функция ТипыТекста() Экспорт

Типы = Новый Структура;
Типы.Вставить("html", "html");
Типы.Вставить("markdown", "markdown");

Возврат Типы;

КонецФункции


Функция Лог() Экспорт

ИмяЛога = ПараметрыПриложения.ИмяПриложения() + ".notification";

Если Лог = Неопределено Тогда
Лог = Логирование.ПолучитьЛог(ИмяЛога);
КонецЕсли;

Возврат Лог;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция МенеджерТранспорта(ИмяТранспорта)

Менеджеры = Новый Соответствие;
Менеджеры.Вставить("Почта", УведомленияПочта);
Менеджеры.Вставить("Телеграм", УведомленияТелеграм);

Возврат Менеджеры[ИмяТранспорта];

КонецФункции

#КонецОбласти
59 changes: 59 additions & 0 deletions Модули/УведомленияПочта.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#Использовать InternetMail

#Область ПрограммныйИнтерфейс

Процедура ОтправитьУведомление(НастройкиТранспорта, ПараметрыУведомления) Экспорт

Профиль = ПрофильПочты(НастройкиТранспорта);
Сообщение = ИсходящееСообщение(НастройкиТранспорта, ПараметрыУведомления);

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение, , ПротоколИнтернетПочты.SMTP);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПрофильПочты(НастройкиТранспорта)

Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Таймаут = 10;

Профиль.АдресСервераSMTP = НастройкиТранспорта["Сервер"];
Профиль.ПортSMTP = НастройкиТранспорта["Порт"];
Профиль.ПользовательSMTP = НастройкиТранспорта["Логин"];
Профиль.ПарольSMTP = НастройкиТранспорта["Пароль"];
Профиль.ИспользоватьSSLSMTP = НастройкиТранспорта["ИспользоватьSSL"];

Возврат Профиль;

КонецФункции

Функция ИсходящееСообщение(НастройкиТранспорта, ПараметрыУведомления)

ТипТекста = Неопределено;
Если ПараметрыУведомления["ТипТекста"] = Уведомления.ТипыТекста().html Тогда
ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
КонецЕсли;

Получатели = НастройкиТранспорта["Получатели"];
Сообщение = Новый ИнтернетПочтовоеСообщение;

Для Каждого Получатель Из Получатели Цикл
Сообщение.Получатели.Добавить(Получатель);
КонецЦикла;

Сообщение.Отправитель = НастройкиТранспорта["Отправитель"];
Сообщение.Тема = ПараметрыУведомления["Тема"];

Сообщение.Тексты.Добавить(ПараметрыУведомления["Текст"], ТипТекста);
Сообщение.Вложения.Добавить(ПараметрыУведомления["Вложение"]);

Возврат Сообщение;

КонецФункции

#КонецОбласти
45 changes: 45 additions & 0 deletions Модули/УведомленияТелеграм.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#Использовать 1connector
#Использовать logos

Перем Лог;

Процедура ОтправитьУведомление(НастройкиТранспорта, ПараметрыУведомления) Экспорт

Лог = Уведомления.Лог();

Получатели = НастройкиТранспорта["Получатели"];
Токен = НастройкиТранспорта["Токен"];

Тема = ПараметрыУведомления["Тема"];
Текст = ПараметрыУведомления["Текст"];
ЭтоHtml = ПараметрыУведомления["ТипТекста"] = Уведомления.ТипыТекста().html;

Если ЭтоHtml Тогда
Заголовок = СтрШаблон("<b>%1:</b>", Тема);
Иначе
Заголовок = СтрШаблон("**%1:**", Тема);
КонецЕсли;

Сообщение = Заголовок + Символы.ПС + Символы.ПС + Текст;

АдресРесурса = "api.telegram.org/bot" + Токен + "/sendMessage";

Для Каждого Получатель Из Получатели Цикл

ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", Получатель);
ПараметрыЗапроса.Вставить("text", Сообщение);

Если ЭтоHtml Тогда
ПараметрыЗапроса.Вставить("parse_mode", "html");
КонецЕсли;

Ответ = КоннекторHTTP.Get(АдресРесурса, ПараметрыЗапроса);

Если Ответ["КодСостояния"] <> 200 Тогда
Лог.Ошибка("Не удалось отправить уведомление телеграм пользователю %1", Получатель);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

0 comments on commit df1b953

Please sign in to comment.