Обновление файла
This commit is contained in:
@@ -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"],
|
||||||
|
|||||||
Reference in New Issue
Block a user