#!/bin/bash #================================================= # GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= source _common.sh source /usr/share/yunohost/helpers ynh_abort_if_errors #================================================= # LOAD 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) #================================================= # 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==||") previous_version_file="../conf/settings_history/settings.$previous_version.py" test -e "$previous_version_file" || ynh_die "Previous version unknown: $previous_version" #================================================= # ENSURE 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 # (<2.17) if [ -z "$db_name" ]; then # If db_name doesn't exist, create it db_name=$(ynh_sanitize_dbid "$app") ynh_app_setting_set "$app" db_name "$db_name" fi settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" # (<2.17) save memc_port if it doesn't exist if [[ -z "$memc_port" ]] then memc_port=$(cat "$settings" \ | grep "'LOCATION': '127.0.0.1:" \ | sed "s|.*:\\(.*\\)'.*|\\1|") ynh_app_setting_set "$app" memc_port "$memc_port" fi # (<2.18) migrade old uwsgi files if existing if [ -e "/etc/systemd/system/$app.service" ] then systemctl stop "$app.service" systemctl disable "$app.service" yunohost service remove "$app.service" ynh_secure_remove "$final_path/uwsgi.ini" ynh_secure_remove "/etc/systemd/system/$app.service" fi # (<2.20) remove your old sockets! if [ -e "/etc/systemd/system/uwsgi-app@$app.socket" ] then systemctl stop "uwsgi-app@$app.socket" yunohost service remove "uwsgi-app@$app.socket" ynh_secure_remove "/etc/systemd/system/uwsgi-app@.socket" systemctl daemon-reload fi # (<2.18) move hub to the correct folder if [ -e "$final_path/bin/hub" ] then mv "$final_path/bin/hub" /usr/bin/ chown root:root /usr/bin/hub fi if [[ -d "$final_path/bin/" ]] then ynh_secure_remove "$final_path/bin/" fi # Weblate requires an update to 3.0 before 3.1 # the upgrade hook will launch this script again to make sure it works if [[ -z "$migration311" ]] then # $migration311 is not set, version is <3.0 migration311="two_steps_upgrade_3.0to3.1-needed" mig_type=$(cat "/etc/yunohost/apps/$YNH_APP_ID/status.json" | sed -e 's/.*"type":.*"\(.\+\)".*/\1/gi') if [ "$mig_type" = "file" ] then mig_parm=$(cat "/etc/yunohost/apps/$YNH_APP_ID/status.json" | sed -e 's/.*"path": "\(.\+\)",.*/\1/gi') else mig_parm=$(cat "/etc/yunohost/apps/$YNH_APP_ID/status.json" | sed -e 's/.*"url": "\(.\+\)", "type".*/\1/gi') fi ynh_app_setting_set "$app" migration311 "$migration311" ynh_app_setting_set "$app" migration311_type "$mig_type" ynh_app_setting_set "$app" migration311_parm "$mig_parm" current_version="3.0.1" fi # Make sure the uwsgi service is stoped if [[ -e "/var/run/uwsgi/$app.socket" ]] then systemctl stop "uwsgi-app@$app.service" fi #================================================= # CHECK THE PATH #================================================= # Normalize the URL path syntax path_url=$(ynh_normalize_url_path "$path_url") #================================================= # STANDARD UPGRADE STEPS #================================================= # 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 #================================================= # CREATE DEDICATED USER #================================================= # Create a system user ynh_system_user_create "$app" "/home/$app" chsh --shell /bin/bash "$app" #================================================= # SPECIFIC UPGRADE #================================================= # Update dependencies #================================================= ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \ mailutils #================================================= # SPECIFIC SETUP uwsgi #================================================= ynh_add_uwsgi_service # 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" ynh_store_file_checksum "$finaluwsgiini" fi #================================================= # PIP INSTALLATION #================================================= # save old settings file cp "$settings" "$final_path/settings.$previous_version.old.py" old_settings="./settings.$previous_version.old.py" settings_diff="$final_path/settings.${previous_version}_${current_version}.diff" ( 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 Weblate=="$current_version" pip install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2-binary python-memcached phply # specific to YunoHost package: pip install django_sendmail_backend ) 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_file" "$old_settings" weblate_fill_settings "$old_settings" # store diff between defaults and local settings diff --unified "$old_settings" "$settings" > "$settings_diff" # generate new defaults settings cp "../conf/settings_history/settings.$current_version.py" "$settings" weblate_fill_settings "$settings" # send diff to the server administrator mail_message=" Weblate was updated from version $previous_version to $current_version This is a MAJOR upgrade, please read this: https://docs.weblate.org/en/latest/admin/upgrade.html#upgrade-3 A new settings.py has been created in: $settings You may have changed your defaults settings. To help you to apply it again, here is a diff file with every changes you did. Diff has been created in: $settings_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." # generate new defaults settings cp "../conf/settings_history/settings.$current_version.py" "$settings" weblate_fill_settings "$settings" fi #================================================= # Run migration scripts #================================================= ( set +o nounset source "${final_path}/venv/bin/activate" set -o nounset export DJANGO_SETTINGS_MODULE="weblate.settings" cd "${final_path}" # https://docs.weblate.org/en/latest/admin/upgrade.html#upgrade-3 # https://github.com/WeblateOrg/docker/blob/386aa8d98bb57dfec3707680827d4e4f4d79e3fd/start#L81-L88 if [[ $current_version = "3.0.1" ]] then weblate showmigrations --plan > /tmp/migrations.txt if grep -Fq '[X] auth.0001_initial' /tmp/migrations.txt && grep -Fq '[ ] weblate_auth.0001_initial' /tmp/migrations.txt ; then ynh_replace_string "AUTH_USER_MODEL" "#AUTH_USER_MODEL" "$settings" weblate migrate weblate_auth 0001 ynh_replace_string "#AUTH_USER_MODEL" "AUTH_USER_MODEL" "$settings" fi ynh_secure_remove /tmp/migrations.txt fi weblate migrate --noinput weblate collectstatic --noinput weblate setuplang weblate setupgroups if [[ $previous_version = "2.16" ]] || \ [[ $previous_version = "2.17.1" ]] || \ [[ $previous_version = "2.18" ]] then weblate loadpo --all --lang dsb weblate loadpo --all --lang he weblate loadpo --all --lang hsb weblate loadpo --all --lang kw weblate loadpo --all --lang lt weblate loadpo --all --lang lv fi ) # Recalculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" #================================================= # SETUP CRON #================================================= 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" #================================================= # 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 #================================================= 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 #================================================= systemctl start "uwsgi-app@$app.service" #================================================= # RELOAD NGINX #================================================= systemctl reload nginx