commit ade6f86a7fef6254ca078df41a0654f16d1fa27f Author: kawaiipunk Date: Wed Aug 26 22:25:08 2026 +0100 Initial commit diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..3905e70 --- /dev/null +++ b/update.sh @@ -0,0 +1,216 @@ +#!/bin/bash + +# Interactive system update script for apt, flatpak, and brew + +set -euo pipefail + +# Color definitions +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Add help option +if [[ "${1:-}" =~ ^-+h ]]; then + echo "Usage: $0" + echo "Interactive system update script for apt, flatpak, and brew" + exit 0 +fi + +# Handle SIGINT (Ctrl+C) +trap 'echo; echo "${YELLOW}[WARN]${NC} Script interrupted by user."; exit 130' INT + +# Enhanced logging with timestamps, colors and severity levels +log() { + local level="${1:-INFO}" + shift + local color="" + + case "$level" in + "INFO") + color="$GREEN" + ;; + "WARN") + color="$YELLOW" + ;; + "ERROR") + color="$RED" + ;; + *) + color="$GREEN" + ;; + esac + + echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] [${color}$level${NC}] $*" | tee -a /tmp/update_script.log >&2 +} + +# Request sudo upfront +if ! sudo -v; then + log "ERROR" "sudo access required to run this script." + exit 1 +fi + +echo + +# Track actions +updates_performed=false +updates_failed=false +dkms_ran=false +dkms_success=false +reboot_required=false + + +# Ensure required commands are available +ensure_command() { + if ! command -v "$1" > /dev/null; then + log "WARN" "$1 is required but not installed." + return 1 + fi +} + +# Update APT packages interactively +if ensure_command apt; then + log "INFO" "Updating APT package list..." + sudo apt update + + log "INFO" "Checking for upgrades..." + + # Skip header line from apt list + if apt list --upgradable 2>/dev/null | tail -n +2 | grep -q "."; then + echo + echo "The following packages can be upgraded:" + apt list --upgradable + echo + read -p "Proceed with interactive upgrade? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + if sudo apt full-upgrade; then + updates_performed=true + else + updates_failed=true + fi + else + log "WARN" "APT upgrade skipped." + fi + else + log "INFO" "No APT packages to upgrade." + fi + + # Clean up + sudo apt autoremove +fi + +# Update Flatpak interactively +if ensure_command flatpak; then + log "INFO" "Checking for Flatpak updates..." + + if flatpak remote-ls --updates > /dev/null 2>&1 && [ $(flatpak remote-ls --updates 2>/dev/null | wc -l) -gt 0 ]; then + echo + read -p "Proceed with Flatpak update? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + if flatpak update && flatpak uninstall --unused; then + updates_performed=true + else + updates_failed=true + fi + else + log "WARN" "Flatpak update skipped." + fi + else + log "INFO" "No Flatpak updates available." + fi +fi + +# Update Homebrew interactively +if command -v brew > /dev/null; then + log "INFO" "Updating Homebrew..." + brew update > /dev/null + + # Check outdated formulae + if brew outdated | grep -q "."; then + echo + echo "Homebrew formulae to upgrade:" + brew outdated + echo + read -p "Upgrade all outdated formulae? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + if brew upgrade; then + updates_performed=true + else + updates_failed=true + fi + else + log "WARN" "Brew formulae upgrade skipped." + fi + else + log "INFO" "No outdated Homebrew formulae." + fi + + # Cleanup + brew cleanup +else + log "WARN" "Homebrew not installed. Skipping." +fi + +# Handle DKMS (non-interactive) +if command -v dkms > /dev/null; then + log "INFO" "Rebuilding DKMS modules..." + # dkms autoinstall will handle missing headers and failed rebuilds + if sudo dkms autoinstall; then + log "INFO" "DKMS modules rebuilt successfully." + else + log "WARN" "DKMS module rebuild failed." + fi +fi + +# Reboot warning +if [ -f /var/run/reboot-required ]; then + log "WARN" "System reboot is required." + cat /var/run/reboot-required.pkgs | xargs echo "Packages requiring reboot:" + reboot_required=true +fi + +# Final status output +echo +echo "===============================" +log "INFO" "Update process completed." + +if [[ "$updates_performed" == "true" ]]; then + log "INFO" "Package updates were applied successfully." +elif [[ "$updates_failed" == "true" ]]; then + log "WARN" "Some updates failed to apply." +else + log "INFO" "No package updates were applied." +fi + +if [[ "$dkms_ran" == "true" ]]; then + if [[ "$dkms_success" == "true" ]]; then + log "INFO" "DKMS modules rebuilt successfully." + else + log "WARN" "DKMS module rebuild failed." + fi +elif ! command -v dkms > /dev/null; then + log "INFO" "DKMS not installed." +else + log "INFO" "No DKMS modules to rebuild." +fi + +if [[ "$reboot_required" == "true" ]]; then + log "WARN" "REBOOT REQUIRED" +else + log "INFO" "System does not require reboot." +fi +echo "===============================" + +echo + +# Return appropriate exit code +if [[ "$reboot_required" == "true" ]]; then + exit 2 +elif [[ "$updates_failed" == "true" ]]; then + exit 1 +else + exit 0 +fi