#!/bin/bash #================================================= # GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= source _common.sh source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME path_url=$(ynh_app_setting_get "$app" path) is_public=$(ynh_app_setting_get "$app" is_public) final_path=$(ynh_app_setting_get "$app" final_path) db_name=$(ynh_app_setting_get "$app" db_name) domain=$(ynh_app_setting_get "$app" domain) db_pwd=$(ynh_app_setting_get "$app" psqlpwd) admin=$(ynh_app_setting_get "$app" admin) admin_mail=$(ynh_user_get_info "$admin" mail) memc_port=$(ynh_app_setting_get "$app" memc_port) github_account=$(ynh_app_setting_get "$app" github_account) migration311=$(ynh_app_setting_get "$app" migration311) key=$(ynh_string_random 24)$(ynh_string_random 24)$(ynh_string_random 2) redis_db=$(ynh_app_setting_get "$app" redis_db) #================================================= # Get previous version number #================================================= ynh_script_progression --message="Get previous version number..." ( set +o nounset source "${final_path}/venv/bin/activate" set -o nounset pip install --upgrade pip pip freeze --local > freeze.pip ) previous_version=$(cat freeze.pip | grep "Weblate==" | sed "s|Weblate==||") ynh_secure_remove freeze.pip previous_version_template="../conf/settings_history/settings.$previous_version.py" test -e "$previous_version_template" || ynh_die "Previous version unknown: $previous_version" #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { # restore it if the upgrade fails ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= ynh_script_progression --message="Ensuring downward compatibility..." if [ "$is_public" = "Yes" ]; then ynh_app_setting_set "$app" is_public 1 # Fix is_public as a boolean value is_public=1 elif [ "$is_public" = "No" ]; then ynh_app_setting_set "$app" is_public 0 is_public=0 fi if [[ -d "$final_path/bin/" ]] then ynh_secure_remove "$final_path/bin/" fi # (<3.8) log cleanups if [[ -e "/var/log/uwsgi/app/$app" ]] then ynh_systemd_action --service_name="$app" --action="stop" ynh_systemd_action --service_name="$app-celery" --action="stop" ynh_secure_remove "/var/log/uwsgi/app/$app" ynh_secure_remove "/var/log/$app-celery" fi #================================================= # CHECK THE PATH #================================================= # Normalize the URL path syntax path_url=$(ynh_normalize_url_path "$path_url") #================================================= # STANDARD UPGRADE STEPS #================================================= # STOP SYSTEMD SERVICE #================================================= ynh_script_progression --message="Stopping systemd services..." ynh_systemd_action --service_name="$app" --action="stop" ynh_systemd_action --service_name="$app-celery" --action="stop" #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Upgrading nginx web server configuration..." # Create a dedicated nginx config ynh_add_nginx_config if [ "$path_url" == "/" ] then # $finalnginxconf comes from ynh_add_nginx_config ynh_replace_string "location //" "location /" "$finalnginxconf" # ynh panel is only comptable with non-root installation ynh_replace_string " include conf.d/" " #include conf.d/" "$finalnginxconf" ynh_store_file_checksum "$finalnginxconf" fi #================================================= # SPECIFIC UPGRADE #================================================= # Update dependencies #================================================= ynh_install_app_dependencies "$pkg_dependencies" #================================================= # CREATE DEDICATED USER #================================================= ynh_script_progression --message="Making sure dedicated system user exists..." # Create a system user ynh_system_user_create "$app" "$final_path" chsh --shell /bin/bash "$app" #================================================= # SPECIFIC SETUP uwsgi #================================================= ynh_script_progression --message="Configure uwsgi..." finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" cp ../conf/uwsgi.ini "$finaluwsgiini" ynh_replace_string "__FINALPATH__" "$final_path" "$finaluwsgiini" ynh_replace_string "__PATH__" "$path_url" "$finaluwsgiini" ynh_replace_string "__APP__" "$app" "$finaluwsgiini" ynh_replace_string "__PYTHONPATH__" "$weblate_pypath" "$finaluwsgiini" # root install doesn't require uwsgi to handle script names if [ "$path_url" == "/" ] then ynh_replace_string "manage-script-name = true" "manage-script-name = false" "$finaluwsgiini" fi ynh_add_systemd_config "$app" "weblate.service" ynh_store_file_checksum "$finaluwsgiini" #================================================= # PIP INSTALLATION #================================================= ynh_script_progression --message="Install weblate using PIP..." --weight=10 ( set +o nounset source "${final_path}/venv/bin/activate" set -o nounset pip install --upgrade pip # prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers" pip install --upgrade setuptools pip install Django==2.2.* pip install Weblate=="$current_version" pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis aeidon ruamel.yaml # specific to YunoHost package: pip install django_sendmail_backend ) #================================================= # CONFIG FILE UPGRADE #================================================= ynh_script_progression --message="Create weblate configuration file..." # save old settings file settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" old_settings="$final_path/settings.$previous_version.old.py" cp "$settings" "$old_settings" check=$(ynh_check_if_checksum_is_different "$settings") if [[ "$check" -eq 1 ]] then echo "Settings.py was modified localy, running diff before using the new default file for $current_version." # generate previous defaults settings cp "$previous_version_template" "$old_settings" weblate_fill_settings "$old_settings" # store diff between defaults and local settings set +eu diff --unified "$old_settings" "$settings" > "$final_path/settings.${previous_version}_${current_version}.diff" set -eu # send diff to the server administrator mail_message=" Weblate was updated from version $previous_version to $current_version Please read: https://docs.weblate.org/en/latest/admin/upgrade.html A new settings.py has been created: $settings You may have changed your defaults settings. To help you, here is a diff file with every changes you did. Diff has been created in: $final_path/settings.${previous_version}_${current_version}.diff Please note secret key is updated, this is normal. For any issue, please file a bug in: https://github.com/YunoHost-Apps/weblate_ynh " ynh_send_readme_to_admin "$mail_message" root "$admin_mail" else echo "Settings.py was not modified, using the new default file for $current_version." fi # generate new defaults settings cp "../conf/settings_history/settings.$current_version.py" "$settings" weblate_fill_settings "$settings" ynh_secure_remove "$old_settings" #================================================= # ACTIVATE CELERY #================================================= ynh_script_progression --message="Configure celery..." celeryconf="$final_path/celery-weblate" cp ../conf/celery-weblate "$celeryconf" ynh_replace_string "__APP__" "$app" "$celeryconf" ynh_replace_string "__FINALPATH__" "$final_path" "$celeryconf" ynh_add_systemd_config "$app-celery" "celery-weblate.service" #================================================= # Run migration scripts #================================================= ynh_script_progression --message="Run migration scripts..." ( set +o nounset source "${final_path}/venv/bin/activate" set -o nounset export DJANGO_SETTINGS_MODULE="weblate.settings" cd "${final_path}" weblate migrate --noinput weblate collectstatic --noinput weblate setuplang weblate setupgroups ) # Recalculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" #================================================= # SETUP CRON #================================================= ynh_script_progression --message="Configure cron file..." cp ../conf/cron "/etc/cron.d/$app" ynh_replace_string "__APP__" "$app" "/etc/cron.d/$app" ynh_replace_string "__FINALPATH__" "$final_path/" "/etc/cron.d/$app" #================================================= # SETUP LOGROTATE #================================================= ynh_script_progression --message="Upgrading logrotate configuration..." # Use logrotate to manage app-specific logfile(s) ynh_use_logrotate #================================================= # GENERIC FINALIZATION #================================================= # SECURE FILES AND DIRECTORIES #================================================= # Set right permissions for curl installation chown -R root:root "$final_path" chown -R "$app": "$final_path/data" mkdir -p "$final_path/avatar-cache" chown -R "$app": "$final_path/avatar-cache" #================================================= # SETUP SSOWAT #================================================= ynh_script_progression --message="Configuring SSOwat..." if [ $is_public -eq 0 ] then # Remove the public access ynh_app_setting_delete "$app" skipped_uris fi # Make app public if necessary if [ $is_public -eq 1 ] then # unprotected_uris allows SSO credentials to be passed anyway ynh_app_setting_set "$app" unprotected_uris "/" # ynh panel is not needed ynh_replace_string " include conf.d/" " #include conf.d/" "$finalnginxconf" ynh_store_file_checksum "$finalnginxconf" fi #================================================= # Restart weblate #================================================= ynh_script_progression --message="Starting weblate's services..." ynh_systemd_action --service_name="$app" --action="start" ynh_systemd_action --service_name="$app-celery" --action="start" #================================================= # RELOAD NGINX #================================================= ynh_script_progression --message="Reloading nginx web server..." ynh_systemd_action --service_name="nginx" --action="reload" #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Upgrade of $app completed" --last