Экспорт QUIK — отдельная служба bj-quikexport; модули, выделенные из ядра, ставятся с обновлением
bj-quikexport (modules/quikexport + cmd/bj-quikexport, 127.0.0.1:8084): управление ARQA quikexport перенесено из bj-server. Настройки у службы в /var/lib/bj/.bj/quik-export/settings.json (при первом запуске переносятся из setup.json), раздел отдаётся фрагментом с индикатором меню, действия отвечают X-BJ-Flash. bj-server встраивает раздел в «Настройку», проксирует формы /admin/setup/quikexport/… и передаёт лицензию (X-BJ-Licensed). Общая проверка служебного ключа — modules/modkit (им пользуется и bj-npr), общее для прокси — lkgateway/modules.go. Выделенные из ядра модули (bj-npr, bj-quikexport: Component.FromCore) при обновлении ставятся и там, где их ещё нет, если входят в лицензию: release.MarkSplitModules, request.json "new", root-установщик ставит и включает unit-файл из комплекта. Если в обновлении меняется сам установщик, модули ставятся после перезапуска bj-server (ensureSplitModules). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
// Package modkit — общее для служб модулей bj (bj-npr, bj-quikexport, …).
|
||||
//
|
||||
// Службы модулей слушают только локальный адрес и принимают запросы только от bj-server:
|
||||
// он проверяет вход, права и лицензию и передаёт служебный ключ в X-BJ-Module-Key
|
||||
// (файл /var/lib/bj/.bj/module.key создаёт bj-server, службы читают его от того же пользователя).
|
||||
package modkit
|
||||
|
||||
import (
|
||||
"crypto/subtle"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// RequireKey — пропускает запросы только со служебным ключом (кроме /healthz).
|
||||
// Ключ читается при каждом запросе, поэтому его замена не требует перезапуска службы.
|
||||
func RequireKey(keyPath string, next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/healthz" {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
key, err := os.ReadFile(keyPath)
|
||||
want := strings.TrimSpace(string(key))
|
||||
got := r.Header.Get("X-BJ-Module-Key")
|
||||
if err != nil || want == "" || subtle.ConstantTimeCompare([]byte(want), []byte(got)) != 1 {
|
||||
http.Error(w, "модуль принимает запросы только от bj-server", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user