diff options
author | mail_redacted_for_web | 2025-04-21 11:30:41 +0200 |
---|---|---|
committer | mail_redacted_for_web | 2025-04-21 11:30:41 +0200 |
commit | 7cbe397b6d5e6d134f5dceb717081c5a78be0b1b (patch) | |
tree | be9dc9b19e5b36cfb0a745eb62ccb5629f13c7b6 | |
parent | 5eba88991da735b630fa0c2094ab648a60c1e90a (diff) | |
download | nextcloud-update-7cbe397b6d5e6d134f5dceb717081c5a78be0b1b.tar.bz2 |
Parametrise nextcloud-upgrade
-rwxr-xr-x | bin/nextcloud-update | 14 | ||||
-rwxr-xr-x | bin/nextcloud-upgrade | 303 |
2 files changed, 217 insertions, 100 deletions
diff --git a/bin/nextcloud-update b/bin/nextcloud-update index c6b1aa3..c88d11c 100755 --- a/bin/nextcloud-update +++ b/bin/nextcloud-update @@ -180,10 +180,22 @@ if [[ "$NC_COREUPD" -eq 1 && "$NC_UA_CORE" -eq 1 ]]; then fi ##### NEXTCLOUD UPDATES ##### +# printf 'NC_COREUPD: %b\n' "$NC_COREUPD" +# printf 'NC_UA_CORE: %b\n' "$NC_UA_CORE" +# printf 'NC_APPSUPD: %b\n' "$NC_APPSUPD" +# printf 'NC_UA_APPS: %b\n' "$NC_UA_APPS" if [[ "$NC_COREUPD" -eq 1 || "$NC_APPSUPD" -eq 1 ]]; then UPDCALL=( '/usr/local/bin/nextcloud-upgrade' ) if [[ "$NC_COREUPD" -eq 1 && "$NC_UA_CORE" -eq 1 ]]; then - UPDCALL=( '-c' "$UPDVER" + UPDCALL+=( '-c' "$UPDVER" ) + elif [[ "$NC_COREUPD" -eq 1 && "$NC_UA_CORE" -eq 0 ]]; then + UPDCALL+=( '-c' 0 ) fi + if [[ "$NC_APPSUP" -eq 1 && "$NX_UA_APPS" -eq 1 ]]; then + UPDCALL+=( '-a' ) + fi +else + UPDCALL='/usr/bin/true' fi # /usr/local/bin/nextcloud-upgrade "$UPDVER" || exit "$?" +"${UPDCALL[@]}" || exit "$?" diff --git a/bin/nextcloud-upgrade b/bin/nextcloud-upgrade index c77182b..4dec0aa 100755 --- a/bin/nextcloud-upgrade +++ b/bin/nextcloud-upgrade @@ -5,7 +5,55 @@ # Error codes: 131-159 (130 is reserved for sigint et al!) -[ -z "$1" ] && printf 'Usage: %b VERSION\n' "$(basename "$0")" >&2 && exit 101 +# Define help function +function hayulp { + printf 'USAGE: %b [-a|--app-update] [-c|--core-update VERSION]\n\n' "$(basename "$0")" + ( + printf -- '-a,\n' + printf -- '--app-update;Update all apps\n' + printf -- '-c,\n' + printf -- '--core-update;Update the Nextcloud core (including apps update)\n' + printf -- ';VERSION is mandatory. "0" for no update at all (e.g. for wrapper scripts).\n' + printf -- '-s,\n' + printf -- '--status;Status including version\n' + printf -- '-u,\n' + printf -- '--update-check;Status including update check\n' + printf -- '-h,\n' + printf -- '--help;This help text\n' + )|column -ts \; + printf '\n' +} + +##### PARSE: COMMAND LINE PARAMETERS ##### +NC_APPSUPD=0; NC_COREUPD=0 +while [[ $# -gt 0 ]]; do + case "$1" in + "-h"|"--help") + hayulp + exit 0 + ;; + "-a"|"--app-update") + NC_APPSUPD=1 + shift + ;; + "-c"|"--core-update") + NC_COREUPD=1 + shift + UPDVER="$1" + shift + ;; + "-"*) + hayulp + printf '\033[93mUnknown option: %b\033[0m\n' "$1" >&2 + exit 104 + ;; + esac +done + +if [ "$UPDVER" == '0' ]; then + NC_COREUPD=2 +fi + # shellcheck disable=SC1091 source /etc/lirion/nextcloud.conf || exit 102 # shellcheck disable=SC1091 @@ -14,116 +62,166 @@ source /usr/lib/lirion/ln-initfunctions || exit 103 /usr/bin/sudo -u "$NCUSER" /usr/bin/whoami > /dev/null || exit 133 /usr/bin/sudo /usr/bin/whoami > /dev/null || exit 133 -lnbegin "File inventory" -if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2" > /dev/null 2>&1; then - lnfail "archive not found" - exit 131 -elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2.sha512" >/dev/null 2>&1; then - lnfail "checksum file not found" - exit 131 -elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2.asc" >/dev/null 2>&1; then - lnfail "signature file not found" - exit 131 -fi -lnok -# TODO: implement script parameter skipping this - if we execute right after nextcloud-download, -# this is redundant as the latter also verifies. We need this only on separate execution (so -# by default as well). -lnbegin "Verifying download" -lnprog 'GPG' -if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/gpg --no-default-keyring --keyring /var/www/keyrings/nextcloud-security.gpg \ - --quiet --verify "${NCDLTGT}/nextcloud-${1}.tar.bz2.asc" "${NCDLTGT}/nextcloud-${1}.tar.bz2" 2>/dev/null -then - lnfail 'GPG failed' - exit 132 +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin "File inventory" + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2" > /dev/null 2>&1; then + lnfail "archive not found" + exit 131 + elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2.sha512" >/dev/null 2>&1; then + lnfail "checksum file not found" + exit 131 + elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCDLTGT}/nextcloud-${1}.tar.bz2.asc" >/dev/null 2>&1; then + lnfail "signature file not found" + exit 131 + fi + lnok + # TODO: implement script parameter skipping this - if we execute right after nextcloud-download, + # this is redundant as the latter also verifies. We need this only on separate execution (so + # by default as well). + lnbegin "Verifying download" + lnprog 'GPG' + if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/gpg --no-default-keyring --keyring /var/www/keyrings/nextcloud-security.gpg \ + --quiet --verify "${NCDLTGT}/nextcloud-${1}.tar.bz2.asc" "${NCDLTGT}/nextcloud-${1}.tar.bz2" 2>/dev/null + then + lnfail 'GPG failed' + exit 132 + fi + lnok + fi fi -lnok -lnbegin 'Setting maintenance mode' -if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" 'maintenance:mode' '--on' >/dev/null 2>&1; then - lnfail 'enabling failed' - exit 133 +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin 'Setting maintenance mode' + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" 'maintenance:mode' '--on' >/dev/null 2>&1; then + lnfail 'enabling failed' + exit 133 + fi + lnok + lnbegin "Grace period with maintenance mode" + while [ "$NCGRACE" -ge 1 ]; do + lnprog "$NCGRACE" + NCGRACE="$((NCGRACE-1))" + sleep 1 + done + lnok + fi fi -lnok -lnbegin "Grace period with maintenance mode" -while [ "$NCGRACE" -ge 1 ]; do - lnprog "$NCGRACE" - NCGRACE="$((NCGRACE-1))" - sleep 1 -done -lnok -lnbegin 'Move old Nextcloud folder' -lnprog 'folder backup removal' -if ! /usr/bin/sudo rm -rf "${NCAPPLDIR}.bak" >/dev/null 2>&1; then - lnfail 'folder backup removal failed' - exit 134 -fi -lnprog 'folder backup' -if ! /usr/bin/sudo /usr/bin/mv -v "${NCAPPLDIR}" "${NCAPPLDIR}.bak" >/dev/null 2>&1; then - lnfail 'folder backup failed' - exit 135 +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin 'Move old Nextcloud folder' + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + lnprog 'folder backup removal' + if ! /usr/bin/sudo rm -rf "${NCAPPLDIR}.bak" >/dev/null 2>&1; then + lnfail 'folder backup removal failed' + exit 134 + fi + lnprog 'folder backup' + if ! /usr/bin/sudo /usr/bin/mv -v "${NCAPPLDIR}" "${NCAPPLDIR}.bak" >/dev/null 2>&1; then + lnfail 'folder backup failed' + exit 135 + fi + lnok + fi fi -lnok -lnbegin 'NC download extraction' -if ! /usr/bin/sudo /usr/bin/install -dm'0750' -o"$NCUSER" -g"$NCUSER" "$NCAPPLDIR" > /dev/null 2>&1; then - lnfail 'folder creation failed' - exit 136 -elif ! MYTMP="$(/usr/bin/sudo -u "$NCUSER" /usr/bin/mktemp -d -p /tmp nextcloud.XXXXXX 2>/dev/null)"; then - lnfail 'temp creation failed' - exit 137 -elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/tar -C "$MYTMP" --checkpoint-action='.' --checkpoint=16384 \ - -xjf "${NCDLTGT}/nextcloud-${1}.tar.bz2"; then - lnfail 'tarball extraction failed' - exit 138 -elif [ "$(/usr/bin/sudo -u "$NCUSER" /usr/bin/find "$MYTMP" -mindepth 1 -maxdepth 1 -name 'nextcloud' 2>/dev/null | wc -w)" -ne 1 ]; then - lnfail 'subfolder nextcloud not found' - exit 139 -elif ! /usr/bin/sudo rsync -rlptD "${MYTMP}/nextcloud/" "${NCAPPLDIR}/" >/dev/null 2>&1; then - lnfail 'folder sync failed' - exit 140 + +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin 'NC download extraction' + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + if ! /usr/bin/sudo /usr/bin/install -dm'0750' -o"$NCUSER" -g"$NCUSER" "$NCAPPLDIR" > /dev/null 2>&1; then + lnfail 'folder creation failed' + exit 136 + elif ! MYTMP="$(/usr/bin/sudo -u "$NCUSER" /usr/bin/mktemp -d -p /tmp nextcloud.XXXXXX 2>/dev/null)"; then + lnfail 'temp creation failed' + exit 137 + elif ! /usr/bin/sudo -u "$NCUSER" /usr/bin/tar -C "$MYTMP" --checkpoint-action='.' --checkpoint=16384 \ + -xjf "${NCDLTGT}/nextcloud-${1}.tar.bz2"; then + lnfail 'tarball extraction failed' + exit 138 + elif [ "$(/usr/bin/sudo -u "$NCUSER" /usr/bin/find "$MYTMP" -mindepth 1 -maxdepth 1 -name 'nextcloud' 2>/dev/null | wc -w)" -ne 1 ]; then + lnfail 'subfolder nextcloud not found' + exit 139 + elif ! /usr/bin/sudo rsync -rlptD "${MYTMP}/nextcloud/" "${NCAPPLDIR}/" >/dev/null 2>&1; then + lnfail 'folder sync failed' + exit 140 + fi + lnok + fi fi -lnok + function ctrl_c { printf '\n' lnbegin 'Caught TERM/INT, aborting.' lnquit - if ! /usr/bin/sudo /usr/bin/rm -rf "$MYTMP"; then - exit 141 + if [[ "$NC_COREUPD" -eq 1 ]]; then + if ! /usr/bin/sudo /usr/bin/rm -rf "$MYTMP"; then + exit 141 + fi fi exit 130 } trap ctrl_c INT trap ctrl_c TERM -lnbegin 'Temp dir removal' -if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/rm -rf "$MYTMP" >/dev/null 2>&1; then - lnfail 142 + +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin 'Temp dir removal' + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/rm -rf "$MYTMP" >/dev/null 2>&1; then + lnfail 142 + fi + lnok + fi fi -lnok -lnbegin 'Sync old config/apps' -# do use trailing slashes for folders here, we are rsyncing! -for src in 'config/config.php' 'apps/' 'apps-extras/' 'apps-external/'; do - lnprog "$src" - if ! stat -tL "${NCAPPLDIR}.bak/$src" >/dev/null 2>&1; then - lnprog "$src not existing in backup" - sleep 0.314159 - continue + +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin 'Sync old config/apps' + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + # do use trailing slashes for folders here, we are rsyncing! + for src in 'config/config.php' 'apps/' 'apps-extras/' 'apps-external/'; do + lnprog "$src" + if ! stat -tL "${NCAPPLDIR}.bak/$src" >/dev/null 2>&1; then + lnprog "$src not existing in backup" + sleep 0.314159 + continue + fi + if ! /usr/bin/sudo /usr/bin/rsync -rulptgoD "${NCAPPLDIR}.bak/$src" "${NCAPPLDIR}/$src" >/dev/null 2>&1; then + lnfail "syncing $src failed" + exit 143 + fi + done + lnok fi - if ! /usr/bin/sudo /usr/bin/rsync -rulptgoD "${NCAPPLDIR}.bak/$src" "${NCAPPLDIR}/$src" >/dev/null 2>&1; then - lnfail "syncing $src failed" - exit 143 +fi + +if [ "$NC_COREUPD" -gt 0 ]; then + lnbegin "Nextcloud file permissions" + if [ "$NC_COREUPD" -gt 1 ]; then + lnskip + else + if ! /usr/bin/sudo /usr/bin/chown -R "${NCUSER}:" "${NCAPPLDIR}/" >/dev/null 2>&1 && \ + /usr/bin/sudo /usr/bin/chmod o-rwx "${NCAPPLDIR}/" >/dev/null 2>&1; then + lnfail + exit 144 + fi + lnok fi -done -lnok -lnbegin "Nextcloud file permissions" -if ! /usr/bin/sudo /usr/bin/chown -R "${NCUSER}:" "${NCAPPLDIR}/" >/dev/null 2>&1 && \ - /usr/bin/sudo /usr/bin/chmod o-rwx "${NCAPPLDIR}/" >/dev/null 2>&1; then - lnfail - exit 144 fi -lnok -# TODO: make update check decide on whether to update +# Play it safe: disable maintenance mode independent of what was executed before. Currently, this +# gives an output of "already disabled" and RC=0, so we're fine. lnbegin 'Disabling maintenance mode' if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" 'maintenance:mode' '--off' >/dev/null 2>&1; then lnfail 'disabling failed' @@ -136,15 +234,19 @@ if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCAPPLDIR}/occ" >/dev/null lnfail exit 145 fi +# Play it safe: Run the upgrade command in any case. Doesn't hurt; unless necessary it'll tell that there's +# "No upgrade required." and give an RC=0 in any case, so we're fine. lnprog "occ upgrade" if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" upgrade -q >/dev/null 2>&1; then lnfail exit 146 fi -lnprog "occ app:update --all" -if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" app:update -q --all >/dev/null 2>&1; then - lnfail "occ app:update" - exit 147 +if [ "$NC_APPSUPD" -eq 1 ]; then + lnprog "occ app:update --all" + if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" app:update -q --all >/dev/null 2>&1; then + lnfail "occ app:update" + exit 147 + fi fi lnprog "occ db:add-missing-primary-keys" if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" db:add-missing-primary-keys -q >/dev/null 2>&1; then @@ -161,9 +263,12 @@ if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" db:add-missing-in lnfail "occ db:add-missing-indices" exit 150 fi -lnprog "cron.php" -if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" -f "${NCAPPLDIR}/cron.php" 2>/dev/null; then - lnfail "cron.php" - exit 151 +if [[ "$NC_APPSUPD" -eq 1 || "$NC_COREUPD" -eq 1 ]]; then + lnprog "cron.php" + if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" -f "${NCAPPLDIR}/cron.php" 2>/dev/null; then + lnfail "cron.php" + exit 151 + fi + sleep 1 fi lnok |