Compare commits

...

5 Commits
4.7.0 ... dev

Author SHA1 Message Date
bbc4d27d7a 新增 ssinstall-local 以准备后续的ACE支持 2025-05-31 00:34:08 +08:00
dc28c2e9d1
gitcode star
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-05-25 03:14:39 +00:00
b4935edf0a fix: unable to run in deepin without dxcb plugin
QT_QPA_PLATFORM should be dxcb;xcb on x11 platform
fallback to xcb when dxcb is unavailable

Log: modify QT_QPA_PLATFORM; fix wrong QTWEBENGINE_CHROMIUM_FLAGS
2025-04-28 14:11:35 +08:00
4f294cee8f 进一步适配ACE 2025-04-16 22:53:43 +08:00
45c52d7755
yfq
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-04-16 07:29:49 +00:00
12 changed files with 368 additions and 184 deletions

@ -1,6 +1,6 @@
# 星火应用商店
[![star](https://gitee.com/spark-store-project/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/stargazers) [![fork](https://gitee.com/spark-store-project/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/members)
![star](https://gitcode.com/spark-store-project/spark-store/star/badge.svg)
## 简介

@ -0,0 +1,6 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss update\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition GroupPlease use ssaudit instead of ssinstall to audit APPsfor ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repositoryyou can also use ssaudit."
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="Please run ssinstall as root"
TRANSHELL_CONTENT_FILE_NOT_EXIST="File not exist"
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="No delete after install option given, will not delete the deb"
TRANSHELL_CONTENT_DEB_IS_DELETED="--delete-after-install option is given and the installation is succeeded, delete the deb file."

@ -0,0 +1,6 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请执行 sudo aptss update 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="请使用root启动ssinstall"
TRANSHELL_CONTENT_FILE_NOT_EXIST="文件不存在"
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="未指定安装后删除或安装出错不删除deb包"
TRANSHELL_CONTENT_DEB_IS_DELETED="使用了--delete-after-install选项且安装未出错删除deb包"

@ -142,18 +142,18 @@ int main(int argc, char *argv[])
// 龙芯机器配置,使得 DApplication 能正确加载 QtWebEngine
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
// 设置 QtWebEngine 环境变量
QStringList chromium_flags;
// 浏览器开启 GPU 支持
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
// chromium_flags.append("--disable-features=UseModernMediaControls");
// chromium_flags.append("--disable-web-security");
// 全平台软件渲染Webkit
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu");
#ifdef __sw_64__
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
chromium_flags.append("--disable-gpu");
#if defined __sw_64__ || __loongarch__
chromium_flags.append("--no-sandbox");
#endif
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", chromium_flags.join(" ").toUtf8());
#ifdef __loongarch__
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
#endif
/**
* NOTE: https://zhuanlan.zhihu.com/p/550285855
* wayland QtWebEngine 退 QWidget
@ -163,8 +163,6 @@ int main(int argc, char *argv[])
DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
}
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
// 开启 Hidpi 支持
qDebug() << "Enable HiDPI Support.";

@ -198,7 +198,7 @@ void Utils::setQPAPlatform()
// }
else
{
qputenv("QT_QPA_PLATFORM", "dxcb");
qputenv("QT_QPA_PLATFORM", "dxcb;xcb");
}
}

@ -1,6 +1,8 @@
#!/bin/bash
SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
export DEBIAN_FRONTEND=noninteractive
@ -60,30 +62,8 @@ function zenity() {
}
function hash_check() {
if [ ! -e "/var/lib/aptss/lists/d.spark-app.store_${STORE_URL}_Packages" ] && \
[ ! -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && \
[ ! -e "/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store_${STORE_URL}_Packages" ]; then
echo "接收星火仓库软件信息中..."
aptss ssupdate
fi
if [ -e "/var/lib/aptss/lists/d.spark-app.store_${STORE_URL}_Packages" ]; then
PACKAGES_DATA_PATH="/var/lib/aptss/lists/d.spark-app.store_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是星火域名仓库配置"
elif [ -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ]; then
PACKAGES_DATA_PATH="/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是d域名单目录仓库配置"
else
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是SDU镜像仓库配置"
fi
echo "正在运行包验证..."
echo "Running Spark Package Verify..."
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
unset IS_SHA512SUM_CHECKED
IS_SHA512SUM_CHECKED=$(cat "$PACKAGES_DATA_PATH" | grep "$DEB_SHA512SUM")
IS_SHA512SUM_CHECKED=skipped
}
function lock_file(){
@ -161,7 +141,9 @@ fi
lock_file "$DEBPATH"
IS_SHA512SUM_CHECKED=skipped
hash_check "$DEBPATH"
if [ ! -z "$IS_SHA512SUM_CHECKED" ]; then
echo "校验跳过,开始安装"
@ -218,7 +200,7 @@ if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
echo "----------------------------------------"
echo "在 $ace_cmd 环境中预检成功,开始安装..."
echo "----------------------------------------"
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yf'
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq'
success=true
break # 跳出循环
else
@ -242,7 +224,7 @@ if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
exit "$try_run_ret"
fi
else ## 如果主机安装检测成功
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yf
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq
fi
### 退出阶段保持不变 ###

@ -144,6 +144,7 @@ fi
if [ ! -f "$1" ]; then
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST},Trying to redownload"
aptss update
FILEPATH=$(dirname "$1")
FILENAME=$(basename "$1")
PACKAGE_NAME=$(echo "$FILENAME" | sed -r 's/^([^_]+)_.*$/\1/')
@ -232,7 +233,7 @@ if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
echo "----------------------------------------"
echo "在 $ace_cmd 环境中预检成功,开始安装..."
echo "----------------------------------------"
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yf'
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq'
success=true
break # 跳出循环
else
@ -256,7 +257,7 @@ if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
exit "$try_run_ret"
fi
else ## 如果主机安装检测成功
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yf
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq
fi
### 退出阶段保持不变 ###

129
tool/ssinstall-local Executable file

@ -0,0 +1,129 @@
#!/bin/bash
SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
export DEBIAN_FRONTEND=noninteractive
help(){
echo "Spark Store 安装脚本使用说明:"
echo "用法: $0 [选项] <deb文件路径>"
echo ""
echo "选项:"
echo " -h, --help 显示此帮助信息"
echo " --delete-after-install 安装完成后删除deb文件"
echo ""
echo "示例:"
echo " $0 /path/to/package.deb"
echo " $0 --delete-after-install /path/to/package.deb"
}
parse_args() {
while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
help
exit 0
;;
--delete-after-install)
DELETE_AFTER_INSTALL="1"
shift
;;
*)
DEBPATH="$1"
;;
esac
shift
done
}
parse_args "$@"
echo "Spark Store Install script. 星火商店安装脚本"
function create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
if [ -e $(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
echo "It is configured that do not create desktop file. Give up"
else
exec_create_desktop_file
fi
}
function exec_create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
echo "$desktop_file_path is checked and will be installed to desktop"
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
echo "$desktop_file_path is checked and will be installed to desktop"
chmod +x "$desktop_file_path"
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
}
####################################
if [ $# -eq 0 ]; then
echo "没有接收到参数,退出"
help
echo "OMG-IT-GOES-WRONG"
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
package_name=$(dpkg-deb -f "$DEBPATH" Package)
echo "Package name is $package_name"
try_run_output=$(aptss --dry-run install "$DEBPATH")
try_run_ret="$?"
# 安装失败后进行 aptss 刷新,随后尝试安装
if [ "$try_run_ret" -ne 0 ]; then
aptss update
try_run_output=$(aptss --dry-run install "$DEBPATH")
try_run_ret="$?"
fi
if [ "$try_run_ret" = "0" ]; then ## 若安装检测成功
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq
else
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
### 退出阶段
if [ "$?" = "0" ]; then
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
create_desktop_file
if [ "$DELETE_AFTER_INSTALL" = "1" ];then
rm "$DEBPATH"
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
else
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
fi
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
else
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
exit 1
fi

@ -1,10 +1,42 @@
#!/bin/bash
dpkg -l | grep "^ii $1 " > /dev/null
dpkg -s "$1" > /dev/null
RET="$?"
if [[ "$RET" != "0" ]] && command -v bookworm-run > /dev/null;then
echo "Try ACE Bookworm"
bookworm-run dpkg -l | grep "^ii $1 " > /dev/null
RET="$?"
exit "$RET"
fi
if [[ "$RET" != "0" ]] &&[[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中
# 定义按顺序尝试的ACE环境命令:推荐安装包)
declare -a ace_commands_order=(
"bookworm-run:amber-ce-bookworm"
"trixie-run:amber-ce-trixie"
"deepin23-run:amber-ce-deepin23"
)
for ace_entry in "${ace_commands_order[@]}"; do
ace_cmd=${ace_entry%%:*}
if command -v "$ace_cmd" >/dev/null 2>&1; then
echo "----------------------------------------"
echo "正在检查 $ace_cmd 环境的安装..."
echo "----------------------------------------"
# 在ACE环境中执行安装检测
$ace_cmd dpkg -l | grep "^ii $1 " > /dev/null
try_run_ret="$?"
# 最终检测结果处理
if [ "$try_run_ret" -eq 0 ]; then
echo "----------------------------------------"
echo "在 $ace_cmd 环境中找到了安装"
echo "----------------------------------------"
exit $try_run_ret
else
echo "----------------------------------------"
echo "在 $ace_cmd 环境中未能找到安装,继续查找"
echo "----------------------------------------"
fi
fi
done
echo "----------------------------------------"
echo "所有已安装的 ACE 环境中未能找到安装,退出"
echo "----------------------------------------"
exit "$RET"
fi
## 如果在ACE环境中或者未出错
exit "$RET"

@ -1,142 +1,132 @@
#!/bin/bash
# ===== Log =====
# log.info xxx
# log.warn xxx
# log.info xxx
# log.debug xxx
# 带颜色的echo
function log.color_output() {
local color=$1
shift 1
echo >&2 -e "\033[${color}m$@\033[0m"
return 0
# ===== ACE环境配置 =====
declare -a ace_commands_order=(
"bookworm-run:amber-ce-bookworm"
"trixie-run:amber-ce-trixie"
"deepin23-run:amber-ce-deepin23"
)
# ===== 日志和函数 =====
[ -f /opt/durapps/spark-store/bin/bashimport/log.amber ] && \
source /opt/durapps/spark-store/bin/bashimport/log.amber || {
log.info() { echo "INFO: $*"; }
log.warn() { echo "WARN: $*"; }
log.error() { echo "ERROR: $*"; }
log.debug() { echo "DEBUG: $*"; }
}
# Log is named without prefix "utils." for convenience
# Usage: log.log <level> ...content
function log.log() {
if [[ $# < 2 ]]; then
return -1
fi
local level=$1
shift 1
case $level in
error) log.color_output "0;31" "[ERROR] $@" ;;
warn) log.color_output "1;33" "[WARN] $@" ;;
info) log.color_output "1;37" "[INFO] $@" ;;
debug) log.color_output "1;30" "[DEBUG] $@" ;;
esac
return 0
}
function log.error() { log.log "error" "$@"; }
function log.warn() { log.log "warn" $@; }
function log.info() { log.log "info" $@; }
function log.debug() { log.log "debug" $@; }
function scan_desktop_file_log(){
unset desktop_file_path
package_name=$1
for desktop_file_path in $(dpkg -L "$1" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
log.info "$desktop_file_path is found."
fi
done
for desktop_file_path in $(dpkg -L "$1" |grep /opt/apps/$package_name/entries/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
log.info "$desktop_file_path is found."
fi
done
}
function scan_desktop_file(){
# ===== 功能函数 =====
function scan_desktop_file_log() {
unset desktop_file_path
local result=""
for desktop_file_path in $(dpkg -L "$1" | grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(grep NoDisplay=true $desktop_file_path)" = "" ]; then
result+="$desktop_file_path,"
fi
done
for desktop_file_path in $(dpkg -L "$1" | grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do
if [ "$(grep NoDisplay=true $desktop_file_path)" = "" ]; then
result+="$desktop_file_path,"
fi
done
# 去掉最后一个逗号
if [ -n "$result" ]; then
result=${result%,}
fi
echo "$result"
local package_name=$1
# 标准desktop文件检测
while IFS= read -r path; do
[ -z "$(grep 'NoDisplay=true' "$path")" ] && {
log.info "Found valid desktop file: $path"
desktop_file_path="$path"
return 0
}
done < <(dpkg -L "$package_name" 2>/dev/null | grep -E '/usr/share/applications/.*\.desktop$|/opt/apps/.*/entries/applications/.*\.desktop$')
# 深度环境特殊处理
while IFS= read -r path; do
[ -z "$(grep 'NoDisplay=true' "$path")" ] && {
log.info "Found deepin desktop file: $path"
desktop_file_path="$path"
return 0
}
done < <(find /opt/apps/$package_name -path '*/entries/applications/*.desktop' 2>/dev/null)
return 1
}
function launch_app(){
function scan_desktop_file() {
local package_name=$1 result=""
# 标准结果收集
while IFS= read -r path; do
[ -z "$(grep 'NoDisplay=true' "$path")" ] && result+="$path,"
done < <(dpkg -L "$package_name" 2>/dev/null | grep -E '/usr/share/applications/.*\.desktop$|/opt/apps/.*/entries/applications/.*\.desktop$')
# 深度环境补充扫描
while IFS= read -r path; do
[ -z "$(grep 'NoDisplay=true' "$path")" ] && result+="$path,"
done < <(find /opt/apps/$package_name -path '*/entries/applications/*.desktop' 2>/dev/null)
echo "${result%,}"
}
# 检查是否传入了路径参数
if [ -z "$1" ]; then
log.error "请传入文件路径作为参数"
function launch_app() {
local DESKTOP_FILE_PATH="${1#file://}"
# 提取并净化Exec命令
exec_command=$(grep -m1 '^Exec=' "$DESKTOP_FILE_PATH" | cut -d= -f2- | sed 's/%.//g')
[ -z "$exec_command" ] && return 1
log.info "Launching: $exec_command"
# 图形环境启动优化
if [ -n "$DISPLAY" ]; then
nohup env DISPLAY=$DISPLAY XAUTHORITY=${XAUTHORITY:-~/.Xauthority} ${SHELL:-bash} -c "$exec_command" >/dev/null 2>&1 &
else
nohup ${SHELL:-bash} -c "$exec_command" >/dev/null 2>&1 &
fi
}
# ===== ACE环境执行器 =====
function ace_runner() {
local command_type=$1 package_name=$2
for ace_entry in "${ace_commands_order[@]}"; do
local ace_cmd=${ace_entry%%:*}
command -v "$ace_cmd" >/dev/null || continue
log.info "Checking in $ace_cmd environment..."
if output=$($ace_cmd "$0" "$command_type" "$package_name" 2>/dev/null); then
[ "$command_type" = "list" ] && echo "$output"
exit 0
fi
done
return 1
}
# ===== 主逻辑 =====
[ $# -lt 2 ] && {
log.error "Usage: $0 {check|launch|list|start} package_name/desktop_file"
exit 1
}
case $1 in
check)
# 当前环境检查
if scan_desktop_file_log "$2"; then
exit 0
else
# 非ACE环境下执行ACE环境扫描
[ -z "$IS_ACE_ENV" ] && ace_runner check "$2"
exit 1
fi
;;
DESKTOP_FILE_PATH=$1
if [[ $DESKTOP_FILE_PATH == file://* ]]; then
# 如果是,移除 'file://' 部分并输出结果
DESKTOP_FILE_PATH="${DESKTOP_FILE_PATH#file://}"
list)
# 当前环境列表
if result=$(scan_desktop_file "$2"); then
echo "$result"
exit 0
else
# 非ACE环境下执行ACE环境扫描
[ -z "$IS_ACE_ENV" ] && ace_runner list "$2"
exit 1
fi
;;
# 获取文件内容中第一个 Exec= 后的命令
exec_command=$(grep -m 1 -oP "(?<=Exec=).*" "$DESKTOP_FILE_PATH")
# 删除 exec_command 中最后的 % 及其后面的内容
exec_command="${exec_command%\%*}"
# 打印提取的命令
log.info "Command is $exec_command"
# 在默认终端执行命令
bash -c "$exec_command"
}
if [ "$#" -lt 2 ];then
log.info "Usage: $0 check/launch/list/start packagename/desktop-file"
exit -1
fi
if [ "$1" = "check" ];then
scan_desktop_file_log "$2"
if [ "$desktop_file_path" = "" ];then
log.error "No desktop file found. exit -1"
exit -1
else
exit 0
fi
elif [ "$1" = "list" ];then
scan_desktop_file "$2"
if [ "$desktop_file_path" = "" ];then
exit -1
else
exit 0
fi
elif [ "$1" = "launch" ];then
scan_desktop_file_log "$2"
if [ "$desktop_file_path" = "" ];then
log.error "No desktop file found. exit -1"
exit -1
fi
launch_app "${desktop_file_path}"
elif [ "$1" = "start" ];then
launch_app "${desktop_file_path}"
fi
launch|start)
# 当前环境启动
if scan_desktop_file_log "$2" && launch_app "$desktop_file_path"; then
exit 0
else
# 非ACE环境下通过ACE环境启动
[ -z "$IS_ACE_ENV" ] && ace_runner launch "$2"
exit 1
fi
;;
*)
log.error "Invalid command: $1"
exit 2
;;
esac

