247 lines
8.9 KiB
Bash
Executable File
247 lines
8.9 KiB
Bash
Executable File
#!/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
|