v2.1.2: validate_api_key проверяет реальные эндпоинты + GET app/available
This commit is contained in:
+37
-21
@@ -1,23 +1,39 @@
|
||||
info_payload: Dict[str, Any] = {"catalog_name": catalog, "app_name": app_name, "train": train}
|
||||
# v2.1.2: сначала пробуем GET (TrueNAS 25.10 часто требует GET),
|
||||
# затем POST через _rest_request (там есть fallback POST→GET при 405)
|
||||
info: Optional[Dict[str, Any]] = None
|
||||
for ep in ("app/info", "app.info", "catalog/item", "catalog.item"):
|
||||
# v2.1.2: проверяем реально работающие эндпоинты TrueNAS 25.10
|
||||
# (многие получили новые имена — перебираем варианты)
|
||||
checks = [
|
||||
("system/info", "GET", None, "базовая информация о системе"),
|
||||
("alert/list", "GET", None, "список алертов"),
|
||||
("catalog", "GET", None, "список каталогов приложений"),
|
||||
("pool/query", "GET", None, "список пулов ZFS (v2)"),
|
||||
("pool", "GET", None, "список пулов ZFS (v1)"),
|
||||
("disk/query", "GET", None, "список дисков (v2)"),
|
||||
("disk", "GET", None, "список дисков (v1)"),
|
||||
("app/query", "GET", None, "список приложений (v2)"),
|
||||
("app", "GET", None, "список приложений (v1)"),
|
||||
("chart/release/query", "GET", None, "helm-релизы"),
|
||||
]
|
||||
ok = 0
|
||||
checked: set = set()
|
||||
for endpoint, method, payload, descr in checks:
|
||||
if endpoint in checked:
|
||||
continue
|
||||
checked.add(endpoint)
|
||||
url = f"{self._base}/api/v2.0/{endpoint}"
|
||||
try:
|
||||
r = requests.get(
|
||||
f"{self._base}/api/v2.0/{ep}",
|
||||
headers=self._headers,
|
||||
params=info_payload,
|
||||
timeout=self.valves.request_timeout,
|
||||
verify=self.valves.verify_ssl,
|
||||
)
|
||||
if method == "GET":
|
||||
r = requests.get(url, headers=self._headers, params=payload, timeout=self.valves.request_timeout, verify=self.valves.verify_ssl)
|
||||
else:
|
||||
r = requests.post(url, headers=self._headers, json=payload or {}, timeout=self.valves.request_timeout, verify=self.valves.verify_ssl)
|
||||
if r.status_code == 200:
|
||||
info = r.json()
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
if info is None:
|
||||
info = self._post("app/info", info_payload, timeout=self.valves.request_timeout)
|
||||
if info is None:
|
||||
info = self._post("catalog/item", info_payload, timeout=self.valves.request_timeout)
|
||||
if info is None:
|
||||
lines.append(f"✅ {endpoint:30s} — {descr}")
|
||||
ok += 1
|
||||
elif r.status_code in (401, 403):
|
||||
lines.append(f"🔑 {endpoint:30s} — 401/403 (нет прав)")
|
||||
elif r.status_code == 404:
|
||||
lines.append(f"❌ {endpoint:30s} — HTTP 404 (нет такого пути)")
|
||||
elif r.status_code == 405:
|
||||
lines.append(f"⚠️ {endpoint:30s} — HTTP 405 (другой метод)")
|
||||
else:
|
||||
lines.append(f"⚠️ {endpoint:30s} — HTTP {r.status_code}")
|
||||
except Exception as e:
|
||||
lines.append(f"💥 {endpoint:30s} — ошибка: {type(e).__name__}")
|
||||
Reference in New Issue
Block a user