#!/usr/bin/env bash # AUTHOR: coding@lirion.de # LICENCE: LGPL-3.0-only # 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 --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 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