diff --git a/truenas_tools.py b/truenas_tools.py index 1f167f1..6bb3d02 100644 --- a/truenas_tools.py +++ b/truenas_tools.py @@ -1,70 +1,23 @@ - payload: Dict[str, Any] = {"catalog_name": catalog, "retrieve_all_trains": True} - if category: - payload["categories"] = [category] - # v2.1.2: TrueNAS 25.10 исторически делал POST /app/available, но в новых билдах - # многие эндпоинты переехали на GET. _rest_request сам делает POST→GET fallback - # при 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) + 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"): try: r = requests.get( f"{self._base}/api/v2.0/{ep}", headers=self._headers, - params=payload if payload else None, + params=info_payload, timeout=self.valves.request_timeout, verify=self.valves.verify_ssl, ) if r.status_code == 200: - try: - 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 - except Exception: - pass + info = r.json() + break except Exception: pass - # Затем POST (через _rest_request — у него есть fallback на GET при 405) - res = self._post(ep, payload, timeout=self.valves.request_timeout) - if res is not 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 \ No newline at end of file + 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: \ No newline at end of file