93 lines
3.6 KiB
Bash
Executable File
93 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# pack_tuku.sh — 一键出包 os.meow.picbrowser.mpk(根布局 tar.gz,可选内联签名)。
|
||
#
|
||
# 布局:mpk 内的条目直接是 app.json + picbrowser(无 <pkg>/ 前缀、无 ./ 前缀),
|
||
# 与安装端「.mpk 内容在 tar 根」的解包口径一致。
|
||
#
|
||
# 一键签名(推荐;os.meow.* 无签名设备会拒装):
|
||
# MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh
|
||
#
|
||
# 环境变量:
|
||
# MEOW_SIGN 指定 meow_sign 可执行文件;未设时依次找 PATH 里的 meow_sign、
|
||
# 再回退 $HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign。
|
||
# MEOW_SIGN_KEY 私钥路径。未设 → 警告并产出未签名包(退出码 0);
|
||
# 设了但找不到工具/密钥或签名失败 → 报错退出(不静默交付未签名包)。
|
||
# 若同目录存在 <key>.pub,签名后自动 verify。
|
||
#
|
||
# 注意:签名是往 tar.gz 尾部追加 footer。签名后的 mpk **不要**再跑 tar/gzip 类命令
|
||
# (gzip 会报 "trailing garbage ignored",属预期,不是包损坏)。因此根布局断言
|
||
# 必须在签名前用 tar -tzf 做。
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
|
||
PKG=os.meow.picbrowser
|
||
MPK="$PKG.mpk"
|
||
STAGE="build/$PKG"
|
||
|
||
[ -x picbrowser ] || ./build_tuku.sh
|
||
|
||
rm -rf "$STAGE"
|
||
mkdir -p "$STAGE"
|
||
cp app.json picbrowser "$STAGE/"
|
||
|
||
rm -f "$MPK"
|
||
tar -C "$STAGE" -czf "$MPK" app.json picbrowser
|
||
|
||
# 根布局断言(签名前):第一层有 app.json,且不带 <pkg>/ 或 ./ 前缀。
|
||
listing="$(tar -C "$STAGE" -tzf "$MPK")"
|
||
printf '%s\n' "$listing"
|
||
if ! printf '%s\n' "$listing" | grep -qx 'app.json'; then
|
||
echo "错误:$MPK 根层缺少 app.json(布局不是根布局)" >&2
|
||
exit 1
|
||
fi
|
||
if printf '%s\n' "$listing" | grep -q "^\(\./\)\?$PKG/"; then
|
||
echo "错误:$MPK 仍带 $PKG/ 前缀(嵌套布局)" >&2
|
||
exit 1
|
||
fi
|
||
|
||
find_sign_tool() {
|
||
if [ -n "${MEOW_SIGN:-}" ]; then
|
||
printf '%s\n' "$MEOW_SIGN"
|
||
elif command -v meow_sign >/dev/null 2>&1; then
|
||
command -v meow_sign
|
||
elif [ -x "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign" ]; then
|
||
printf '%s\n' "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign"
|
||
else
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
if [ -z "${MEOW_SIGN_KEY:-}" ]; then
|
||
echo "警告:未签名(未设置 MEOW_SIGN_KEY),已产出未签名包 $MPK" >&2
|
||
echo " 设 MEOW_SIGN_KEY=<私钥> 后重跑,或手动 sign;os.meow.* 未签名设备拒装。" >&2
|
||
else
|
||
if [ ! -f "$MEOW_SIGN_KEY" ]; then
|
||
echo "错误:MEOW_SIGN_KEY=$MEOW_SIGN_KEY 不存在" >&2
|
||
exit 1
|
||
fi
|
||
if ! SIGN_TOOL="$(find_sign_tool)"; then
|
||
echo "错误:找不到 meow_sign(可用 MEOW_SIGN=/path/to/meow_sign 指定);$MPK 未签名" >&2
|
||
exit 1
|
||
fi
|
||
if [ ! -x "$SIGN_TOOL" ]; then
|
||
echo "错误:$SIGN_TOOL 不可执行(可用 MEOW_SIGN 指定可执行的 meow_sign);$MPK 未签名" >&2
|
||
exit 1
|
||
fi
|
||
if ! "$SIGN_TOOL" sign "$MPK" "$MEOW_SIGN_KEY"; then
|
||
echo "错误:meow_sign sign 失败,$MPK 仍是未签名包" >&2
|
||
echo " 若提示 cannot execute / required file not found,多半是该二进制与本机不兼容,用 MEOW_SIGN 指定可执行版本。" >&2
|
||
exit 1
|
||
fi
|
||
if [ -f "$MEOW_SIGN_KEY.pub" ]; then
|
||
if ! "$SIGN_TOOL" verify "$MPK" "$MEOW_SIGN_KEY.pub"; then
|
||
echo "错误:meow_sign verify 失败,$MPK 签名无效" >&2
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "提示:未找到 $MEOW_SIGN_KEY.pub,跳过 verify"
|
||
fi
|
||
# 签名后不要再 tar -t/-z:footer 在 gzip 流外,gzip 会报 trailing garbage(预期)。
|
||
fi
|
||
|
||
ls -la "$MPK"
|