135 lines
5.1 KiB
Bash
135 lines
5.1 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
# ==============================================================================
|
||
|
|
# Script: 05-verify-desktop.sh
|
||
|
|
# Description:
|
||
|
|
# 1. 黑盒环境启发式验证 (dms / quickshell)。
|
||
|
|
# 2. 显式包发货单对账 (pacman -T)。
|
||
|
|
# 3. 用户配置文件/软链接部署完整性验证。
|
||
|
|
# 一旦任何一环发现缺失,立即中断并退出 (exit 1)。
|
||
|
|
# ==============================================================================
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
source "$SCRIPT_DIR/00-utils.sh"
|
||
|
|
|
||
|
|
VERIFY_LIST="/tmp/shorin_install_verify.list"
|
||
|
|
|
||
|
|
section "Verification" "Auditing System State"
|
||
|
|
|
||
|
|
# ==============================================================================
|
||
|
|
# 1. 特殊环境启发式验证 (仅针对 Shorin DMS 系列)
|
||
|
|
# ==============================================================================
|
||
|
|
|
||
|
|
# if [[ "$DESKTOP_ENV" == "shorindms" || "$DESKTOP_ENV" == "shorindmsgit" ]]; then
|
||
|
|
# log "Performing specialized heuristic checks for DMS blackbox..."
|
||
|
|
# DMS_ERRORS=0
|
||
|
|
|
||
|
|
# if ! command -v quickshell &>/dev/null && ! pacman -Qq | grep -q "quickshell"; then
|
||
|
|
# echo -e " \033[1;31m->\033[0m \033[1;33mquickshell (or related package)\033[0m is MISSING!"
|
||
|
|
# DMS_ERRORS=1
|
||
|
|
# fi
|
||
|
|
|
||
|
|
# if ! command -v dms &>/dev/null && ! pacman -Qq | grep -q "dms-shell"; then
|
||
|
|
# echo -e " \033[1;31m->\033[0m \033[1;33mdms-shell (or related package)\033[0m is MISSING!"
|
||
|
|
# DMS_ERRORS=1
|
||
|
|
# fi
|
||
|
|
|
||
|
|
# if [ "$DMS_ERRORS" -ne 0 ]; then
|
||
|
|
# echo ""
|
||
|
|
# error "DMS CORE VALIDATION FAILED!"
|
||
|
|
# write_log "FATAL" "DMS heuristic validation failed. quickshell or dms-shell is missing."
|
||
|
|
# echo -e " ${H_YELLOW}>>> Exiting installer. The official DMS script might have failed. ${NC}"
|
||
|
|
# exit 1
|
||
|
|
# else
|
||
|
|
# success "DMS core components verified."
|
||
|
|
# fi
|
||
|
|
# fi
|
||
|
|
|
||
|
|
# ==============================================================================
|
||
|
|
# 2. 清单统实验证 (发货单对账)
|
||
|
|
# ==============================================================================
|
||
|
|
if [ -f "$VERIFY_LIST" ]; then
|
||
|
|
mapfile -t CHECK_PKGS < <(cat "$VERIFY_LIST" | tr ' ' '\n' | sed '/^[[:space:]]*$/d' | sort -u)
|
||
|
|
|
||
|
|
if [ ${#CHECK_PKGS[@]} -gt 0 ]; then
|
||
|
|
log "Verifying ${#CHECK_PKGS[@]} explicit packages..."
|
||
|
|
MISSING_PKGS=$(pacman -T "${CHECK_PKGS[@]}" 2>/dev/null)
|
||
|
|
|
||
|
|
if [ -n "$MISSING_PKGS" ]; then
|
||
|
|
echo ""
|
||
|
|
error "SOFTWARE INSTALLATION INCOMPLETE!"
|
||
|
|
echo -e " ${DIM}The following packages failed to install:${NC}"
|
||
|
|
echo "$MISSING_PKGS" | awk '{print " \033[1;31m->\033[0m \033[1;33m" $0 "\033[0m"}'
|
||
|
|
echo ""
|
||
|
|
if declare -f write_log >/dev/null; then
|
||
|
|
write_log "FATAL" "Missing packages: $(echo "$MISSING_PKGS" | tr '\n' ' ')"
|
||
|
|
fi
|
||
|
|
error "Cannot proceed with a broken desktop environment."
|
||
|
|
echo -e " ${H_YELLOW}>>> Exiting installer. Please check your network or AUR helpers. ${NC}"
|
||
|
|
exit 1
|
||
|
|
else
|
||
|
|
success "All explicit packages successfully verified."
|
||
|
|
rm -f "$VERIFY_LIST"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ==============================================================================
|
||
|
|
# 3. 配置文件部署验证 (Dotfiles Audit)
|
||
|
|
# ==============================================================================
|
||
|
|
log "Identifying target user for config audit..."
|
||
|
|
detect_target_user
|
||
|
|
|
||
|
|
if [ -z "$TARGET_USER" ]; then
|
||
|
|
warn "Could not reliably detect user 1000. Skipping dotfiles audit."
|
||
|
|
else
|
||
|
|
HOME_DIR="/home/$TARGET_USER"
|
||
|
|
CONFIG_ERRORS=0
|
||
|
|
|
||
|
|
# KISS 的检查小函数
|
||
|
|
check_config_exists() {
|
||
|
|
local path="$1"
|
||
|
|
# -e 可以完美识别常规目录、文件,以及目标有效的软链接
|
||
|
|
if [ ! -e "$path" ]; then
|
||
|
|
echo -e " \033[1;31m->\033[0m \033[1;33m$path\033[0m is MISSING or BROKEN!"
|
||
|
|
CONFIG_ERRORS=$((CONFIG_ERRORS + 1))
|
||
|
|
else
|
||
|
|
log " [OK] $path"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
log "Auditing dotfiles for ${DESKTOP_ENV^^}..."
|
||
|
|
|
||
|
|
case "$DESKTOP_ENV" in
|
||
|
|
shorinniri)
|
||
|
|
check_config_exists "$HOME_DIR/.config/niri"
|
||
|
|
check_config_exists "$HOME_DIR/.config/waybar"
|
||
|
|
check_config_exists "$HOME_DIR/.config/matugen"
|
||
|
|
check_config_exists "$HOME_DIR/.config/waypaper"
|
||
|
|
;;
|
||
|
|
shorindms|shorindmsgit)
|
||
|
|
check_config_exists "$HOME_DIR/.config/niri/dms"
|
||
|
|
;;
|
||
|
|
hyprniri)
|
||
|
|
check_config_exists "$HOME_DIR/.config/hypr"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
log "No specific config checks mapped for $DESKTOP_ENV. Skipping."
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
if [ "$CONFIG_ERRORS" -gt 0 ]; then
|
||
|
|
echo ""
|
||
|
|
error "DOTFILES DEPLOYMENT FAILED!"
|
||
|
|
if declare -f write_log >/dev/null; then
|
||
|
|
write_log "FATAL" "Dotfiles audit failed. $CONFIG_ERRORS paths missing or broken."
|
||
|
|
fi
|
||
|
|
echo -e " ${H_YELLOW}>>> Exiting installer. The repository clone or symlink step might have failed. ${NC}"
|
||
|
|
exit 1
|
||
|
|
else
|
||
|
|
success "Configuration files and symlinks deployed correctly."
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 全部通关!
|
||
|
|
exit 0
|