jsonapp111 / app.py
zhuhai111's picture
Update app.py
0dda9a1 verified
import os
import subprocess
import threading
import time
import urllib.request
import tarfile
import zipfile
import http.server
import socketserver
import signal
# 下载并解压工具函数
def download_and_extract(url, extract_to, is_zip=False):
filename = url.split("/")[-1]
if not os.path.exists(extract_to):
os.makedirs(extract_to)
filepath = os.path.join(extract_to, filename)
if not os.path.exists(filepath):
print(f"Downloading {filename} ...")
urllib.request.urlretrieve(url, filepath)
if is_zip:
with zipfile.ZipFile(filepath, "r") as zip_ref:
zip_ref.extractall(extract_to)
else:
with tarfile.open(filepath, "r:*") as tar:
tar.extractall(path=extract_to)
# 下载并解压 fluxbox
def setup_fluxbox():
url = "https://github.com/void-linux/void-packages/files/12496441/fluxbox-1.3.7-x86_64.tar.gz"
extract_to = "./fluxbox"
download_and_extract(url, extract_to)
return os.path.join(extract_to, "fluxbox-1.3.7-x86_64", "bin", "fluxbox")
# 下载并解压 TigerVNC
def setup_tigervnc():
url = "https://github.com/TigerVNC/tigervnc/releases/download/v1.13.1/tigervnc-1.13.1.x86_64.tar.gz"
extract_to = "./tigervnc"
download_and_extract(url, extract_to)
return os.path.join(extract_to, "tigervnc-1.13.1.x86_64", "vncserver")
# 下载并解压 noVNC
def setup_novnc():
url = "https://github.com/novnc/noVNC/archive/refs/heads/master.zip"
extract_to = "./novnc"
download_and_extract(url, extract_to, is_zip=True)
return os.path.join(extract_to, "noVNC-master")
# 启动 Xvfb
def start_xvfb():
return subprocess.Popen(["Xvfb", ":1", "-screen", "0", "1024x768x16"], env={**os.environ, "DISPLAY": ":1"})
# 启动 fluxbox
def start_fluxbox(fluxbox_path):
return subprocess.Popen([fluxbox_path], env={**os.environ, "DISPLAY": ":1"})
# 启动 VNC server
def start_vncserver(vncserver_path):
return subprocess.Popen([vncserver_path, ":1", "-geometry", "1024x768", "-SecurityTypes", "None"], env={**os.environ, "DISPLAY": ":1"})
# 启动 noVNC
def start_novnc(novnc_path):
websockify = os.path.join(novnc_path, "utils", "websockify", "run")
return subprocess.Popen(["python", websockify, "7860", "localhost:5901", "--web", novnc_path], env=os.environ)
# 启动 ssh_client.py
def start_ssh_client():
if os.path.exists("ssh_client.py"):
return subprocess.Popen(["python", "ssh_client.py"])
return None
# 创建简单的重定向页面到 noVNC
def create_redirect_html():
with open("index.html", "w") as f:
f.write("""<!DOCTYPE html>
<html>
<head>
<title>Fluxbox+TigerVNC Space</title>
<meta http-equiv="refresh" content="0; url=./vnc.html">
</head>
<body>
<p>重定向到 VNC 界面...</p>
<p><a href="./vnc.html">如果没有自动跳转,请点击这里</a></p>
</body>
</html>
""")
def setup_and_run():
print("正在设置和启动桌面环境...")
fluxbox_path = setup_fluxbox()
vncserver_path = setup_tigervnc()
novnc_path = setup_novnc()
# 创建重定向页面
create_redirect_html()
# 启动 Xvfb
xvfb_proc = start_xvfb()
print("Xvfb 已启动")
time.sleep(2)
# 启动 fluxbox
fluxbox_proc = start_fluxbox(fluxbox_path)
print("Fluxbox 已启动")
time.sleep(2)
# 启动 VNC server
vnc_proc = start_vncserver(vncserver_path)
print("TigerVNC 已启动")
time.sleep(2)
# 启动 noVNC
novnc_proc = start_novnc(novnc_path)
print("noVNC 已启动在端口 7860,请访问 http://<your-space-url>:7860/vnc.html")
# 启动 ssh_client.py
ssh_client_proc = start_ssh_client()
if ssh_client_proc:
print("ssh_client.py 已启动")
# 等待所有进程完成(实际上它们会一直运行)
try:
while True:
time.sleep(600) # 每10分钟检查一次
# 检查各个进程是否还在运行,如果不在则重启
if xvfb_proc.poll() is not None:
print("Xvfb 已终止,正在重启...")
xvfb_proc = start_xvfb()
if fluxbox_proc.poll() is not None:
print("Fluxbox 已终止,正在重启...")
fluxbox_proc = start_fluxbox(fluxbox_path)
if vnc_proc.poll() is not None:
print("TigerVNC 已终止,正在重启...")
vnc_proc = start_vncserver(vncserver_path)
if novnc_proc.poll() is not None:
print("noVNC 已终止,正在重启...")
novnc_proc = start_novnc(novnc_path)
if ssh_client_proc and ssh_client_proc.poll() is not None:
print("ssh_client.py 已终止,正在重启...")
ssh_client_proc = start_ssh_client()
except KeyboardInterrupt:
print("正在关闭所有进程...")
# 清理进程
for proc in [xvfb_proc, fluxbox_proc, vnc_proc, novnc_proc]:
if proc:
proc.terminate()
if ssh_client_proc:
ssh_client_proc.terminate()
if __name__ == "__main__":
print("启动桌面环境:Fluxbox + TigerVNC + noVNC")
setup_and_run()