Ключ: «У меня уже есть подготовленная флешка — использовать ключ с неё» — без записи на флешку
- Флешка с готовым ключом (например, с другого сервера 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:
@@ -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"))
|
||||
|
||||
Reference in New Issue
Block a user