Добавлен экспорт инструмента Proxmox Tools (Kybinka)

This commit is contained in:
host committed 2026-08-01 13:15:47 +03:00
1 parent b4e1c57592
commit 1e114b200f
1 file changed
+1
@@ -0,0 +1 @@
[{"id":"proxmox_tools_kybinka","user_id":"a9b3bc2c-071d-44d2-b6a3-7188033e0a66","name":"Proxmox Tools (Kybinka)","meta":{"description":"Инструменты для управления Proxmox VE (сервер Kybinka, 192.168.1.10): LXC (создание, старт, стоп, удаление), VM (клонирование из шаблона, создание из ISO, управление), мониторинг (ноды, хранилище, ресурсы, задачи).","manifest":{"title":"Proxmox Tools (Kybinka)","author":"(your name)","description":"Инструменты для управления Proxmox VE (сервер Kybinka, 192.168.1.10): LXC (создание, старт, стоп, удаление), VM (клонирование из шаблона, создание из ISO, управление), мониторинг (ноды, хранилище, ресурсы, задачи).","version":"1.0.0"},"has_user_valves":false},"access_grants":[],"updated_at":1785573012,"created_at":1785572990,"user":null,"write_access":true,"content":"\"\"\"\ntitle: Proxmox Tools (Kybinka)\nauthor: (your name)\ndescription: Инструменты для управления Proxmox VE (сервер Kybinka, 192.168.1.10): LXC (создание, старт, стоп, удаление), VM (клонирование из шаблона, создание из ISO, управление), мониторинг (ноды, хранилище, ресурсы, задачи).\nversion: 1.0.0\n\"\"\"\n\nimport time\nimport requests\nimport urllib3\nfrom pydantic import BaseModel, Field\nfrom typing import Optional\n\n\nclass Tools:\n class Valves(BaseModel):\n proxmox_host: str = Field(\n default=\"https://192.168.1.10:8006\",\n description=\"Базовый URL API Proxmox (например, https://192.168.1.10:8006)\",\n )\n proxmox_user: str = Field(\n default=\"root@pam\",\n description=\"Пользователь API Proxmox (например, root@pam)\",\n )\n proxmox_token_name: str = Field(\n default=\"open-webui\", description=\"Имя/API-токена Proxmox\"\n )\n proxmox_token_value: str = Field(\n default=\"\",\n description=\"Секрет API-токена Proxmox (задаётся в интерфейсе Valves, никогда не коммитьте в код)\",\n )\n verify_ssl: bool = Field(\n default=False, description=\"Проверять TLS-сертификат хоста Proxmox\"\n )\n default_node: str = Field(\n default=\"kybinka\", description=\"Имя ноды Proxmox по умолчанию\"\n )\n default_storage: str = Field(\n default=\"local\", description=\"Хранилище по умолчанию для rootfs/шаблонов LXC\",\n )\n default_bridge: str = Field(\n default=\"vmbr0\", description=\"Сетевой мост по умолчанию\"\n )\n request_timeout: int = Field(\n default=30, description=\"Таймаут HTTP-запроса в секундах\"\n )\n\n def __init__(self):\n self.valves = self.Valves()\n # Гасим спам \"InsecureRequestWarning\" при verify_ssl=False\n urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\n\n # ============================================================\n # ВНУТРЕННИЕ ХЕЛПЕРЫ (не отдаются LLM)\n # ============================================================\n def _base_url(self) -> str:\n \"\"\"Базовый URL API Proxmox.\"\"\"\n return self.valves.proxmox_host.rstrip(\"/\") + \"/api2/json\"\n\n def _auth_header(self) -> dict:\n \"\"\"Заголовок авторизации по API-токену.\"\"\"\n return {\n \"Authorization\": (\n f\"PVEAPIToken={self.valves.proxmox_user}!\"\n f\"{self.valves.proxmox_token_name}={self.valves.proxmox_token_value}\"\n )\n }\n\n def _api(\n self,\n method: str,\n path: str,\n params: Optional[dict] = None,\n data: Optional[dict] = None,\n ):\n \"\"\"Выполнить запрос к API Proxmox.\"\"\"\n url = self._base_url() + path\n resp = requests.request(\n method=method,\n url=url,\n headers=self._auth_header(),\n params=params,\n json=data,\n verify=self.valves.verify_ssl,\n timeout=self.valves.request_timeout,\n )\n resp.raise_for_status()\n return resp.json().get(\"data\", {})\n\n @staticmethod\n def _fmt(b) -> str:\n \"\"\"Отформатировать байты в человекочитаемый вид.\"\"\"\n if b is None:\n return \"N/A\"\n Line truncated