Обновить truenas_tools.py

This commit is contained in:
2026-07-24 02:38:41 +03:00
parent 850848a04d
commit cd62c4fb77
+70 -2
View File
@@ -33,6 +33,13 @@ class Tools:
"Authorization": f"Bearer {self.valves.TRUENAS_API_KEY}", "Authorization": f"Bearer {self.valves.TRUENAS_API_KEY}",
"Content-Type": "application/json", "Content-Type": "application/json",
} }
self._last_error = "нет данных (запросы ещё не выполнялись)"
try:
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
except Exception:
pass
def clear_cache(self): def clear_cache(self):
self._cache.clear() self._cache.clear()
@@ -53,10 +60,71 @@ class Tools:
if self.valves.CACHE_TTL > 0: if self.valves.CACHE_TTL > 0:
self._cache[cache_key] = (now, s) self._cache[cache_key] = (now, s)
return s return s
self._last_error = f"HTTP {r.status_code} на {endpoint}: {r.text[:300]}"
return None return None
except Exception: except Exception as e:
self._last_error = f"Исключение на {endpoint}: {type(e).__name__}: {e}"
return None return None
def get_debug_info(self) -> str:
"""
Диагностика соединения с TrueNAS: проверяет базовый URL, HTTP/HTTPS,
код ответа и текст ошибки для system/info. Полезно, когда API
'недоступен' и нужно понять, на каком этапе рвётся запрос.
"""
lines = []
base = self._base
lines.append(f"🔧 TRUENAS_URL из настроек: {base}")
lines.append(
"🔑 API-ключ задан: "
+ ("да" if self.valves.TRUENAS_API_KEY else "❌ НЕТ — заполни Valves.TRUENAS_API_KEY")
)
candidates = [base]
if base.startswith("http://"):
candidates.append("https://" + base[len("http://"):])
elif base.startswith("https://"):
candidates.append("http://" + base[len("https://"):])
for url in candidates:
lines.append(f"\n▶️ Проверка: {url}/api/v2.0/system/info")
try:
r = requests.get(
f"{url}/api/v2.0/system/info",
headers=self._headers,
timeout=10,
verify=False,
)
lines.append(f" Код ответа: {r.status_code}")
if r.status_code == 200:
lines.append(
" ✅ Успех! Обнови TRUENAS_URL на этот вариант, если он отличается от текущего."
)
elif r.status_code in (401, 403):
lines.append(
" 🔑 Ошибка авторизации — проверь API-ключ (Settings → API Keys) и что он активен."
)
else:
lines.append(f" ⚠️ Тело ответа (первые 300 симв.): {r.text[:300]}")
except requests.exceptions.SSLError as e:
lines.append(f" 🔒 Ошибка SSL: {e}")
except requests.exceptions.ConnectionError as e:
lines.append(
f" 🔌 Ошибка соединения (сервер недоступен / порт закрыт / неверный IP): {e}"
)
except requests.exceptions.Timeout:
lines.append(
" ⏱️ Таймаут — сервер не отвечает за 10 секунд (перегружен или сеть медленная)."
)
except Exception as e:
lines.append(f" ❓ Прочая ошибка: {type(e).__name__}: {e}")
lines.append(
"\nℹ️ Последняя зафиксированная ошибка внутренних запросов: "
+ getattr(self, "_last_error", "нет данных (запросы ещё не выполнялись)")
)
return "\n".join(lines)
def _try_endpoints(self, cache_key: str, endpoints: list) -> str: def _try_endpoints(self, cache_key: str, endpoints: list) -> str:
for ep in endpoints: for ep in endpoints:
result = self._rest_get(f"{cache_key}_{ep.replace('/', '_')}", ep) result = self._rest_get(f"{cache_key}_{ep.replace('/', '_')}", ep)
@@ -248,4 +316,4 @@ class Tools:
"--- ВИРТУАЛЬНЫЕ МАШИНЫ ---\n" + self.get_vms_status() + "\n\n" "--- ВИРТУАЛЬНЫЕ МАШИНЫ ---\n" + self.get_vms_status() + "\n\n"
"--- КОНТЕЙНЕРЫ (virt/incus) ---\n" + self.get_containers_status() + "\n\n" "--- КОНТЕЙНЕРЫ (virt/incus) ---\n" + self.get_containers_status() + "\n\n"
"--- АЛЕРТЫ ---\n" + self.get_active_alerts() "--- АЛЕРТЫ ---\n" + self.get_active_alerts()
) )