package lexicomai import "strings" // knownProducts — перечень продуктов компании, которые поддерживает модуль // (наблюдено на сандбоксе-проде и в деплое EDDS). Сторонние/открытые продукты // (vllm), снятые (deprecated), легаси (spr5) и не-сервисы (mocks, wwwroot) // сюда не входят. ses-sip-gateway-api — вторичный, тоже не поддерживается. // // Это имена продуктов, а не адреса: никаких IP/подсетей/VLAN в коде нет. // Список не «жёсткая схема», а валидатор, чтобы модель не обращалась к // несуществующим продуктам (fail-closed). var knownProducts = map[string]struct{}{ "acs": {}, "ams": {}, "cls": {}, "crs": {}, "llm": {}, "qas": {}, "res": {}, "sbs": {}, "see": {}, "ses": {}, "ses-sip": {}, "smc": {}, "spr": {}, "tts": {}, "ups": {}, "vds": {}, } // DefaultProducts — сводный перечень (для repo_catalog/инвентаря без таргета). func DefaultProducts() []string { return sortedProductNames() } // NormalizeProduct приводит имя продукта к каноническому виду (нижний регистр). // Пустое или неизвестное имя — ошибка (fail-closed). func NormalizeProduct(name string) (string, error) { p := strings.ToLower(strings.TrimSpace(name)) if p == "" { return "", errProductRequired } if _, ok := knownProducts[p]; !ok { return "", &UnknownProductError{Name: name} } return p, nil } // ServiceUnit возвращает имя systemd-юнита основного сервиса продукта. func ServiceUnit(product string) string { return product + ".service" } // sortedProductNames возвращает отсортированный список известных продуктов. func sortedProductNames() []string { names := make([]string, 0, len(knownProducts)) for n := range knownProducts { names = append(names, n) } // Простая сортировка — стабильный порядок в выводе. for i := 1; i < len(names); i++ { for j := i; j > 0 && names[j] < names[j-1]; j-- { names[j], names[j-1] = names[j-1], names[j] } } return names }