# ----------------------------------------------------------------- # Каталоги и приложения (v2.1+) # ----------------------------------------------------------------- def discover_app_endpoints(self) -> str: """ Диагностический метод: проверяет разные эндпоинты API каталога приложений и сообщает, какие из них реально работают на этой версии TrueNAS. Полезно при обновлении truenas_tools.py или при ошибках в list_app_catalog. """ candidates_get = [ "app/available", "app/available_apps", "app/list_apps", "chart/release/names", "chart/release", "chart/release/list", "catalog", "catalog?label=TRUENAS", "catalog/items", "catalogs", "app/catalog", ] 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: