#!/bin/bash # Load common variables and helpers source ./_common.sh # Source app helpers source /usr/share/yunohost/helpers # Set app specific variables app=$APPNAME dbname=$app dbuser=$app # Backup the current version of the app, restore it if the upgrade fails backup_number=1 old_backup_number=2 if sudo yunohost backup list | grep -q $app-before-upgrade1 > /dev/null 2>&1; then # Vérifie l'existence d'une archive déjà numéroté à 1. backup_number=2 # Et passe le numéro de l'archive à 2 old_backup_number=1 fi ynh_app_setting_set $app backup_core_only 1 # Indique au backup/restore de ne pas sauvegarder le dossier de data, uniquement le core de nextcloud. sudo yunohost backup create --ignore-hooks --apps $app --name $app-before-upgrade$backup_number # Créer un backup différent de celui existant. if [ "$?" -eq 0 ]; then # Si le backup est un succès, supprime l'archive précédente. if sudo yunohost backup list | grep -q $app-before-upgrade$old_backup_number > /dev/null 2>&1; then # Vérifie l'existence de l'ancienne archive avant de la supprimer, pour éviter une erreur. sudo yunohost backup delete $app-before-upgrade$old_backup_number > /dev/null fi else # Si le backup a échoué ynh_die "Backup failed, the upgrade process was aborted." fi EXIT_PROPERLY () { exit_code=$? if [ "$exit_code" -eq 0 ]; then ynh_app_setting_delete $app backup_core_only exit 0 # Quitte sans erreur si le script se termine correctement. fi trap '' EXIT set +eu echo "Upgrade failed." >&2 if sudo yunohost backup list | grep -q $app-before-upgrade$backup_number > /dev/null 2>&1; then # Vérifie l'existence de l'archive avant de supprimer l'application et de restaurer sudo yunohost app remove $app # Supprime l'application avant de la restaurer. sudo yunohost backup restore --ignore-hooks $app-before-upgrade$backup_number --apps $app --force # Restore the backup if upgrade failed ynh_die "The app was restored to the way it was before the failed upgrade." fi } set -eu trap EXIT_PROPERLY EXIT # Migrate from ownCloud to Nextcloud if [[ $YNH_APP_INSTANCE_NAME != $app ]]; then [[ $YNH_APP_ID == owncloud ]] \ || ynh_die "Incompatible application to migrate to Nextcloud" # check that Nextcloud is not already installed (sudo yunohost app list --installed -f "$app" | grep -q id) \ && ynh_die "Nextcloud is already installed" # retrieve ownCloud app settings real_app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get "$real_app" domain) oc_dbpass=$(ynh_app_setting_get "$real_app" mysqlpwd) oc_dbname=$real_app oc_dbuser=$real_app # remove nginx and php-fpm configuration files sudo rm -f \ "/etc/nginx/conf.d/${domain}.d/${real_app}.conf" \ "/etc/php5/fpm/pool.d/${real_app}.conf" \ "/etc/cron.d/${real_app}" # reload services to disable ownCloud sudo service php5-fpm reload || true sudo service nginx reload || true # remove dependencies package ynh_package_remove owncloud-deps || true # clean new destination and data directories DESTDIR="/var/www/$app" DATADIR="/home/yunohost.app/${app}/data" sudo rm -rf "$DESTDIR" "/home/yunohost.app/$app" # rename ownCloud folders sudo mv "/var/www/$real_app" "$DESTDIR" sudo mv "/home/yunohost.app/$real_app" "/home/yunohost.app/$app" sudo sed -ri "s#^(\s*'datadirectory' =>).*,#\1 '${DATADIR}',#" \ "/var/www/${app}/config/config.php" # rename the MySQL database rename_mysql_db "$oc_dbname" "$oc_dbuser" "$oc_dbpass" "$dbname" "$dbuser" sudo sed -ri "s#^(\s*'dbname' =>).*,#\1 '${dbname}',#" \ "/var/www/${app}/config/config.php" sudo sed -ri "s#^(\s*'dbuser' =>).*,#\1 '${dbuser}',#" \ "/var/www/${app}/config/config.php" # rename ownCloud system group and account sudo groupmod -n "$app" "$real_app" sudo usermod -l "$app" "$real_app" else real_app=$app # handle old migrations from ownCloud curr_dbname=$(sudo cat "/var/www/${app}/config/config.php" \ | grep dbname | sed "s|.*=> '\(.*\)'.*|\1|g") if [[ $curr_dbname != $dbname ]]; then curr_dbuser=$(sudo cat "/var/www/${app}/config/config.php" \ | grep dbuser | sed "s|.*=> '\(.*\)'.*|\1|g") dbpass=$(ynh_app_setting_get "$real_app" mysqlpwd) # rename the MySQL database rename_mysql_db "$curr_dbname" "$curr_dbuser" "$dbpass" "$dbname" "$dbuser" sudo sed -ri "s#^(\s*'dbname' =>).*,#\1 '${dbname}',#" \ "/var/www/${app}/config/config.php" sudo sed -ri "s#^(\s*'dbuser' =>).*,#\1 '${dbuser}',#" \ "/var/www/${app}/config/config.php" fi fi # Retrieve app settings domain=$(ynh_app_setting_get "$real_app" domain) path=$(ynh_app_setting_get "$real_app" path) path=${path%/} dbpass=$(ynh_app_setting_get "$real_app" mysqlpwd) user_home=$(ynh_app_setting_get "$real_app" user_home) # Check destination directory DESTDIR="/var/www/$app" [[ ! -d $DESTDIR ]] && ynh_die \ "The destination directory '$DESTDIR' does not exist.\ The app is not correctly installed, you should remove it first." # Check app's data directory DATADIR="/home/yunohost.app/${app}/data" [[ ! -d $DATADIR ]] && ynh_die \ "The data directory '$DATADIR' does not exist.\ The app is not correctly installed, you should remove it first." # Upgrade dependencies ynh_package_install_from_equivs ../conf/${DEPS_PKG_NAME}.control \ || ynh_die "Unable to upgrade dependencies" # FIXME: Delete current nginx configuration to be able to check if # .well-known is already served. See https://dev.yunohost.org/issues/400 nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf" sudo rm -f "$nginx_conf" sudo service nginx reload # Copy and set nginx configuration sed -i "s@#APP#@${app}@g" ../conf/nginx.conf sed -i "s@#PATH#@${path}@g" ../conf/nginx.conf sed -i "s@#LOCATION#@${path:-/}@g" ../conf/nginx.conf sed -i "s@#DESTDIR#@${DESTDIR}@g" ../conf/nginx.conf # do not serve .well-known if it's already served on the domain if is_url_handled "https://${domain}/.well-known/caldav" ; then sed -ri '/^location = \/\.well\-known\/(caldav|carddav) \{/,/\}/d' \ ../conf/nginx.conf fi sudo cp ../conf/nginx.conf "$nginx_conf" # Copy and set php-fpm configuration phpfpm_conf="/etc/php5/fpm/pool.d/${app}.conf" sed -i "s@#USER#@${app}@g" ../conf/php-fpm.conf sed -i "s@#GROUP#@${app}@g" ../conf/php-fpm.conf sed -i "s@#POOLNAME#@${app}@g" ../conf/php-fpm.conf sed -i "s@#DESTDIR#@${DESTDIR}/@g" ../conf/php-fpm.conf sudo cp ../conf/php-fpm.conf "$phpfpm_conf" sudo chown root: $phpfpm_conf sudo chmod 644 $phpfpm_conf # Set system group in hooks sed -i "s@#GROUP#@${app}@g" ../hooks/post_user_create # occ helper for the current installation _exec_occ() { exec_occ "$DESTDIR" "$app" $@ } # Retrieve new Nextcloud sources in a temporary directory TMPDIR=$(ynh_mkdir_tmp) extract_nextcloud "$TMPDIR" # Copy Nextcloud configuration file nc_conf="${DESTDIR}/config.json" sed -i "s@#DOMAIN#@${domain}@g" ../conf/config.json sed -i "s@#DATADIR#@${DATADIR}@g" ../conf/config.json sudo cp ../conf/config.json "${TMPDIR}/config.json" # Enable maintenance mode _exec_occ maintenance:mode --on # Copy config and 3rd party applications from current directory sudo cp -a "${DESTDIR}/config/config.php" "${TMPDIR}/config/config.php" for a in $(sudo ls "${DESTDIR}/apps"); do [[ ! -d "${TMPDIR}/apps/$a" ]] \ && sudo cp -a "${DESTDIR}/apps/$a" "${TMPDIR}/apps/$a" done # Rename existing app directory and move new one sudo rm -rf "${DESTDIR}" sudo mv "$TMPDIR" "$DESTDIR" # Set app folders ownership sudo chown -R $app: "$DESTDIR" "$DATADIR" # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) # TODO: Restore old directory in case of failure? _exec_occ maintenance:mode --off _exec_occ upgrade \ || ([[ $? -eq 3 ]] || ynh_die "Unable to upgrade Nextcloud") # Ensure that UpdateNotification app is disabled _exec_occ app:disable updatenotification # Enable plugins and set Nextcloud configuration _exec_occ app:enable user_ldap _exec_occ config:import "$nc_conf" sudo rm -f "$nc_conf" # Guess user_home value if empty if [[ -z "${user_home:-}" ]]; then sudo cat "${DATADIR}/mount.json" >/dev/null 2>&1 \ && user_home=1 \ || user_home=0 ynh_app_setting_set "$real_app" user_home "$user_home" fi # Enable External Storage and create local mount to home folder as needed if [[ ${user_home} -eq 1 ]]; then _exec_occ app:enable files_external _exec_occ files_external:list --output=json \ | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ || create_home_external_storage '_exec_occ' fi # Add dynamic logout URL to the config # TODO: if changes are made to this section, replace it with new one. _exec_occ config:system:get logout_url >/dev/null 2>&1 \ || sudo su -c "echo \" //-YunoHost- // set logout_url according to main domain \\\$main_domain = exec('cat /etc/yunohost/current_host'); \\\$CONFIG['logout_url'] = 'https://'.\\\$main_domain.'/yunohost/sso/?action=logout'; //-YunoHost- \" >> ${DESTDIR}/config/config.php" -- $app # Iterate over users to extend their home folder permissions - for the external # storage plugin usage - and create relevant Nextcloud directories for u in $(ynh_user_list); do sudo mkdir -p "${DATADIR}/${u}" sudo setfacl -m g:$app:rwx "/home/$u" || true done # Fix app ownerships & permissions sudo find ${DESTDIR}/ -type f -print0 | sudo xargs -0 chmod 0644 sudo find ${DESTDIR}/ -type d -print0 | sudo xargs -0 chmod 0755 sudo find ${DATADIR}/ -type f -print0 | sudo xargs -0 chmod 0640 sudo find ${DATADIR}/ -type d -print0 | sudo xargs -0 chmod 0750 sudo chmod 640 "${DESTDIR}/config/config.php" sudo chmod 755 /home/yunohost.app # Set SSOwat rules ynh_app_setting_set "$real_app" unprotected_uris "/" ynh_app_setting_set "$real_app" skipped_regex \ "$(sed 's/[\.\-]/\%&/g' <<< $domain)/%.well%-known/.*" # Reload services sudo service php5-fpm restart || true sudo service nginx reload || true # Add cron job cron_path="/etc/cron.d/$app" sed -i "s@#USER#@${app}@g" ../conf/nextcloud.cron sed -i "s@#DESTDIR#@${DESTDIR}@g" ../conf/nextcloud.cron sudo cp ../conf/nextcloud.cron "$cron_path" sudo chmod 644 "$cron_path" _exec_occ background:cron # Finish ownCloud migration if [[ $real_app != $app ]]; then echo "ownCloud has been successfully migrated to Nextcloud! \ A last scheduled operation will run in a couple of minutes to finish the \ migration in YunoHost side. Do not proceed any application operation while \ you don't see Nextcloud as installed." >&2 # install cron job and script for final migration step script_path="/usr/local/sbin/owncloud-migration.sh" sed -i "s@#APP#@${real_app}@g" ../conf/owncloud-migration.sh sudo cp ../conf/owncloud-migration.sh "$script_path" sudo chmod 755 "$script_path" cron_path="/etc/cron.d/owncloud-migration" echo "*/1 * * * * root $script_path" | sudo tee "$cron_path" >/dev/null sudo chmod 644 "$cron_path" fi # Warn about possible disabled apps echo "Note that if you've installed some third-parties Nextcloud applications, \ they are probably disabled and you'll have to manually activate them again." >&2