Оповещения: группа «Администратор системы», блок «Кому писать» открыт; копии: адрес хранилища как в проводнике

Администратору (адрес из «Почты») — сбои (ИШ, связь с НРД, службы bj, DEPO) и обновления (новый выпуск bj,
ИШ, лицензия, сертификаты); отделам — переводы и поручения. Существующие установки: администратор получает
всё, что получал. Новые оповещения: «Доступно обновление bj» (раз на выпуск), «Служба … не работает /
снова работает» (модули и служба ключей Валидаты). Резервные копии: \\сервер\папка или сервер + общая
папка по полям → //сервер/папка; понятная причина отказа доступа.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 22:44:35 +03:00
parent f07bb53162
commit d23ddf6e0c
16 changed files with 547 additions and 63 deletions
+20 -4
View File
@@ -28,9 +28,9 @@ func dispatchAlert(rc *RuntimeConfig, title, body string) {
cfg := rc.Snapshot()
a := cfg.Alerts
if a.SMTP.Enabled {
// адрес алертов + группы по маршруту типа (сроки поручений / QUIK / системные)
// администратор системы и отделы — по маршруту типа (сроки поручений / QUIK / сбои / обновления / прочие)
s := a.SMTP
s.To = mergeEmails(a.SMTP.To, cfg.Incoming.Recipients(alertKind(title)))
s.To = notifyRecipients(cfg, alertKind(title))
if strings.TrimSpace(s.To) != "" {
if err := sendSMTP(s, "[bj] "+title, body); err != nil {
log.Printf("lk-gateway: алерт SMTP не доставлен: %v", err)
@@ -298,13 +298,29 @@ func readFull(conn net.Conn, buf []byte) (int, error) {
return total, nil
}
// alertKind — тип оповещения по заголовку (для маршрутизации по группам адресов).
// alertKind — тип оповещения по заголовку (маршрут «какой тип кому» — в настройках уведомлений). Сбои и
// обновления — администратору системы: падение ИШ или службы отделам ни к чему, им — переводы и поручения.
func alertKind(title string) string {
has := func(prefixes ...string) bool {
for _, p := range prefixes {
if strings.HasPrefix(title, p) {
return true
}
}
return false
}
switch {
case strings.HasPrefix(title, "НРД: депо-поручение") || strings.HasPrefix(title, "НРД: истёк срок"):
case has("НРД: депо-поручение", "НРД: истёк срок"):
return "orders"
case strings.Contains(title, "QUIK"):
return "quik"
case has("ИШ НРД", "Перезапуск ИШ НРД", "НРД не отвечает", "НРД всё ещё не отвечает", "НРД снова на связи",
"Проверка связи с НРД", "Сбой компонента", "Компонент не отвечает", "Служба ", "DEPO: bj не может",
"DEPO: вход логином", "DEPO: обработчик", "Резервная копия"):
return "infra"
case has("Доступно обновление", "ИШ обновлён", "ИШ не обновлён", "Лицензия", "Поддержка bj", "Модуль «",
"Сертификат", "Версия внешней системы"):
return "updates"
}
return "system"
}