Initial commit
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user