Канал ИШ: необязательные параметры — NULL (иначе ИШ молча выкидывал канал); мастер: шаг «Учётные записи», HTTPS сразу, DEPO без процедур — не блокирует

- bj-igate-admin: пустые строки в числовых/интервальных параметрах канала ИШ разбирал с ошибкой и не
  загружал канал («There are no active channels», API 500 «more than one Channel…»); теперь NULL, как пишет
  интерфейс ИШ; старые каналы чинятся при «Создать канал»; папка архивов 1042S — по имени
- проверка «Шлюз НРД»: канал контура действительно загружен и включён (api/admin/channels/wsl)
- «Учёт DEPO»: нет процедур bj2depo — жёлтое «не забудьте доустановить», не блокирует
- HTTPS: перенаправление с http:// включено по умолчанию, только когда HTTPS реально слушает порт
- мастер: шаг «Учётные записи» (роли, создание, «Придумать пароль») перед проверкой; письма с проверки убраны;
  форма «создать» не меняет существующую запись с тем же логином

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 23:19:01 +03:00
parent b3f3454e4a
commit 44f00a006a
12 changed files with 264 additions and 47 deletions
+31
View File
@@ -54,6 +54,37 @@ func igateState(ctx context.Context, base string) (bool, string) {
return true, "шлюз отвечает по адресу " + base + ", движок работает"
}
// igateChannelState — загрузил ли ИШ канал с этим составным кодом (<канал контура><код депонента>) и включён ли он.
// Движок может быть Running и без единого канала: ИШ молча выкидывает канал, который не смог прочитать из базы
// (06.10.2026 на .29: пустые строки вместо NULL в необязательных параметрах), — и тогда любой обмен даёт HTTP 500.
func igateChannelState(ctx context.Context, base, code string) (found, enabled bool, err error) {
base = strings.TrimRight(pickStr(strings.TrimSpace(base), igateDefaultURL), "/")
cctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(cctx, http.MethodGet, base+"/api/admin/channels/wsl", nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return false, false, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return false, false, fmt.Errorf("HTTP %s", resp.Status)
}
var list []struct {
Code string `json:"code"`
IsEnabled bool `json:"isEnabled"`
}
if err := json.NewDecoder(io.LimitReader(resp.Body, 1<<20)).Decode(&list); err != nil {
return false, false, err
}
for _, c := range list {
if strings.EqualFold(c.Code, code) {
return true, c.IsEnabled, nil
}
}
return false, false, nil
}
func registerIgate(mux *http.ServeMux, rc *RuntimeConfig) {
registerIgateAdmin(mux, rc)
mux.HandleFunc("/admin/setup/igate/state", func(w http.ResponseWriter, r *http.Request) {