129 lines
4.2 KiB
Bash
Executable File
129 lines
4.2 KiB
Bash
Executable File
#!/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)。"
|