@ -1,14 +1,54 @@
#!/bin/bash
dpkg -l | grep "^ii $1 " > /dev/null
# ===== ACE环境配置 =====
declare -a ace_commands_order=(
"bookworm-run:amber-ce-bookworm"
"trixie-run:amber-ce-trixie"
"deepin23-run:amber-ce-deepin23"
)
# ===== 日志和函数 =====
[ -f /opt/durapps/spark-store/bin/bashimport/log.amber ] && \
source /opt/durapps/spark-store/bin/bashimport/log.amber || {
log.info() { echo "INFO: $*"; }
log.warn() { echo "WARN: $*"; }
log.error() { echo "ERROR: $*"; }
log.debug() { echo "DEBUG: $*"; }
}
dpkg -s "$1" > /dev/null
RET="$?"
if [[ "$RET" == "0" ]] ;then
apt autopurge $1 -y
else
if command -v bookworm-run > /dev/null;then
echo "Try ACE Bookworm"
bookworm-run apt autopurge $1 -y
for ace_entry in "${ace_commands_order[@]}"; do
ace_cmd=${ace_entry%%:*}
if command -v "$ace_cmd" >/dev/null 2>&1; then
echo "----------------------------------------"
echo "正在检查 $ace_cmd 环境的安装..."
echo "----------------------------------------"
# 在ACE环境中执行安装检测
$ace_cmd dpkg -l | grep "^ii $1 " > /dev/null
try_run_ret="$?"
fi
fi
# 最终检测结果处理
if [ "$try_run_ret" -eq 0 ]; then
echo "----------------------------------------"
echo "在 $ace_cmd 环境中找到了安装"
echo "----------------------------------------"
$ace_cmd apt autopurge $1 -y
else
echo "----------------------------------------"
echo "在 $ace_cmd 环境中未能找到安装,继续查找"
echo "----------------------------------------"
fi
fi
done
echo "----------------------------------------"
echo "所有已安装的 ACE 环境中未能找到安装,退出"
echo "----------------------------------------"
exit "$RET"
fi
exit "$RET"

@ -146,7 +146,7 @@ for PKG_UPGRADE in $PKG_UPGRADE_LIST; do
update_transhell
# 启动升级任务
(yes | pkexec ${HERE}/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y 2>&1 > /dev/null ) &
(yes n | pkexec ${HERE}/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -yfq 2>&1 > /dev/null ) &
# 计算进度百分比
progress=$(( count * 100 / total - 1))