Единая точка управления нодой: пересборка 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
40 строки
1.2 KiB
Python
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()
|