Files
chromebox_10th_audio_driver/scripts/capture-ubuntu-audio-baseline.sh
2026-04-06 21:59:41 +08:00

129 lines
4.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 在安装 kaisa-hdmi-pipewire-fix 或其它大改前采集「Ubuntu / 当前机」音频基线并落盘。
# 输出目录默认audio_topology/baseline-stash/<时间戳>_<hostname>/
# 用法:./scripts/capture-ubuntu-audio-baseline.sh [输出目录]
# 详见docs/linux-hdmi/OPERATION_PipeWire_Kaisa_HDMI.md「基线备份与恢复」
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
STAMP="$(date +%Y%m%d_%H%M%S)_$(hostname)"
if [[ -n "${1:-}" ]]; then
STASH="$(realpath "$1")"
else
STASH="${REPO_ROOT}/audio_topology/baseline-stash/${STAMP}"
fi
mkdir -p "$STASH/backup/root"
write_manifest() {
local mf="$STASH/manifest.txt"
{
echo "# capture-ubuntu-audio-baseline"
echo "created_iso: $(date -Iseconds)"
echo "hostname: $(hostname)"
echo "stash_dir: $STASH"
echo ""
echo "## uname"
uname -a
echo ""
echo "## dpkg (相关包)"
dpkg -l 2>/dev/null | grep -E '^(ii|rc)\s+(alsa-ucm-conf|wireplumber|pipewire|pipewire-pulse|kaisa-hdmi-pipewire-fix)\s' || true
echo ""
if dpkg -s kaisa-hdmi-pipewire-fix &>/dev/null; then
echo "## kaisa-hdmi-pipewire-fix: installed"
dpkg -s kaisa-hdmi-pipewire-fix 2>/dev/null | grep -E '^(Package|Version|Status):' || true
else
echo "## kaisa-hdmi-pipewire-fix: not installed"
fi
echo ""
echo "## deb 相关路径(存在性与 sha256"
} >"$mf"
local paths=(
/etc/wireplumber/wireplumber.conf.d/50-kaisa-sof-rt5682-hdmi.conf
/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
/usr/share/alsa/ucm2/GoogleKaisa/sof-rt5682/HiFi.conf
)
local p
for p in "${paths[@]}"; do
if [[ -e "$p" ]]; then
echo "PATH $p exists=yes" >>"$mf"
if [[ -f "$p" ]]; then
sha256sum "$p" >>"$mf" 2>/dev/null || echo "(sha256sum failed)" >>"$mf"
fi
else
echo "PATH $p exists=no" >>"$mf"
fi
done
echo "" >>"$mf"
echo "## /usr/share/doc/kaisa-hdmi-pipewire-fix/" >>"$mf"
if [[ -d /usr/share/doc/kaisa-hdmi-pipewire-fix ]]; then
ls -la /usr/share/doc/kaisa-hdmi-pipewire-fix >>"$mf" 2>&1 || true
else
echo "(目录不存在)" >>"$mf"
fi
}
backup_vendor_ucm() {
local src="/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
if [[ -f "$src" ]]; then
install -D -m0644 "$src" "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
echo "已备份 vendor UCM: $src -> backup/root/..."
fi
}
backup_user_wireplumber() {
local d="${HOME}/.config/wireplumber/wireplumber.conf.d"
local names=()
if [[ -d "$d" ]]; then
shopt -s nullglob
local f
for f in "$d"/*; do
[[ -e "$f" ]] || continue
local b
b="$(basename "$f")"
if [[ "$b" == *kaisa* ]] || [[ "$b" == 50-kaisa* ]]; then
names+=("$b")
fi
done
fi
if ((${#names[@]} > 0)); then
tar -C "$d" -czf "$STASH/user-wireplumber-conf.tar.gz" "${names[@]}"
echo "已打包用户 WirePlumber 片段: ${names[*]} -> user-wireplumber-conf.tar.gz"
else
echo "(未找到 ~/.config/wireplumber/... 下含 kaisa 的片段,跳过 user-wireplumber-conf.tar.gz)"
fi
}
pack_system_overlay() {
if [[ -f "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf" ]]; then
tar -C "$STASH/backup/root" -czf "$STASH/system-overlay.tar.gz" \
usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
echo "已生成 system-overlay.tar.gz可配合 restore 还原安装 deb 前的 vendor sof-rt5682.conf"
else
echo "(未备份 vendor sof-rt5682.conf不生成 system-overlay.tar.gz)"
fi
}
write_manifest
backup_vendor_ucm
backup_user_wireplumber
pack_system_overlay
TOPO="$STASH/topology.txt"
echo "正在调用 collect_linux_audio_topology.sh -> $TOPO"
bash "${REPO_ROOT}/audio_topology/collect_linux_audio_topology.sh" "$TOPO"
echo ""
echo "========== 基线已写入: $STASH =========="
echo " manifest.txt — 包状态与 deb 路径清单"
echo " topology.txt — 完整音频拓扑"
echo " system-overlay.tar.gz — 若存在vendor sof-rt5682.conf 快照"
echo " user-wireplumber-conf.tar.gz — 若存在:用户 kaisa WirePlumber 片段"
echo ""
echo "恢复至「尽量接近本次采集时」的系统文件状态:"
echo " ./scripts/restore-ubuntu-audio-baseline.sh $STASH"
echo ""
echo "若曾启用 §4.3 user systemd 自动 restore恢复基线前可先禁用该 user 单元(见 OPERATION。"