add install git
This commit is contained in:
38
LinuxGrubRepair.bin.spec
Normal file
38
LinuxGrubRepair.bin.spec
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['frontend.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='LinuxGrubRepair.bin',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
394
arch-install.sh
Executable file
394
arch-install.sh
Executable file
@@ -0,0 +1,394 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# BootRepairTool - Arch Linux 源码安装脚本
|
||||
# ------------------------------------------------------------------------------
|
||||
# 功能:
|
||||
# 1. 自动安装依赖 (git, tk, python)
|
||||
# 2. 克隆项目到 /opt/boot-repair-tool
|
||||
# 3. 创建启动脚本和桌面入口
|
||||
# 4. 提示用户如何运行
|
||||
#
|
||||
# 使用方式:
|
||||
#
|
||||
# 方式一:从 Git 仓库安装(默认)
|
||||
# 默认会从 GitHub 克隆最新版本:
|
||||
# sudo bash arch-install.sh
|
||||
#
|
||||
# 或指定自定义仓库地址:
|
||||
# sudo bash arch-install.sh git https://github.com/username/repo.git
|
||||
#
|
||||
# 方式二:本地安装(离线)
|
||||
# 将项目文件夹复制到 Arch Linux 系统,进入目录运行:
|
||||
# sudo bash arch-install.sh local
|
||||
#
|
||||
# 注意: 使用前请修改脚本中的 DEFAULT_REPO_URL 为实际仓库地址
|
||||
# ==============================================================================
|
||||
|
||||
# --- 配置变量 ---
|
||||
APP_NAME="Linux GRUB 引导修复工具"
|
||||
APP_NAME_EN="BootRepairTool"
|
||||
# 默认 Git 仓库地址(请修改为实际地址)
|
||||
DEFAULT_REPO_URL="https://git.yuyujing.cn/zj/BootRepairTool.git"
|
||||
# 安装模式: "git" 或 "local"
|
||||
INSTALL_MODE="${1:-git}"
|
||||
# 可以通过第二个参数指定自定义仓库地址
|
||||
CUSTOM_REPO_URL="${2:-}"
|
||||
INSTALL_DIR="/opt/boot-repair-tool"
|
||||
EXEC_FILE="boot-repair"
|
||||
DESKTOP_FILE_NAME="boot-repair.desktop"
|
||||
DESKTOP_INSTALL_DIR="/usr/share/applications"
|
||||
POLICY_FILE="/usr/share/polkit-1/actions/com.bootrepair.tool.policy"
|
||||
ICON_FILE="boot-repair.png"
|
||||
|
||||
# --- 颜色定义 ---
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 检查是否以 root 权限运行
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo -e "${RED}错误:此脚本需要 root 权限运行。请使用 'sudo bash $0'。${NC}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查并安装依赖
|
||||
install_dependencies() {
|
||||
echo -e "${YELLOW}[1/6] 检查并安装依赖...${NC}"
|
||||
|
||||
# 更新包数据库
|
||||
echo -e "${BLUE} 更新包数据库...${NC}"
|
||||
pacman -Sy --noconfirm
|
||||
|
||||
# 需要安装的包
|
||||
PACKAGES="git tk python python-pip"
|
||||
|
||||
for pkg in $PACKAGES; do
|
||||
if pacman -Q "$pkg" &>/dev/null; then
|
||||
echo -e "${GREEN} ✓ $pkg 已安装${NC}"
|
||||
else
|
||||
echo -e "${YELLOW} 正在安装 $pkg...${NC}"
|
||||
pacman -S --noconfirm "$pkg"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN} ✓ $pkg 安装成功${NC}"
|
||||
else
|
||||
echo -e "${RED} ✗ $pkg 安装失败${NC}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 克隆或更新项目
|
||||
clone_or_update_project() {
|
||||
echo -e "${YELLOW}[2/6] 安装项目文件...${NC}"
|
||||
|
||||
# 确定仓库地址
|
||||
if [ -n "$CUSTOM_REPO_URL" ]; then
|
||||
REPO_URL="$CUSTOM_REPO_URL"
|
||||
else
|
||||
REPO_URL="$DEFAULT_REPO_URL"
|
||||
fi
|
||||
|
||||
# 检查是否使用本地文件安装
|
||||
if [ "$INSTALL_MODE" = "local" ]; then
|
||||
# 本地安装模式 - 复制当前目录的文件
|
||||
SCRIPT_SOURCE="${BASH_SOURCE[0]}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
|
||||
|
||||
echo -e "${BLUE} 使用本地文件安装...${NC}"
|
||||
|
||||
# 检查必要的文件是否存在
|
||||
if [ ! -f "${SCRIPT_DIR}/frontend.py" ] || [ ! -f "${SCRIPT_DIR}/backend.py" ]; then
|
||||
echo -e "${RED} ✗ 未找到 frontend.py 或 backend.py${NC}"
|
||||
echo -e "${YELLOW} 请确保在 BootRepairTool 项目目录中运行此脚本${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 如果目录存在,备份
|
||||
if [ -d "${INSTALL_DIR}" ]; then
|
||||
mv "${INSTALL_DIR}" "${INSTALL_DIR}.backup.$(date +%Y%m%d%H%M%S)"
|
||||
fi
|
||||
|
||||
# 创建安装目录
|
||||
mkdir -p "${INSTALL_DIR}"
|
||||
|
||||
# 复制所有 Python 文件和必要的资源
|
||||
cp -r "${SCRIPT_DIR}"/*.py "${INSTALL_DIR}/" 2>/dev/null || true
|
||||
cp -r "${SCRIPT_DIR}"/*.md "${INSTALL_DIR}/" 2>/dev/null || true
|
||||
cp -r "${SCRIPT_DIR}/tip" "${INSTALL_DIR}/" 2>/dev/null || true
|
||||
|
||||
echo -e "${GREEN} ✓ 项目文件已复制到 ${INSTALL_DIR}${NC}"
|
||||
|
||||
elif [ -d "${INSTALL_DIR}/.git" ]; then
|
||||
# Git 更新模式
|
||||
echo -e "${BLUE} 项目已存在,正在更新...${NC}"
|
||||
cd "${INSTALL_DIR}" || exit 1
|
||||
git pull origin main || git pull origin master
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN} ✓ 项目更新成功${NC}"
|
||||
else
|
||||
echo -e "${YELLOW} 警告:更新失败,使用现有版本${NC}"
|
||||
fi
|
||||
else
|
||||
# Git 克隆模式(默认)
|
||||
echo -e "${BLUE} 正在从 ${REPO_URL} 克隆项目...${NC}"
|
||||
|
||||
# 如果目录存在但不是 git 仓库,先备份
|
||||
if [ -d "${INSTALL_DIR}" ]; then
|
||||
mv "${INSTALL_DIR}" "${INSTALL_DIR}.backup.$(date +%Y%m%d%H%M%S)"
|
||||
fi
|
||||
|
||||
# 克隆仓库
|
||||
git clone --depth 1 "${REPO_URL}" "${INSTALL_DIR}"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN} ✓ 项目克隆成功${NC}"
|
||||
else
|
||||
echo -e "${RED} ✗ 项目克隆失败${NC}"
|
||||
echo -e "${YELLOW} 提示:请检查网络连接或仓库地址是否正确${NC}"
|
||||
echo -e "${YELLOW} 当前仓库地址: ${REPO_URL}${NC}"
|
||||
echo -e "${YELLOW} 或使用本地安装: sudo bash arch-install.sh local${NC}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 创建启动脚本
|
||||
create_launcher() {
|
||||
echo -e "${YELLOW}[3/6] 创建启动脚本...${NC}"
|
||||
|
||||
# 创建主启动脚本
|
||||
cat > "${INSTALL_DIR}/${EXEC_FILE}" << 'EOF'
|
||||
#!/bin/bash
|
||||
# ==============================================================================
|
||||
# BootRepairTool 启动脚本
|
||||
# 解决 Arch Linux 等系统上的 X11 字体渲染问题
|
||||
# ==============================================================================
|
||||
|
||||
# 设置字体渲染环境变量,解决 "BadLength (poly request too large)" 错误
|
||||
export XLIB_SKIP_ARGB_VISUALS=1
|
||||
export GDK_NATIVE_WINDOWS=1
|
||||
export TCL_DONT_USE_RENDER_EXTENSION=1
|
||||
|
||||
# 如果使用 Wayland,强制使用 XWayland
|
||||
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
|
||||
export GDK_BACKEND=x11
|
||||
fi
|
||||
|
||||
# 获取脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# 切换到项目目录
|
||||
cd "${SCRIPT_DIR}" || exit 1
|
||||
|
||||
# 使用系统 Python 运行前端
|
||||
exec python frontend.py "$@"
|
||||
EOF
|
||||
|
||||
chmod +x "${INSTALL_DIR}/${EXEC_FILE}"
|
||||
|
||||
# 创建软链接到 /bin
|
||||
if [ -L "/bin/${EXEC_FILE}" ]; then
|
||||
rm -f "/bin/${EXEC_FILE}"
|
||||
fi
|
||||
ln -sf "${INSTALL_DIR}/${EXEC_FILE}" "/bin/${EXEC_FILE}"
|
||||
|
||||
echo -e "${GREEN} ✓ 启动脚本创建完成${NC}"
|
||||
}
|
||||
|
||||
# 创建图标
|
||||
create_icon() {
|
||||
echo -e "${YELLOW}[4/6] 创建图标...${NC}"
|
||||
|
||||
# 创建简单的 SVG 图标
|
||||
cat > "${INSTALL_DIR}/${ICON_FILE}" << 'EOF'
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="32" cy="32" r="28" fill="#2196F3"/>
|
||||
<circle cx="32" cy="32" r="20" fill="#1976D2"/>
|
||||
<path d="M32 16 L32 32 L44 40" stroke="white" stroke-width="4" fill="none" stroke-linecap="round"/>
|
||||
<circle cx="32" cy="32" r="4" fill="white"/>
|
||||
</svg>
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN} ✓ 图标创建完成${NC}"
|
||||
}
|
||||
|
||||
# 创建桌面入口文件
|
||||
create_desktop_entry() {
|
||||
echo -e "${YELLOW}[5/6] 创建桌面入口...${NC}"
|
||||
|
||||
cat > "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}" << EOF
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Linux GRUB 引导修复工具
|
||||
Name[zh_CN]=Linux GRUB 引导修复工具
|
||||
Name[en_US]=Boot Repair Tool
|
||||
Comment=修复 Linux 系统 GRUB 引导加载器
|
||||
Comment[zh_CN]=修复 Linux 系统 GRUB 引导加载器
|
||||
Categories=System;Settings;Utility;
|
||||
Terminal=false
|
||||
Icon=${INSTALL_DIR}/${ICON_FILE}
|
||||
Exec=pkexec ${INSTALL_DIR}/${EXEC_FILE}
|
||||
Actions=;
|
||||
EOF
|
||||
|
||||
chmod 644 "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}"
|
||||
|
||||
# 创建 PolicyKit 规则
|
||||
cat > "$POLICY_FILE" << EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE policyconfig PUBLIC
|
||||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
|
||||
<policyconfig>
|
||||
<action id="com.bootrepair.tool.pkexec">
|
||||
<description>Run Linux GRUB Boot Repair Tool</description>
|
||||
<description xml:lang="zh_CN">运行 Linux GRUB 引导修复工具</description>
|
||||
<message>Authentication is required to run the Boot Repair Tool.</message>
|
||||
<message xml:lang="zh_CN">运行引导修复工具需要管理员权限</message>
|
||||
<icon_name>boot-repair</icon_name>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/bin/${EXEC_FILE}</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||
</action>
|
||||
</policyconfig>
|
||||
EOF
|
||||
|
||||
chmod 644 "$POLICY_FILE"
|
||||
|
||||
# 更新桌面数据库
|
||||
if command -v update-desktop-database &>/dev/null; then
|
||||
update-desktop-database "${DESKTOP_INSTALL_DIR}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} ✓ 桌面入口创建完成${NC}"
|
||||
}
|
||||
|
||||
# 复制到用户桌面
|
||||
copy_to_user_desktop() {
|
||||
echo -e "${YELLOW}[6/6] 创建用户桌面快捷方式...${NC}"
|
||||
|
||||
CURRENT_USER=$(logname 2>/dev/null || echo "${SUDO_USER}")
|
||||
if [ -z "$CURRENT_USER" ]; then
|
||||
CURRENT_USER=$(whoami)
|
||||
fi
|
||||
|
||||
USER_DESKTOP_DIR=""
|
||||
if [ -d "/home/${CURRENT_USER}/桌面" ]; then
|
||||
USER_DESKTOP_DIR="/home/${CURRENT_USER}/桌面"
|
||||
elif [ -d "/home/${CURRENT_USER}/Desktop" ]; then
|
||||
USER_DESKTOP_DIR="/home/${CURRENT_USER}/Desktop"
|
||||
fi
|
||||
|
||||
if [ -n "${USER_DESKTOP_DIR}" ] && [ -d "/home/${CURRENT_USER}" ]; then
|
||||
cp -f "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}" "${USER_DESKTOP_DIR}/"
|
||||
chmod 755 "${USER_DESKTOP_DIR}/${DESKTOP_FILE_NAME}"
|
||||
chown "${CURRENT_USER}:" "${USER_DESKTOP_DIR}/${DESKTOP_FILE_NAME}" 2>/dev/null || true
|
||||
echo -e "${GREEN} ✓ 已复制到 ${USER_DESKTOP_DIR}${NC}"
|
||||
else
|
||||
echo -e "${YELLOW} 未找到用户桌面目录,跳过${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 显示完成信息
|
||||
show_completion() {
|
||||
echo ""
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo -e "${GREEN} 安装完成!${NC}"
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📋 使用方式:${NC}"
|
||||
echo ""
|
||||
echo -e " ${GREEN}方法一:图形界面${NC}"
|
||||
echo -e " 从应用程序菜单启动 '${APP_NAME}'"
|
||||
echo ""
|
||||
echo -e " ${GREEN}方法二:命令行 (推荐)${NC}"
|
||||
echo -e " ${CYAN}sudo boot-repair${NC}"
|
||||
echo ""
|
||||
echo -e " ${GREEN}方法三:使用 pkexec${NC}"
|
||||
echo -e " ${CYAN}pkexec boot-repair${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📁 安装路径:${NC}"
|
||||
echo -e " 源码目录: ${INSTALL_DIR}"
|
||||
echo -e " 启动脚本: /bin/${EXEC_FILE}"
|
||||
echo -e " 图标: ${INSTALL_DIR}/${ICON_FILE}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}🔧 更新项目:${NC}"
|
||||
echo -e " ${CYAN}cd ${INSTALL_DIR} && sudo git pull${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}🗑️ 卸载:${NC}"
|
||||
echo -e " ${CYAN}sudo rm -rf ${INSTALL_DIR} /bin/${EXEC_FILE}${NC}"
|
||||
echo -e " ${CYAN}sudo rm -f ${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}${NC}"
|
||||
echo -e " ${CYAN}sudo rm -f ${POLICY_FILE}${NC}"
|
||||
echo ""
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo -e "${GREEN}提示: 如果未在菜单中看到程序,请尝试注销并重新登录。${NC}"
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo ""
|
||||
|
||||
# 询问是否立即运行
|
||||
read -p "是否立即运行程序? [y/N]: " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo -e "${GREEN}正在启动 ${APP_NAME}...${NC}"
|
||||
"${INSTALL_DIR}/${EXEC_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 显示帮助信息
|
||||
show_help() {
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo -e "${APP_NAME} - Arch Linux 安装脚本"
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo ""
|
||||
echo -e "用法: sudo bash $0 [模式] [仓库地址]"
|
||||
echo ""
|
||||
echo -e "参数:"
|
||||
echo -e " 模式: git (默认) 或 local"
|
||||
echo -e " 仓库地址: 自定义 Git 仓库 URL(可选)"
|
||||
echo ""
|
||||
echo -e "示例:"
|
||||
echo -e " ${GREEN}sudo bash $0${NC} # 默认从 Git 克隆"
|
||||
echo -e " ${GREEN}sudo bash $0 git${NC} # 从默认仓库克隆"
|
||||
echo -e " ${GREEN}sudo bash $0 git https://...${NC} # 从指定仓库克隆"
|
||||
echo -e " ${GREEN}sudo bash $0 local${NC} # 从当前目录复制"
|
||||
echo ""
|
||||
}
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
# 显示帮助
|
||||
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
||||
show_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo -e "${CYAN} ${APP_NAME} - Arch Linux 安装脚本${NC}"
|
||||
echo -e "${CYAN}=================================================${NC}"
|
||||
echo ""
|
||||
|
||||
check_root
|
||||
install_dependencies
|
||||
clone_or_update_project
|
||||
create_launcher
|
||||
create_icon
|
||||
create_desktop_entry
|
||||
copy_to_user_desktop
|
||||
show_completion
|
||||
}
|
||||
|
||||
# 运行主函数
|
||||
main "$@"
|
||||
97
build.py
97
build.py
@@ -29,7 +29,7 @@ def check_python_version():
|
||||
|
||||
def install_dependencies():
|
||||
"""安装打包所需的依赖"""
|
||||
print("\n[1/4] 安装依赖...")
|
||||
print("\n[1/5] 安装依赖...")
|
||||
|
||||
deps = ["pyinstaller"]
|
||||
|
||||
@@ -47,7 +47,7 @@ def install_dependencies():
|
||||
|
||||
def clean_build():
|
||||
"""清理之前的构建文件"""
|
||||
print("\n[2/4] 清理构建文件...")
|
||||
print("\n[2/5] 清理构建文件...")
|
||||
|
||||
dirs_to_remove = ["build", "dist"]
|
||||
files_to_remove = ["*.pyc", "*.spec"]
|
||||
@@ -69,12 +69,12 @@ def clean_build():
|
||||
|
||||
def build_executable():
|
||||
"""使用 PyInstaller 打包"""
|
||||
print("\n[3/4] 开始打包...")
|
||||
print("\n[3/5] 开始打包...")
|
||||
|
||||
# 打包命令
|
||||
# 打包命令 - 输出为 .bin 文件,wrapper 脚本将调用它
|
||||
cmd = [
|
||||
sys.executable, "-m", "PyInstaller",
|
||||
"--name=LinuxGrubRepair",
|
||||
"--name=LinuxGrubRepair.bin",
|
||||
"--onefile",
|
||||
"--console",
|
||||
"--clean",
|
||||
@@ -93,23 +93,81 @@ def build_executable():
|
||||
return False
|
||||
|
||||
|
||||
def show_result():
|
||||
"""显示打包结果"""
|
||||
print("\n[4/4] 打包完成!")
|
||||
def create_launcher():
|
||||
"""创建启动器脚本,解决 X11 字体渲染问题"""
|
||||
print("\n[4/5] 创建启动器脚本...")
|
||||
|
||||
launcher_content = '''#!/bin/bash
|
||||
# ==============================================================================
|
||||
# BootRepairTool 启动脚本
|
||||
# 解决 Arch Linux 等系统上的 X11 字体渲染问题
|
||||
# ==============================================================================
|
||||
|
||||
# 获取脚本实际所在目录(处理软链接情况)
|
||||
SCRIPT_SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -L "$SCRIPT_SOURCE" ]; do
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
|
||||
SCRIPT_SOURCE="$(readlink "$SCRIPT_SOURCE")"
|
||||
[[ $SCRIPT_SOURCE != /* ]] && SCRIPT_SOURCE="$SCRIPT_DIR/$SCRIPT_SOURCE"
|
||||
done
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
|
||||
|
||||
# 如果是从 /bin 软链接启动,则使用实际安装目录
|
||||
if [ "$SCRIPT_DIR" = "/bin" ] || [ "$SCRIPT_DIR" = "/usr/bin" ]; then
|
||||
SCRIPT_DIR="/opt/boot-repair-tool"
|
||||
fi
|
||||
|
||||
# 设置字体渲染环境变量,解决 "BadLength (poly request too large)" 错误
|
||||
export XLIB_SKIP_ARGB_VISUALS=1
|
||||
|
||||
# 禁用某些 X11 RENDER 扩展功能
|
||||
export GDK_NATIVE_WINDOWS=1
|
||||
|
||||
# 设置 tkinter 使用基本字体渲染
|
||||
export TCL_DONT_USE_RENDER_EXTENSION=1
|
||||
|
||||
# 如果使用 Wayland,强制使用 XWayland
|
||||
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
|
||||
export GDK_BACKEND=x11
|
||||
fi
|
||||
|
||||
# 执行实际程序
|
||||
exec "${SCRIPT_DIR}/LinuxGrubRepair.bin" "$@"
|
||||
'''
|
||||
|
||||
dist_path = os.path.join(os.getcwd(), "dist")
|
||||
exe_name = "LinuxGrubRepair"
|
||||
exe_path = os.path.join(dist_path, exe_name)
|
||||
launcher_path = os.path.join(dist_path, "LinuxGrubRepair")
|
||||
|
||||
if os.path.exists(exe_path):
|
||||
size = os.path.getsize(exe_path)
|
||||
size_mb = size / (1024 * 1024)
|
||||
print(f"\n 可执行文件: {exe_path}")
|
||||
print(f" 文件大小: {size_mb:.2f} MB")
|
||||
with open(launcher_path, 'w') as f:
|
||||
f.write(launcher_content)
|
||||
|
||||
# 设置可执行权限
|
||||
os.chmod(launcher_path, 0o755)
|
||||
print(f" ✓ 启动器创建完成: {launcher_path}")
|
||||
return True
|
||||
|
||||
|
||||
def show_result():
|
||||
"""显示打包结果"""
|
||||
print("\n[5/5] 打包完成!")
|
||||
|
||||
dist_path = os.path.join(os.getcwd(), "dist")
|
||||
launcher_name = "LinuxGrubRepair"
|
||||
bin_name = "LinuxGrubRepair.bin"
|
||||
launcher_path = os.path.join(dist_path, launcher_name)
|
||||
bin_path = os.path.join(dist_path, bin_name)
|
||||
|
||||
if os.path.exists(launcher_path) and os.path.exists(bin_path):
|
||||
bin_size = os.path.getsize(bin_path)
|
||||
bin_size_mb = bin_size / (1024 * 1024)
|
||||
print(f"\n 启动器: {launcher_path}")
|
||||
print(f" 程序文件: {bin_path}")
|
||||
print(f" 文件大小: {bin_size_mb:.2f} MB")
|
||||
print("\n 使用方式:")
|
||||
print(f" sudo ./{exe_name}")
|
||||
print(f" sudo ./{launcher_name}")
|
||||
print("\n 注意: 启动器脚本已配置 X11 环境变量,可解决字体渲染问题")
|
||||
else:
|
||||
print(" 未找到生成的可执行文件")
|
||||
print(" 未找到生成的文件")
|
||||
|
||||
|
||||
def main():
|
||||
@@ -135,6 +193,11 @@ def main():
|
||||
print("打包失败")
|
||||
sys.exit(1)
|
||||
|
||||
# 创建启动器
|
||||
if not create_launcher():
|
||||
print("创建启动器失败")
|
||||
sys.exit(1)
|
||||
|
||||
# 显示结果
|
||||
show_result()
|
||||
|
||||
|
||||
BIN
dist/LinuxGrubRepair
vendored
BIN
dist/LinuxGrubRepair
vendored
Binary file not shown.
BIN
dist/LinuxGrubRepair.bin
vendored
Executable file
BIN
dist/LinuxGrubRepair.bin
vendored
Executable file
Binary file not shown.
35
frontend.py
35
frontend.py
@@ -8,10 +8,45 @@ import os
|
||||
import re
|
||||
import backend
|
||||
|
||||
# ==============================================================================
|
||||
# X11 字体渲染问题修复
|
||||
# 设置 tkinter 使用安全字体,避免 "BadLength" 错误
|
||||
# ==============================================================================
|
||||
def setup_safe_fonts():
|
||||
"""配置安全的字体设置,解决 Arch Linux 等系统上的 X11 渲染问题"""
|
||||
try:
|
||||
# 设置 tkinter 使用安全字体
|
||||
# 避免使用可能导致 X11 RENDER 扩展问题的复杂字体
|
||||
default_fonts = {
|
||||
'TkDefaultFont': ('DejaVu Sans', 10),
|
||||
'TkTextFont': ('DejaVu Sans', 10),
|
||||
'TkFixedFont': ('DejaVu Sans Mono', 10),
|
||||
'TkMenuFont': ('DejaVu Sans', 10),
|
||||
'TkHeadingFont': ('DejaVu Sans', 12, 'bold'),
|
||||
}
|
||||
|
||||
for font_name, font_config in default_fonts.items():
|
||||
try:
|
||||
tk.font.nametofont(font_name).configure(family=font_config[0], size=font_config[1])
|
||||
except:
|
||||
pass
|
||||
except:
|
||||
pass
|
||||
|
||||
# 尝试导入字体模块
|
||||
try:
|
||||
import tkinter.font as tkfont
|
||||
except ImportError:
|
||||
import tkFont as tkfont
|
||||
|
||||
|
||||
class GrubRepairApp:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
|
||||
# 设置安全字体
|
||||
setup_safe_fonts()
|
||||
|
||||
master.title("Linux GRUB 引导修复工具 v2.0")
|
||||
master.geometry("643x750")
|
||||
master.resizable(True, True)
|
||||
|
||||
18
install.sh
18
install.sh
@@ -19,6 +19,7 @@
|
||||
APP_NAME="Linux GRUB 引导修复工具"
|
||||
APP_NAME_EN="BootRepairTool"
|
||||
EXEC_FILE="LinuxGrubRepair"
|
||||
EXEC_BIN_FILE="LinuxGrubRepair.bin"
|
||||
ICON_FILE="boot-repair.png"
|
||||
INSTALL_DIR="/opt/boot-repair-tool"
|
||||
DESKTOP_FILE_NAME="boot-repair.desktop"
|
||||
@@ -118,20 +119,25 @@ mkdir -p "${INSTALL_DIR}" || { echo -e "${RED}创建目录失败!${NC}"; exit
|
||||
echo -e "${GREEN} 目录创建完成。${NC}"
|
||||
|
||||
echo -e "${GREEN}2. 安装可执行文件...${NC}"
|
||||
# 首先尝试使用本地文件
|
||||
if use_local_file "./dist/${EXEC_FILE}" "${INSTALL_DIR}/${EXEC_FILE}" "可执行文件"; then
|
||||
# 首先尝试使用本地文件(包括启动器和 .bin 文件)
|
||||
if [ -f "./dist/${EXEC_FILE}" ] && [ -f "./dist/${EXEC_BIN_FILE}" ]; then
|
||||
use_local_file "./dist/${EXEC_FILE}" "${INSTALL_DIR}/${EXEC_FILE}" "启动器脚本"
|
||||
use_local_file "./dist/${EXEC_BIN_FILE}" "${INSTALL_DIR}/${EXEC_BIN_FILE}" "程序文件"
|
||||
echo -e "${GREEN} 本地可执行文件已复制。${NC}"
|
||||
# 然后尝试从 URL 下载
|
||||
# 然后尝试从 URL 下载(单文件模式,用于在线安装)
|
||||
elif [ "${BASE_DOWNLOAD_URL}" != "https://your-domain.com/data/sh/boot-repair" ]; then
|
||||
download_file "${EXEC_DOWNLOAD_URL}" "${INSTALL_DIR}/${EXEC_FILE}" "${EXEC_FILE}"
|
||||
else
|
||||
echo -e "${RED}错误:未找到可执行文件!${NC}"
|
||||
echo -e "${YELLOW}请先将可执行文件放入 ./dist/${EXEC_FILE} 目录,${NC}"
|
||||
echo -e "${YELLOW}或修改 BASE_DOWNLOAD_URL 配置。${NC}"
|
||||
echo -e "${YELLOW}请先将可执行文件放入 ./dist/ 目录:${NC}"
|
||||
echo -e "${YELLOW} - ${EXEC_FILE} (启动器脚本)${NC}"
|
||||
echo -e "${YELLOW} - ${EXEC_BIN_FILE} (程序文件)${NC}"
|
||||
echo -e "${YELLOW}或修改 BASE_DOWNLOAD_URL 配置用于在线安装。${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
chmod +x "${INSTALL_DIR}/${EXEC_FILE}"
|
||||
[ -f "${INSTALL_DIR}/${EXEC_BIN_FILE}" ] && chmod +x "${INSTALL_DIR}/${EXEC_BIN_FILE}"
|
||||
echo -e "${GREEN} 可执行文件权限设置完成。${NC}"
|
||||
|
||||
echo -e "${GREEN}3. 安装图标...${NC}"
|
||||
@@ -185,7 +191,7 @@ cat << EOF > "$POLICY_FILE"
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">${INSTALL_DIR}/${EXEC_FILE}</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/bin/boot-repair</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||
</action>
|
||||
</policyconfig>
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
# --- 配置变量 ---
|
||||
APP_NAME="Linux GRUB 引导修复工具"
|
||||
EXEC_FILE="LinuxGrubRepair"
|
||||
EXEC_BIN_FILE="LinuxGrubRepair.bin"
|
||||
ICON_FILE="boot-repair.png"
|
||||
INSTALL_DIR="/opt/boot-repair-tool"
|
||||
DESKTOP_FILE_NAME="boot-repair.desktop"
|
||||
|
||||
Reference in New Issue
Block a user