cleanup script fix and toothpick modules fix

This commit is contained in:
cnst
2024-09-15 17:54:20 +02:00
parent ef91994c62
commit b408f513d0
8 changed files with 305 additions and 201 deletions

View File

@@ -5,13 +5,7 @@
# Exit on any error, undefined variable, or pipeline failure # Exit on any error, undefined variable, or pipeline failure
set -euo pipefail set -euo pipefail
# Ensure Bash 4 or newer is being used # Default number of kernel and initrd files to keep
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_KERNEL=4
KEEP_INITRD=6 KEEP_INITRD=6
@@ -30,10 +24,6 @@ usage() {
echo " --keep-kernel N Keep the latest N kernel files (default: 4)." 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 " --keep-initrd N Keep the latest N initrd files (default: 6)."
echo " --help, -h Show this help message." 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 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 # Collect all .efi files in /boot/EFI/nixos
mapfile -d '' -t efi_files < <(find /boot/EFI/nixos -type f -name '*.efi' -print0) mapfile -d '' -t efi_files < <(find /boot/EFI/nixos -type f -name '*.efi' -print0)
declare -A kernels_files_by_version # Initialize arrays for kernel and initrd files
declare -A initrds_files_by_version kernel_files=()
declare -A versions_mtime 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 for file in "${efi_files[@]}"; do
basename=$(basename "$file") basename=$(basename "$file")
# Pattern 1: <hash>-linux-<version>-bzImage.efi (kernel) # Pattern: <hash>-linux-<version>-bzImage.efi (kernel)
if [[ "$basename" =~ ^(.*)-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-bzImage\.efi$ ]]; then if [[ "$basename" =~ ^(.*)-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-bzImage\.efi$ ]]; then
version="${BASH_REMATCH[2]}" kernel_files+=("$file")
type="kernel"
# Pattern 1: <hash>-initrd-linux-<version>-initrd.efi (initrd) # Pattern: <hash>-initrd-linux-<version>-initrd.efi (initrd)
elif [[ "$basename" =~ ^(.*)-initrd-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-initrd\.efi$ ]]; then elif [[ "$basename" =~ ^(.*)-initrd-linux-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-initrd\.efi$ ]]; then
version="${BASH_REMATCH[2]}" initrd_files+=("$file")
type="initrd"
# Pattern 2: kernel-<version>-<hash>.efi (kernel) # Pattern: kernel-<version>-<hash>.efi (kernel)
elif [[ "$basename" =~ ^kernel-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then elif [[ "$basename" =~ ^kernel-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then
version="${BASH_REMATCH[1]}" kernel_files+=("$file")
type="kernel"
# Pattern 2: initrd-<version>-<hash>.efi (initrd) # Pattern: initrd-<version>-<hash>.efi (initrd)
elif [[ "$basename" =~ ^initrd-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then elif [[ "$basename" =~ ^initrd-([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.\+]+)?)-([a-zA-Z0-9]+)\.efi$ ]]; then
version="${BASH_REMATCH[1]}" initrd_files+=("$file")
type="initrd"
else else
log "Warning: Unrecognized filename format: $basename" log "Warning: Unrecognized filename format: $basename"
continue continue
fi 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 done
# Collect all versions # Function to process and delete old files
all_versions=("${!versions_mtime[@]}") 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) log "Processing $file_type files..."
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[@]} 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
for file in "${files_to_delete[@]}"; do
log "Deleting $file"
if [ "$DRY_RUN" = false ]; then if [ "$DRY_RUN" = false ]; then
if rm -f -- "$resolved_file"; then rm -f -- "$file"
log "Deleted: $resolved_file"
else else
log "Failed to delete: $resolved_file" log "Dry run - would delete: $file"
fi
else
log "Dry run - would delete: $resolved_file"
fi fi
done done
else
log "No $file_type files to delete. Current count: ${#files[@]}"
fi
}
# Process initrd and kernel files
process_files kernel_files "$KEEP_KERNEL" "kernel"
process_files initrd_files "$KEEP_INITRD" "initrd"
log "Cleanup script completed." log "Cleanup script completed."

260
.scripts/cleanup-boot.shbak Executable file
View File

@@ -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: <hash>-linux-<version>-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: <hash>-initrd-linux-<version>-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-<version>-<hash>.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-<version>-<hash>.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."

14
flake.lock generated
View File

@@ -1502,11 +1502,11 @@
"systems": "systems_7" "systems": "systems_7"
}, },
"locked": { "locked": {
"lastModified": 1726403814, "lastModified": 1726413442,
"narHash": "sha256-by72+sV6Q3h2c9jjqqEQFGuOhZy8G29qF6HKDomoWWs=", "narHash": "sha256-vnuV8eKEO2/MgcxR1G8D3iIEa83SKlbrQpsEAKUYRpc=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "a8fce63c468fc4689a83c06d2f7eb8d5e8900f2f", "rev": "ac4002abb28571f367264b176cf13b11e7aa406a",
"revCount": 4, "revCount": 5,
"type": "git", "type": "git",
"url": "https://git.sr.ht/~canasta/runix" "url": "https://git.sr.ht/~canasta/runix"
}, },
@@ -1815,11 +1815,11 @@
}, },
"locked": { "locked": {
"dir": "nix", "dir": "nix",
"lastModified": 1726359931, "lastModified": 1726405016,
"narHash": "sha256-yGcSRN6T7YgRI2k0LpcKwuJQ+QO/YvzBVeUaWtlMN3U=", "narHash": "sha256-U0hJ4RqzyIi8EqTTA7twkvnyXVgoKnvpIfBoIAdH0FE=",
"owner": "wez", "owner": "wez",
"repo": "wezterm", "repo": "wezterm",
"rev": "1eddc9157f51577d7984dd6aec3b780ecec1d4a0", "rev": "09ac8c53777ac6de61b757292f5dc4da80322bbd",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -55,9 +55,6 @@
}; };
}; };
utils = { utils = {
ags = {
enable = false;
};
anyrun = { anyrun = {
enable = false; enable = false;
}; };

View File

@@ -1,3 +0,0 @@
{
programs.dconf.enable = true;
}

View File

@@ -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";
# };
};
}

View File

@@ -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";
};
};
}

View File

@@ -1,7 +0,0 @@
{
services.xserver = {
enable = true;
videoDrivers = ["nvidia"];
xkb.layout = "se";
};
}