#!/usr/bin/env bash # 在安装 kaisa-hdmi-pipewire-fix 或其它大改前,采集「Ubuntu / 当前机」音频基线并落盘。 # 输出目录默认:audio_topology/baseline-stash/<时间戳>_/ # 用法:./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)。"