v2.1.2: get_app_info использует GET и расширенный список путей; validate_api_key показывает реальные эндпоинты
This commit is contained in:
+12
-59
@@ -1,70 +1,23 @@
|
|||||||
payload: Dict[str, Any] = {"catalog_name": catalog, "retrieve_all_trains": True}
|
info_payload: Dict[str, Any] = {"catalog_name": catalog, "app_name": app_name, "train": train}
|
||||||
if category:
|
# v2.1.2: сначала пробуем GET (TrueNAS 25.10 часто требует GET),
|
||||||
payload["categories"] = [category]
|
# затем POST через _rest_request (там есть fallback POST→GET при 405)
|
||||||
# v2.1.2: TrueNAS 25.10 исторически делал POST /app/available, но в новых билдах
|
info: Optional[Dict[str, Any]] = None
|
||||||
# многие эндпоинты переехали на GET. _rest_request сам делает POST→GET fallback
|
for ep in ("app/info", "app.info", "catalog/item", "catalog.item"):
|
||||||
# при 405, поэтому здесь используем _post — он сам разберётся.
|
|
||||||
# Дополнительно пробуем GET напрямую для надёжности.
|
|
||||||
endpoints = [
|
|
||||||
"app/available", # новый (Electric Eel+)
|
|
||||||
"app.available",
|
|
||||||
"chart/release/names",
|
|
||||||
"chart.release.names",
|
|
||||||
"chart_release/names",
|
|
||||||
"catalog/items", # fallback
|
|
||||||
"catalog.items",
|
|
||||||
"catalog_items",
|
|
||||||
"app/available_apps",
|
|
||||||
"app/list_apps",
|
|
||||||
]
|
|
||||||
apps: List[Dict[str, Any]] = []
|
|
||||||
used_ep = None
|
|
||||||
used_method = None
|
|
||||||
for ep in endpoints:
|
|
||||||
# Сначала GET (часто работает на 25.10)
|
|
||||||
try:
|
try:
|
||||||
r = requests.get(
|
r = requests.get(
|
||||||
f"{self._base}/api/v2.0/{ep}",
|
f"{self._base}/api/v2.0/{ep}",
|
||||||
headers=self._headers,
|
headers=self._headers,
|
||||||
params=payload if payload else None,
|
params=info_payload,
|
||||||
timeout=self.valves.request_timeout,
|
timeout=self.valves.request_timeout,
|
||||||
verify=self.valves.verify_ssl,
|
verify=self.valves.verify_ssl,
|
||||||
)
|
)
|
||||||
if r.status_code == 200:
|
if r.status_code == 200:
|
||||||
try:
|
info = r.json()
|
||||||
data = r.json()
|
|
||||||
if isinstance(data, list):
|
|
||||||
apps = data
|
|
||||||
used_ep = ep
|
|
||||||
used_method = "GET"
|
|
||||||
break
|
|
||||||
if isinstance(data, dict):
|
|
||||||
for key in ("items", "applications", "releases", "apps"):
|
|
||||||
if key in data and isinstance(data[key], list):
|
|
||||||
apps = data[key]
|
|
||||||
used_ep = ep
|
|
||||||
used_method = "GET"
|
|
||||||
break
|
|
||||||
if apps:
|
|
||||||
break
|
break
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
except Exception:
|
if info is None:
|
||||||
pass
|
info = self._post("app/info", info_payload, timeout=self.valves.request_timeout)
|
||||||
# Затем POST (через _rest_request — у него есть fallback на GET при 405)
|
if info is None:
|
||||||
res = self._post(ep, payload, timeout=self.valves.request_timeout)
|
info = self._post("catalog/item", info_payload, timeout=self.valves.request_timeout)
|
||||||
if res is not None:
|
if info is None:
|
||||||
if isinstance(res, list):
|
|
||||||
apps = res
|
|
||||||
used_ep = ep
|
|
||||||
used_method = "POST"
|
|
||||||
break
|
|
||||||
if isinstance(res, dict):
|
|
||||||
for key in ("items", "applications", "releases", "apps"):
|
|
||||||
if key in res and isinstance(res[key], list):
|
|
||||||
apps = res[key]
|
|
||||||
used_ep = ep
|
|
||||||
used_method = res.get("_via", "POST")
|
|
||||||
break
|
|
||||||
if apps:
|
|
||||||
break
|
|
||||||
Reference in New Issue
Block a user