571 lines
22 KiB
Python
571 lines
22 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
Python 2.7 Auto Download Script
|
||
For NetEase Da Shen Review Data Monitoring System
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import time
|
||
import shutil
|
||
import urllib2
|
||
import getpass
|
||
import base64
|
||
import subprocess
|
||
import traceback
|
||
import codecs
|
||
from datetime import datetime
|
||
|
||
# 先尝试设置控制台代码页为UTF-8(仅Windows环境)
|
||
try:
|
||
if sys.platform.startswith('win'):
|
||
subprocess.call('chcp 936', shell=True)
|
||
except:
|
||
pass
|
||
|
||
# 基本配置
|
||
COS_URL = "http://cos.ui-beam.com/work_scripts/monitor/dev/latest/"
|
||
# COS_URL = "http://cos.ui-beam.com/work_scripts/monitor/releases/latest/"
|
||
TEMP_DIR = os.path.join(os.path.expanduser("~"), "Desktop", "monitor_temp")
|
||
LOG_FILE = os.path.join(TEMP_DIR, "download_log.txt")
|
||
|
||
# 要下载的文件列表 - 格式: (URL相对路径, 本地保存路径, 是否必需)
|
||
FILES_TO_DOWNLOAD = [
|
||
("start_monitor.cmd", "start_monitor.cmd", True),
|
||
("dashboard.py", "dashboard.py", True),
|
||
("breeze_monitor.py", "breeze_monitor.py", True),
|
||
("cms_monitor.py", "cms_monitor.py", True),
|
||
("cms_coefficients.json", "cms_coefficients.json", True),
|
||
("breeze_coefficients.json", "breeze_coefficients.json", True),
|
||
("templates/dashboard.html", "templates/dashboard.html", True),
|
||
("templates/login.html", "templates/login.html", True),
|
||
("static/ds-favicon.ico", "static/ds-favicon.ico", True),
|
||
("install_dependencies.bat", "install_dependencies.bat", True),
|
||
# ("inspect_monitor.py", "inspect_monitor.py", True),
|
||
# Cookie扩展相关文件
|
||
("cookie-extension/manifest.json", "cookie-extension/manifest.json", True),
|
||
("cookie-extension/popup.html", "cookie-extension/popup.html", True),
|
||
("cookie-extension/popup.js", "cookie-extension/popup.js", True),
|
||
("cookie-extension/images/icon16.png", "cookie-extension/images/icon16.png", True),
|
||
("cookie-extension/images/icon48.png", "cookie-extension/images/icon48.png", True),
|
||
("cookie-extension/images/icon128.png", "cookie-extension/images/icon128.png", True),
|
||
("cookie-extension/images/placeholder.txt", "cookie-extension/images/placeholder.txt", True)
|
||
]
|
||
|
||
# 记录日志函数
|
||
def log_message(message):
|
||
"""记录日志消息"""
|
||
try:
|
||
# 确保日志目录存在
|
||
log_dir = os.path.dirname(LOG_FILE)
|
||
if not os.path.exists(log_dir):
|
||
os.makedirs(log_dir)
|
||
|
||
# 使用codecs打开文件,指定编码为gbk
|
||
with codecs.open(LOG_FILE, "a", "gbk") as f:
|
||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
log_line = "[%s] %s\n" % (timestamp, message)
|
||
f.write(log_line)
|
||
|
||
# 使用safe_print输出到控制台
|
||
safe_print(message)
|
||
except Exception as e:
|
||
safe_print("[ERROR] Could not write to log file: %s" % str(e))
|
||
|
||
# 使用UTF-8安全打印
|
||
def safe_print(text):
|
||
"""安全打印函数,处理编码问题"""
|
||
try:
|
||
if isinstance(text, unicode):
|
||
print(text.encode('gbk', 'ignore'))
|
||
else:
|
||
print(text)
|
||
except UnicodeEncodeError:
|
||
print(text.encode('gbk', 'ignore'))
|
||
except Exception as e:
|
||
print("[ERROR] Print error: %s" % str(e))
|
||
|
||
# 获取最新版本号
|
||
def get_latest_version():
|
||
"""获取最新版本号"""
|
||
try:
|
||
version_url = "http://cos.ui-beam.com/work_scripts/monitor/dev/latest/VERSION.txt" # 测试版本版本号地址
|
||
# version_url = "http://cos.ui-beam.com/work_scripts/monitor/releases/VERSION.txt" # 正式版本版本号地址
|
||
response = urllib2.urlopen(version_url)
|
||
version = response.read().strip()
|
||
return version
|
||
except Exception as e:
|
||
error_msg = u"获取版本号失败: %s" % unicode(str(e), 'gbk', 'ignore')
|
||
safe_print(error_msg)
|
||
return u"未知版本"
|
||
|
||
# 非中文字符界面信息
|
||
MESSAGES = {
|
||
'tool_title': u"网易大神审核数据监控系统安装工具",
|
||
'no_auth_version': u"当前最新版本:{0}".format(get_latest_version()),
|
||
'downloading': u"正在下载文件,请稍候...",
|
||
'script_started': u"下载脚本已启动",
|
||
'temp_dir': u"临时目录",
|
||
'dir_init_failed': u"初始化目录失败,退出",
|
||
'created_temp_dir': u"创建临时目录",
|
||
'dir_exists': u"临时目录已存在,正在清理内容...",
|
||
'dir_cleared': u"临时目录已清理",
|
||
'created_templates_dir': u"创建templates目录",
|
||
'created_static_dir': u"创建static目录",
|
||
'created_cookie_ext_dir': u"创建cookie-extension目录",
|
||
'created_cookie_ext_images_dir': u"创建cookie-extension/images目录",
|
||
'using_proxy': u"使用代理下载",
|
||
'retrying_with_proxy': u"尝试使用代理重试...",
|
||
'downloaded_files': u"已下载文件",
|
||
'of': u"个,共",
|
||
'files': u"个文件",
|
||
'download_required_failed': u"部分必需文件下载失败",
|
||
'all_files_downloaded': u"所有文件下载成功",
|
||
'install_deps_not_found': u"依赖安装脚本未找到",
|
||
'installing_deps': u"正在安装依赖...",
|
||
'deps_output': u"依赖安装输出",
|
||
'deps_error': u"依赖安装错误",
|
||
'deps_installed': u"依赖安装成功",
|
||
'deps_failed': u"依赖安装失败,返回码",
|
||
'deps_script_error': u"运行依赖安装脚本出错",
|
||
'start_script_not_found': u"启动脚本未找到",
|
||
'starting_system': u"正在启动监控系统...",
|
||
'system_started': u"监控系统启动成功",
|
||
'start_system_failed': u"启动监控系统失败",
|
||
'manual_guide_title': u"手动安装指南",
|
||
'manual_guide_intro': u"如果自动安装失败,请按照以下步骤手动安装:",
|
||
'use_ie': u"1. 获取系统文件:使用IE浏览器下载这些文件:",
|
||
'save_to_structure': u"2. 文件结构:将文件保存到以下结构:",
|
||
'run_deps_first': u"3. 安装依赖:运行install_dependencies.bat安装依赖",
|
||
'then_run_start': u"4. 启动系统:运行start_monitor.cmd启动系统",
|
||
'created_manual_guide': u"已创建手动安装指南",
|
||
'create_guide_failed': u"创建手动指南失败",
|
||
'script_copied': u"已将下载脚本复制到临时目录",
|
||
'copy_script_failed': u"复制脚本失败",
|
||
'deps_install_failed_try_start': u"依赖安装失败,尝试直接启动监控系统",
|
||
'steps_failed': u"某些步骤失败,请检查日志获取详情",
|
||
'try_manual': u"您可以尝试使用以下指南手动安装",
|
||
'unhandled_exception': u"未处理的异常",
|
||
'execution_completed': u"脚本执行完成",
|
||
'press_enter': u"按回车键退出..."
|
||
}
|
||
|
||
# 初始化目录函数
|
||
def init_directory():
|
||
"""初始化临时目录"""
|
||
try:
|
||
# 创建主目录
|
||
if not os.path.exists(TEMP_DIR):
|
||
os.makedirs(TEMP_DIR)
|
||
log_message("[INFO] %s: %s" % (MESSAGES['created_temp_dir'], TEMP_DIR))
|
||
else:
|
||
log_message("[INFO] %s" % MESSAGES['dir_exists'])
|
||
|
||
# 清理现有目录内容,保留日志文件
|
||
for item in os.listdir(TEMP_DIR):
|
||
item_path = os.path.join(TEMP_DIR, item)
|
||
if item != "download_log.txt" and item != "download_auto_run.py":
|
||
if os.path.isdir(item_path):
|
||
shutil.rmtree(item_path)
|
||
else:
|
||
os.remove(item_path)
|
||
|
||
log_message("[INFO] %s" % MESSAGES['dir_cleared'])
|
||
|
||
# 创建templates子目录
|
||
templates_dir = os.path.join(TEMP_DIR, "templates")
|
||
if not os.path.exists(templates_dir):
|
||
os.makedirs(templates_dir)
|
||
log_message("[INFO] %s" % MESSAGES['created_templates_dir'])
|
||
|
||
# 创建static子目录
|
||
static_dir = os.path.join(TEMP_DIR, "static")
|
||
if not os.path.exists(static_dir):
|
||
os.makedirs(static_dir)
|
||
log_message("[INFO] %s" % MESSAGES['created_static_dir'])
|
||
|
||
# 创建cookie-extension子目录
|
||
cookie_ext_dir = os.path.join(TEMP_DIR, "cookie-extension")
|
||
if not os.path.exists(cookie_ext_dir):
|
||
os.makedirs(cookie_ext_dir)
|
||
log_message("[INFO] %s" % MESSAGES['created_cookie_ext_dir'])
|
||
|
||
# 创建cookie-extension/images子目录
|
||
cookie_ext_images_dir = os.path.join(TEMP_DIR, "cookie-extension", "images")
|
||
if not os.path.exists(cookie_ext_images_dir):
|
||
os.makedirs(cookie_ext_images_dir)
|
||
log_message("[INFO] %s" % MESSAGES['created_cookie_ext_images_dir'])
|
||
|
||
return True
|
||
except Exception as e:
|
||
log_message("[ERROR] Failed to initialize directory: %s" % str(e))
|
||
return False
|
||
|
||
# 下载函数
|
||
def download_file(url_path, local_path, use_proxy=False):
|
||
"""下载单个文件,默认不使用代理"""
|
||
full_url = "%s/%s" % (COS_URL, url_path)
|
||
full_local_path = os.path.join(TEMP_DIR, local_path)
|
||
|
||
# 确保目标目录存在
|
||
local_dir = os.path.dirname(full_local_path)
|
||
if not os.path.exists(local_dir):
|
||
os.makedirs(local_dir)
|
||
|
||
log_message("[INFO] Downloading %s to %s" % (full_url, full_local_path))
|
||
|
||
try:
|
||
# 设置代理信息
|
||
if use_proxy:
|
||
log_message("[INFO] %s" % MESSAGES['using_proxy'])
|
||
proxy_handler = urllib2.ProxyHandler({
|
||
'http': 'http://CD-WEBPROXY02.yajuenet.internal:8080',
|
||
'https': 'http://CD-WEBPROXY02.yajuenet.internal:8080'
|
||
})
|
||
opener = urllib2.build_opener(proxy_handler)
|
||
urllib2.install_opener(opener)
|
||
else:
|
||
# 禁用代理
|
||
proxy_handler = urllib2.ProxyHandler({})
|
||
opener = urllib2.build_opener(proxy_handler)
|
||
urllib2.install_opener(opener)
|
||
|
||
# 下载文件
|
||
response = urllib2.urlopen(full_url, timeout=30)
|
||
content = response.read()
|
||
|
||
# 写入文件
|
||
with open(full_local_path, 'wb') as f:
|
||
f.write(content)
|
||
|
||
log_message("[INFO] Successfully downloaded: %s" % local_path)
|
||
return True
|
||
|
||
except urllib2.URLError as e:
|
||
log_message("[ERROR] Failed to download %s: %s" % (url_path, str(e)))
|
||
|
||
# 如果不使用代理失败,尝试使用代理
|
||
if not use_proxy:
|
||
log_message("[INFO] %s" % MESSAGES['retrying_with_proxy'])
|
||
return download_file(url_path, local_path, True)
|
||
|
||
return False
|
||
|
||
except Exception as e:
|
||
log_message("[ERROR] Failed to download %s: %s" % (url_path, str(e)))
|
||
return False
|
||
|
||
# 下载所有文件
|
||
def download_all_files():
|
||
"""下载所有必要的文件"""
|
||
success_count = 0
|
||
failed_required = False
|
||
|
||
for url_path, local_path, required in FILES_TO_DOWNLOAD:
|
||
# 先尝试不使用代理下载
|
||
if download_file(url_path, local_path, False):
|
||
success_count += 1
|
||
elif required:
|
||
failed_required = True
|
||
|
||
log_message("[INFO] %s %d %s %d %s" % (
|
||
MESSAGES['downloaded_files'],
|
||
success_count,
|
||
MESSAGES['of'],
|
||
len(FILES_TO_DOWNLOAD),
|
||
MESSAGES['files']
|
||
))
|
||
|
||
if failed_required:
|
||
log_message("[ERROR] %s" % MESSAGES['download_required_failed'])
|
||
return False
|
||
|
||
return True
|
||
|
||
# 运行依赖安装脚本
|
||
def run_install_dependencies():
|
||
"""运行依赖安装脚本"""
|
||
install_script = os.path.join(TEMP_DIR, "install_dependencies.bat")
|
||
|
||
if not os.path.exists(install_script):
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['install_deps_not_found'], install_script))
|
||
return False
|
||
|
||
try:
|
||
log_message("[INFO] %s" % MESSAGES['installing_deps'])
|
||
|
||
# 记录当前工作目录
|
||
original_dir = os.getcwd()
|
||
|
||
# 切换到临时目录并启动脚本
|
||
os.chdir(TEMP_DIR)
|
||
|
||
# 使用subprocess运行批处理文件并等待其完成
|
||
process = subprocess.Popen(["cmd", "/c", install_script],
|
||
shell=True,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE)
|
||
|
||
# 等待脚本执行完成
|
||
stdout, stderr = process.communicate()
|
||
|
||
# 使用codecs处理编码
|
||
if stdout:
|
||
stdout = codecs.decode(stdout, 'gbk', 'ignore')
|
||
log_message("[INFO] %s: %s" % (MESSAGES['deps_output'], stdout))
|
||
|
||
if stderr:
|
||
stderr = codecs.decode(stderr, 'gbk', 'ignore')
|
||
log_message("[WARNING] %s: %s" % (MESSAGES['deps_error'], stderr))
|
||
|
||
# 返回到原始目录
|
||
os.chdir(original_dir)
|
||
|
||
if process.returncode == 0:
|
||
log_message("[INFO] %s" % MESSAGES['deps_installed'])
|
||
return True
|
||
else:
|
||
log_message("[ERROR] %s: %d" % (MESSAGES['deps_failed'], process.returncode))
|
||
return False
|
||
|
||
except Exception as e:
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['deps_script_error'], str(e)))
|
||
return False
|
||
|
||
# 启动监控系统
|
||
def start_monitor_system():
|
||
"""启动监控系统"""
|
||
start_script = os.path.join(TEMP_DIR, "start_monitor.cmd")
|
||
|
||
if not os.path.exists(start_script):
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['start_script_not_found'], start_script))
|
||
return False
|
||
|
||
try:
|
||
log_message("[INFO] %s" % MESSAGES['starting_system'])
|
||
|
||
# 记录当前工作目录
|
||
original_dir = os.getcwd()
|
||
|
||
# 切换到临时目录并启动脚本
|
||
os.chdir(TEMP_DIR)
|
||
|
||
# 使用subprocess启动批处理文件,不等待其完成
|
||
process = subprocess.Popen(["cmd", "/c", "start", "", "start_monitor.cmd"],
|
||
shell=True,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE)
|
||
|
||
# 返回到原始目录
|
||
os.chdir(original_dir)
|
||
|
||
log_message("[INFO] %s" % MESSAGES['system_started'])
|
||
return True
|
||
|
||
except Exception as e:
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['start_system_failed'], str(e)))
|
||
return False
|
||
|
||
# 创建手动指南
|
||
def create_manual_guide():
|
||
"""创建手动安装指南"""
|
||
guide_path = os.path.join(TEMP_DIR, "manual_install_guide.txt")
|
||
|
||
try:
|
||
with codecs.open(guide_path, "w", "gbk") as f:
|
||
f.write("=" * 50 + "\n")
|
||
f.write("%s\n" % MESSAGES['manual_guide_title'])
|
||
f.write("=" * 50 + "\n\n")
|
||
|
||
f.write("%s\n\n" % MESSAGES['manual_guide_intro'])
|
||
|
||
f.write("%s\n\n" % MESSAGES['use_ie'])
|
||
|
||
for url_path, local_path, required in FILES_TO_DOWNLOAD:
|
||
full_url = "%s/%s" % (COS_URL, url_path)
|
||
f.write(" %s\n" % full_url)
|
||
|
||
f.write("\n%s\n\n" % MESSAGES['save_to_structure'])
|
||
f.write(" %s/\n" % TEMP_DIR)
|
||
f.write(" |-- start_monitor.cmd\n")
|
||
f.write(" |-- dashboard.py\n")
|
||
f.write(" |-- breeze_monitor.py\n")
|
||
f.write(" |-- cms_monitor.py\n")
|
||
f.write(" |-- cms_coefficients.json\n")
|
||
f.write(" |-- breeze_coefficients.json\n")
|
||
f.write(" |-- README.html\n")
|
||
f.write(" |-- install_dependencies.bat\n")
|
||
f.write(" |-- templates/\n")
|
||
f.write(" | |-- dashboard.html\n")
|
||
f.write(" | |-- login.html\n")
|
||
f.write(" |-- static/\n")
|
||
f.write(" | |-- ds-favicon.ico\n")
|
||
f.write(" |-- cookie-extension/\n")
|
||
f.write(" |-- manifest.json\n")
|
||
f.write(" |-- popup.html\n")
|
||
f.write(" |-- popup.js\n")
|
||
f.write(" |-- README.html\n\n")
|
||
f.write(" |-- README.md\n")
|
||
f.write(" |-- images/\n")
|
||
f.write(" |-- icon16.png\n")
|
||
f.write(" |-- icon48.png\n")
|
||
f.write(" |-- icon128.png\n\n")
|
||
f.write(" |-- placeholder.txt\n\n")
|
||
|
||
f.write("%s\n\n" % MESSAGES['run_deps_first'])
|
||
f.write("%s\n\n" % MESSAGES['then_run_start'])
|
||
|
||
# 添加Cookie扩展安装说明
|
||
f.write("5. 安装Cookie扩展:\n")
|
||
f.write(" - 打开Chrome浏览器,在地址栏输入:chrome://extensions/并回车\n")
|
||
f.write(" - 在右上角勾选开发者模式\n")
|
||
f.write(" - 将下载的cookie-extension文件夹拖拽到Chrome扩展页面\n\n")
|
||
|
||
f.write("6. 获取系统Cookie:\n")
|
||
f.write(" - 在浏览器中打开Breeze系统和CMS系统并登录\n")
|
||
f.write(" - Breeze系统:https://breeze.opd.netease.com/center/workbench\n")
|
||
f.write(" - CMS系统:https://god-cms.gameyw.netease.com/cms/\n")
|
||
f.write(" - 点击扩展图标,选择复制SESSION Cookie\n")
|
||
f.write(" - 将复制的Cookie粘贴到监控系统登录页\n\n")
|
||
|
||
f.write("=" * 50 + "\n")
|
||
|
||
log_message("[INFO] %s: %s" % (MESSAGES['created_manual_guide'], guide_path))
|
||
return True
|
||
|
||
except Exception as e:
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['create_guide_failed'], str(e)))
|
||
return False
|
||
|
||
# 复制此脚本到临时目录
|
||
def copy_script():
|
||
"""将当前脚本复制到临时目录"""
|
||
try:
|
||
script_path = os.path.abspath(__file__)
|
||
dest_path = os.path.join(TEMP_DIR, "download_auto_run.py")
|
||
|
||
shutil.copy2(script_path, dest_path)
|
||
log_message("[INFO] %s" % MESSAGES['script_copied'])
|
||
return True
|
||
except Exception as e:
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['copy_script_failed'], str(e)))
|
||
return False
|
||
|
||
# 打开Cookie扩展安装指南
|
||
# def open_cookie_guide():
|
||
# """打开Cookie扩展安装指南"""
|
||
# cookie_guide_url = "http://cos.ui-beam.com/work_scripts/monitor/cookie-extension/README.html"
|
||
|
||
# try:
|
||
# # 使用默认浏览器打开在线链接
|
||
# if sys.platform.startswith('win'):
|
||
# os.system('start "" "%s"' % cookie_guide_url)
|
||
# elif sys.platform.startswith('darwin'): # macOS
|
||
# subprocess.Popen(['open', cookie_guide_url])
|
||
# else: # Linux
|
||
# subprocess.Popen(['xdg-open', cookie_guide_url])
|
||
|
||
# log_message("[INFO] Opened Cookie installation guide: %s" % cookie_guide_url)
|
||
# return True
|
||
# except Exception as e:
|
||
# log_message("[ERROR] Failed to open cookie guide: %s" % str(e))
|
||
# return False
|
||
|
||
# 打开系统使用手册
|
||
def open_user_manual():
|
||
"""打开系统使用手册"""
|
||
manual_url = "http://cos.ui-beam.com/work_scripts/monitor/dev/latest/README.html"
|
||
|
||
try:
|
||
# 使用默认浏览器打开在线链接
|
||
if sys.platform.startswith('win'):
|
||
os.system('start "" "%s"' % manual_url)
|
||
elif sys.platform.startswith('darwin'): # macOS
|
||
subprocess.Popen(['open', manual_url])
|
||
else: # Linux
|
||
subprocess.Popen(['xdg-open', manual_url])
|
||
|
||
log_message("[INFO] 已打开系统使用手册: %s" % manual_url)
|
||
return True
|
||
except Exception as e:
|
||
log_message("[ERROR] 打开系统使用手册失败: %s" % str(e))
|
||
return False
|
||
|
||
# 主函数
|
||
def main():
|
||
"""主函数"""
|
||
try:
|
||
# 使用print可能会更安全,不使用log_message来输出开头的界面
|
||
safe_print(u"\n%s" % MESSAGES['tool_title'])
|
||
print("======================================================\n")
|
||
safe_print(u"%s" % MESSAGES['no_auth_version'])
|
||
safe_print(u"%s\n" % MESSAGES['downloading'])
|
||
|
||
# 初始化日志
|
||
if not os.path.exists(os.path.dirname(LOG_FILE)):
|
||
os.makedirs(os.path.dirname(LOG_FILE))
|
||
|
||
log_message("\n" + "=" * 40)
|
||
log_message("[INFO] %s" % MESSAGES['script_started'])
|
||
log_message("[INFO] %s: %s" % (MESSAGES['temp_dir'], TEMP_DIR))
|
||
|
||
# 初始化目录
|
||
if not init_directory():
|
||
log_message("[ERROR] %s" % MESSAGES['dir_init_failed'])
|
||
return 1
|
||
|
||
# 复制脚本
|
||
copy_script()
|
||
|
||
# 创建手动指南
|
||
create_manual_guide()
|
||
|
||
# 下载文件
|
||
if download_all_files():
|
||
log_message("[INFO] %s" % MESSAGES['all_files_downloaded'])
|
||
|
||
# 安装依赖
|
||
if run_install_dependencies():
|
||
log_message("[INFO] %s" % MESSAGES['deps_installed'])
|
||
|
||
# 启动监控系统
|
||
if start_monitor_system():
|
||
# 稍等几秒,让监控系统先启动
|
||
time.sleep(3)
|
||
|
||
# 打开系统使用手册
|
||
open_user_manual()
|
||
|
||
return 0
|
||
else:
|
||
log_message("[WARNING] %s" % MESSAGES['deps_install_failed_try_start'])
|
||
if start_monitor_system():
|
||
# 稍等几秒,让监控系统先启动
|
||
time.sleep(3)
|
||
|
||
# 打开系统使用手册
|
||
open_user_manual()
|
||
|
||
return 0
|
||
|
||
log_message("[WARNING] %s" % MESSAGES['steps_failed'])
|
||
log_message("[INFO] %s: %s" % (
|
||
MESSAGES['try_manual'],
|
||
os.path.join(TEMP_DIR, "manual_install_guide.txt")
|
||
))
|
||
return 1
|
||
|
||
except Exception as e:
|
||
log_message("[ERROR] %s: %s" % (MESSAGES['unhandled_exception'], str(e)))
|
||
log_message("[TRACE] %s" % traceback.format_exc())
|
||
return 1
|
||
|
||
finally:
|
||
log_message("[INFO] %s" % MESSAGES['execution_completed'])
|
||
|
||
# 入口点
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|