#!/bin/bash
#
# This script performs a release upgrade to linuxmuster.net 7.4.
# thomas@linuxmuster.net
# 20260627
#

# get linuxmuster environment

source /usr/share/linuxmuster/helperfunctions.sh
logfile="$LOGDIR/linuxmuster-release-upgrade.log"

# Setup logging, but allow to temporarily restore terminal output for interactive calls
exec > >(tee -a "$logfile") 2>&1

# options
echo "$@" | grep -qw "\-\-force" && donotask="yes"
echo "$@" | grep -qw "\-\-reboot" && autoreboot="yes"
echo "$@" | grep -qw "\-\-clean" && cleancache="yes"
if echo "$@" | grep -q "\-\-help"; then
    echo "Usage: linuxmuster-release-upgrade [--force|--reboot|--clean|--help]"
    echo "  --force   Do not ask for confirmation"
    echo "  --reboot  Reboot after successful upgrade"
    echo "  --clean   Clean up apt cache after upgrade"
    echo "  --help    Show this help message"
    exit 0
fi

echo "############################################################"
echo "#                                                          #"
echo "#                        ATTENTION!                        #"
echo "#                                                          #"
echo "# This script upgrades your system to linuxmuster.net 7.4! #"
echo "# Make sure you have created a snapshot before.            #"
echo "#                                                          #"
echo "############################################################"
echo

# security query
answer="YES"
if [ ! -n "$donotask" ]; then
    echo -n "Do you want to continue? Type \"$answer\" to start the upgrade: "
    read given_answer
    [ "$given_answer" = "$answer" ] || exit 1
fi

# ensure time is correct
echo -e "\n## Adjusting system time..."
ntpdate pool.ntp.org

# save resolv.conf
cp /etc/resolv.conf /etc/resolv.conf.release-upgrade

# test if release upgrade is possible
NEXT_RELEASE="26.04"
if do-release-upgrade -c 2>&1 | grep -q "$NEXT_RELEASE"; then
    RELEASE_TYPE="stable"
else
    if do-release-upgrade -c -d 2>&1 | grep -q "$NEXT_RELEASE"; then
        DFLAG="-d"
        RELEASE_TYPE="development"
    else
        echo "Release $NEXT_RELEASE is not available!"
        exit 1
    fi
fi
echo "Upgrade to $NEXT_RELEASE is available as $RELEASE_TYPE release!"

# get grub disks from debconf database and grub-probe
get_grub_disks() {
    local grub_disks="$(debconf-show grub-pc 2>/dev/null | grep "grub-pc/install_devices:" | sed 's/.*: //')"
    local probed_disk="$(grub-probe --target=disk /boot 2>/dev/null)"
    stringinstring "$probed_disk" "$grub_disks" || grub_disks="$probed_disk $grub_disks"
    # strip disks from grub_disks that do not exist
    local disk
    for disk in $grub_disks; do
        [ -b "$disk" ] || grub_disks="$(echo "$grub_disks" | sed "s|$disk||")"
    done
    echo "$grub_disks" | xargs
}

# detect grub boot disks
echo -en "\n## Trying to auto-detect all grub boot disks: "
BOOT_DISKS="$(get_grub_disks)"
if [ -n "$BOOT_DISKS" ]; then
    echo "$BOOT_DISKS"
    if [ -n "$donotask" ]; then
        boot_disk="$(echo "$BOOT_DISKS" | awk '{print $1}')"
    else
        echo -n "   * Input the grub boot disk to continue: "
        read boot_disk
    fi
else
    echo "nothing found!"
fi
if [ ! -b "$boot_disk" ]; then
    echo -e "\nERROR: Could not determine a valid grub boot disk!"
    echo "Please run 'dpkg-reconfigure grub-pc' to fix the grub configuration and restart the upgrade."
    exit 1
