From b408f513d042f378786850f884e21be7dc4b4fa5 Mon Sep 17 00:00:00 2001 From: cnst Date: Sun, 15 Sep 2024 17:54:20 +0200 Subject: [PATCH] cleanup script fix and toothpick modules fix --- .scripts/cleanup-boot.sh | 184 ++++----------- .scripts/cleanup-boot.shbak | 260 ++++++++++++++++++++++ flake.lock | 14 +- home/users/toothpick/modules.nix | 3 - system/etc/dconf/default.nix | 3 - system/etc/xserver/amd/default.nix | 17 -- system/etc/xserver/amd/hhkbse/default.nix | 18 -- system/etc/xserver/nvidia/default.nix | 7 - 8 files changed, 305 insertions(+), 201 deletions(-) create mode 100755 .scripts/cleanup-boot.shbak delete mode 100644 system/etc/dconf/default.nix delete mode 100644 system/etc/xserver/amd/default.nix delete mode 100644 system/etc/xserver/amd/hhkbse/default.nix delete mode 100644 system/etc/xserver/nvidia/default.nix diff --git a/.scripts/cleanup-boot.sh b/.scripts/cleanup-boot.sh index 3d369cb9..6a789d48 100755 --- a/.scripts/cleanup-boot.sh +++ b/.scripts/cleanup-boot.sh @@ -5,13 +5,7 @@ # Exit on any error, undefined variable, or pipeline failure set -euo pipefail -# Ensure Bash 4 or newer is being used -if ((BASH_VERSINFO[0] < 4)); then - echo "Error: This script requires Bash version 4 or higher." - exit 1 -fi - -# Default number of versions and files to keep +# Default number of kernel and initrd files to keep KEEP_KERNEL=4 KEEP_INITRD=6 @@ -30,10 +24,6 @@ usage() { echo " --keep-kernel N Keep the latest N kernel files (default: 4)." echo " --keep-initrd N Keep the latest N initrd files (default: 6)." echo " --help, -h Show this help message." - echo - echo "Examples:" - echo " ./cleanup-boot.sh --dry-run" - echo " ./cleanup-boot.sh --keep-kernel 3 --keep-initrd 5" exit 1 } @@ -97,164 +87,66 @@ log "Starting cleanup script. Keeping $KEEP_KERNEL kernel files and $KEEP_INITRD # Collect all .efi files in /boot/EFI/nixos mapfile -d '' -t efi_files < <(find /boot/EFI/nixos -type f -name '*.efi' -print0) -declare -A kernels_files_by_version -declare -A initrds_files_by_version -declare -A versions_mtime +# Initialize arrays for kernel and initrd files +kernel_files=() +initrd_files=() -# Parse filenames to group kernel and initrd files by their version number +# Parse filenames and collect kernel and initrd files based on patterns for file in "${efi_files[@]}"; do basename=$(basename "$file") - # Pattern 1: -linux--bzImage.efi (kernel) + # Pattern: -linux--bzImage.efi (kernel) if [[ "$basename" =~ ^(.*)-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-bzImage\.efi$ ]]; then - version="${BASH_REMATCH[2]}" - type="kernel" + kernel_files+=("$file") - # Pattern 1: -initrd-linux--initrd.efi (initrd) + # Pattern: -initrd-linux--initrd.efi (initrd) elif [[ "$basename" =~ ^(.*)-initrd-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-initrd\.efi$ ]]; then - version="${BASH_REMATCH[2]}" - type="initrd" + initrd_files+=("$file") - # Pattern 2: kernel--.efi (kernel) + # Pattern: kernel--.efi (kernel) elif [[ "$basename" =~ ^kernel-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then - version="${BASH_REMATCH[1]}" - type="kernel" + kernel_files+=("$file") - # Pattern 2: initrd--.efi (initrd) + # Pattern: initrd--.efi (initrd) elif [[ "$basename" =~ ^initrd-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then - version="${BASH_REMATCH[1]}" - type="initrd" + initrd_files+=("$file") else log "Warning: Unrecognized filename format: $basename" continue fi - - # Get file modification time - if ! file_mtime=$(stat -c '%Y' "$file" 2>/dev/null); then - log "Warning: Failed to get modification time for $file" - continue - fi - - # Append the file to the list of files per version and type - entry="$file_mtime|$file" - if [[ "$type" == "kernel" ]]; then - kernels_files_by_version["$version"]+="$entry"$'\n' - elif [[ "$type" == "initrd" ]]; then - initrds_files_by_version["$version"]+="$entry"$'\n' - fi - - # Update the latest modification time for the version - version_mtime="${versions_mtime["$version"]:-0}" - if [[ "$file_mtime" -gt "$version_mtime" ]]; then - versions_mtime["$version"]="$file_mtime" - fi done -# Collect all versions -all_versions=("${!versions_mtime[@]}") +# Function to process and delete old files +process_files() { + local -n files=$1 # Pass array by reference + local keep_count=$2 + local file_type=$3 -# Sort versions by their latest modification time (newest first) -mapfile -t sorted_versions < <( - for version in "${all_versions[@]}"; do - echo "${versions_mtime[$version]}:$version" - done | sort -rn -k1,1 | awk -F: '{print $2}' -) + log "Processing $file_type files..." -version_count=${#sorted_versions[@]} + if [ "${#files[@]}" -gt "$keep_count" ]; then + # Sort files by modification time and keep the latest N files + sorted_files=$(for f in "${files[@]}"; do echo "$(stat -c '%Y' "$f"):$f"; done | sort -rn -k1,1) -log "Found $version_count versions." + # Collect files to delete + mapfile -t files_to_delete < <(echo "$sorted_files" | tail -n +"$((keep_count + 1))" | cut -d: -f2) -if [ "$version_count" -eq 0 ]; then - log "No versions found." - exit 0 -fi - -# Initialize delete_files array -delete_files=() - -# Log the files identified for deletion -log "Files identified for deletion:" - -# Process initrd files -for version in "${sorted_versions[@]}"; do - initrd_files="${initrds_files_by_version["$version"]:-}" - - if [ -n "$initrd_files" ]; then - IFS='' - mapfile -t initrd_files_array <<<"$initrd_files" - unset IFS - # Sort initrd files by mtime and filename (newest first) - mapfile -t sorted_initrd_files < <(printf '%s\n' "${initrd_files_array[@]}" | sort -rn -k1,1 -k2,2) - initrd_file_count=${#sorted_initrd_files[@]} - if [ "$KEEP_INITRD" -gt 0 ] && [ "$initrd_file_count" -gt "$KEEP_INITRD" ]; then - files_to_delete=("${sorted_initrd_files[@]:$KEEP_INITRD}") - for entry in "${files_to_delete[@]}"; do - file="${entry#*|}" - delete_files+=("$file") - log "$file" - done - fi - fi -done - -# Process kernel files -for version in "${sorted_versions[@]}"; do - kernel_files="${kernels_files_by_version["$version"]:-}" - - if [ -n "$kernel_files" ]; then - IFS='' - mapfile -t kernel_files_array <<<"$kernel_files" - unset IFS - # Sort kernel files by mtime and filename (newest first) - mapfile -t sorted_kernel_files < <(printf '%s\n' "${kernel_files_array[@]}" | sort -rn -k1,1 -k2,2) - kernel_file_count=${#sorted_kernel_files[@]} - if [ "$KEEP_KERNEL" -gt 0 ] && [ "$kernel_file_count" -gt "$KEEP_KERNEL" ]; then - files_to_delete=("${sorted_kernel_files[@]:$KEEP_KERNEL}") - for entry in "${files_to_delete[@]}"; do - file="${entry#*|}" - delete_files+=("$file") - log "$file" - done - fi - fi -done - -if [ ${#delete_files[@]} -eq 0 ]; then - log "No files to delete." - exit 0 -fi - -# Confirm dry run mode -if [ "$DRY_RUN" = true ]; then - log "Dry run mode enabled. No files will be deleted." -fi - -# Remove old files -for file in "${delete_files[@]}"; do - # Skip empty entries - if [[ -z "$file" ]]; then - continue - fi - - # Resolve absolute path - resolved_file=$(realpath "$file") - - # Security check: Ensure the file is within /boot/EFI/nixos - if [[ "$resolved_file" != /boot/EFI/nixos/* ]]; then - log "Warning: Attempted to delete file outside of /boot/EFI/nixos: $resolved_file" - continue - fi - - if [ "$DRY_RUN" = false ]; then - if rm -f -- "$resolved_file"; then - log "Deleted: $resolved_file" - else - log "Failed to delete: $resolved_file" - fi + for file in "${files_to_delete[@]}"; do + log "Deleting $file" + if [ "$DRY_RUN" = false ]; then + rm -f -- "$file" + else + log "Dry run - would delete: $file" + fi + done else - log "Dry run - would delete: $resolved_file" + log "No $file_type files to delete. Current count: ${#files[@]}" fi -done +} + +# Process initrd and kernel files +process_files kernel_files "$KEEP_KERNEL" "kernel" +process_files initrd_files "$KEEP_INITRD" "initrd" log "Cleanup script completed." diff --git a/.scripts/cleanup-boot.shbak b/.scripts/cleanup-boot.shbak new file mode 100755 index 00000000..3d369cb9 --- /dev/null +++ b/.scripts/cleanup-boot.shbak @@ -0,0 +1,260 @@ +#!/usr/bin/env bash + +# Script to clean up old initrd and kernel files in /boot/EFI/nixos + +# Exit on any error, undefined variable, or pipeline failure +set -euo pipefail + +# Ensure Bash 4 or newer is being used +if ((BASH_VERSINFO[0] < 4)); then + echo "Error: This script requires Bash version 4 or higher." + exit 1 +fi + +# Default number of versions and files to keep +KEEP_KERNEL=4 +KEEP_INITRD=6 + +# Log file for cleanup actions +LOG_FILE="/var/log/cleanup-boot.log" + +# Dry run flag +DRY_RUN=false + +# Function to display usage information +usage() { + echo "Usage: $0 [--dry-run] [--keep-kernel N] [--keep-initrd N] [--help]" + echo + echo "Options:" + echo " --dry-run Perform a trial run with no changes made." + echo " --keep-kernel N Keep the latest N kernel files (default: 4)." + echo " --keep-initrd N Keep the latest N initrd files (default: 6)." + echo " --help, -h Show this help message." + echo + echo "Examples:" + echo " ./cleanup-boot.sh --dry-run" + echo " ./cleanup-boot.sh --keep-kernel 3 --keep-initrd 5" + exit 1 +} + +# Parse command-line arguments +while [[ "$#" -gt 0 ]]; do + case "$1" in + --dry-run) + DRY_RUN=true + ;; + --keep-kernel) + if [[ -n "${2:-}" && "$2" =~ ^[1-9][0-9]*$ ]]; then + KEEP_KERNEL="$2" + shift + else + echo "Error: --keep-kernel requires a positive integer." + usage + fi + ;; + --keep-initrd) + if [[ -n "${2:-}" && "$2" =~ ^[1-9][0-9]*$ ]]; then + KEEP_INITRD="$2" + shift + else + echo "Error: --keep-initrd requires a positive integer." + usage + fi + ;; + --help | -h) + usage + ;; + *) + echo "Unknown option: $1" + usage + ;; + esac + shift +done + +# Check for root privileges +if [ "$EUID" -ne 0 ]; then + echo "Error: Please run as root." + exit 1 +fi + +# Check if log file is writable +if ! touch "$LOG_FILE" &>/dev/null; then + echo "Error: Cannot write to log file $LOG_FILE" + exit 1 +fi + +# Function to log messages with timestamps +log() { + local message + message="$(date '+%Y-%m-%d %H:%M:%S') - $1" + echo "$message" | tee -a "$LOG_FILE" + logger -t cleanup-boot "$message" +} + +log "Starting cleanup script. Keeping $KEEP_KERNEL kernel files and $KEEP_INITRD initrd files." + +# Collect all .efi files in /boot/EFI/nixos +mapfile -d '' -t efi_files < <(find /boot/EFI/nixos -type f -name '*.efi' -print0) + +declare -A kernels_files_by_version +declare -A initrds_files_by_version +declare -A versions_mtime + +# Parse filenames to group kernel and initrd files by their version number +for file in "${efi_files[@]}"; do + basename=$(basename "$file") + + # Pattern 1: -linux--bzImage.efi (kernel) + if [[ "$basename" =~ ^(.*)-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-bzImage\.efi$ ]]; then + version="${BASH_REMATCH[2]}" + type="kernel" + + # Pattern 1: -initrd-linux--initrd.efi (initrd) + elif [[ "$basename" =~ ^(.*)-initrd-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-initrd\.efi$ ]]; then + version="${BASH_REMATCH[2]}" + type="initrd" + + # Pattern 2: kernel--.efi (kernel) + elif [[ "$basename" =~ ^kernel-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then + version="${BASH_REMATCH[1]}" + type="kernel" + + # Pattern 2: initrd--.efi (initrd) + elif [[ "$basename" =~ ^initrd-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then + version="${BASH_REMATCH[1]}" + type="initrd" + + else + log "Warning: Unrecognized filename format: $basename" + continue + fi + + # Get file modification time + if ! file_mtime=$(stat -c '%Y' "$file" 2>/dev/null); then + log "Warning: Failed to get modification time for $file" + continue + fi + + # Append the file to the list of files per version and type + entry="$file_mtime|$file" + if [[ "$type" == "kernel" ]]; then + kernels_files_by_version["$version"]+="$entry"$'\n' + elif [[ "$type" == "initrd" ]]; then + initrds_files_by_version["$version"]+="$entry"$'\n' + fi + + # Update the latest modification time for the version + version_mtime="${versions_mtime["$version"]:-0}" + if [[ "$file_mtime" -gt "$version_mtime" ]]; then + versions_mtime["$version"]="$file_mtime" + fi +done + +# Collect all versions +all_versions=("${!versions_mtime[@]}") + +# Sort versions by their latest modification time (newest first) +mapfile -t sorted_versions < <( + for version in "${all_versions[@]}"; do + echo "${versions_mtime[$version]}:$version" + done | sort -rn -k1,1 | awk -F: '{print $2}' +) + +version_count=${#sorted_versions[@]} + +log "Found $version_count versions." + +if [ "$version_count" -eq 0 ]; then + log "No versions found." + exit 0 +fi + +# Initialize delete_files array +delete_files=() + +# Log the files identified for deletion +log "Files identified for deletion:" + +# Process initrd files +for version in "${sorted_versions[@]}"; do + initrd_files="${initrds_files_by_version["$version"]:-}" + + if [ -n "$initrd_files" ]; then + IFS='' + mapfile -t initrd_files_array <<<"$initrd_files" + unset IFS + # Sort initrd files by mtime and filename (newest first) + mapfile -t sorted_initrd_files < <(printf '%s\n' "${initrd_files_array[@]}" | sort -rn -k1,1 -k2,2) + initrd_file_count=${#sorted_initrd_files[@]} + if [ "$KEEP_INITRD" -gt 0 ] && [ "$initrd_file_count" -gt "$KEEP_INITRD" ]; then + files_to_delete=("${sorted_initrd_files[@]:$KEEP_INITRD}") + for entry in "${files_to_delete[@]}"; do + file="${entry#*|}" + delete_files+=("$file") + log "$file" + done + fi + fi +done + +# Process kernel files +for version in "${sorted_versions[@]}"; do + kernel_files="${kernels_files_by_version["$version"]:-}" + + if [ -n "$kernel_files" ]; then + IFS='' + mapfile -t kernel_files_array <<<"$kernel_files" + unset IFS + # Sort kernel files by mtime and filename (newest first) + mapfile -t sorted_kernel_files < <(printf '%s\n' "${kernel_files_array[@]}" | sort -rn -k1,1 -k2,2) + kernel_file_count=${#sorted_kernel_files[@]} + if [ "$KEEP_KERNEL" -gt 0 ] && [ "$kernel_file_count" -gt "$KEEP_KERNEL" ]; then + files_to_delete=("${sorted_kernel_files[@]:$KEEP_KERNEL}") + for entry in "${files_to_delete[@]}"; do + file="${entry#*|}" + delete_files+=("$file") + log "$file" + done + fi + fi +done + +if [ ${#delete_files[@]} -eq 0 ]; then + log "No files to delete." + exit 0 +fi + +# Confirm dry run mode +if [ "$DRY_RUN" = true ]; then + log "Dry run mode enabled. No files will be deleted." +fi + +# Remove old files +for file in "${delete_files[@]}"; do + # Skip empty entries + if [[ -z "$file" ]]; then + continue + fi + + # Resolve absolute path + resolved_file=$(realpath "$file") + + # Security check: Ensure the file is within /boot/EFI/nixos + if [[ "$resolved_file" != /boot/EFI/nixos/* ]]; then + log "Warning: Attempted to delete file outside of /boot/EFI/nixos: $resolved_file" + continue + fi + + if [ "$DRY_RUN" = false ]; then + if rm -f -- "$resolved_file"; then + log "Deleted: $resolved_file" + else + log "Failed to delete: $resolved_file" + fi + else + log "Dry run - would delete: $resolved_file" + fi +done + +log "Cleanup script completed." diff --git a/flake.lock b/flake.lock index 29be3cb8..274b86c2 100644 --- a/flake.lock +++ b/flake.lock @@ -1502,11 +1502,11 @@ "systems": "systems_7" }, "locked": { - "lastModified": 1726403814, - "narHash": "sha256-by72+sV6Q3h2c9jjqqEQFGuOhZy8G29qF6HKDomoWWs=", + "lastModified": 1726413442, + "narHash": "sha256-vnuV8eKEO2/MgcxR1G8D3iIEa83SKlbrQpsEAKUYRpc=", "ref": "refs/heads/main", - "rev": "a8fce63c468fc4689a83c06d2f7eb8d5e8900f2f", - "revCount": 4, + "rev": "ac4002abb28571f367264b176cf13b11e7aa406a", + "revCount": 5, "type": "git", "url": "https://git.sr.ht/~canasta/runix" }, @@ -1815,11 +1815,11 @@ }, "locked": { "dir": "nix", - "lastModified": 1726359931, - "narHash": "sha256-yGcSRN6T7YgRI2k0LpcKwuJQ+QO/YvzBVeUaWtlMN3U=", + "lastModified": 1726405016, + "narHash": "sha256-U0hJ4RqzyIi8EqTTA7twkvnyXVgoKnvpIfBoIAdH0FE=", "owner": "wez", "repo": "wezterm", - "rev": "1eddc9157f51577d7984dd6aec3b780ecec1d4a0", + "rev": "09ac8c53777ac6de61b757292f5dc4da80322bbd", "type": "github" }, "original": { diff --git a/home/users/toothpick/modules.nix b/home/users/toothpick/modules.nix index 74ffda61..6997d7a7 100644 --- a/home/users/toothpick/modules.nix +++ b/home/users/toothpick/modules.nix @@ -55,9 +55,6 @@ }; }; utils = { - ags = { - enable = false; - }; anyrun = { enable = false; }; diff --git a/system/etc/dconf/default.nix b/system/etc/dconf/default.nix deleted file mode 100644 index 5424db3d..00000000 --- a/system/etc/dconf/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ - programs.dconf.enable = true; -} diff --git a/system/etc/xserver/amd/default.nix b/system/etc/xserver/amd/default.nix deleted file mode 100644 index 6c717260..00000000 --- a/system/etc/xserver/amd/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - services.xserver = { - enable = true; - videoDrivers = ["amdgpu"]; - # xkb = { - # extraLayouts.hhkbse = { - # description = "HHKBse by cnst"; - # languages = ["se"]; - # symbolsFile = /home/cnst/.nix-config/nixos/hosts/cnix/xkb/symbols/hhkbse; - # }; - # layout = "hhkbse"; - # # dir = "/home/cnst/.nix-config/nixos/xkb"; - # variant = ""; - # options = "lv3:rwin_switch"; - # }; - }; -} diff --git a/system/etc/xserver/amd/hhkbse/default.nix b/system/etc/xserver/amd/hhkbse/default.nix deleted file mode 100644 index 4d7e007c..00000000 --- a/system/etc/xserver/amd/hhkbse/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{hostConfig, ...}: let - path = "${hostConfig}/cnix/xkb/symbols"; -in { - services.xserver = { - enable = true; - videoDrivers = ["amdgpu"]; - xkb = { - extraLayouts.hhkbse = { - description = "HHKBse by cnst"; - languages = ["se"]; - symbolsFile = "${path}/hhkbse"; - }; - layout = "hhkbse"; - variant = ""; - options = "lv3:rwin_switch"; - }; - }; -} diff --git a/system/etc/xserver/nvidia/default.nix b/system/etc/xserver/nvidia/default.nix deleted file mode 100644 index cc501fe2..00000000 --- a/system/etc/xserver/nvidia/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - services.xserver = { - enable = true; - videoDrivers = ["nvidia"]; - xkb.layout = "se"; - }; -}