Files
Bridge-and-Join-s/internal/lkgateway/igate.go
T

55 lines
2.2 KiB
Go

package lkgateway
// Интеграционный шлюз НРД (ИШ, служба igate) на этом сервере: состояние для мастера (шаг 8).
import (
"context"
"io"
"net/http"
"os"
"os/exec"
"strings"
"time"
)
const igateDefaultURL = "http://localhost:8090"
// igateInstalled — пакет ИШ стоит на этом сервере.
func igateInstalled() bool {
_, err := os.Stat("/opt/nsd/igate")
return err == nil
}
// igateState — отвечает ли ИШ и в каком состоянии его движок.
func igateState(ctx context.Context, base string) (bool, string) {
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/engine/state", nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
if !igateInstalled() {
return false, "интеграционный шлюз на этом сервере не установлен"
}
out, _ := exec.CommandContext(ctx, "systemctl", "is-active", "igate").Output()
return false, "шлюз установлен, но не отвечает по адресу " + base + " (служба igate: " + pickStr(strings.TrimSpace(string(out)), "неизвестно") + ")"
}
defer resp.Body.Close()
body, _ := io.ReadAll(io.LimitReader(resp.Body, 256))
st := strings.Trim(strings.TrimSpace(string(body)), `"`)
if resp.StatusCode != http.StatusOK {
return false, "шлюз отвечает с ошибкой HTTP " + resp.Status
}
if st != "Running" {
return false, "шлюз отвечает, но его движок в состоянии «" + st + "» — нужен Running"
}
return true, "шлюз отвечает по адресу " + base + ", движок работает"
}
func registerIgate(mux *http.ServeMux, rc *RuntimeConfig) {
mux.HandleFunc("/admin/setup/igate/state", func(w http.ResponseWriter, r *http.Request) {
ok, msg := igateState(r.Context(), rc.Snapshot().NSD.IGWBaseURL)
jsonOut(w, map[string]any{"ok": ok, "msg": msg, "installed": igateInstalled()})
})
}