fi
echo "## Saving boot disk $boot_disk to grub-pc's debconf database..."
echo "grub-pc grub-pc/install_devices multiselect $boot_disk" | debconf-set-selections
# install grub on detected boot disk
script -q -c "dpkg-reconfigure --priority=critical grub-pc" || exit 1

# start release upgrade
echo -e "\n## Starting release upgrade..."
echo DPkg::options \{ \"--force-confdef\"\; \"--force-confold\"\; \} > /etc/apt/apt.conf.d/local
if ! do-release-upgrade $DFLAG -m server -f DistUpgradeViewNonInteractive; then
    rm -f /etc/apt/apt.conf.d/local
    echo "Upgrade failed obviously!"
    exit 1
fi

# remove annoying cloud-init package, if installed
echo -e "\n## Removing cloud-init packages, if installed..."
for p in cloud-guest-utils cloud-init cloud-init-base; do
    if dpkg -l $p 2>/dev/null | grep -q ^ii; then
        apt-get -yu purge $p
    fi
done

# disable obsolete services
echo -e "\n## Disabling obsolete services..."
for s in isc-dhcp-server6 networkd-wait-online.service systemd-resolved; do
    for c in stop disable mask; do
        systemctl $c $s
    done
done

# tweak resolv.conf
echo -e "\n## Tweaking resolv.conf..."
rm -f /etc/resolv.conf
source /usr/share/linuxmuster/environment.sh
echo "nameserver $firewallip" > /etc/resolv.conf

# ensure samba-ad-dc pkg is installed
echo -e "\n## Ensuring samba-ad-dc package is installed..."
DEBIAN_FRONTEND=noninteractive apt-get -yu install samba-ad-dc

# tweak sophomorix
cfg="/usr/share/sophomorix/devel/sophomorix.ini"
if ! grep -q "$NEXT_RELEASE" "$cfg"; then
    echo -e "\n## Tweaking sophomorix configuration..."
    sed -i "s|DISTRIB_EXPERIMENTAL =.*|DISTRIB_EXPERIMENTAL = $NEXT_RELEASE|" "$cfg"
fi

# create repo sources file
echo -e "\n## Creating linuxmuster.net repository sources file..."
repo_key_local="/etc/apt/trusted.gpg.d/linuxmuster.net.gpg"
deb_url="https://deb.linuxmuster.net/"
repo_key_remote="${deb_url}pub.gpg"
lmn_sources="/etc/apt/sources.list.d/lmn.sources"
[ -e "$repo_key_local" ] || wget -qO- "$repo_key_remote" | gpg --dearmour -o "$repo_key_local"
cat << _EOF > "$lmn_sources"
Types: deb
URIs: ${deb_url}
Suites: lmn74
Components: main
Signed-By: ${repo_key_local}
_EOF
apt-get update

# force reconfigure of linuxmuster-webui7 package, if no upgrade exists
if ! apt list --upgradable 2>&1 | grep -q linuxmuster-webui7; then
    echo -e "\n## Reconfiguring linuxmuster-webui7..."
    dpkg-reconfigure linuxmuster-webui7
fi

# stop linbo-torrent.service before upgrading linbo package
echo -e "\n## Stopping linbo-torrent.service..."
systemctl stop linbo-torrent.service

# upgrade linuxmuster pkgs
echo -e "\n## Upgrading linuxmuster packages..."
apt-get -yu dist-upgrade
apt-get -yu autoremove --purge

# clean apt cache
if [ -n "$cleancache" ]; then
    echo -e "\n## Cleaning apt cache..."
    apt-get clean
fi

# remove apt tweak
echo -e "\n## Removing apt tweak..."
rm -f /etc/apt/apt.conf.d/local

# restore resolv.conf
echo -e "\n## Restoring resolv.conf..."
rm -f /etc/resolv.conf
mv /etc/resolv.conf.release-upgrade /etc/resolv.conf

# reboot
if [ -n "$autoreboot" ]; then
    echo -e "\n## Rebooting..."
    reboot
fi
