mirror of
https://gitee.com/spark-store-project/spark-store
synced 2025-09-10 21:32:20 +08:00
升级完毕ssinstall
This commit is contained in:
parent
74cc0fbce9
commit
b708b63113
577
tool/ssaudit
577
tool/ssaudit
@ -1,93 +1,166 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
# 初始化常量和全局变量
|
||||||
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
readonly SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
||||||
|
readonly SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
||||||
|
# ACE环境配置 - 修改此数组即可添加或删除支持的环境
|
||||||
|
readonly ACE_ENVIRONMENTS=(
|
||||||
|
"bookworm-run:amber-ce-bookworm"
|
||||||
|
"trixie-run:amber-ce-trixie"
|
||||||
|
"deepin23-run:amber-ce-deepin23"
|
||||||
|
"sid-run:amber-ce-sid"
|
||||||
|
)
|
||||||
|
readonly ACE_ENVIRONMENTS_FOR_AUTOINSTALL=(
|
||||||
|
"bookworm-run:amber-ce-bookworm"
|
||||||
|
"trixie-run:amber-ce-trixie"
|
||||||
|
)
|
||||||
|
# 生成ACE环境参数帮助信息
|
||||||
|
function generate_ace_help() {
|
||||||
|
local help_text=""
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
local ace_param="--${ace_entry#*:}"
|
||||||
|
help_text+=" $ace_param 使用${ace_entry%%:*} ACE容器安装\n"
|
||||||
|
done
|
||||||
|
echo -e "$help_text"
|
||||||
|
}
|
||||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||||
|
# 脚本工作变量
|
||||||
|
DELETE_AFTER_INSTALL="0"
|
||||||
|
DEBPATH=""
|
||||||
|
FORCE_ACE_ENV=""
|
||||||
|
FORCE_NATIVE="0"
|
||||||
|
NO_CREATE_DESKTOP="0"
|
||||||
|
FORCE_CREATE_DESKTOP="0"
|
||||||
|
|
||||||
|
# 加载翻译和调试
|
||||||
load_transhell_debug
|
load_transhell_debug
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
# 根据架构设置仓库URL
|
||||||
trap 'unlock_file $DEBPATH' EXIT
|
|
||||||
case $(arch) in
|
case $(arch) in
|
||||||
x86_64)
|
x86_64) STORE_URL="store" ;;
|
||||||
STORE_URL="store"
|
aarch64) STORE_URL="aarch64-store" ;;
|
||||||
;;
|
loongarch64) STORE_URL="loong64-store" ;;
|
||||||
aarch64)
|
|
||||||
STORE_URL="aarch64-store"
|
|
||||||
;;
|
|
||||||
loongarch64)
|
|
||||||
STORE_URL="loong64-store"
|
|
||||||
STORE_LIST_URL="-loong64"
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
# 帮助函数
|
||||||
echo "Spark Store Audit script. 星火商店审核脚本"
|
function show_help() {
|
||||||
|
echo "Spark Store Audit script. 星火商店审核脚本"
|
||||||
function pkexec_as_current_user() {
|
echo "用法: $0 [选项] <deb路径>"
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
echo "选项:"
|
||||||
local uid=$(id -u "$user")
|
echo " -h, --help 显示帮助信息"
|
||||||
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus pkexec "$@"
|
echo " --delete-after-install 安装成功后删除软件包"
|
||||||
|
echo " --no-create-desktop-entry 不创建桌面快捷方式"
|
||||||
|
echo " --force-create-desktop-entry 强制创建桌面快捷方式"
|
||||||
|
echo "$(generate_ace_help)"
|
||||||
|
echo " --native 只在主机安装,不使用ACE容器"
|
||||||
}
|
}
|
||||||
function create_desktop_file() {
|
# 参数解析
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
function parse_args() {
|
||||||
if [ -e $(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
|
while [ $# -gt 0 ]; do
|
||||||
echo "It is configured that do not create desktop file. Give up"
|
case "$1" in
|
||||||
else
|
-h|--help)
|
||||||
exec_create_desktop_file
|
show_help
|
||||||
fi
|
exit 0
|
||||||
}
|
;;
|
||||||
function exec_create_desktop_file() {
|
--delete-after-install)
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
DELETE_AFTER_INSTALL="1"
|
||||||
for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
|
shift
|
||||||
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
|
;;
|
||||||
echo $desktop_file_path is checked and will be installed to desktop
|
--native)
|
||||||
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
|
FORCE_NATIVE="1"
|
||||||
fi
|
shift
|
||||||
|
;;
|
||||||
|
--no-create-desktop-entry)
|
||||||
|
NO_CREATE_DESKTOP="1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--force-create-desktop-entry)
|
||||||
|
FORCE_CREATE_DESKTOP="1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# 检查是否为ACE环境参数
|
||||||
|
local is_ace_param=0
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
local ace_param="--${ace_entry#*:}"
|
||||||
|
if [ "$1" = "$ace_param" ]; then
|
||||||
|
FORCE_ACE_ENV="${ace_entry%%:*}"
|
||||||
|
is_ace_param=1
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 如果不是ACE参数,则视为DEB路径
|
||||||
|
if [ "$is_ace_param" -eq 0 ]; then
|
||||||
|
DEBPATH="$1"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done
|
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
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 验证当前用户
|
||||||
function zenity() {
|
function validate_user() {
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
if [ "$(id -u)" != "0" ]; then
|
||||||
local uid=$(id -u "$user")
|
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
||||||
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus zenity "$@"
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 验证文件存在或尝试下载
|
||||||
|
function validate_or_download_file() {
|
||||||
|
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/')
|
||||||
|
VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/')
|
||||||
|
pushd "${FILEPATH}" >/dev/null || exit 1
|
||||||
|
aptss download "${PACKAGE_NAME}"
|
||||||
|
popd >/dev/null || exit 1
|
||||||
|
|
||||||
|
if [ ! -f "$1" ]; then
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 哈希校验
|
||||||
function hash_check() {
|
function hash_check() {
|
||||||
|
local PACKAGES_DATA_PATH=""
|
||||||
|
|
||||||
|
# 检查可能的仓库位置
|
||||||
|
if [ -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ]; then
|
||||||
|
PACKAGES_DATA_PATH="/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages"
|
||||||
|
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"
|
||||||
|
else
|
||||||
|
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
|
||||||
|
fi
|
||||||
|
|
||||||
IS_SHA512SUM_CHECKED=skipped
|
echo "正在运行包验证..."
|
||||||
|
echo "Running Spark Package Verify..."
|
||||||
|
|
||||||
|
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
|
||||||
|
unset IS_SHA512SUM_CHECKED
|
||||||
|
IS_SHA512SUM_CHECKED=$(grep -F "$DEB_SHA512SUM" "$PACKAGES_DATA_PATH")
|
||||||
}
|
}
|
||||||
|
|
||||||
function lock_file(){
|
# 确保aptss存在
|
||||||
chattr +i "$1"
|
function ensure_aptss_exist() {
|
||||||
}
|
|
||||||
|
|
||||||
function unlock_file(){
|
|
||||||
chattr -i "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensure_aptss_exist(){
|
|
||||||
|
|
||||||
if command -v aptss &>/dev/null; then
|
if command -v aptss &>/dev/null; then
|
||||||
aptss update
|
aptss update
|
||||||
else
|
else
|
||||||
local deb_file="/tmp/spark-store-console-in-container_latest_all.deb"
|
local deb_file="/tmp/spark-store-console-in-container_latest_all.deb"
|
||||||
|
|
||||||
# Download package
|
|
||||||
if ! wget -O "$deb_file" "https://amber-ce-resource.spark-app.store/store/depends/spark-store-console-in-container_latest_all.deb"; then
|
if ! wget -O "$deb_file" "https://amber-ce-resource.spark-app.store/store/depends/spark-store-console-in-container_latest_all.deb"; then
|
||||||
echo "下载 .deb 安装包失败" >&2
|
echo "下载 .deb 安装包失败" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install package
|
|
||||||
if ! apt install -y "$deb_file"; then
|
if ! apt install -y "$deb_file"; then
|
||||||
echo "安装 .deb 包失败" >&2
|
echo "安装 .deb 包失败" >&2
|
||||||
rm -f "$deb_file"
|
rm -f "$deb_file"
|
||||||
@ -95,7 +168,6 @@ function ensure_aptss_exist(){
|
|||||||
fi
|
fi
|
||||||
rm -f "$deb_file"
|
rm -f "$deb_file"
|
||||||
|
|
||||||
# Verify installation
|
|
||||||
if ! command -v aptss &>/dev/null; then
|
if ! command -v aptss &>/dev/null; then
|
||||||
echo "成功安装但未找到 aptss 命令" >&2
|
echo "成功安装但未找到 aptss 命令" >&2
|
||||||
return 1
|
return 1
|
||||||
@ -103,152 +175,265 @@ function ensure_aptss_exist(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
export -f ensure_aptss_exist
|
export -f ensure_aptss_exist
|
||||||
####################################
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
# 确保ACE环境存在
|
||||||
echo "没有接收到参数,退出"
|
function ensure_ace_env() {
|
||||||
echo "用法:$0 deb路径"
|
local ace_env_pkg="${1}"
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit
|
if ! dpkg -l "$ace_env_pkg" &>/dev/null; then
|
||||||
fi
|
echo "ACE环境$ace_env_pkg未安装,正在尝试安装..."
|
||||||
|
zenity --info --text="首次使用$ace_env_pkg环境,重启或注销桌面后才能在启动器中展示,不影响应用启动。安装将在后台继续。" --title="ACE环境安装" &
|
||||||
|
if ! aptss install -y "$ace_env_pkg"; then
|
||||||
|
echo "安装$ace_env_pkg失败"
|
||||||
if [ "$(id -u)" != "0" ]; then
|
return 1
|
||||||
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
fi
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$1" ]; then
|
|
||||||
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST},Trying to redownload"
|
|
||||||
FILEPATH=$(dirname "$1")
|
|
||||||
FILENAME=$(basename "$1")
|
|
||||||
PACKAGE_NAME=$(echo "$FILENAME" | sed -r 's/^([^_]+)_.*$/\1/')
|
|
||||||
VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/')
|
|
||||||
pushd ${FILEPATH}
|
|
||||||
aptss download ${PACKAGE_NAME}
|
|
||||||
popd
|
|
||||||
if [ ! -f "$1" ]; then
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
DEBPATH=$(realpath "$1")
|
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
export user=$(who | awk '{print $1}' | head -n 1)
|
||||||
|
# 在桌面创建快捷方式
|
||||||
|
function create_desktop_file() {
|
||||||
|
# 如果明确要求不要创建或明确要创建,则跳过配置文件检查
|
||||||
|
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
||||||
|
echo "根据参数要求,跳过创建桌面快捷方式"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 0 ]; then
|
||||||
|
if [ -e "$(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop" ]; then
|
||||||
|
echo "根据配置要求,跳过创建桌面快捷方式"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec_create_desktop_file
|
||||||
|
}
|
||||||
|
export CURRENT_USER_DIR_DESKTOP=$(sudo -u "$user" xdg-user-dir DESKTOP)
|
||||||
|
function exec_create_desktop_file() {
|
||||||
|
local desktop_files=()
|
||||||
|
|
||||||
|
# 收集所有桌面文件
|
||||||
|
desktop_files+=($(dpkg -L "$package_name" | grep '/usr/share/applications/.*\.desktop$'))
|
||||||
|
desktop_files+=($(dpkg -L "$package_name" | grep '/opt/apps/'"$package_name"'/entries/applications/.*\.desktop$'))
|
||||||
|
|
||||||
|
for desktop_file_path in "${desktop_files[@]}"; do
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || [ -z "$(grep 'NoDisplay=true' "$desktop_file_path")" ]; 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" "${CURRENT_USER_DIR_DESKTOP}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
export -f exec_create_desktop_file
|
||||||
|
|
||||||
|
# 在ACE环境中创建桌面快捷方式
|
||||||
|
function create_desktop_in_ace() {
|
||||||
|
local ace_cmd="$1"
|
||||||
|
local package_name="$2"
|
||||||
|
|
||||||
|
# 如果明确要求不要创建,则直接返回
|
||||||
|
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
||||||
|
echo "根据参数要求,跳过在ACE中创建桌面快捷方式"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果是强制创建,或者没有配置禁止创建
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! $ace_cmd "[ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]"; then
|
||||||
|
echo "在ACE环境中创建桌面快捷方式..."
|
||||||
|
export -f exec_create_desktop_file
|
||||||
|
export package_name
|
||||||
|
export FORCE_CREATE_DESKTOP
|
||||||
|
$ace_cmd "exec_create_desktop_file"
|
||||||
else
|
else
|
||||||
DEBPATH=$(realpath "$1")
|
echo "根据ACE环境中的配置,跳过创建桌面快捷方式"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
lock_file "$DEBPATH"
|
# 在指定ACE环境中安装
|
||||||
|
function install_in_ace_env() {
|
||||||
|
local ace_cmd="$1"
|
||||||
|
local deb_path="$2"
|
||||||
|
local ace_env_pkg="${3#*:}"
|
||||||
|
|
||||||
|
if ! ensure_ace_env "$ace_env_pkg"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "----------------------------------------"
|
||||||
|
echo "正在尝试使用 $ace_cmd 环境安装..."
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# 在ACE环境中执行安装
|
||||||
|
if ! $ace_cmd "ensure_aptss_exist && { dpkg -i '$deb_path' || aptss install '$deb_path' -yfq; }"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
hash_check "$DEBPATH"
|
# 在主机安装
|
||||||
|
function install_in_host() {
|
||||||
|
local deb_path="$1"
|
||||||
|
|
||||||
|
dpkg -i "$deb_path" || aptss install "$deb_path" -yfq
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
# 自动尝试在各种环境中安装
|
||||||
|
function auto_try_install() {
|
||||||
if [ ! -z "$IS_SHA512SUM_CHECKED" ]; then
|
local deb_path="$1"
|
||||||
echo "校验跳过,开始安装"
|
|
||||||
echo "----------------------------------------------------------------------------------"
|
# 首先尝试在主机安装
|
||||||
package_name=$(dpkg-deb -f "$DEBPATH" Package)
|
if install_in_host "$deb_path"; then
|
||||||
echo "Package name is $package_name"
|
return 0
|
||||||
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
|
fi
|
||||||
try_run_ret="$?"
|
|
||||||
# 安装失败后进行 aptss 刷新,随后尝试在主机安装
|
# 如果主机安装失败且不在强制本地模式,尝试ACE环境
|
||||||
if [ "$try_run_ret" -ne 0 ]; then
|
if [ "$FORCE_NATIVE" -eq 0 ]; then
|
||||||
aptss update
|
for ace_entry in "${ACE_ENVIRONMENTS_FOR_AUTOINSTALL[@]}"; do
|
||||||
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
|
local ace_cmd=${ace_entry%%:*}
|
||||||
try_run_ret="$?"
|
local ace_env_pkg=${ace_entry#*:}
|
||||||
fi
|
|
||||||
|
# 确保ACE环境存在
|
||||||
if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
|
if ensure_ace_env "$ace_env_pkg"; then
|
||||||
if [[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中
|
if install_in_ace_env "$ace_cmd" "$deb_path" "$ace_env_pkg"; then
|
||||||
# 定义按顺序尝试的ACE环境(命令:推荐安装包)
|
# 在ACE环境中创建桌面快捷方式
|
||||||
declare -a ace_commands_order=(
|
create_desktop_in_ace "$ace_cmd" "$package_name"
|
||||||
"bookworm-run:amber-ce-bookworm"
|
return 0
|
||||||
"trixie-run:amber-ce-trixie"
|
|
||||||
"deepin23-run:amber-ce-deepin23"
|
|
||||||
)
|
|
||||||
|
|
||||||
success=false
|
|
||||||
recommendation_msg=""
|
|
||||||
# 收集所有推荐信息
|
|
||||||
for ace_entry in "${ace_commands_order[@]}"; do
|
|
||||||
recommendation_msg+="您可安装 ${ace_entry%%:*} 兼容环境后重试: ${ace_entry#*:}\n"
|
|
||||||
done
|
|
||||||
|
|
||||||
# 按顺序尝试每个ACE环境
|
|
||||||
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 ensure_aptss_exist
|
|
||||||
try_run_output=$($ace_cmd aptss install --dry-run "$DEBPATH" 2>&1)
|
|
||||||
try_run_ret="$?"
|
|
||||||
|
|
||||||
# 如果首次检测失败则更新后重试
|
|
||||||
if [ "$try_run_ret" -ne 0 ]; then
|
|
||||||
$ace_cmd aptss update
|
|
||||||
try_run_output=$($ace_cmd aptss install --dry-run "$DEBPATH" 2>&1)
|
|
||||||
try_run_ret="$?"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 最终检测结果处理
|
|
||||||
if [ "$try_run_ret" -eq 0 ]; then
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "在 $ace_cmd 环境中预检成功,开始安装..."
|
|
||||||
echo "----------------------------------------"
|
|
||||||
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq'
|
|
||||||
success=true
|
|
||||||
break # 跳出循环
|
|
||||||
else
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "在 $ace_cmd 环境中安装预检失败,错误信息:"
|
|
||||||
echo -e "${try_run_output}"
|
|
||||||
echo "----------------------------------------"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
if ! $success; then
|
# 清理安装后的文件
|
||||||
echo "OMG-IT-GOES-WRONG"
|
function post_install_cleanup() {
|
||||||
echo -e "${try_run_output}"
|
local success=$1
|
||||||
echo -e "所有ACE环境尝试失败,推荐安装以下任一兼容环境:\n${recommendation_msg}"
|
local deb_path="$2"
|
||||||
exit "$try_run_ret"
|
local package_name="$3"
|
||||||
|
|
||||||
|
if [ "$success" -eq 0 ] && [ "$DELETE_AFTER_INSTALL" -eq "1" ]; then
|
||||||
|
# 检查是否安装在主机
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ] || [ -n "$FORCE_ACE_ENV" ]; then
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ]; then
|
||||||
|
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
||||||
|
echo "软件包已在主机安装:$package_name"
|
||||||
|
create_desktop_file
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
else
|
||||||
|
echo "软件包未在主机安装:$package_name"
|
||||||
|
echo "安装异常!抛出错误"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# ACE环境中安装的情况,不检查主机dpkg数据库
|
||||||
|
echo "软件包已在ACE环境安装:$package_name"
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# 自动模式下,如果ACE安装成功也会走到这里
|
||||||
|
echo "软件包已安装:$package_name"
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ] && ! dpkg -s "$package_name" >/dev/null 2>&1; then
|
||||||
|
echo "软件包未在主机安装:$package_name"
|
||||||
|
echo "安装异常!抛出错误"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
elif [ -n "$FORCE_ACE_ENV" ] && ! command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
||||||
|
echo "指定的ACE环境不可用"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
else # 已经在ACE环境中仍失败直接退出
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
echo -e "${try_run_output}"
|
|
||||||
exit "$try_run_ret"
|
|
||||||
fi
|
fi
|
||||||
else ## 如果主机安装检测成功
|
}
|
||||||
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq
|
|
||||||
fi
|
|
||||||
|
|
||||||
### 退出阶段保持不变 ###
|
# 文件锁定/解锁函数
|
||||||
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ]; then
|
function lock_file() {
|
||||||
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
chattr +i "$1"
|
||||||
echo "软件包已安装:$package_name"
|
}
|
||||||
create_desktop_file
|
|
||||||
unlock_file $DEBPATH
|
function unlock_file() {
|
||||||
rm "$DEBPATH"
|
chattr -i "$1"
|
||||||
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
}
|
||||||
else
|
|
||||||
echo "软件包未安装:$package_name"
|
# 主安装流程
|
||||||
echo "安装异常!抛出错误"
|
function main_install() {
|
||||||
|
parse_args "$@"
|
||||||
|
|
||||||
|
if [ -z "$DEBPATH" ]; then
|
||||||
|
echo "没有接收到参数,退出"
|
||||||
|
show_help
|
||||||
echo "OMG-IT-GOES-WRONG"
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
|
# 设置退出时的文件解锁
|
||||||
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
trap 'unlock_file $DEBPATH' EXIT
|
||||||
echo "软件包已安装:$package_name"
|
validate_user
|
||||||
create_desktop_file
|
validate_or_download_file "$DEBPATH"
|
||||||
|
|
||||||
|
DEBPATH=$(realpath "$DEBPATH")
|
||||||
|
lock_file "$DEBPATH"
|
||||||
|
|
||||||
|
# hash_check "$DEBPATH"
|
||||||
|
#
|
||||||
|
# if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
||||||
|
# echo "尝试更新仓库信息重新校验"
|
||||||
|
# aptss ssupdate
|
||||||
|
# hash_check "$DEBPATH"
|
||||||
|
# if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
||||||
|
# echo -e "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
||||||
|
# zenity --info --icon-name=spark-store --height 270 --width 500 --text "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
||||||
|
# echo "OMG-IT-GOES-WRONG"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
# fi
|
||||||
|
|
||||||
|
package_name=$(dpkg-deb -f "$DEBPATH" Package)
|
||||||
|
local install_success=1
|
||||||
|
|
||||||
|
if [ -n "$FORCE_ACE_ENV" ]; then
|
||||||
|
# 查找对应的ACE环境包名
|
||||||
|
local ace_env_pkg=""
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
if [ "${ace_entry%%:*}" = "$FORCE_ACE_ENV" ]; then
|
||||||
|
ace_env_pkg="${ace_entry#*:}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 强制使用指定的ACE环境安装
|
||||||
|
if command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
||||||
|
install_in_ace_env "$FORCE_ACE_ENV" "$DEBPATH" "$ace_env_pkg"
|
||||||
|
install_success=$?
|
||||||
|
if [ "$install_success" -eq 0 ]; then
|
||||||
|
create_desktop_in_ace "$FORCE_ACE_ENV" "$package_name"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "指定的ACE环境 $FORCE_ACE_ENV 不可用"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "软件包未安装:$package_name"
|
# 自动选择安装方式
|
||||||
echo "安装异常!抛出错误"
|
auto_try_install "$DEBPATH"
|
||||||
echo "OMG-IT-GOES-WRONG"
|
install_success=$?
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
fi
|
post_install_cleanup "$install_success" "$DEBPATH" "$package_name"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行主函数
|
||||||
|
main_install "$@"
|
||||||
|
607
tool/ssinstall
607
tool/ssinstall
@ -1,105 +1,144 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
# 初始化常量和全局变量
|
||||||
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
readonly SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
||||||
|
readonly SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
||||||
|
# ACE环境配置 - 修改此数组即可添加或删除支持的环境
|
||||||
|
readonly ACE_ENVIRONMENTS=(
|
||||||
|
"bookworm-run:amber-ce-bookworm"
|
||||||
|
"trixie-run:amber-ce-trixie"
|
||||||
|
"deepin23-run:amber-ce-deepin23"
|
||||||
|
"sid-run:amber-ce-sid"
|
||||||
|
)
|
||||||
|
readonly ACE_ENVIRONMENTS_FOR_AUTOINSTALL=(
|
||||||
|
"bookworm-run:amber-ce-bookworm"
|
||||||
|
"trixie-run:amber-ce-trixie"
|
||||||
|
)
|
||||||
|
# 生成ACE环境参数帮助信息
|
||||||
|
function generate_ace_help() {
|
||||||
|
local help_text=""
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
local ace_param="--${ace_entry#*:}"
|
||||||
|
help_text+=" $ace_param 使用${ace_entry%%:*} ACE容器安装\n"
|
||||||
|
done
|
||||||
|
echo -e "$help_text"
|
||||||
|
}
|
||||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||||
|
# 脚本工作变量
|
||||||
|
DELETE_AFTER_INSTALL="0"
|
||||||
|
DEBPATH=""
|
||||||
|
FORCE_ACE_ENV=""
|
||||||
|
FORCE_NATIVE="0"
|
||||||
|
NO_CREATE_DESKTOP="0"
|
||||||
|
FORCE_CREATE_DESKTOP="0"
|
||||||
|
|
||||||
|
# 加载翻译和调试
|
||||||
load_transhell_debug
|
load_transhell_debug
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
# 根据架构设置仓库URL
|
||||||
trap 'unlock_file $DEBPATH' EXIT
|
|
||||||
case $(arch) in
|
case $(arch) in
|
||||||
x86_64)
|
x86_64) STORE_URL="store" ;;
|
||||||
STORE_URL="store"
|
aarch64) STORE_URL="aarch64-store" ;;
|
||||||
;;
|
loongarch64) STORE_URL="loong64-store" ;;
|
||||||
aarch64)
|
|
||||||
STORE_URL="aarch64-store"
|
|
||||||
;;
|
|
||||||
loongarch64)
|
|
||||||
STORE_URL="loong64-store"
|
|
||||||
STORE_LIST_URL="-loong64"
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
# 帮助函数
|
||||||
echo "Spark Store Install script. 星火商店安装脚本"
|
function show_help() {
|
||||||
parse_args() {
|
echo "Spark Store Install script. 星火商店安装脚本"
|
||||||
|
echo "用法: $0 [选项] <deb路径>"
|
||||||
|
echo "选项:"
|
||||||
|
echo " -h, --help 显示帮助信息"
|
||||||
|
echo " --delete-after-install 安装成功后删除软件包"
|
||||||
|
echo " --no-create-desktop-entry 不创建桌面快捷方式"
|
||||||
|
echo " --force-create-desktop-entry 强制创建桌面快捷方式"
|
||||||
|
echo "$(generate_ace_help)"
|
||||||
|
echo " --native 只在主机安装,不使用ACE容器"
|
||||||
|
}
|
||||||
|
# 参数解析
|
||||||
|
function parse_args() {
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-h | --help)
|
-h|--help)
|
||||||
help
|
show_help
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
--delete-after-install)
|
--delete-after-install)
|
||||||
DELETE_AFTER_INSTALL="1"
|
DELETE_AFTER_INSTALL="1"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
*)
|
--native)
|
||||||
DEBPATH="$1"
|
FORCE_NATIVE="1"
|
||||||
;;
|
shift
|
||||||
|
;;
|
||||||
|
--no-create-desktop-entry)
|
||||||
|
NO_CREATE_DESKTOP="1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--force-create-desktop-entry)
|
||||||
|
FORCE_CREATE_DESKTOP="1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# 检查是否为ACE环境参数
|
||||||
|
local is_ace_param=0
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
local ace_param="--${ace_entry#*:}"
|
||||||
|
if [ "$1" = "$ace_param" ]; then
|
||||||
|
FORCE_ACE_ENV="${ace_entry%%:*}"
|
||||||
|
is_ace_param=1
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 如果不是ACE参数,则视为DEB路径
|
||||||
|
if [ "$is_ace_param" -eq 0 ]; then
|
||||||
|
DEBPATH="$1"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
shift
|
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_args "$@"
|
# 验证当前用户
|
||||||
|
function validate_user() {
|
||||||
# 包含自动识别安装需求和用户交互业务代码
|
if [ "$(id -u)" != "0" ]; then
|
||||||
|
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
||||||
function pkexec_as_current_user() {
|
echo "OMG-IT-GOES-WRONG"
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
exit 1
|
||||||
local uid=$(id -u "$user")
|
|
||||||
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus pkexec "$@"
|
|
||||||
}
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function zenity() {
|
|
||||||
local user=$(who | awk '{print $1}' | head -n 1)
|
|
||||||
local uid=$(id -u "$user")
|
|
||||||
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus zenity "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
function hash_check() {
|
|
||||||
if [ ! -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${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
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 验证文件存在或尝试下载
|
||||||
|
function validate_or_download_file() {
|
||||||
|
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/')
|
||||||
|
VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/')
|
||||||
|
pushd "${FILEPATH}" >/dev/null || exit 1
|
||||||
|
aptss download "${PACKAGE_NAME}"
|
||||||
|
popd >/dev/null || exit 1
|
||||||
|
|
||||||
|
if [ ! -f "$1" ]; then
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 哈希校验
|
||||||
|
function hash_check() {
|
||||||
|
local PACKAGES_DATA_PATH=""
|
||||||
|
|
||||||
|
# 检查可能的仓库位置
|
||||||
if [ -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ]; then
|
if [ -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ]; then
|
||||||
PACKAGES_DATA_PATH="/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages"
|
PACKAGES_DATA_PATH="/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages"
|
||||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是星火域名仓库配置"
|
|
||||||
elif [ -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ]; then
|
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"
|
PACKAGES_DATA_PATH="/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages"
|
||||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是d域名单目录仓库配置"
|
|
||||||
else
|
else
|
||||||
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
|
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
|
||||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是SDU镜像仓库配置"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "正在运行包验证..."
|
echo "正在运行包验证..."
|
||||||
@ -107,31 +146,21 @@ function hash_check() {
|
|||||||
|
|
||||||
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
|
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
|
||||||
unset IS_SHA512SUM_CHECKED
|
unset IS_SHA512SUM_CHECKED
|
||||||
IS_SHA512SUM_CHECKED=$(cat "$PACKAGES_DATA_PATH" | grep "$DEB_SHA512SUM")
|
IS_SHA512SUM_CHECKED=$(grep -F "$DEB_SHA512SUM" "$PACKAGES_DATA_PATH")
|
||||||
}
|
}
|
||||||
|
|
||||||
function lock_file(){
|
# 确保aptss存在
|
||||||
chattr +i "$1"
|
function ensure_aptss_exist() {
|
||||||
}
|
|
||||||
|
|
||||||
function unlock_file(){
|
|
||||||
chattr -i "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensure_aptss_exist(){
|
|
||||||
|
|
||||||
if command -v aptss &>/dev/null; then
|
if command -v aptss &>/dev/null; then
|
||||||
aptss update
|
aptss update
|
||||||
else
|
else
|
||||||
local deb_file="/tmp/spark-store-console-in-container_latest_all.deb"
|
local deb_file="/tmp/spark-store-console-in-container_latest_all.deb"
|
||||||
|
|
||||||
# Download package
|
|
||||||
if ! wget -O "$deb_file" "https://amber-ce-resource.spark-app.store/store/depends/spark-store-console-in-container_latest_all.deb"; then
|
if ! wget -O "$deb_file" "https://amber-ce-resource.spark-app.store/store/depends/spark-store-console-in-container_latest_all.deb"; then
|
||||||
echo "下载 .deb 安装包失败" >&2
|
echo "下载 .deb 安装包失败" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install package
|
|
||||||
if ! apt install -y "$deb_file"; then
|
if ! apt install -y "$deb_file"; then
|
||||||
echo "安装 .deb 包失败" >&2
|
echo "安装 .deb 包失败" >&2
|
||||||
rm -f "$deb_file"
|
rm -f "$deb_file"
|
||||||
@ -139,7 +168,6 @@ function ensure_aptss_exist(){
|
|||||||
fi
|
fi
|
||||||
rm -f "$deb_file"
|
rm -f "$deb_file"
|
||||||
|
|
||||||
# Verify installation
|
|
||||||
if ! command -v aptss &>/dev/null; then
|
if ! command -v aptss &>/dev/null; then
|
||||||
echo "成功安装但未找到 aptss 命令" >&2
|
echo "成功安装但未找到 aptss 命令" >&2
|
||||||
return 1
|
return 1
|
||||||
@ -147,164 +175,265 @@ function ensure_aptss_exist(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
export -f ensure_aptss_exist
|
export -f ensure_aptss_exist
|
||||||
####################################
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
# 确保ACE环境存在
|
||||||
echo "没有接收到参数,退出"
|
function ensure_ace_env() {
|
||||||
echo "用法:$0 deb路径"
|
local ace_env_pkg="${1}"
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit
|
if ! dpkg -l "$ace_env_pkg" &>/dev/null; then
|
||||||
fi
|
echo "ACE环境$ace_env_pkg未安装,正在尝试安装..."
|
||||||
|
zenity --info --text="首次使用$ace_env_pkg环境,重启或注销桌面后才能在启动器中展示,不影响应用启动。安装将在后台继续。" --title="ACE环境安装" &
|
||||||
|
if ! aptss install -y "$ace_env_pkg"; then
|
||||||
|
echo "安装$ace_env_pkg失败"
|
||||||
|
return 1
|
||||||
if [ "$(id -u)" != "0" ]; then
|
fi
|
||||||
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
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/')
|
|
||||||
VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/')
|
|
||||||
pushd ${FILEPATH}
|
|
||||||
aptss download ${PACKAGE_NAME}
|
|
||||||
popd
|
|
||||||
if [ ! -f "$1" ]; then
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
DEBPATH=$(realpath "$1")
|
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
export user=$(who | awk '{print $1}' | head -n 1)
|
||||||
|
# 在桌面创建快捷方式
|
||||||
|
function create_desktop_file() {
|
||||||
|
# 如果明确要求不要创建或明确要创建,则跳过配置文件检查
|
||||||
|
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
||||||
|
echo "根据参数要求,跳过创建桌面快捷方式"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 0 ]; then
|
||||||
|
if [ -e "$(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop" ]; then
|
||||||
|
echo "根据配置要求,跳过创建桌面快捷方式"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec_create_desktop_file
|
||||||
|
}
|
||||||
|
export CURRENT_USER_DIR_DESKTOP=$(sudo -u "$user" xdg-user-dir DESKTOP)
|
||||||
|
function exec_create_desktop_file() {
|
||||||
|
local desktop_files=()
|
||||||
|
|
||||||
|
# 收集所有桌面文件
|
||||||
|
desktop_files+=($(dpkg -L "$package_name" | grep '/usr/share/applications/.*\.desktop$'))
|
||||||
|
desktop_files+=($(dpkg -L "$package_name" | grep '/opt/apps/'"$package_name"'/entries/applications/.*\.desktop$'))
|
||||||
|
|
||||||
|
for desktop_file_path in "${desktop_files[@]}"; do
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || [ -z "$(grep 'NoDisplay=true' "$desktop_file_path")" ]; 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" "${CURRENT_USER_DIR_DESKTOP}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
export -f exec_create_desktop_file
|
||||||
|
|
||||||
|
# 在ACE环境中创建桌面快捷方式
|
||||||
|
function create_desktop_in_ace() {
|
||||||
|
local ace_cmd="$1"
|
||||||
|
local package_name="$2"
|
||||||
|
|
||||||
|
# 如果明确要求不要创建,则直接返回
|
||||||
|
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
||||||
|
echo "根据参数要求,跳过在ACE中创建桌面快捷方式"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果是强制创建,或者没有配置禁止创建
|
||||||
|
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! $ace_cmd "[ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]"; then
|
||||||
|
echo "在ACE环境中创建桌面快捷方式..."
|
||||||
|
export -f exec_create_desktop_file
|
||||||
|
export package_name
|
||||||
|
export FORCE_CREATE_DESKTOP
|
||||||
|
$ace_cmd "exec_create_desktop_file"
|
||||||
else
|
else
|
||||||
DEBPATH=$(realpath "$1")
|
echo "根据ACE环境中的配置,跳过创建桌面快捷方式"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
lock_file "$DEBPATH"
|
# 在指定ACE环境中安装
|
||||||
|
function install_in_ace_env() {
|
||||||
|
local ace_cmd="$1"
|
||||||
|
local deb_path="$2"
|
||||||
|
local ace_env_pkg="${3#*:}"
|
||||||
|
|
||||||
|
if ! ensure_ace_env "$ace_env_pkg"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "----------------------------------------"
|
||||||
|
echo "正在尝试使用 $ace_cmd 环境安装..."
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# 在ACE环境中执行安装
|
||||||
|
if ! $ace_cmd "ensure_aptss_exist && { dpkg -i '$deb_path' || aptss install '$deb_path' -yfq; }"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
hash_check "$DEBPATH"
|
# 在主机安装
|
||||||
|
function install_in_host() {
|
||||||
|
local deb_path="$1"
|
||||||
|
|
||||||
|
dpkg -i "$deb_path" || aptss install "$deb_path" -yfq
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
# 自动尝试在各种环境中安装
|
||||||
echo "尝试更新仓库信息重新校验"
|
function auto_try_install() {
|
||||||
aptss ssupdate
|
local deb_path="$1"
|
||||||
hash_check "$DEBPATH"
|
|
||||||
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
# 首先尝试在主机安装
|
||||||
echo -e "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
if install_in_host "$deb_path"; then
|
||||||
zenity --info --icon-name=spark-store --height 270 --width 500 --text "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
return 0
|
||||||
echo "OMG-IT-GOES-WRONG"
|
fi
|
||||||
exit 1
|
|
||||||
fi
|
# 如果主机安装失败且不在强制本地模式,尝试ACE环境
|
||||||
fi
|
if [ "$FORCE_NATIVE" -eq 0 ]; then
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS_FOR_AUTOINSTALL[@]}"; do
|
||||||
if [ ! -z "$IS_SHA512SUM_CHECKED" ]; then
|
local ace_cmd=${ace_entry%%:*}
|
||||||
echo "校验成功,开始安装"
|
local ace_env_pkg=${ace_entry#*:}
|
||||||
echo "----------------------------------------------------------------------------------"
|
|
||||||
package_name=$(dpkg-deb -f "$DEBPATH" Package)
|
# 确保ACE环境存在
|
||||||
echo "Package name is $package_name"
|
if ensure_ace_env "$ace_env_pkg"; then
|
||||||
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
|
if install_in_ace_env "$ace_cmd" "$deb_path" "$ace_env_pkg"; then
|
||||||
try_run_ret="$?"
|
# 在ACE环境中创建桌面快捷方式
|
||||||
# 安装失败后进行 aptss 刷新,随后尝试在主机安装
|
create_desktop_in_ace "$ace_cmd" "$package_name"
|
||||||
if [ "$try_run_ret" -ne 0 ]; then
|
return 0
|
||||||
aptss update
|
|
||||||
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
|
|
||||||
try_run_ret="$?"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$try_run_ret" -ne 0 ]; then ## 若安装检测仍然失败
|
|
||||||
if [[ "$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"
|
|
||||||
)
|
|
||||||
|
|
||||||
success=false
|
|
||||||
recommendation_msg=""
|
|
||||||
# 收集所有推荐信息
|
|
||||||
for ace_entry in "${ace_commands_order[@]}"; do
|
|
||||||
recommendation_msg+="您可安装 ${ace_entry%%:*} 兼容环境后重试: ${ace_entry#*:}\n"
|
|
||||||
done
|
|
||||||
|
|
||||||
# 按顺序尝试每个ACE环境
|
|
||||||
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 ensure_aptss_exist
|
|
||||||
try_run_output=$($ace_cmd aptss install --dry-run "$DEBPATH" 2>&1)
|
|
||||||
try_run_ret="$?"
|
|
||||||
|
|
||||||
# 如果首次检测失败则更新后重试
|
|
||||||
if [ "$try_run_ret" -ne 0 ]; then
|
|
||||||
$ace_cmd aptss update
|
|
||||||
try_run_output=$($ace_cmd aptss install --dry-run "$DEBPATH" 2>&1)
|
|
||||||
try_run_ret="$?"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 最终检测结果处理
|
|
||||||
if [ "$try_run_ret" -eq 0 ]; then
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "在 $ace_cmd 环境中预检成功,开始安装..."
|
|
||||||
echo "----------------------------------------"
|
|
||||||
$ace_cmd 'dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq'
|
|
||||||
success=true
|
|
||||||
break # 跳出循环
|
|
||||||
else
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "在 $ace_cmd 环境中安装预检失败,错误信息:"
|
|
||||||
echo -e "${try_run_output}"
|
|
||||||
echo "----------------------------------------"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
if ! $success; then
|
# 清理安装后的文件
|
||||||
echo "OMG-IT-GOES-WRONG"
|
function post_install_cleanup() {
|
||||||
echo -e "${try_run_output}"
|
local success=$1
|
||||||
echo -e "所有ACE环境尝试失败,推荐安装以下任一兼容环境:\n${recommendation_msg}"
|
local deb_path="$2"
|
||||||
exit "$try_run_ret"
|
local package_name="$3"
|
||||||
|
|
||||||
|
if [ "$success" -eq 0 ] && [ "$DELETE_AFTER_INSTALL" -eq "1" ]; then
|
||||||
|
# 检查是否安装在主机
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ] || [ -n "$FORCE_ACE_ENV" ]; then
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ]; then
|
||||||
|
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
||||||
|
echo "软件包已在主机安装:$package_name"
|
||||||
|
create_desktop_file
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
else
|
||||||
|
echo "软件包未在主机安装:$package_name"
|
||||||
|
echo "安装异常!抛出错误"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# ACE环境中安装的情况,不检查主机dpkg数据库
|
||||||
|
echo "软件包已在ACE环境安装:$package_name"
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# 自动模式下,如果ACE安装成功也会走到这里
|
||||||
|
echo "软件包已安装:$package_name"
|
||||||
|
unlock_file "$deb_path"
|
||||||
|
rm "$deb_path"
|
||||||
|
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
|
||||||
|
if [ "$FORCE_NATIVE" -eq 1 ] && ! dpkg -s "$package_name" >/dev/null 2>&1; then
|
||||||
|
echo "软件包未在主机安装:$package_name"
|
||||||
|
echo "安装异常!抛出错误"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
elif [ -n "$FORCE_ACE_ENV" ] && ! command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
||||||
|
echo "指定的ACE环境不可用"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
else # 已经在ACE环境中仍失败直接退出
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
echo -e "${try_run_output}"
|
|
||||||
exit "$try_run_ret"
|
|
||||||
fi
|
fi
|
||||||
else ## 如果主机安装检测成功
|
}
|
||||||
dpkg -i "$DEBPATH" || aptss install "$DEBPATH" -yfq
|
|
||||||
fi
|
|
||||||
|
|
||||||
### 退出阶段保持不变 ###
|
# 文件锁定/解锁函数
|
||||||
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ]; then
|
function lock_file() {
|
||||||
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
chattr +i "$1"
|
||||||
echo "软件包已安装:$package_name"
|
}
|
||||||
create_desktop_file
|
|
||||||
unlock_file $DEBPATH
|
function unlock_file() {
|
||||||
rm "$DEBPATH"
|
chattr -i "$1"
|
||||||
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
}
|
||||||
else
|
|
||||||
echo "软件包未安装:$package_name"
|
# 主安装流程
|
||||||
echo "安装异常!抛出错误"
|
function main_install() {
|
||||||
|
parse_args "$@"
|
||||||
|
|
||||||
|
if [ -z "$DEBPATH" ]; then
|
||||||
|
echo "没有接收到参数,退出"
|
||||||
|
show_help
|
||||||
echo "OMG-IT-GOES-WRONG"
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
|
# 设置退出时的文件解锁
|
||||||
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
trap 'unlock_file $DEBPATH' EXIT
|
||||||
echo "软件包已安装:$package_name"
|
validate_user
|
||||||
create_desktop_file
|
validate_or_download_file "$DEBPATH"
|
||||||
|
|
||||||
|
DEBPATH=$(realpath "$DEBPATH")
|
||||||
|
lock_file "$DEBPATH"
|
||||||
|
|
||||||
|
hash_check "$DEBPATH"
|
||||||
|
|
||||||
|
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
||||||
|
echo "尝试更新仓库信息重新校验"
|
||||||
|
aptss ssupdate
|
||||||
|
hash_check "$DEBPATH"
|
||||||
|
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
||||||
|
echo -e "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
||||||
|
zenity --info --icon-name=spark-store --height 270 --width 500 --text "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
package_name=$(dpkg-deb -f "$DEBPATH" Package)
|
||||||
|
local install_success=1
|
||||||
|
|
||||||
|
if [ -n "$FORCE_ACE_ENV" ]; then
|
||||||
|
# 查找对应的ACE环境包名
|
||||||
|
local ace_env_pkg=""
|
||||||
|
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
||||||
|
if [ "${ace_entry%%:*}" = "$FORCE_ACE_ENV" ]; then
|
||||||
|
ace_env_pkg="${ace_entry#*:}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 强制使用指定的ACE环境安装
|
||||||
|
if command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
||||||
|
install_in_ace_env "$FORCE_ACE_ENV" "$DEBPATH" "$ace_env_pkg"
|
||||||
|
install_success=$?
|
||||||
|
if [ "$install_success" -eq 0 ]; then
|
||||||
|
create_desktop_in_ace "$FORCE_ACE_ENV" "$package_name"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "指定的ACE环境 $FORCE_ACE_ENV 不可用"
|
||||||
|
echo "OMG-IT-GOES-WRONG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "软件包未安装:$package_name"
|
# 自动选择安装方式
|
||||||
echo "安装异常!抛出错误"
|
auto_try_install "$DEBPATH"
|
||||||
echo "OMG-IT-GOES-WRONG"
|
install_success=$?
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
fi
|
post_install_cleanup "$install_success" "$DEBPATH" "$package_name"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行主函数
|
||||||
|
main_install "$@"
|
||||||
|
@ -1,432 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 初始化常量和全局变量
|
|
||||||
readonly SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
|
||||||
readonly SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
|
||||||
# ACE环境配置 - 修改此数组即可添加或删除支持的环境
|
|
||||||
readonly ACE_ENVIRONMENTS=(
|
|
||||||
"bookworm-run:amber-ce-bookworm"
|
|
||||||
"trixie-run:amber-ce-trixie"
|
|
||||||
"deepin23-run:amber-ce-deepin23"
|
|
||||||
)
|
|
||||||
# 生成ACE环境参数帮助信息
|
|
||||||
function generate_ace_help() {
|
|
||||||
local help_text=""
|
|
||||||
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
|
||||||
local ace_param="--${ace_entry#*:}"
|
|
||||||
help_text+=" $ace_param 使用${ace_entry%%:*} ACE容器安装\n"
|
|
||||||
done
|
|
||||||
echo -e "$help_text"
|
|
||||||
}
|
|
||||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
|
||||||
# 脚本工作变量
|
|
||||||
DELETE_AFTER_INSTALL="0"
|
|
||||||
DEBPATH=""
|
|
||||||
FORCE_ACE_ENV=""
|
|
||||||
FORCE_NATIVE="0"
|
|
||||||
NO_CREATE_DESKTOP="0"
|
|
||||||
FORCE_CREATE_DESKTOP="0"
|
|
||||||
|
|
||||||
# 加载翻译和调试
|
|
||||||
load_transhell_debug
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
# 根据架构设置仓库URL
|
|
||||||
case $(arch) in
|
|
||||||
x86_64) STORE_URL="store" ;;
|
|
||||||
aarch64) STORE_URL="aarch64-store" ;;
|
|
||||||
loongarch64) STORE_URL="loong64-store" ;;
|
|
||||||
esac
|
|
||||||
# 帮助函数
|
|
||||||
function show_help() {
|
|
||||||
echo "Spark Store Install script. 星火商店安装脚本"
|
|
||||||
echo "用法: $0 [选项] <deb路径>"
|
|
||||||
echo "选项:"
|
|
||||||
echo " -h, --help 显示帮助信息"
|
|
||||||
echo " --delete-after-install 安装成功后删除软件包"
|
|
||||||
echo " --no-create-desktop-entry 不创建桌面快捷方式"
|
|
||||||
echo " --force-create-desktop-entry 强制创建桌面快捷方式"
|
|
||||||
echo "$(generate_ace_help)"
|
|
||||||
echo " --native 只在主机安装,不使用ACE容器"
|
|
||||||
}
|
|
||||||
# 参数解析
|
|
||||||
function parse_args() {
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
case "$1" in
|
|
||||||
-h|--help)
|
|
||||||
show_help
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--delete-after-install)
|
|
||||||
DELETE_AFTER_INSTALL="1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--native)
|
|
||||||
FORCE_NATIVE="1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--no-create-desktop-entry)
|
|
||||||
NO_CREATE_DESKTOP="1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--force-create-desktop-entry)
|
|
||||||
FORCE_CREATE_DESKTOP="1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# 检查是否为ACE环境参数
|
|
||||||
local is_ace_param=0
|
|
||||||
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
|
||||||
local ace_param="--${ace_entry#*:}"
|
|
||||||
if [ "$1" = "$ace_param" ]; then
|
|
||||||
FORCE_ACE_ENV="${ace_entry%%:*}"
|
|
||||||
is_ace_param=1
|
|
||||||
shift
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# 如果不是ACE参数,则视为DEB路径
|
|
||||||
if [ "$is_ace_param" -eq 0 ]; then
|
|
||||||
DEBPATH="$1"
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# 验证当前用户
|
|
||||||
function validate_user() {
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
|
||||||
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 验证文件存在或尝试下载
|
|
||||||
function validate_or_download_file() {
|
|
||||||
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/')
|
|
||||||
VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/')
|
|
||||||
pushd "${FILEPATH}" >/dev/null || exit 1
|
|
||||||
aptss download "${PACKAGE_NAME}"
|
|
||||||
popd >/dev/null || exit 1
|
|
||||||
|
|
||||||
if [ ! -f "$1" ]; then
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 哈希校验
|
|
||||||
function hash_check() {
|
|
||||||
local PACKAGES_DATA_PATH=""
|
|
||||||
|
|
||||||
# 检查可能的仓库位置
|
|
||||||
if [ -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ]; then
|
|
||||||
PACKAGES_DATA_PATH="/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages"
|
|
||||||
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"
|
|
||||||
else
|
|
||||||
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "正在运行包验证..."
|
|
||||||
echo "Running Spark Package Verify..."
|
|
||||||
|
|
||||||
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
|
|
||||||
unset IS_SHA512SUM_CHECKED
|
|
||||||
IS_SHA512SUM_CHECKED=$(grep -F "$DEB_SHA512SUM" "$PACKAGES_DATA_PATH")
|
|
||||||
}
|
|
||||||
|
|
||||||
# 确保aptss存在
|
|
||||||
function ensure_aptss_exist() {
|
|
||||||
if command -v aptss &>/dev/null; then
|
|
||||||
aptss update
|
|
||||||
else
|
|
||||||
local deb_file="/tmp/spark-store-console-in-container_latest_all.deb"
|
|
||||||
|
|
||||||
if ! wget -O "$deb_file" "https://amber-ce-resource.spark-app.store/store/depends/spark-store-console-in-container_latest_all.deb"; then
|
|
||||||
echo "下载 .deb 安装包失败" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! apt install -y "$deb_file"; then
|
|
||||||
echo "安装 .deb 包失败" >&2
|
|
||||||
rm -f "$deb_file"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
rm -f "$deb_file"
|
|
||||||
|
|
||||||
if ! command -v aptss &>/dev/null; then
|
|
||||||
echo "成功安装但未找到 aptss 命令" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f ensure_aptss_exist
|
|
||||||
|
|
||||||
# 确保ACE环境存在
|
|
||||||
function ensure_ace_env() {
|
|
||||||
local ace_env_pkg="${1}"
|
|
||||||
|
|
||||||
if ! dpkg -l "$ace_env_pkg" &>/dev/null; then
|
|
||||||
echo "ACE环境$ace_env_pkg未安装,正在尝试安装..."
|
|
||||||
zenity --info --text="首次使用$ace_env_pkg环境,重启或注销桌面后才能在启动器中展示,不影响应用启动。安装将在后台继续。" --title="ACE环境安装" &
|
|
||||||
if ! aptss install -y "$ace_env_pkg"; then
|
|
||||||
echo "安装$ace_env_pkg失败"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
export user=$(who | awk '{print $1}' | head -n 1)
|
|
||||||
# 在桌面创建快捷方式
|
|
||||||
function create_desktop_file() {
|
|
||||||
# 如果明确要求不要创建或明确要创建,则跳过配置文件检查
|
|
||||||
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
|
||||||
echo "根据参数要求,跳过创建桌面快捷方式"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$FORCE_CREATE_DESKTOP" -eq 0 ]; then
|
|
||||||
if [ -e "$(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop" ]; then
|
|
||||||
echo "根据配置要求,跳过创建桌面快捷方式"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec_create_desktop_file
|
|
||||||
}
|
|
||||||
export CURRENT_USER_DIR_DESKTOP=$(sudo -u "$user" xdg-user-dir DESKTOP)
|
|
||||||
function exec_create_desktop_file() {
|
|
||||||
local desktop_files=()
|
|
||||||
|
|
||||||
# 收集所有桌面文件
|
|
||||||
desktop_files+=($(dpkg -L "$package_name" | grep '/usr/share/applications/.*\.desktop$'))
|
|
||||||
desktop_files+=($(dpkg -L "$package_name" | grep '/opt/apps/'"$package_name"'/entries/applications/.*\.desktop$'))
|
|
||||||
|
|
||||||
for desktop_file_path in "${desktop_files[@]}"; do
|
|
||||||
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || [ -z "$(grep 'NoDisplay=true' "$desktop_file_path")" ]; 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" "${CURRENT_USER_DIR_DESKTOP}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
export -f exec_create_desktop_file
|
|
||||||
|
|
||||||
# 在ACE环境中创建桌面快捷方式
|
|
||||||
function create_desktop_in_ace() {
|
|
||||||
local ace_cmd="$1"
|
|
||||||
local package_name="$2"
|
|
||||||
|
|
||||||
# 如果明确要求不要创建,则直接返回
|
|
||||||
if [ "$NO_CREATE_DESKTOP" -eq 1 ]; then
|
|
||||||
echo "根据参数要求,跳过在ACE中创建桌面快捷方式"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 如果是强制创建,或者没有配置禁止创建
|
|
||||||
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! $ace_cmd "[ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]"; then
|
|
||||||
echo "在ACE环境中创建桌面快捷方式..."
|
|
||||||
export -f exec_create_desktop_file
|
|
||||||
export package_name
|
|
||||||
export FORCE_CREATE_DESKTOP
|
|
||||||
$ace_cmd "exec_create_desktop_file"
|
|
||||||
else
|
|
||||||
echo "根据ACE环境中的配置,跳过创建桌面快捷方式"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 在指定ACE环境中安装
|
|
||||||
function install_in_ace_env() {
|
|
||||||
local ace_cmd="$1"
|
|
||||||
local deb_path="$2"
|
|
||||||
local ace_env_pkg="${3#*:}"
|
|
||||||
|
|
||||||
if ! ensure_ace_env "$ace_env_pkg"; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "正在尝试使用 $ace_cmd 环境安装..."
|
|
||||||
echo "----------------------------------------"
|
|
||||||
|
|
||||||
# 在ACE环境中执行安装
|
|
||||||
if ! $ace_cmd "ensure_aptss_exist && { dpkg -i '$deb_path' || aptss install '$deb_path' -yfq; }"; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# 在主机安装
|
|
||||||
function install_in_host() {
|
|
||||||
local deb_path="$1"
|
|
||||||
|
|
||||||
dpkg -i "$deb_path" || aptss install "$deb_path" -yfq
|
|
||||||
return $?
|
|
||||||
}
|
|
||||||
|
|
||||||
# 自动尝试在各种环境中安装
|
|
||||||
function auto_try_install() {
|
|
||||||
local deb_path="$1"
|
|
||||||
|
|
||||||
# 首先尝试在主机安装
|
|
||||||
if install_in_host "$deb_path"; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 如果主机安装失败且不在强制本地模式,尝试ACE环境
|
|
||||||
if [ "$FORCE_NATIVE" -eq 0 ]; then
|
|
||||||
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
|
||||||
local ace_cmd=${ace_entry%%:*}
|
|
||||||
|
|
||||||
if command -v "$ace_cmd" >/dev/null 2>&1; then
|
|
||||||
if install_in_ace_env "$ace_cmd" "$deb_path" "$ace_entry"; then
|
|
||||||
# 在ACE环境中创建桌面快捷方式
|
|
||||||
create_desktop_in_ace "$ace_cmd" "$package_name"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# 清理安装后的文件
|
|
||||||
function post_install_cleanup() {
|
|
||||||
local success=$1
|
|
||||||
local deb_path="$2"
|
|
||||||
local package_name="$3"
|
|
||||||
|
|
||||||
if [ "$success" -eq 0 ] && [ "$DELETE_AFTER_INSTALL" -eq "1" ]; then
|
|
||||||
# 检查是否安装在主机
|
|
||||||
if [ "$FORCE_NATIVE" -eq 1 ] || [ -n "$FORCE_ACE_ENV" ]; then
|
|
||||||
if [ "$FORCE_NATIVE" -eq 1 ]; then
|
|
||||||
if dpkg -s "$package_name" >/dev/null 2>&1; then
|
|
||||||
echo "软件包已在主机安装:$package_name"
|
|
||||||
create_desktop_file
|
|
||||||
unlock_file "$deb_path"
|
|
||||||
rm "$deb_path"
|
|
||||||
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
|
||||||
else
|
|
||||||
echo "软件包未在主机安装:$package_name"
|
|
||||||
echo "安装异常!抛出错误"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# ACE环境中安装的情况,不检查主机dpkg数据库
|
|
||||||
echo "软件包已在ACE环境安装:$package_name"
|
|
||||||
unlock_file "$deb_path"
|
|
||||||
rm "$deb_path"
|
|
||||||
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# 自动模式下,如果ACE安装成功也会走到这里
|
|
||||||
echo "软件包已安装:$package_name"
|
|
||||||
unlock_file "$deb_path"
|
|
||||||
rm "$deb_path"
|
|
||||||
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
|
|
||||||
if [ "$FORCE_NATIVE" -eq 1 ] && ! dpkg -s "$package_name" >/dev/null 2>&1; then
|
|
||||||
echo "软件包未在主机安装:$package_name"
|
|
||||||
echo "安装异常!抛出错误"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
elif [ -n "$FORCE_ACE_ENV" ] && ! command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
|
||||||
echo "指定的ACE环境不可用"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 文件锁定/解锁函数
|
|
||||||
function lock_file() {
|
|
||||||
chattr +i "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function unlock_file() {
|
|
||||||
chattr -i "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 主安装流程
|
|
||||||
function main_install() {
|
|
||||||
parse_args "$@"
|
|
||||||
|
|
||||||
if [ -z "$DEBPATH" ]; then
|
|
||||||
echo "没有接收到参数,退出"
|
|
||||||
show_help
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 设置退出时的文件解锁
|
|
||||||
trap 'unlock_file $DEBPATH' EXIT
|
|
||||||
validate_user
|
|
||||||
validate_or_download_file "$DEBPATH"
|
|
||||||
|
|
||||||
DEBPATH=$(realpath "$DEBPATH")
|
|
||||||
lock_file "$DEBPATH"
|
|
||||||
|
|
||||||
hash_check "$DEBPATH"
|
|
||||||
|
|
||||||
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
|
||||||
echo "尝试更新仓库信息重新校验"
|
|
||||||
aptss ssupdate
|
|
||||||
hash_check "$DEBPATH"
|
|
||||||
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
|
|
||||||
echo -e "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
|
||||||
zenity --info --icon-name=spark-store --height 270 --width 500 --text "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
package_name=$(dpkg-deb -f "$DEBPATH" Package)
|
|
||||||
local install_success=1
|
|
||||||
|
|
||||||
if [ -n "$FORCE_ACE_ENV" ]; then
|
|
||||||
# 查找对应的ACE环境包名
|
|
||||||
local ace_env_pkg=""
|
|
||||||
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
|
|
||||||
if [ "${ace_entry%%:*}" = "$FORCE_ACE_ENV" ]; then
|
|
||||||
ace_env_pkg="${ace_entry#*:}"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# 强制使用指定的ACE环境安装
|
|
||||||
if command -v "$FORCE_ACE_ENV" >/dev/null 2>&1; then
|
|
||||||
install_in_ace_env "$FORCE_ACE_ENV" "$DEBPATH" "$ace_env_pkg"
|
|
||||||
install_success=$?
|
|
||||||
if [ "$install_success" -eq 0 ]; then
|
|
||||||
create_desktop_in_ace "$FORCE_ACE_ENV" "$package_name"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "指定的ACE环境 $FORCE_ACE_ENV 不可用"
|
|
||||||
echo "OMG-IT-GOES-WRONG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# 自动选择安装方式
|
|
||||||
auto_try_install "$DEBPATH"
|
|
||||||
install_success=$?
|
|
||||||
fi
|
|
||||||
|
|
||||||
post_install_cleanup "$install_success" "$DEBPATH" "$package_name"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 执行主函数
|
|
||||||
main_install "$@"
|
|
Loading…
x
Reference in New Issue
Block a user