v2.1.1: добавлен метод discover_app_endpoints() для диагностики
This commit is contained in:
+64
-17
@@ -1,17 +1,64 @@
|
|||||||
payload: Dict[str, Any] = {"catalog_name": catalog, "retrieve_all_trains": True}
|
# -----------------------------------------------------------------
|
||||||
if category:
|
# Каталоги и приложения (v2.1+)
|
||||||
payload["categories"] = [category]
|
# -----------------------------------------------------------------
|
||||||
# v2.1.1: расширенный список эндпоинтов — TrueNAS 25.10 имеет разные пути
|
def discover_app_endpoints(self) -> str:
|
||||||
# в зависимости от версии (chart/release/ — новые, catalog/ — старые)
|
"""
|
||||||
endpoints = [
|
Диагностический метод: проверяет разные эндпоинты API каталога приложений
|
||||||
"app/available", # новый (Electric Eel+)
|
и сообщает, какие из них реально работают на этой версии TrueNAS.
|
||||||
"app.available",
|
Полезно при обновлении truenas_tools.py или при ошибках в list_app_catalog.
|
||||||
"chart/release/names", # иногда используется
|
"""
|
||||||
"chart.release.names",
|
candidates_get = [
|
||||||
"chart_release/names",
|
"app/available", "app/available_apps", "app/list_apps",
|
||||||
"catalog/items", # fallback
|
"chart/release/names", "chart/release", "chart/release/list",
|
||||||
"catalog.items",
|
"catalog", "catalog?label=TRUENAS", "catalog/items",
|
||||||
"catalog_items",
|
"catalogs", "app/catalog",
|
||||||
"app/available_apps",
|
]
|
||||||
"app/list_apps",
|
candidates_post = [
|
||||||
]
|
("app/available", {"catalog_name": "TRUENAS", "retrieve_all_trains": True}),
|
||||||
|
("app/available", {}),
|
||||||
|
("app.available", {"catalog_name": "TRUENAS"}),
|
||||||
|
("chart/release/names", {"catalog_name": "TRUENAS"}),
|
||||||
|
("chart.release.names", {}),
|
||||||
|
("chart_release/names", {"catalog_name": "TRUENAS"}),
|
||||||
|
("catalog/items", {"label": "TRUENAS"}),
|
||||||
|
]
|
||||||
|
lines = ["🔍 ДИАГНОСТИКА ЭНДПОИНТОВ КАТАЛОГА", ""]
|
||||||
|
lines.append("=== GET ===")
|
||||||
|
for ep in candidates_get:
|
||||||
|
url = f"{self._base}/api/v2.0/{ep}"
|
||||||
|
try:
|
||||||
|
r = requests.get(url, headers=self._headers, timeout=self.valves.request_timeout, verify=self.valves.verify_ssl)
|
||||||
|
if r.status_code == 200:
|
||||||
|
body = r.text[:120].replace("\n", " ")
|
||||||
|
lines.append(f"✅ {ep:35s} HTTP 200 | {body}")
|
||||||
|
elif r.status_code == 404:
|
||||||
|
lines.append(f"❌ {ep:35s} HTTP 404")
|
||||||
|
elif r.status_code in (401, 403):
|
||||||
|
lines.append(f"🔑 {ep:35s} HTTP {r.status_code} (нет прав)")
|
||||||
|
else:
|
||||||
|
lines.append(f"⚠️ {ep:35s} HTTP {r.status_code}")
|
||||||
|
except Exception as e:
|
||||||
|
lines.append(f"💥 {ep:35s} ошибка: {type(e).__name__}")
|
||||||
|
lines.append("")
|
||||||
|
lines.append("=== POST ===")
|
||||||
|
for ep, payload in candidates_post:
|
||||||
|
url = f"{self._base}/api/v2.0/{ep}"
|
||||||
|
try:
|
||||||
|
r = requests.post(url, headers=self._headers, json=payload, timeout=self.valves.request_timeout, verify=self.valves.verify_ssl)
|
||||||
|
if r.status_code == 200:
|
||||||
|
body = r.text[:120].replace("\n", " ")
|
||||||
|
lines.append(f"✅ {ep:35s} HTTP 200 | {body}")
|
||||||
|
elif r.status_code == 404:
|
||||||
|
lines.append(f"❌ {ep:35s} HTTP 404")
|
||||||
|
elif r.status_code in (401, 403):
|
||||||
|
lines.append(f"🔑 {ep:35s} HTTP {r.status_code} (нет прав)")
|
||||||
|
else:
|
||||||
|
lines.append(f"⚠️ {ep:35s} HTTP {r.status_code}")
|
||||||
|
except Exception as e:
|
||||||
|
lines.append(f"💥 {ep:35s} ошибка: {type(e).__name__}")
|
||||||
|
lines.append("")
|
||||||
|
lines.append("ℹ️ Также можно посмотреть Swagger-документацию API:")
|
||||||
|
lines.append(f" {self._base}/api/docs/")
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
def list_catalogs(self) -> str:
|
||||||
Reference in New Issue
Block a user