Files
Claude 7bf7a0f6b7 Утилита virtuality-ctl была добавлена
Единая точка управления нодой: пересборка systemd-юнитов из web.env
(порт, HTTPS с самоподписанным сертификатом и redirector HTTP→HTTPS,
автообновление, ежедневное обслуживание, libvirt-guests), смена пароля
и часового пояса, перезагрузка/выключение, архив настроек ноды и его
восстановление, откат панели после неудачного обновления, безопасное
подключение моста br0 с автооткатом через 2 минуты, отчёт для
поддержки, удаление. Установщик и панель будут использовать её вместо
собственных копий этой логики.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LEUXMcdZo7b87mjkUsPgg
2026-09-25 14:26:03 +00:00

40 строки
1.2 KiB
Python

#!/usr/bin/env python3
"""Tiny HTTP → HTTPS redirector for the panel (used when TLS is enabled).
Listens on the plain port so that a user typing http://server:8088 lands on
https://server:8443 instead of a TLS error.
"""
import argparse
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--host", default="0.0.0.0")
parser.add_argument("--port", type=int, default=8088)
parser.add_argument("--target-port", type=int, default=8443)
args = parser.parse_args()
class Handler(BaseHTTPRequestHandler):
server_version = "Virtuality"
sys_version = ""
def do_GET(self): # noqa: N802
host = (self.headers.get("Host") or "").split(":")[0] or "localhost"
self.send_response(301)
self.send_header("Location", f"https://{host}:{args.target_port}{self.path}")
self.send_header("Content-Length", "0")
self.end_headers()
do_HEAD = do_GET # noqa: N815
do_POST = do_GET # noqa: N815
def log_message(self, *_args):
return
ThreadingHTTPServer((args.host, args.port), Handler).serve_forever()
if __name__ == "__main__":
main()