Ключ: «У меня уже есть подготовленная флешка — использовать ключ с неё» — без записи на флешку

- Флешка с готовым ключом (например, с другого сервера bj) используется как есть:
  bj-keymedia-install use-media ничего на неё не пишет — справочник для ИШ
  пересобирается в копии на диске, из неё — профиль ИШ; этапы и кнопки — «использовать
  ключ с флешки», «на неё ничего не записывается».
- Ключевая флешка подключается к ИШ постоянно и только на чтение, как на рабочем
  сервере: строка fstab по UUID на /var/lib/igate/keymedia с автомонтированием
  (прежний fstab — копией), ссылка реестра ключей igate на флешку. И при обычной
  установке (запись архива) — тоже: на свежем сервере Валидата иначе не находила ключ.

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 18:28:08 +03:00
parent 0a0408a3cc
commit dd59c47dc0
4 changed files with 152 additions and 6 deletions
+68
View File
@@ -274,6 +274,66 @@ func (h *setupHandlers) renderKeyWizard(w http.ResponseWriter, r *http.Request)
render(w, h.tpl.a.keyWizard, *d)
}
// keyWizardUseMedia — «использовать ключ с подготовленной флешки как есть»: на флешку ничего не пишется.
// Справочник для ИШ собирается из её копии на диске, флешка подключается к ИШ постоянно и только на чтение.
func (h *setupHandlers) keyWizardUseMedia(w http.ResponseWriter, r *http.Request, staging string) {
h.keyWiz.mu.Lock()
dev, prof := h.keyWiz.MediaDevice, h.keyWiz.MediaProfile
h.keyWiz.mu.Unlock()
found := false
for _, d := range listFlashDrives() {
found = found || d.Device == dev
}
if dev == "" || !found {
h.keyWizFlash(w, r, "Флешка с ключом не найдена — вставьте её и нажмите «Использовать ключ с флешки» ещё раз.")
return
}
contour := r.FormValue("contour")
if contour != "prod" {
contour = "test3"
}
ctx, cancel := context.WithTimeout(r.Context(), 3*time.Minute)
defer cancel()
res, err := runKeymediaOp(ctx, "use-media", map[string]string{"staging": staging, "profile": prof, "target_dev": dev, "channel": contourChannel(contour)})
h.keyWiz.mu.Lock()
if err != nil || res["ok"] != true {
msg := errStr(err)
if e, ok := res["error"].(string); ok {
msg = e
}
h.keyWiz.set(1, "error", "Ключ с флешки не подключён: "+msg)
h.keyWiz.mu.Unlock()
h.keyWizFlash(w, r, "Ключ с флешки не подключён: "+msg)
return
}
if p, ok := res["profile"].(string); ok {
h.keyWiz.Profile = p
}
rebuild, _ := res["rebuild"].(string)
igate, _ := res["igate"].(string)
h.keyWiz.set(1, "ok", "Флешка "+dev+" подключена к ИШ только для чтения — на неё ничего не записано")
h.keyWiz.set(2, "ok", fmt.Sprintf("Справочник для ИШ собран на диске (%s); профиль «%s» %s", rebuildRu(rebuild), h.keyWiz.Profile, igateRu(igate)))
h.keyWiz.set(3, "active", "")
h.keyWiz.mu.Unlock()
h.reactivateCryptoProfile(ctx)
ishOK, ishMsg := h.restartAndVerifyISH(ctx)
h.keyWiz.mu.Lock()
if !ishOK {
h.keyWiz.set(3, "error", "ИШ не подтвердил готовность: "+ishMsg)
h.keyWiz.mu.Unlock()
h.keyWizFlash(w, r, "Ключ подключён, но ИШ не готов: "+ishMsg)
return
}
h.keyWiz.set(3, "ok", "ИШ перезапущен и работает: "+ishMsg)
h.keyWiz.set(4, "ok", "Ключ с флешки подключён — проверьте подключения на странице «Статус»")
h.keyWiz.Done = true
h.keyWiz.mu.Unlock()
_ = os.RemoveAll(staging)
refreshCertStore(h.rc)
http.Redirect(w, r, keyWizBack(r)+"flash="+urlQ("Готово! Ключ с флешки подключён к ИШ как есть — флешка не менялась."), http.StatusSeeOther)
}
// keyWizardFromMedia — POST /admin/setup/keywizard/from-media: ключ уже на флешке (подготовленной bj раньше
// или с ключом и справочником от НРД). Флешка только читается: ключ и справочник копируются во временный
// каталог — дальше обычная установка на эту же флешку под тем же именем профиля (с резервной копией флешки).
@@ -316,6 +376,10 @@ func (h *setupHandlers) keyWizardFromMedia(w http.ResponseWriter, r *http.Reques
h.keyWiz.reset()
h.keyWiz.StagingID, h.keyWiz.VDK = id, vdk
h.keyWiz.MediaDevice, h.keyWiz.MediaProfile = drive.Device, prof
// флешка уже подготовлена: используется как есть — этапы называются по-другому, записи на флешку нет
h.keyWiz.Steps[0].Title = "Ключ найден на подготовленной флешке"
h.keyWiz.Steps[1].Title = "Флешка подключается как есть — на неё ничего не записывается"
h.keyWiz.Steps[2].Title = "Справочник сертификатов для ИШ — на диске сервера"
h.keyWiz.set(0, "ok", fmt.Sprintf("Ключ найден на флешке %s: %s, справочник %s%s", fallback(drive.Model, drive.Device), vdk, spr, prefixed(", профиль ", prof)))
h.keyWiz.set(1, "active", "")
h.keyWiz.mu.Unlock()
@@ -416,6 +480,10 @@ func (h *setupHandlers) keyWizardInstall(w http.ResponseWriter, r *http.Request)
return
}
staging := filepath.Join("/var/lib/bj/media/iso", id)
if r.FormValue("as_is") == "1" {
h.keyWizardUseMedia(w, r, staging)
return
}
// Выбор флешки и имя профиля из формы.
profileName := strings.TrimSpace(r.FormValue("profile_name"))