ncp-update-nc, nc-autoupdate-nc, ncp-check-nc-version: Dynamically determine upgrade path and auto-upgrade to latest minor version

Signed-off-by: Tobias Knöppler <6317548+theCalcaholic@users.noreply.github.com>
This commit is contained in:
Tobias K 2024-07-15 14:22:45 +02:00 committed by Tobias Knöppler
parent 0c023d95a5
commit 323a202785
No known key found for this signature in database
GPG Key ID: 3510056072886A8F
6 changed files with 51 additions and 32 deletions

View File

@ -6,18 +6,20 @@ set -e
source /usr/local/etc/library.sh # sets NCLATESTVER
CURRENT="$(ncc status | grep "version:" | awk '{ print $3 }')"
LATEST="$(wget -qO- https://raw.githubusercontent.com/nextcloud/nextcloudpi/master/etc/ncp.cfg | jq -r .nextcloud_version)"
CURRENT="$(nc_version)"
NEXT_VERSION="$(determine_nc_upgrade_version "${CURRENT}" "${NCLATESTVER?}")"
[[ -n "$NEXT_VERSION" ]] || exit 0
NOTIFIED=/var/run/.nc-version-notified
test -e "${NOTIFIED}" && [[ "${LATEST}" == "$( cat "${NOTIFIED}" )" ]] && {
echo "Found update from ${CURRENT} to ${LATEST}. Already notified"
test -e "${NOTIFIED}" && [[ "${NEXT_VERSION}" == "$( cat "${NOTIFIED}" )" ]] && {
echo "Found update from ${CURRENT} to ${NEXT_VERSION}. Already notified"
exit 0
}
if is_more_recent_than "${LATEST}" "${CURRENT}"; then
if is_more_recent_than "${NEXT_VERSION}" "${CURRENT}"; then
notify_admin \
"Nextcloud update" \
"Update from ${CURRENT} to ${LATEST} is available. Update from https://$(get_ip):4443"
echo "${LATEST}" > "${NOTIFIED}"
"Update from ${CURRENT} to ${NEXT_VERSION} is available. Update from https://$(get_ip):4443"
echo "${NEXT_VERSION}" > "${NOTIFIED}"
fi

View File

@ -39,14 +39,14 @@ ncc status &>/dev/null || { [[ "$DBG" == x ]] && ncc status; echo "Next
####################
[[ ${EUID} -eq 0 ]] && SUDO="sudo -u www-data"
CURRENT="$( $SUDO php /var/www/nextcloud/occ status | grep "version:" | awk '{ print $3 }' )"
MAJOR_CUR=$( cut -d. -f1 <<<"${CURRENT}" )
MAJOR_NEW=$( cut -d. -f1 <<<"${VER}" )
if [[ $((MAJOR_NEW - MAJOR_CUR)) -gt 1 ]]; then
echo "Upgrade cannot skip major versions. Please upgrade one major version at a time" >&2
CURRENT="$(nc_version)"
TARGET_VERSION="$(determine_nc_upgrade_version "${CURRENT?}" "${VER?}")"
[[ -n "$TARGET_VERSION" ]] || {
echo "Could not find a valid upgrade path from '${CURRENT}' to '${TARGET_VERSION}'. Nothing to update."
exit 1
fi
}
MAJOR_NEW="${TARGET_VERSION%%.*}"
if [[ "$MAJOR_NEW" -ge 24 ]] && [[ "$(lsb_release -r)" =~ .*10 ]]
then
@ -55,18 +55,10 @@ then
fi
grep -qP "\d+\.\d+\.\d+" <<<"$CURRENT" || { echo "Malformed version $CURRENT"; exit 1; }
grep -qP "\d+\.\d+\.\d+" <<<"$VER" || { echo "Malformed version $VER" ; exit 1; }
grep -qP "\d+\.\d+\.\d+" <<<"$TARGET_VERSION" || { echo "Malformed version $TARGET_VERSION" ; exit 1; }
echo "Current Nextcloud version $CURRENT"
echo "Available Nextcloud version $VER"
is_more_recent_than "${VER}" "${CURRENT}" || { echo "Nothing to update"; exit 1; } # we want `exit 1` so the autoupdate doesn't notify success in this case
if ! is_more_recent_than '25.0.0' "${VER}" && is_more_recent_than "8.1.0" "${PHPVER}.0" && is_docker
then
echo 'You need to upgrade to a later docker image in order to upgrade to Nextcloud 25+'
exit 1
fi
echo "Available Nextcloud version $TARGET_VERSION"
# make sure that cron.php is not running and there are no pending jobs
# https://github.com/nextcloud/server/issues/10949
@ -88,8 +80,8 @@ trap cleanup EXIT
# get new code
####################
URL="https://download.nextcloud.com/server/releases/nextcloud-$VER.tar.bz2"
echo "Download Nextcloud $VER..."
URL="https://download.nextcloud.com/server/releases/nextcloud-$TARGET_VERSION.tar.bz2"
echo "Download Nextcloud $TARGET_VERSION..."
wget -q "$URL" -O nextcloud.tar.bz2 || { echo "Error downloading"; exit 1; }
# backup
@ -127,7 +119,7 @@ trap rollback_simple INT TERM HUP ERR
# replace code
####################
echo "Install Nextcloud $VER..."
echo "Install Nextcloud $TARGET_VERSION..."
mv -T nextcloud nextcloud-old
tar -xf nextcloud.tar.bz2 # && false # test point
rm -rf /var/www/nextcloud.tar.bz2
@ -195,7 +187,7 @@ $ncc | grep -q db:add-missing-primary-keys && $ncc db:add-missing-primary-keys -
$ncc | grep -q db:convert-filecache-bigint && $ncc db:convert-filecache-bigint -n
# use the correct version for custom apps
NCVER="$(ncc status | grep "version:" | awk '{ print $3 }')"
NCVER="$(nc_version)"
if is_more_recent_than "21.0.0" "${NCVER}"; then
NCPREV=/var/www/ncp-previewgenerator/ncp-previewgenerator-nc20
else

View File

@ -27,7 +27,7 @@ echo -e "[ncp-update-nc]" >> /var/log/ncp.log
if [[ \${PIPESTATUS[0]} -eq 0 ]]; then
VER="\$( /usr/local/bin/ncc status | grep "version:" | awk '{ print \$3 }' )"
VER="\$(nc_version)"
notify_admin "NextCloudPi" "Nextcloud was updated to \$VER"
fi

View File

@ -516,7 +516,32 @@ function check_distro()
function nc_version()
{
ncc status | grep "version:" | awk '{ print $3 }'
ncc status | grep "versionstring:" | awk '{ print $3 }'
}
function determine_nc_upgrade_version() {
local current supported current_maj supported_maj versions next_version
current="${1?}"
supported="${2?}"
#CURRENT="$(ncc status | grep "versionstring:" | awk '{ print $3 }')"
current_maj="${current%%.*}"
supported_maj="${supported%%.*}"
versions="$(curl -L -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/nextcloud/server/releases?per_page=100 | jq -r '.[].tag_name' | grep -v -e 'rc.$' -e 'beta.$' | sort -V)"
next_version="$(grep "v${current_maj}." <<<"${versions}" | tail -n 1 | tr -d 'v')"
if [[ "${next_version}" == "${current}" ]]
then
if [[ "${supported_maj}" -le "${current_maj}" ]]
then
# No update available
return 0
fi
next_version="$(grep "$v$((current_maj + 1))." <<< "${versions}" | tail -n 1 | tr -d 'v')"
fi
[[ -z "${next_version}" ]] || echo -n "${next_version}"
}
function get_ip()

View File

@ -9,7 +9,7 @@
{
"id": "VER",
"name": "Version",
"value": "28.0.5"
"value": "28.0.7"
},
{
"id": "MAXFILESIZE",

View File

@ -1,5 +1,5 @@
{
"nextcloud_version": "28.0.5",
"nextcloud_version": "28.0.7",
"php_version": "8.1",
"release": "bookworm"
}