Files
spark-store/extras/shell-caller.sh
T

183 lines
6.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
# 显示进度条并执行命令(使用 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