-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
133 lines (114 loc) · 5.27 KB
/
Copy pathapp.py
File metadata and controls
133 lines (114 loc) · 5.27 KB
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
import os
import sys
import threading
import webbrowser
import subprocess
import re
import time
import logging
from flask import Flask, send_from_directory, jsonify
# Отключаем мусорные логи Flask и ngrok
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
logging.getLogger('pyngrok').setLevel(logging.ERROR)
from backend.settings import settings
from backend.routes import api_bp
# Пытаемся импортировать библиотеку для консольного QR
try:
import qrcode
HAS_QR = True
except ImportError:
HAS_QR = False
settings.load_config()
settings.load_data()
app = Flask(__name__, static_folder=str(settings.APP_ROOT / "static"), static_url_path="/static")
app.register_blueprint(api_bp)
public_url = None
local_url = f"http://{settings.CONFIG['host']}:{settings.CONFIG['port']}"
@app.route("/")
def index():
return send_from_directory(app.static_folder, "index.html")
@app.route('/favicon.png')
def favicon():
return send_from_directory(app.root_path, 'favicon.png', mimetype='image/png')
@app.route('/api/tunnel')
def get_tunnel():
"""Возвращает публичный URL туннеля для QR-кода на фронтенде"""
for _ in range(10):
if public_url:
break
time.sleep(0.5)
return jsonify({"url": public_url})
def print_dashboard():
"""Отрисовка красивого терминального интерфейса"""
os.system('cls' if os.name == 'nt' else 'clear')
print("\033[96m" + "╔" + "═"*60 + "╗")
print("║ \033[1m🌟 Comfy File Sorter is Running!\033[0m\033[96m ║")
print("╠" + "═"*60 + "╣\033[0m")
print(f"\033[96m║\033[0m \033[92m🏠 Локально:\033[0m {local_url:<45} \033[96m║\033[0m")
if public_url:
print(f"\033[96m║\033[0m \033[94m🌍 Удаленно:\033[0m {public_url:<45} \033[96m║\033[0m")
print("\033[96m╚" + "═"*60 + "╝\033[0m")
if HAS_QR:
print("\n\033[95m📱 Отсканируйте QR-код для доступа с телефона:\033[0m\n")
qr = qrcode.QRCode(version=1, box_size=1, border=2)
qr.add_data(public_url)
qr.make(fit=True)
qr.print_ascii(invert=True)
else:
print("\033[96m╚" + "═"*60 + "╝\033[0m")
if settings.CONFIG.get('enable_tunnel', True):
print("\n\033[93m⏳ Установка защищенного туннеля...\033[0m")
else:
print("\n\033[90m[Туннель отключен в настройках]\033[0m")
print("\n\033[90m" + "-"*62)
print(" Журнал (отображаются только ошибки):")
print("-" * 62 + "\033[0m\n")
def start_fallback_tunnel(port):
"""Возвращен старый туннель localhost.run, так как ngrok не работает в РФ"""
global public_url
while True:
try:
process = subprocess.Popen(
[
"ssh", "-o", "StrictHostKeyChecking=no", "-o", "ServerAliveInterval=30",
"-o", "ServerAliveCountMax=3", "-R", f"80:127.0.0.1:{port}", "nokey@localhost.run"
],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1
)
for line in iter(process.stdout.readline, ''):
if not line: break
if "https://" in line and "lhr.life" in line:
match = re.search(r'(https://[a-zA-Z0-9-]+\.lhr\.life)', line)
if match:
new_url = match.group(1)
if public_url != new_url:
public_url = new_url
print_dashboard() # Обновляем UI после получения ссылки
process.wait()
except Exception:
pass
public_url = None
print("\n\033[91m[Туннель] Разорвано. Переподключение...\033[0m")
time.sleep(5)
if __name__ == "__main__":
print_dashboard()
if settings.CONFIG.get('enable_tunnel', True):
if settings.CONFIG.get('use_ngrok'):
try:
from pyngrok import ngrok
if settings.CONFIG.get('ngrok_token'):
ngrok.set_auth_token(settings.CONFIG['ngrok_token'])
tunnel = ngrok.connect(settings.CONFIG['port'])
public_url = tunnel.public_url
print_dashboard()
except Exception as e:
print(f"\033[91m[Ошибка] Ngrok не удался ({e}). Запуск резервного туннеля...\033[0m")
threading.Thread(target=start_fallback_tunnel, args=(settings.CONFIG['port'],), daemon=True).start()
else:
threading.Thread(target=start_fallback_tunnel, args=(settings.CONFIG['port'],), daemon=True).start()
if os.environ.get("OPEN_BROWSER", "1") == "1":
threading.Timer(2.5, lambda: webbrowser.open(local_url)).start()
cli = sys.modules['flask.cli']
cli.show_server_banner = lambda *x: None
app.run(host=settings.CONFIG['host'], port=settings.CONFIG['port'], threaded=True, debug=False)