Обновление файла

This commit is contained in:
2026-07-25 02:01:52 +03:00
parent 9e1d06ba3d
commit de34bb6b0b
+25 -2
View File
@@ -9,6 +9,7 @@ import random
import re import re
import string import string
import time import time
from urllib.parse import quote
from proxmoxer import ProxmoxAPI from proxmoxer import ProxmoxAPI
@@ -29,6 +30,18 @@ def _client() -> ProxmoxAPI:
) )
def _pve_origin_host() -> str:
"""Хост, который нужно передавать Proxmox как origin для vncticket.
PVE привязывает тикет к origin (схема+хост+порт), указанному в vncproxy.
По умолчанию используется хост из PVE_HOST (например, pve1.input.netcraze.pro).
Если задан PVE_PUBLIC_HOST — берётся он (для случая, когда backend внутри
сети использует внутренний адрес, а тикет нужно привязать к внешнему).
"""
origin = getattr(settings, "pve_public_host", "") or settings.pve_host
return origin.replace("https://", "").replace("http://", "").split(":")[0]
def gen_password(length: int = 14) -> str: def gen_password(length: int = 14) -> str:
"""Генерирует криптостойкий пароль из букв и цифр.""" """Генерирует криптостойкий пароль из букв и цифр."""
alphabet = string.ascii_letters + string.digits alphabet = string.ascii_letters + string.digits
@@ -289,11 +302,21 @@ def get_status(guest_type: str, vmid: int, node: str = None) -> dict:
def get_vnc_ticket(guest_type: str, vmid: int, node: str = None) -> dict: def get_vnc_ticket(guest_type: str, vmid: int, node: str = None) -> dict:
"""Запрашивает у Proxmox одноразовый тикет для VNC/websocket-консоли.""" """Запрашивает у Proxmox одноразовый тикет для VNC/websocket-консоли.
Важно: Proxmox привязывает тикет к origin (схема+хост+порт). Чтобы
тикет работал через внешний адрес (например, pve1.input.netcraze.pro),
передаём параметр host= при запросе. Backend общается с Proxmox по
внутреннему адресу, но тикет будет валиден для внешнего.
"""
node = node or settings.pve_node node = node or settings.pve_node
px = _client() px = _client()
endpoint = px.nodes(node).qemu(vmid) if guest_type == "vm" else px.nodes(node).lxc(vmid) endpoint = px.nodes(node).qemu(vmid) if guest_type == "vm" else px.nodes(node).lxc(vmid)
result = endpoint.vncproxy.post(websocket=1)
# host=... — указывает, к какому origin привязать тикет (нужно для
# внешнего адреса, если backend подключается к Proxmox по внутреннему).
origin_host = _pve_origin_host()
result = endpoint.vncproxy.post(websocket=1, host=origin_host)
return { return {
"ticket": result["ticket"], "ticket": result["ticket"],
"port": result["port"], "port": result["port"],