#!/bin/bash # ============================================================================== # 03c-snapshot-before-desktop.sh # Creates a system snapshot before installing major Desktop Environments. # ============================================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 1. 引用工具库 if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then source "$SCRIPT_DIR/00-utils.sh" else echo "Error: 00-utils.sh not found." exit 1 fi # 2. 权限检查 check_root section "Phase 3c" "System Snapshot" # ============================================================================== create_checkpoint() { local MARKER="Before Desktop Environments" # 0. 检查 snapper 是否安装 if ! command -v snapper &>/dev/null; then warn "Snapper tool not found. Skipping snapshot creation." return fi # 1. Root 分区快照 # 检查 root 配置是否存在 if snapper -c root get-config &>/dev/null; then # 检查是否已存在同名快照 (避免重复创建) if snapper -c root list --columns description | grep -Fqx "$MARKER"; then log "Snapshot '$MARKER' already exists on [root]." else log "Creating safety checkpoint on [root]..." # 使用 --type single 表示这是一个独立的存档点 snapper -c root create --description "$MARKER" success "Root snapshot created." fi else warn "Snapper 'root' config not configured. Skipping root snapshot." fi # 2. Home 分区快照 (如果存在 home 配置) if snapper -c home get-config &>/dev/null; then if snapper -c home list --columns description | grep -Fqx "$MARKER"; then log "Snapshot '$MARKER' already exists on [home]." else log "Creating safety checkpoint on [home]..." snapper -c home create --description "$MARKER" success "Home snapshot created." fi fi } # ============================================================================== # 执行 # ============================================================================== # --- Identify User & DM Check --- log "Identifying target user..." detect_target_user if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then error "Target user invalid or home directory does not exist." exit 1 fi log "Preparing to create restore point..." create_checkpoint HYRPLAND_AUTOSTART="$HOME_DIR/.config/systemd/user/hyprland-autostart.service" NIRI_AUTOSTART="$HOME_DIR/.config/systemd/user/niri-autostart.service" if [ -f "$HYPRLAND_AUTOSTART" ]; then log "Removing existing Hyprland autostart service..." rm -f "$HYPRLAND_AUTOSTART" fi if [ -f "$NIRI_AUTOSTART" ]; then log "Removing existing Niri autostart service..." rm -f "$NIRI_AUTOSTART" fi log "Module 03c completed."