Compare commits

...

15 Commits

Author SHA1 Message Date
shenmo7192 910216a457 convert 只输入最表层的依赖
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-10-27 06:49:31 +00:00
shenmo7192 48b06ca964 1.0.10 2025-10-27 12:55:53 +08:00
shenmo7192 1cb22d8465 修复convert无法正确写入的问题 2025-10-27 12:54:49 +08:00
shenmo7192 0d368d73d9 写错了变量名称 2025-10-27 12:45:36 +08:00
shenmo7192 f73645a024 去除debug信息 2025-10-27 12:37:36 +08:00
shenmo7192 e46affc340 1.0.10 2025-10-27 12:36:48 +08:00
shenmo7192 c5fd74b513 更改spec以和实际一致 2025-10-27 11:42:05 +08:00
shenmo7192 1c492b165d 支持依赖解析 2025-10-27 11:29:37 +08:00
shenmo7192 737e7d4979 支持多层base加载 2025-10-27 10:44:58 +08:00
shenmo7192 379cd37fac 1.0.9 2025-10-27 09:58:09 +08:00
shenmo7192 a2f0af2ca7 支持 转换时多base 2025-10-27 09:56:06 +08:00
shenmo7192 5c811840fa 支持 多层 dir base 2025-10-27 09:42:25 +08:00
shenmo7192 a615cf0b72 修改彩蛋 2025-10-27 09:26:07 +08:00
shenmo7192 8736cf13b8 update src/usr/bin/amber-pm-convert.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-10-25 17:18:11 +00:00
shenmo7192 9702df0410 修复自动刷新软件源的问题 2025-10-26 00:41:19 +08:00
5 changed files with 193 additions and 71 deletions
View File
+2 -2
View File
@@ -1,9 +1,9 @@
Package: apm
Source: amber-ce
Version: 1.0.8
Version: 1.0.10
Architecture: amd64
Maintainer: shenmo <shenmo@spark-app.store>
Installed-Size: 48716
Installed-Size: 48724
Depends: bubblewrap, flatpak, policykit-1 | pkexec | polkit-1 | polkit, systemd, procps,coreutils,fuse-overlayfs,xz-utils
Section: misc
Conflicts: ace-host-integration
+96 -30
View File
@@ -9,17 +9,18 @@ SCRIPT_NAME=$(basename "$0")
# 显示用法信息
usage() {
echo "用法: $SCRIPT_NAME --base <basename> <deb文件路径> [--pkgname <包名>] [--version <版本号>]"
echo "用法: $SCRIPT_NAME --base <basename> [--base <basename> ...] <deb文件路径> [--pkgname <包名>] [--version <版本号>]"
echo ""
echo "参数说明:"
echo " --basename 必填参数,指定基础环境名称"
echo " --basename 必填参数,指定基础环境名称,可多次使用指定多个基础环境"
echo " deb文件路径 必填参数,要转换的DEB文件路径"
echo " --pkgname 可选参数,指定新包的包名(默认使用原DEB包名)"
echo " --version 可选参数,指定新包的版本号(默认在原版本后追加'-apm'"
echo ""
echo "示例:"
echo " $SCRIPT_NAME --base amber-pm-trixie /path/to/package.deb"
echo " $SCRIPT_NAME --base amber-pm-trixie /path/to/package.deb --pkgname new-pkg --version 1.0.0"
echo " $SCRIPT_NAME --base amber-pm-bookworm-spark-wine /path/to/package.deb --pkgname new-pkg --version 1.0.0"
echo "最下层的base在最后面,从上到下写base"
}
# 检查参数数量
@@ -30,7 +31,7 @@ if [ $# -lt 3 ]; then
fi
# 解析参数
BASENAME=""
BASENAMES=() # 改为数组存储多个base
DEB_PATH=""
PKGNAME=""
VERSION=""
@@ -39,7 +40,8 @@ VERSION=""
while [ $# -gt 0 ]; do
case $1 in
--base)
BASENAME="$2"
BASENAMES+=("$2")
BASENAMES_ORIG+=("$2")
shift 2
;;
--pkgname)
@@ -64,8 +66,8 @@ while [ $# -gt 0 ]; do
done
# 检查必填参数
if [ -z "$BASENAME" ] || [ -z "$DEB_PATH" ]; then
log.error "错误:--basenameDEB文件路径 为必填参数"
if [ ${#BASENAMES[@]} -eq 0 ] || [ -z "$DEB_PATH" ]; then
log.error "错误:至少需要一个--basename参数,且DEB文件路径为必填"
usage
exit 1
fi
@@ -77,7 +79,10 @@ if [ ! -f "$DEB_PATH" ]; then
fi
log.info "开始转换DEB包: $DEB_PATH"
log.info "基础环境: $BASENAME"
log.info "基础环境数量: ${#BASENAMES[@]}"
for i in "${!BASENAMES[@]}"; do
log.info " 基础环境 $((i+1)): ${BASENAMES[$i]}"
done
# 1. 创建临时工作目录
CRAFT_DIR="$HOME/apm-craft-$$"
@@ -108,7 +113,35 @@ cleanup() {
# 设置退出时清理
trap cleanup EXIT
# 2. 检查原DEB包信息
# 递归获取info文件中的依赖
get_recursive_basenames() {
local basename="$1"
local base_dir="/var/lib/apm/apm/files/ace-env/var/lib/apm/$basename"
local info_file="$base_dir/info"
if [ -f "$info_file" ]; then
log.info "读取info文件: $info_file"
while IFS= read -r base; do
# 跳过空行
[[ -z "$base" ]] && continue
# 如果依赖的base没有被记录过,则递归添加
if [[ ! " ${BASENAMES[*]} " =~ " $base " ]]; then
BASENAMES+=("$base")
# 递归获取依赖
get_recursive_basenames "$base"
fi
done < "$info_file"
else
log.info "未找到info文件,跳过: $info_file"
fi
}
# 递归获取所有基础环境
for BASE in "${BASENAMES[@]}"; do
get_recursive_basenames "$BASE"
done
# 检查DEB文件
log.info "检查原DEB包信息..."
ORIG_PKGNAME=$(dpkg -f "$DEB_PATH" Package)
ORIG_VERSION=$(dpkg -f "$DEB_PATH" Version)
@@ -126,17 +159,38 @@ log.info "新包名: $NEW_PKGNAME"
log.info "新版本: $NEW_VERSION"
log.info "新架构: $ORIG_ARCH"
# 4. 进行融合挂载
log.info "正在进行融合挂载..."
ACE_ENV_PATH="/var/lib/apm/apm/files/ace-env/var/lib/apm/${BASENAME}/files/ace-env"
# 2. 构建lowerdir路径(多个base按顺序叠放)
log.info "构建overlay lowerdir路径..."
LOWERDIRS=()
if [ ! -d "$ACE_ENV_PATH" ]; then
log.error "错误:基础环境路径不存在: $ACE_ENV_PATH"
# 按顺序处理每个base(从第一个到最后一个,最后一个在最底层)
for BASENAME in "${BASENAMES[@]}"; do
ACE_ENV_PATH="/var/lib/apm/apm/files/ace-env/var/lib/apm/${BASENAME}/files/ace-env"
CORE_PATH="/var/lib/apm/apm/files/ace-env/var/lib/apm/${BASENAME}/files/core"
if [ -d "$ACE_ENV_PATH" ]; then
log.info "使用ace-env路径: $ACE_ENV_PATH"
LOWERDIRS+=("$ACE_ENV_PATH")
elif [ -d "$CORE_PATH" ]; then
log.info "使用core路径: $CORE_PATH"
LOWERDIRS+=("$CORE_PATH")
else
log.error "错误:基础环境路径不存在: $BASENAME"
log.error " 检查的路径: $ACE_ENV_PATH"
log.error " 检查的路径: $CORE_PATH"
exit 1
fi
done
# 将lowerdirs数组用冒号连接
LOWERDIR=$(IFS=:; echo "${LOWERDIRS[*]}")
log.debug "最终lowerdir: $LOWERDIR"
# 4. 进行融合挂载
log.info "正在进行融合挂载..."
sudo mount -t overlay overlay \
-o "lowerdir=$ACE_ENV_PATH,upperdir=$CRAFT_DIR/core/,workdir=$CRAFT_DIR/work/" \
-o "lowerdir=$LOWERDIR,upperdir=$CRAFT_DIR/core/,workdir=$CRAFT_DIR/work/" \
"$CRAFT_DIR/mergedir"
log.info "挂载完成"
@@ -158,8 +212,7 @@ fi
log.info "安装前检查通过,准备实际安装..."
# 3. 提取并修改DEB包
# 6. 提取并修改DEB包
log.info "提取并修改原DEB包..."
EXTRACT_DIR="$CRAFT_DIR/extract"
MODIFIED_DEB_DIR="$CRAFT_DIR/modified_deb"
@@ -231,8 +284,6 @@ fi
log.info "DEB包修改完成,新包路径: $MODIFIED_DEB_PATH"
# 实际安装修改后的DEB包
if ! sudo -E /var/lib/apm/apm/files/ace-run-pkg ssaudit "$MODIFIED_DEB_PATH" --native --no-create-desktop-entry; then
log.error "错误:修改后的DEB包安装失败"
@@ -242,17 +293,27 @@ fi
log.info "修改后的DEB包安装完成"
# 清理一些垃圾
sudo -E /var/lib/apm/apm/files/ace-run-pkg rm -vfr /var/lib/apt/lists
sudo -E /var/lib/apm/apm/files/ace-run-pkg aptss clean
sudo -E /var/lib/apm/apm/files/ace-run-pkg rm -vfr /var/lib/apt/lists
sudo -E /var/lib/apm/apm/files/ace-run-pkg rm -vfr /var/lib/aptss/lists
# 6. 创建新的APM包结构
# 7. 创建新的APM包结构
log.info "创建新的APM包结构..."
PKG_BUILD_DIR="$CRAFT_DIR/new-pkg"
mkdir -p "$PKG_BUILD_DIR/DEBIAN"
mkdir -p "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME"/{entries,files}
# 创建info文件
echo "$BASENAME" > "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME/info"
# 创建info文件 - 写入所有base,每行一个
log.info "创建info文件,包含输入的基础环境:"
for BASENAME in "${BASENAMES_ORIG[@]}"; do
echo "$BASENAME" >> "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME/info"
log.info " 写入: $BASENAME"
done
log.info "创建info_debug文件,包含所有基础环境:"
for BASENAME in "${BASENAMES[@]}"; do
echo "$BASENAME" >> "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME/info_debug"
log.info " 写入: $BASENAME"
done
# 创建postinst脚本
cat > "$PKG_BUILD_DIR/DEBIAN/postinst" << 'EOF'
@@ -269,7 +330,7 @@ EOF
chmod +x "$PKG_BUILD_DIR/DEBIAN/postinst"
# 7. 复制文件到新的APM包
# 8. 复制文件到新的APM包
log.info "复制文件到新的APM包..."
# 复制/usr/share/内容到entries
@@ -291,11 +352,11 @@ sudo cp -r "$CRAFT_DIR"/{core,work} "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME/fil
# 设置文件权限
sudo chmod -R 755 "$PKG_BUILD_DIR/var/lib/apm/$NEW_PKGNAME/files/"
# 8. 解除挂载
# 9. 解除挂载
log.info "解除挂载..."
cleanup_mount
# 9. 打包新的APM包
# 10. 打包新的APM包
log.info "打包新的APM包..."
calculate_directory_size() {
local dir="$1"
@@ -306,16 +367,20 @@ calculate_directory_size() {
fi
}
# 构建依赖字符串 - 包含所有base
DEPENDS_STR=$(IFS=,; echo "${BASENAMES_ORIG[*]}")
# 创建control文件
cat > "${PKG_BUILD_DIR}/DEBIAN/control" << EOF
Package: $NEW_PKGNAME
Version: $NEW_VERSION
Architecture: $ORIG_ARCH
Maintainer: APM Converter <apm@localhost>
Depends: $BASENAME
Maintainer: APM Converter <apm-convert@spark-app.store>
Depends: $DEPENDS_STR
Installed-Size: $(calculate_directory_size $PKG_BUILD_DIR)
Description: APM converted package from $DEB_PATH
Description: APM converted package from $ORIG_PKGNAME
This package was automatically converted from the original deb package.
Based on: ${BASENAMES_ORIG[*]}
EOF
# 生成输出文件名
@@ -329,5 +394,6 @@ log.info "生成的APM包: $OUTPUT_DEB"
log.info "包名: $NEW_PKGNAME"
log.info "版本: $NEW_VERSION"
log.info "架构: $ORIG_ARCH"
log.info "依赖: $BASENAME"
log.info "依赖: $DEPENDS_STR"
log.info "基础环境: ${BASENAMES[*]}"
log.info "注意:桌面文件已修改,添加了APM运行前缀和APPID"
+88 -32
View File
@@ -1,5 +1,5 @@
#!/bin/bash
VERSION=1.0.8.1
VERSION=1.0.10
# 获取脚本名称用于帮助信息
SCRIPT_NAME=$(basename "$0")
PATH_PREFIX=/var/lib/apm/apm/files/ace-env/
@@ -38,15 +38,73 @@ Commands:
EOF
}
apm_exec(){
mkdir -p /tmp/apm/${coredir}
fuse-overlayfs -o lowerdir="${PATH_PREFIX}/var/lib/apm/${basedir}/files/ace-env",upperdir="${PATH_PREFIX}/var/lib/apm/${coredir}/files/core/",workdir="${PATH_PREFIX}/var/lib/apm/${coredir}/files/work/" "/tmp/apm/${coredir}"
# 递归读取info文件并构建lowerdir
local lowerdirs=()
local current_dir="${PATH_PREFIX}/var/lib/apm/${coredir}" # 当前目录开始
local next_info_file=""
chrootEnvPath=/tmp/apm/${coredir} /var/lib/apm/apm/files/ace-run "$@"
umount /tmp/apm/${coredir}
while : ; do
# 构建info文件的路径
next_info_file="${current_dir}/info"
# echo "${current_dir}/info"
# 检查info文件是否存在
if [[ ! -f "$next_info_file" ]]; then
# log.debug "No more info files found, stopping recursion."
break
fi
# 读取info文件的每一行并构建lowerdir
while IFS= read -r basedir; do
[[ -z "$basedir" ]] && continue # 跳过空行
# 检查ace-env目录是否存在
if [[ -d "${PATH_PREFIX}/var/lib/apm/${basedir}/files/ace-env" ]]; then
lowerdirs+=("${PATH_PREFIX}/var/lib/apm/${basedir}/files/ace-env")
# 如果ace-env不存在,检查core目录
elif [[ -d "${PATH_PREFIX}/var/lib/apm/${basedir}/files/core" ]]; then
lowerdirs+=("${PATH_PREFIX}/var/lib/apm/${basedir}/files/core")
else
log.warn "Neither ace-env nor core directory found for base: $basedir"
fi
done < "$next_info_file"
# 尝试获取下一个依赖信息的路径
local next_basedir=$(tail -n 1 "$next_info_file")
if [[ -z "$next_basedir" || ! -d "${PATH_PREFIX}/var/lib/apm/${next_basedir}" ]]; then
log.debug "No further dependencies found, ending recursion."
break
fi
# 更新当前目录,递归处理下一个依赖
current_dir="${PATH_PREFIX}/var/lib/apm/${next_basedir}"
done
# 检查是否找到了有效的lowerdir
if [[ ${#lowerdirs[@]} -eq 0 ]]; then
log.error "No valid lower directories found for package: $coredir"
return 1
fi
# 将lowerdirs数组用冒号连接起来
local lowerdir=$(IFS=:; echo "${lowerdirs[*]}")
# 创建挂载点目录
mkdir -p "/tmp/apm/${coredir}"
# 使用fuse-overlayfs挂载
log.debug "Mounting with lowerdir: $lowerdir"
fuse-overlayfs -o lowerdir="$lowerdir",upperdir="${PATH_PREFIX}/var/lib/apm/${coredir}/files/core/",workdir="${PATH_PREFIX}/var/lib/apm/${coredir}/files/work/" "/tmp/apm/${coredir}"
# 执行命令
chrootEnvPath="/tmp/apm/${coredir}" /var/lib/apm/apm/files/ace-run "$@"
# 卸载
umount "/tmp/apm/${coredir}"
}
# 调试信息函数
debug_info() {
log.debug "======= APM Debug Information ======="
@@ -85,11 +143,9 @@ bronya_egg() {
| | / /__ _/ / /____ ______(_)__ / __/_ _____ / /____ __ _
| |/ / _ `/ / '_/ // / __/ / -_) _\ \/ // (_-</ __/ -_) ' \
|___/\_,_/_/_/\_\\_, /_/ /_/\__/ /___/\_, /___/\__/\__/_/_/_/
____ _ __ /___/ __ __/___/
/ _/__ (_) /_(_)__ _/ /____ ___/ /
_/ // _ \/ / __/ / _ `/ __/ -_) _ /
/___/_//_/_/\__/_/\_,_/\__/\__/\_,_/
/ / ___ ___ __/___/____/ / /___/
/ /__/ _ `/ // / _ \/ __/ _ \
/____/\_,_/\_,_/_//_/\__/_//_/
Valkyrie 系统启动 - 重装小兔,Fire!
💎 感谢 Anysets 为 AmberCE 和 AmberPM 的 Arch 架构支持提供帮助~
@@ -98,28 +154,29 @@ EOF
xmp360_egg() {
cat <<'EOF'
################################################################################
################################################################################
################################################################################
##################### ####################
####################. %###################
##########= ####################
############################ #=========*#########
############# .% .*****= :######
############################### =+ =#######* -#####
##### %: *######## :#####
######################% # ########* +#####
########: # %#####
########################## .# ######
##################* -* ######
##################= =###%: +- *###* ######
##################. # %: :* # -######
##################. % *###= % -- #### % %######
########################- ####+ ########################### .####. #########
######################### ############################% ##########
###########################=::+################################%-:-*############
################################################################################
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▒ ▓▓▓▓▓▓░ ▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒░ ▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓ ▓ ▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ▓ ░░░░░░░ ▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░ ▓ ▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▒ ▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓ ▒░ ▒▓▓▒ ░▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ░▒ ▒░ ▓ ▓ ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░░ ▓▓▓▓ ▓ ▓ ▒▓▓▓▒ ▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓░ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
哇————————————————袄 - 撞大运咯~
哇——————袄 - 撞大运咯!
💎 感谢 潇湘·秀 为 APM 的 RPM 架构支持提供帮助~
EOF
}
@@ -223,7 +280,6 @@ case "$1" in
fi
coredir=$pkg
basedir=$(cat ${PATH_PREFIX}/var/lib/apm/${coredir}/info)
# 检测是否有额外命令参数
@@ -6,7 +6,7 @@ After=apt-daily.service network.target network-online.target systemd-networkd.se
[Service]
Type=simple
RemainAfterExit=yes
ExecStart=apm clean && apm update
ExecStart=bash -c "apm clean && apm update"
Restart=on-failure
RestartSec=10