Script Post Services for Laptop Ministries

Viewing: 1750016564_upuntu.sh

Try wget https://script.laptopministry.org/uploads/1750016564_upuntu.sh from the console

Raw File Link

#!/bin/bash

# Script to upgrade Ubuntu to the latest LTS release
# Run with: sudo bash upgrade-to-latest-lts.sh
# Script developed by Laptop Ministry on June 14th 2025.
# Copyleft 2025.

# Exit on error
set -e

# Log file for debugging
LOGFILE="/var/log/ubuntu-lts-upgrade.log"
echo "Ubuntu LTS Upgrade started at $(date)" | tee -a "$LOGFILE"

# Function to log messages
log() {
    echo "[$(date)] $1" | tee -a "$LOGFILE"
}

# Function to check if the current release is LTS
is_lts() {
    lsb_release -a 2>/dev/null | grep -q "LTS"
    return $?
}

# Function to get the current Ubuntu version
get_current_version() {
    lsb_release -rs 2>/dev/null || echo "unknown"
}

# Function to check if the version is the latest LTS (simplified check)
# As of June 2025, 24.04 is the latest LTS; update if a newer LTS is known
is_latest_lts() {
    local version="$1"
    # List of known LTS versions in ascending order (add newer LTS as needed)
    local lts_versions=("20.04" "22.04" "24.04")
    local latest_lts="${lts_versions[-1]}"
    
    # Compare current version with the latest known LTS
    if [[ "$version" == "$latest_lts" ]]; then
        return 0 # Is latest LTS
    fi
    return 1 # Not latest LTS
}

# Function to check disk space (require at least 5GB free)
check_disk_space() {
    local free_space
    free_space=$(df -h / | tail -1 | awk '{print $4}' | sed 's/G//')
    if (( $(echo "$free_space < 5" | bc -l) )); then
        log "ERROR: Insufficient disk space ($free_space GB free). Need at least 5GB."
        exit 1
    fi
    log "Disk space check passed ($free_space GB free)."
}

# Function to prompt for backup
prompt_backup() {
    read -p "Have you backed up all critical data? (y/n): " response
    if [[ ! "$response" =~ ^[Yy]$ ]]; then
        log "ERROR: Please back up your data before proceeding."
        exit 1
    fi
    log "Backup confirmed by user."
}

# Function to update and upgrade packages
update_system() {
    log "Updating and upgrading current system..."
    apt update >> "$LOGFILE" 2>&1 || { log "ERROR: Failed to update package lists."; exit 1; }
    apt upgrade -y >> "$LOGFILE" 2>&1 || { log "ERROR: Failed to upgrade packages."; exit 1; }
    apt dist-upgrade -y >> "$LOGFILE" 2>&1 || { log "ERROR: Failed to perform dist-upgrade."; exit 1; }
    apt autoremove -y >> "$LOGFILE" 2>&1 || { log "WARNING: Failed to clean up unused packages."; }
    log "System updated successfully."
}

# Function to configure release upgrades for LTS
configure_lts() {
    log "Configuring release upgrades for LTS..."
    local config_file="/etc/update-manager/release-upgrades"
    if ! grep -q "^Prompt=lts" "$config_file"; then
        sed -i 's/Prompt=.*/Prompt=lts/' "$config_file" || { log "ERROR: Failed to configure $config_file."; exit 1; }
    fi
    log "LTS upgrade configuration set."
}

# Function to perform the release upgrade
perform_upgrade() {
    log "Starting release upgrade..."
    do-release-upgrade -f DistUpgradeViewNonInteractive >> "$LOGFILE" 2>&1 || {
        log "ERROR: Release upgrade failed. Check $LOGFILE for details."
        exit 1
    }
    log "Release upgrade completed."
}

# Function to post-upgrade checks
post_upgrade_checks() {
    log "Running post-upgrade checks..."
    apt update >> "$LOGFILE" 2>&1 || { log "WARNING: Failed to update package lists post-upgrade."; }
    apt upgrade -y >> "$LOGFILE" 2>&1 || { log "WARNING: Failed to upgrade packages post-upgrade."; }
    apt autoremove -y >> "$LOGFILE" 2>&1 || { log "WARNING: Failed to clean up unused packages."; }
    apt install -f -y >> "$LOGFILE" 2>&1 || { log "WARNING: Failed to fix broken packages."; }
    log "Post-upgrade checks completed."
}

# Main script
log "Starting Ubuntu LTS upgrade process..."

# Check if running as root
if [[ $EUID -ne 0 ]]; then
    log "ERROR: This script must be run as root (use sudo)."
    exit 1
fi

# Prompt for backup
prompt_backup

# Check disk space
check_disk_space

# Install update-manager-core
log "Installing update-manager-core..."
apt install -y update-manager-core >> "$LOGFILE" 2>&1 || { log "ERROR: Failed to install update-manager-core."; exit 1; }

# Configure for LTS upgrades
configure_lts

# Main upgrade loop
while true; do
    current_version=$(get_current_version)
    log "Current Ubuntu version: $current_version"
    
    if ! is_lts; then
        log "WARNING: Current version is not an LTS release. Attempting to upgrade to next LTS."
    fi
    
    if is_latest_lts "$current_version"; then
        log "System is already on the latest LTS release ($current_version). Exiting."
        break
    fi
    
    # Update system before upgrade
    update_system
    
    # Perform the release upgrade
    perform_upgrade
    
    # Run post-upgrade checks
    post_upgrade_checks
    
    # Reboot (optional, uncomment if desired)
    # log "Rebooting system..."
    # reboot
done

# Final verification
current_version=$(get_current_version)
log "Final Ubuntu version: $current_version"
if is_lts && is_latest_lts "$current_version"; then
    log "Successfully upgraded to the latest LTS release ($current_version)."
else
    log "WARNING: Upgrade completed, but system may not be on the latest LTS. Current version: $current_version."
fi

exit 0
BASH to Home