Мастер: «Далее» на шаге ключа сразу после установки + надёжная сверка справочника

После успешной установки ключа на шаге «Ключ и сертификаты» не появлялась
кнопка «Далее»: шаг считался выполненным только по асинхронной сверке
справочника ИШ (nsdCertsCheck), а она сразу после установки отваливалась по
таймауту — root-воркер был занят перезапуском ИШ и повторной активацией
профиля. Ключ при этом уже подключён и подписывает.

- refreshCertStore: повторяет сверку до 5 раз (воркер освобождается — проходит),
  вместо одной попытки с таймаутом.
- Шаг 8 в мастере выполнен, если справочник собран ИЛИ мастер ключа прошёл до
  конца (ИШ подтвердил подпись) — «Далее» появляется сразу, не дожидаясь сверки.
  Добавлен потокобезопасный keyWizardState.installed().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 14:32:58 +03:00
parent ed2d0ce4e5
commit 1659a15f81
4 changed files with 40 additions and 17 deletions
+14 -4
View File
@@ -365,10 +365,20 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
func refreshCertStore(rc *RuntimeConfig) {
go func() {
time.Sleep(20 * time.Second) // ИШ перезапускается после изменений
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
defer cancel()
if _, err := nsdCertsCheck(ctx, rc); err != nil {
log.Printf("nsdcerts: перечитать справочник: %v", err)
// root-воркер обрабатывает запросы по одному и сразу после установки ключа
// (перезапуск ИШ, повторная активация профиля) бывает занят — одной попытки
// может не хватить, она отваливается по таймауту. Повторяем, пока сверка не
// пройдёт: без свежего справочника шаг «Ключ и сертификаты» остаётся
// невыполненным и в мастере нет кнопки «Далее», хотя ключ уже подписывает.
for attempt := 1; attempt <= 5; attempt++ {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
_, err := nsdCertsCheck(ctx, rc)
cancel()
if err == nil {
return
}
log.Printf("nsdcerts: перечитать справочник (попытка %d/5): %v", attempt, err)
time.Sleep(30 * time.Second)
}
}()
}