diff options
Diffstat (limited to 'bin/nextcloud-upgrade')
-rwxr-xr-x | bin/nextcloud-upgrade | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/bin/nextcloud-upgrade b/bin/nextcloud-upgrade new file mode 100755 index 0000000..7b222de --- /dev/null +++ b/bin/nextcloud-upgrade @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +# Error codes: 131-159 (130 is reserved for sigint et al!) + +[ -z "$1" ] && printf 'Usage: %b VERSION\n' "$(basename "$0")" >&2 && exit 101 +# shellcheck disable=SC1091 +source /etc/lirion/nextcloud.conf || exit 102 +# shellcheck disable=SC1091 +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 +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 +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 +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 +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 + 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 +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 + 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 +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 +lnbegin 'Disabling maintenance mode' +if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" 'maintenance:mode' '--off' >/dev/null 2>&1; then + lnfail 'disabling failed' + exit 152 +fi +lnok +lnbegin "Nextcloud upgrade" +if ! /usr/bin/sudo -u "$NCUSER" /usr/bin/stat -tL "${NCAPPLDIR}/occ" >/dev/null 2>&1 &&\ + [ "$(/usr/bin/sudo -u "$NCUSER" /usr/bin/stat -c '%f' "${NCAPPLDIR}/occ" 2>/dev/null)" != '81a0' ]; then + lnfail + exit 145 +fi +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" +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 +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 + lnfail "occ db:add-missing-primary-keys" + exit 148 +fi +lnprog "occ db:add-missing-columns" +if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" db:add-missing-columns -q >/dev/null 2>&1; then + lnfail "occ db:add-missing-columns" + exit 149 +fi +lnprog "occ db:add-missing-indices" +if ! /usr/bin/sudo -u "$NCUSER" "$NCPHPBIN" "${NCAPPLDIR}/occ" db:add-missing-indices -q >/dev/null 2>&1; then + 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 +fi +lnok |