Files
BootRepairTool/install.sh
2026-02-12 06:06:49 +08:00

247 lines
8.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ==============================================================================
# Linux GRUB 引导修复工具 (BootRepairTool) 安装脚本
# ------------------------------------------------------------------------------
# 功能:
# 1. 下载应用程序可执行文件、图标。
# 2. 创建安装目录 `/opt/boot-repair-tool`。
# 3. 创建软链接 `/bin/boot-repair`。
# 4. 创建并安装桌面入口文件 (.desktop) 到 `/usr/share/applications`。
# 5. 创建 PolicyKit 规则文件,确保 pkexec 正常工作。
# 6. 更新桌面数据库,使应用程序显示在菜单中。
#
# 使用方法:
# 1. 终端中运行: sudo bash install.sh
# ==============================================================================
# --- 配置变量 ---
APP_NAME="Linux GRUB 引导修复工具"
APP_NAME_EN="BootRepairTool"
EXEC_FILE="LinuxGrubRepair"
ICON_FILE="boot-repair.png"
INSTALL_DIR="/opt/boot-repair-tool"
DESKTOP_FILE_NAME="boot-repair.desktop"
DESKTOP_INSTALL_DIR="/usr/share/applications"
POLICY_FILE="/usr/share/polkit-1/actions/com.bootrepair.tool.policy"
# 下载源 URL (请根据实际情况修改)
BASE_DOWNLOAD_URL="https://your-domain.com/data/sh/boot-repair"
EXEC_DOWNLOAD_URL="${BASE_DOWNLOAD_URL}/${EXEC_FILE}"
ICON_DOWNLOAD_URL="${BASE_DOWNLOAD_URL}/${ICON_FILE}"
# pkexec 启动参数
SLEEP_DURATION=2
# --- 颜色定义 ---
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# --- 函数定义 ---
# 检查是否以 root 权限运行
check_root() {
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}错误:此脚本需要 root 权限运行。请使用 'sudo bash $0'。${NC}"
exit 1
fi
}
# 下载文件函数
download_file() {
local url=$1
local dest_path=$2
local file_description=$3
echo -e "${GREEN}正在下载 ${file_description}${url}...${NC}"
# 优先使用 wget否则尝试 curl
if command -v wget &> /dev/null; then
wget -q --show-progress -O "${dest_path}" "${url}"
elif command -v curl &> /dev/null; then
curl -L --progress-bar -o "${dest_path}" "${url}"
else
echo -e "${RED}错误:未找到 wget 或 curl无法下载文件。${NC}"
exit 1
fi
if [ $? -ne 0 ]; then
echo -e "${RED}错误:下载 ${file_description} 失败,请检查网络连接或 URL。${NC}"
exit 1
fi
echo -e "${GREEN} ${file_description} 下载完成。${NC}"
}
# 检查本地文件是否存在
use_local_file() {
local local_path=$1
local dest_path=$2
local file_description=$3
if [ -f "${local_path}" ]; then
echo -e "${BLUE}使用本地 ${file_description}: ${local_path}${NC}"
cp "${local_path}" "${dest_path}"
return 0
fi
return 1
}
# 创建默认图标 (如果没有提供图标)
create_default_icon() {
local icon_path=$1
# 创建一个简单的 SVG 图标
cat << 'EOF' > "${icon_path}"
<?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 "${YELLOW} 已创建默认 SVG 图标。${NC}"
}
# --- 主安装流程 ---
echo -e "${YELLOW}=================================================${NC}"
echo -e "${YELLOW} 开始安装 ${APP_NAME}${NC}"
echo -e "${YELLOW}=================================================${NC}"
check_root
echo -e "${GREEN}1. 创建安装目录 ${INSTALL_DIR}...${NC}"
mkdir -p "${INSTALL_DIR}" || { echo -e "${RED}创建目录失败!${NC}"; exit 1; }
echo -e "${GREEN} 目录创建完成。${NC}"
echo -e "${GREEN}2. 安装可执行文件...${NC}"
# 首先尝试使用本地文件
if use_local_file "./dist/${EXEC_FILE}" "${INSTALL_DIR}/${EXEC_FILE}" "可执行文件"; then
echo -e "${GREEN} 本地可执行文件已复制。${NC}"
# 然后尝试从 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}"
exit 1
fi
chmod +x "${INSTALL_DIR}/${EXEC_FILE}"
echo -e "${GREEN} 可执行文件权限设置完成。${NC}"
echo -e "${GREEN}3. 安装图标...${NC}"
if use_local_file "./${ICON_FILE}" "${INSTALL_DIR}/${ICON_FILE}" "图标文件"; then
echo -e "${GREEN} 本地图标已复制。${NC}"
elif [ "${BASE_DOWNLOAD_URL}" != "https://your-domain.com/data/sh/boot-repair" ]; then
download_file "${ICON_DOWNLOAD_URL}" "${INSTALL_DIR}/${ICON_FILE}" "${ICON_FILE}"
else
create_default_icon "${INSTALL_DIR}/${ICON_FILE}"
fi
echo -e "${GREEN}4. 创建软链接 /bin/boot-repair...${NC}"
rm -f "/bin/boot-repair"
ln -sn "${INSTALL_DIR}/${EXEC_FILE}" "/bin/boot-repair"
echo -e "${GREEN} 软链接创建完成。${NC}"
echo -e "${GREEN}5. 创建桌面入口文件...${NC}"
cat << EOF > "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}"
[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}"
echo -e "${GREEN} 桌面入口文件创建完成。${NC}"
echo -e "${GREEN}6. 创建 PolicyKit 规则文件...${NC}"
cat << EOF > "$POLICY_FILE"
<?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">${INSTALL_DIR}/${EXEC_FILE}</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 PolicyKit 规则文件失败,退出。${NC}"
exit 1
fi
chmod 644 "$POLICY_FILE"
echo -e "${GREEN} PolicyKit 规则文件创建完成。${NC}"
echo -e "${GREEN}7. 更新桌面数据库...${NC}"
if command -v update-desktop-database &> /dev/null; then
update-desktop-database "${DESKTOP_INSTALL_DIR}" || { echo -e "${YELLOW}警告:更新桌面数据库失败。${NC}"; }
else
echo -e "${YELLOW} update-desktop-database 命令未找到,跳过。${NC}"
fi
# 复制到用户桌面
echo -e "${GREEN}8. 复制桌面快捷方式到用户桌面...${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
echo -e "${YELLOW}=================================================${NC}"
echo -e "${GREEN} 安装完成!${NC}"
echo -e "${YELLOW}=================================================${NC}"
echo ""
echo -e "${BLUE}使用方式:${NC}"
echo -e " 图形界面: 从应用程序菜单启动 'Linux GRUB 引导修复工具'"
echo -e " 命令行: ${GREEN}sudo boot-repair${NC}${GREEN}pkexec boot-repair${NC}"
echo ""
echo -e "${BLUE}安装路径:${NC}"
echo -e " 程序: ${INSTALL_DIR}/${EXEC_FILE}"
echo -e " 图标: ${INSTALL_DIR}/${ICON_FILE}"
echo -e " 软链接: /bin/boot-repair"
echo ""
echo -e "${YELLOW}提示: 如果未在菜单中看到程序,请尝试注销并重新登录。${NC}"
echo ""
exit 0