87 lines
2.8 KiB
Bash
87 lines
2.8 KiB
Bash
|
|
#!/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."
|