Files
fontvielle 19a2b6dda4 fix(admin): кнопка «Проверить документацию» возвращает на /admin/news + браузерный UA для nsd.ru
Три бага в Doc-watcher / Новостях, всплывшие при первом ручном прогоне:

1. setupFlash после POST в /admin/news/check-docs редиректил на
   /admin/setup, а не на /admin/news, и оператор «выпадал» с ленты.
   Теперь setupFlash смотрит Referer и возвращает на любой из
   /admin/wizard, /admin/news, /admin/setup — на ту страницу с которой
   пришёл POST.

2. http.DefaultClient в news.go и cacerts.go подхватывал HTTPS_PROXY
   из окружения и шёл через корпоративный zetit, который блокирует
   nsd.ru (CONNECT 403). Заменил на noProxyClient с явно отключённой
   проксификацией (Transport.Proxy = nil) — doc-watcher всегда идёт
   напрямую, независимо от ENV.

3. nsd.ru отдаёт 403 на запросы с UA «bj-server/1.0» (антибот). Заменил
   на стандартный Chrome User-Agent + браузерные Accept/Accept-Language.
   После этого moex-most-dlya-m2m.pdf найден и скачан, новость
   «Обновлена документация» опубликована.

Кроме того, по запросу — убрана форма «Добавить вручную» с /admin/news.
В UI остался только мониторинг: автоматическая лента событий +
ручная кнопка «🔄 Проверить обновления документации сейчас».
Handler /admin/news/add сохранён в коде на случай ручного ввода
инцидентов в будущем.
2026-05-14 16:36:31 +03:00

92 lines
4.7 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "content"}}
<style>
.news-item { background:var(--card); border:1px solid var(--border); border-radius:6px; padding:14px; margin-bottom:10px; }
.news-item.dismissed { opacity:0.5; }
.news-item.kind-maintenance { border-left:4px solid var(--warn); }
.news-item.kind-feature { border-left:4px solid var(--ok); }
.news-item.kind-doc-update { border-left:4px solid var(--accent); }
.news-item.kind-system { border-left:4px solid var(--err); }
.news-item.kind-manual { border-left:4px solid var(--muted); }
.news-meta { font-size:11px; color:var(--muted); margin-bottom:6px; text-transform:uppercase; letter-spacing:0.04em; }
.news-title { font-size:15px; font-weight:600; margin:0 0 6px 0; }
.news-body { font-size:13px; white-space:pre-wrap; }
.news-validity { margin-top:6px; padding:4px 8px; background:var(--bg); border-radius:4px; display:inline-block; font-size:12px; }
.news-validity.active { background:rgba(232,177,58,0.15); color:var(--warn); }
</style>
{{if .Flash}}<div class="card" style="border-left:3px solid var(--accent)"><p style="margin:0">{{.Flash}}</p></div>{{end}}
<div class="card">
<h2>Новости и события</h2>
<p class="muted">События системы, окна техработ НРД, обновления документации и сертификатов. Лента не очищается — служит журналом для аудита. Скрытые новости можно посмотреть, сняв галочку «Только активные».</p>
<form method="post" action="/admin/news/check-docs" style="margin-top:10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<button type="submit" class="btn">🔄 Проверить обновления документации НРД сейчас</button>
{{if not .Settings.News.LastDocCheck.IsZero}}
<span class="muted" style="font-size:12px">Последняя проверка: {{.Settings.News.LastDocCheck.Format "02.01.2006 15:04:05"}}</span>
{{end}}
</form>
{{if .Settings.News.DocSources}}
<details style="margin-top:8px">
<summary style="cursor:pointer;color:var(--accent);font-size:13px">Источники документации, которые отслеживает doc-watcher</summary>
<table style="margin-top:8px;font-size:13px">
<thead><tr><th>Имя</th><th>URL</th><th>PDF найдено</th><th>Последняя проверка</th></tr></thead>
<tbody>
{{range .Settings.News.DocSources}}
<tr>
<td>{{.Name}}</td>
<td><a href="{{.URL}}" target="_blank"><code style="font-size:11px">{{.URL}}</code></a></td>
<td>{{len .KnownPDFs}}</td>
<td>{{if .LastChecked.IsZero}}—{{else}}{{.LastChecked.Format "02.01.2006 15:04"}}{{end}}</td>
</tr>
{{end}}
</tbody>
</table>
</details>
{{end}}
</div>
<h2 style="margin:24px 0 12px 0">Лента ({{len .Settings.News.Items}})</h2>
{{if not .Settings.News.Items}}
<div class="card"><p class="muted" style="margin:0">Пока ничего нет. Doc-watcher запустится через минуту после старта bj-server и заполнит ленту автоматически.</p></div>
{{end}}
{{range .Settings.News.Items}}
<div class="news-item kind-{{.Kind}} {{if .Dismissed}}dismissed{{end}}">
<div class="news-meta">
{{.At.Format "02.01.2006 15:04"}}
· <strong>{{.Kind}}</strong>
{{if .URL}}· <a href="{{.URL}}" target="_blank" rel="noopener">источник</a>{{end}}
</div>
<h3 class="news-title">{{.Title}}</h3>
{{if .Body}}<div class="news-body">{{.Body}}</div>{{end}}
{{if or (not .ValidFrom.IsZero) (not .ValidTo.IsZero)}}
{{$now := now}}
{{$active := false}}
{{if and (not .ValidFrom.IsZero) (not .ValidTo.IsZero)}}
{{if and (gt $now.Unix .ValidFrom.Unix) (lt $now.Unix .ValidTo.Unix)}}{{$active = true}}{{end}}
{{end}}
<div class="news-validity {{if $active}}active{{end}}">
{{if not .ValidFrom.IsZero}}С {{.ValidFrom.Format "02.01.2006"}}{{end}}
{{if not .ValidTo.IsZero}} по {{.ValidTo.Format "02.01.2006"}}{{end}}
{{if $active}} — <strong>сейчас активно</strong>{{end}}
</div>
{{end}}
{{if not .Dismissed}}
<form method="post" action="/admin/news/dismiss" style="margin-top:10px">
<input type="hidden" name="id" value="{{.ID}}">
<button type="submit" class="btn" style="background:var(--border);color:var(--text);padding:4px 10px;font-size:12px">Скрыть</button>
</form>
{{end}}
</div>
{{end}}
{{if .Settings.News.DocCheckResult}}
<div class="card" style="margin-top:20px">
<h2>Журнал последней проверки документации</h2>
<pre>{{.Settings.News.DocCheckResult}}</pre>
</div>
{{end}}
{{end}}