Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 33 additions & 2 deletions docker-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,37 @@ run_as() {
fi
}

# Function to get and validate Nextcloud version from version.php
# Arguments:
# $1 - path to version.php file
# $2 - description (e.g., "installed" or "image") for error messages
# Returns: version string on success, exits on failure
get_nextcloud_version() {
version_file="$1"
description="$2"

# shellcheck disable=SC2016
php_output="$(php -r 'require "'"$version_file"'"; echo implode(".", $OC_Version);' 2>&1)"
php_exit_code=$?

if [ $php_exit_code -ne 0 ] || echo "$php_output" | grep -qiE '(error|warning|fatal)'; then
echo "Error: Failed to determine $description Nextcloud version." >&2
echo "PHP output: $php_output" >&2
echo "This usually indicates PHP is broken or missing required modules." >&2
exit 1
fi

# Validate version format (should be at least 3 numeric parts, optionally 4)
# e.g., "32.0.3" or "32.0.3.2" - but NOT "32.0"
if ! echo "$php_output" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$'; then
echo "Error: Invalid $description version format: $php_output" >&2
echo "Expected version number format with at least 3 parts (e.g., 32.0.3 or 32.0.3.2), but got unexpected output." >&2
exit 1
fi

echo "$php_output"
}

# Execute all executable files in a given directory in alphanumeric order
run_path() {
local hook_folder_path="/docker-entrypoint-hooks.d/$1"
Expand Down Expand Up @@ -159,10 +190,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP
installed_version="0.0.0.0"
if [ -f /var/www/html/version.php ]; then
# shellcheck disable=SC2016
installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
installed_version="$(get_nextcloud_version "/var/www/html/version.php" "installed")"
fi
# shellcheck disable=SC2016
image_version="$(php -r 'require "/usr/src/nextcloud/version.php"; echo implode(".", $OC_Version);')"
image_version="$(get_nextcloud_version "/usr/src/nextcloud/version.php" "image")"

if version_greater "$installed_version" "$image_version"; then
echo "Can't start Nextcloud because the version of the data ($installed_version) is higher than the docker image version ($image_version) and downgrading is not supported. Are you sure you have pulled the newest image version?"
Expand Down
Loading