mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-09-20 21:50:11 +08:00
183 lines
6.9 KiB
Bash
Executable File
183 lines
6.9 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 显示进度条并执行命令(使用 zenity)
|
||
run_with_progress() {
|
||
local title="$1"
|
||
local text="$2"
|
||
local cmd="$3"
|
||
|
||
# 检测可用的对话框工具
|
||
if ! command -v zenity &> /dev/null; then
|
||
echo "警告:未找到 zenity,无法显示进度条。直接执行命令..." >&2
|
||
eval "$cmd"
|
||
return $?
|
||
fi
|
||
|
||
# 启动 zenity 进度条
|
||
local progress_pid
|
||
zenity --progress --pulsate --title="$title" --text="$text" --no-cancel 2>/dev/null &
|
||
progress_pid=$!
|
||
|
||
# 执行实际命令
|
||
eval "$cmd"
|
||
local cmd_exit=$?
|
||
|
||
# 关闭进度条
|
||
kill "$progress_pid" 2>/dev/null
|
||
wait "$progress_pid" 2>/dev/null
|
||
|
||
return $cmd_exit
|
||
}
|
||
|
||
# 1. 检查是否提供了至少一个参数
|
||
if [[ $# -eq 0 ]]; then
|
||
echo "错误:未提供命令参数。"
|
||
echo "用法: $0 [apm|aptss|ssinstall] <子命令> [参数...]"
|
||
exit 1
|
||
fi
|
||
|
||
# 2. 获取第一个参数作为主指令
|
||
command_type="$1"
|
||
|
||
# 3. 根据指令类型分发逻辑
|
||
case "$command_type" in
|
||
"apm")
|
||
# 禁止 apm debug 命令
|
||
if [[ "$2" == "debug" ]]; then
|
||
echo "错误:apm debug 命令已被禁止执行。"
|
||
echo "提示:如需调试,请使用其他方式。"
|
||
exit 1
|
||
fi
|
||
# 禁止 apm ssaudit 命令(已弃用,请使用 apm ssinstall)
|
||
if [[ "$2" == "ssaudit" ]]; then
|
||
echo "错误:apm ssaudit 命令已被弃用,请使用 apm ssinstall。"
|
||
echo "提示:请将 APM 升级到 1.2.2 版本以上以继续使用安装功能。"
|
||
exit 1
|
||
fi
|
||
# 执行 apm 命令(跳过第一个参数)
|
||
/usr/bin/apm "${@:2}" 2>&1
|
||
exit_code=$?
|
||
# 如果 apm ssinstall 执行失败,提示可能是版本过低
|
||
if [[ "$2" == "ssinstall" && "$exit_code" != "0" ]]; then
|
||
echo "提示:apm ssinstall 执行失败,可能是您的 APM 版本过低(需要 1.2.2+)。"
|
||
echo "请升级 APM 到 1.2.2 版本以上来继续安装。"
|
||
fi
|
||
;;
|
||
|
||
"ssinstall")
|
||
# 执行 ssinstall 命令(跳过第一个参数)
|
||
/usr/bin/ssinstall "${@:2}" --native 2>&1
|
||
exit_code=$?
|
||
if [[ "$exit_code" != "0" ]];then
|
||
echo "安装失败,可尝试安装对应的 APM 版本应用;若无对应的 APM 版本应用,可提交用户反馈"
|
||
fi
|
||
;;
|
||
|
||
"force-ssinstall")
|
||
# 强制安装被系统锁定(apt-mark hold)的包:在一次已提权的 pkexec 会话内
|
||
# 完成「解除锁定 → ssinstall 本地 .deb → 恢复锁定」,避免单独 pkexec apt-mark
|
||
# 触发额外权限框(apt-mark 不在 policykit 免密 exec.path 内)。
|
||
# 用法:force-ssinstall <pkgname> <deb路径> [ssinstall 额外参数...]
|
||
pkg="$2"
|
||
deb="$3"
|
||
shift 3
|
||
# 仅放行单包名(与前端 PKGNAME_PATTERN 一致,双引号防注入)
|
||
if [[ -z "$pkg" || -z "$deb" ]]; then
|
||
echo "错误:force-ssinstall 缺少包名或 deb 路径参数。"
|
||
exit 1
|
||
fi
|
||
# 安装前解除系统锁定(失败仅警告,不阻断)
|
||
apt-mark unhold "$pkg" 2>&1 || echo "警告:解除系统锁定 $pkg 失败,将继续尝试安装"
|
||
# 安装本地 .deb(--native 由本分支统一追加)
|
||
/usr/bin/ssinstall "$deb" "$@" --native 2>&1
|
||
exit_code=$?
|
||
# 安装后无论如何恢复系统锁定,保持用户原本的 hold 状态
|
||
apt-mark hold "$pkg" 2>&1 || echo "警告:恢复系统锁定 $pkg 失败,请手动检查"
|
||
if [[ "$exit_code" != "0" ]]; then
|
||
echo "安装失败,可尝试安装对应的 APM 版本应用;若无对应的 APM 版本应用,可提交用户反馈"
|
||
fi
|
||
exit $exit_code
|
||
;;
|
||
|
||
"aptss")
|
||
# 针对 aptss 的特殊逻辑:如果是 remove 子命令,需要图形化确认
|
||
if [[ "$2" == "remove" ]]; then
|
||
packages="${@:3}"
|
||
|
||
# 确认框通用参数
|
||
title="确认卸载"
|
||
text="正在准备卸载: $packages\n\n若这是您下达的卸载指令,请选择确认继续卸载"
|
||
|
||
# 使用 zenity 确认
|
||
if command -v zenity &> /dev/null; then
|
||
zenity --question --title="$title" --text="$text" \
|
||
--ok-label="确认卸载" --cancel-label="取消" --width=400
|
||
confirmed=$?
|
||
else
|
||
echo "错误:未找到 zenity,无法显示确认对话框。卸载操作已拒绝。"
|
||
exit 1
|
||
fi
|
||
|
||
# 根据确认结果执行
|
||
if [[ $confirmed -eq 0 ]]; then
|
||
/usr/bin/aptss "${@:2}" -y 2>&1
|
||
exit_code=$?
|
||
else
|
||
echo "操作已取消"
|
||
exit 0
|
||
fi
|
||
elif [[ "$2" == "install" ]]; then
|
||
packages="${@:3}"
|
||
# 确认框通用参数
|
||
title="确认安装"
|
||
text="正在准备安装: $packages\n\n若这是您下达的安装指令,请选择确认继续安装"
|
||
|
||
# 使用 zenity 确认
|
||
if command -v zenity &> /dev/null; then
|
||
zenity --question --title="$title" --text="$text" \
|
||
--ok-label="确认安装" --cancel-label="取消" --width=400
|
||
confirmed=$?
|
||
else
|
||
echo "错误:未找到 zenity,无法显示确认对话框。安装操作已拒绝。"
|
||
exit 1
|
||
fi
|
||
|
||
# 根据确认结果执行
|
||
if [[ $confirmed -eq 0 ]]; then
|
||
# 1) 先更新软件源(带进度条)
|
||
echo "正在更新软件源..."
|
||
if ! run_with_progress "更新软件源" "正在更新软件源,请稍候..." "/usr/bin/aptss update"; then
|
||
echo "错误:软件源更新失败,安装已终止。"
|
||
exit 1
|
||
fi
|
||
# 2) 执行安装(带进度条)
|
||
echo "正在安装软件包..."
|
||
if ! run_with_progress "安装软件包" "正在安装: $packages,请稍候..." "/usr/bin/aptss install $packages -y"; then
|
||
echo "错误:软件包安装失败。"
|
||
exit 1
|
||
fi
|
||
exit_code=0
|
||
else
|
||
echo "操作已取消"
|
||
exit 0
|
||
fi
|
||
elif [[ "$2" == "ssupdate" ]]; then
|
||
/usr/bin/aptss "${@:2}" -y 2>&1
|
||
exit_code=$?
|
||
exit $exit_code
|
||
else
|
||
# 非 remove/install 命令,拒绝执行
|
||
echo "拒绝执行 aptss 白名单外的指令"
|
||
exit 1
|
||
fi
|
||
;;
|
||
|
||
*)
|
||
# 兜底:拒绝非法指令
|
||
echo "拒绝执行:仅允许执行 'apm', 'aptss' 或 'ssinstall'。收到的参数: '$command_type'"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
exit $exit_code
|