File size: 5,322 Bytes
e9d6dcf
 
 
 
 
 
 
0dda9a1
 
 
e9d6dcf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0dda9a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9d6dcf
0dda9a1
e9d6dcf
 
 
0dda9a1
 
 
 
e9d6dcf
0dda9a1
 
e9d6dcf
0dda9a1
e9d6dcf
0dda9a1
 
e9d6dcf
0dda9a1
e9d6dcf
0dda9a1
 
e9d6dcf
0dda9a1
e9d6dcf
0dda9a1
 
 
e9d6dcf
0dda9a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9d6dcf
 
0dda9a1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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()