diff --git a/README.md b/README.md index 0219964..fb32475 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,71 @@ -LimeSurvey for YunoHost -=============== +# LibreSurvey for YunoHost -LimeSurvey is used to create advanced poll. +[![Integration level](https://dash.yunohost.org/integration/libresurvey.svg)](https://ci-apps.yunohost.org/jenkins/job/libresurvey%20%28Community%29/lastBuild/consoleFull) +[![Install LibreSurvey with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=libresurvey) -http://www.limesurvey.org/ +> *This package allow you to install LibreSurvey quickly and simply on a YunoHost server. +If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* -**Package by:** ljf (I will maintain this package at least until beggining of 2018) +## Overview +LibreSurvey is used to create advanced poll. -**Patches author:** Shnoulle +**Shipped version:** 2.62.5 **Categories:** Productivity, Poll -**Upgrade this package:** -`sudo yunohost app upgrade --verbose LimeSurvey -u https://github.com/YunoHost-Apps/limesurvey_ynh` +## Screenshots -**Multi-user:** Yes. +![](https://www.limesurvey.org/images/news/LimeSurvey3Beta/generalsettings.PNG) -**Private/Public mode:** In private mode, only authorized YunoHost members can create poll, with the public mode, it's possible to create account to people with no YunoHost account. +## Configuration + +Before to run the install YunoHost ask you an admin user, you can use it to connecte you on https://your_libresurvey_url/admin/ + +## Documentation + +* YunoHost documentation: There no other documentations, feel free to contribute. + +## YunoHost specific features + + +* In private mode, only authorized YunoHost members can create poll, with the public mode, it's possible to create account to people with no YunoHost account. +* SSO and LDAP are configured. +* Login secured by fail2ban + +#### Multi-users support + +Not supported. + +#### Supported architectures + +* x86-64b - [![Build Status](https://ci-apps.yunohost.org/jenkins/job/leed%20(Community)/badge/icon)](https://ci-apps.yunohost.org/jenkins/job/libresurvey%20(Community)/) +* ARMv8-A - [![Build Status](https://ci-apps.yunohost.org/jenkins/job/leed%20(Community)%20(%7EARM%7E)/badge/icon)](https://ci-apps.yunohost.org/jenkins/job/libresurvey%20(Community)%20(%7EARM%7E)/) + +## Limitations + +## Additionnal informations + +## Links + + * Report a bug: https://github.com/YunoHost-Apps/libresurvey_ynh/issues + * LibreSurvey is a fork of LimeSurvey https://www.limesurvey.org + * YunoHost website: https://yunohost.org/ + +--- + +Developers infos +---------------- + +**Package by:** ljf + +**Patches author:** Shnoulle + +Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/libresurvey_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/libresurvey_ynh/tree/testing --verbose +or +sudo yunohost app upgrade leed -u https://github.com/YunoHost-Apps/libresurvey_ynh/tree/testing --verbose +``` -**SSO/LDAP:** SSO and LDAP are configured. diff --git a/app.src b/app.src deleted file mode 100644 index 6567177..0000000 --- a/app.src +++ /dev/null @@ -1,3 +0,0 @@ -SOURCE_URL=https://github.com/LimeSurvey/LimeSurvey/archive/2.64.5+170331.tar.gz -SOURCE_SUM=ede99fb149feed4a60ea83e540263c912a68fb46c7fca98cb7ff7c5d474f3dc4 -SOURCE_FILE=limesurvey2.64.5+170331.tar.gz diff --git a/check_process b/check_process index b3da0d1..b7de956 100644 --- a/check_process +++ b/check_process @@ -7,7 +7,7 @@ language="en" is_public=1 (PUBLIC|public=1|private=0) ; Checks - pkg_linter=1 + pkg_linter=0 setup_sub_dir=1 setup_root=1 setup_nourl=0 @@ -23,15 +23,18 @@ fail_download_source=0 port_already_use=0 final_path_already_use=0 + change_url=0 ;;; Levels Level 1=auto Level 2=auto Level 3=auto Level 4=1 -# https://github.com/YunoHost-Apps/limesurvey_ynh/issues/10 - Level 5=1 + Level 5=auto Level 6=auto Level 7=auto Level 8=0 Level 9=0 Level 10=0 +;;; Options +Email=ljf+libresurvey_ynh@reflexlibre.net +Notification=down diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..1c0b8b9 --- /dev/null +++ b/conf/app.src @@ -0,0 +1,3 @@ +SOURCE_URL=https://github.com/LimeSurvey/LimeSurvey/archive/2.64.5+170331.tar.gz +SOURCE_SUM=9ae345eae7443f4df7f60ac49e8514ffb30315ba9376d5464cbfe9d6aaf9469f +SOURCE_FILENAME=libresurvey2.64.5+170331.tar.gz diff --git a/conf/libreform.src b/conf/libreform.src new file mode 100644 index 0000000..1f6b0e5 --- /dev/null +++ b/conf/libreform.src @@ -0,0 +1,3 @@ +SOURCE_URL=https://github.com/zamentur/libreform/archive/40fad776c33271ecc028b9260fb7f9e300998e5f.tar.gz +SOURCE_SUM=4c0a96d610c6740ff7467cf1916a923949bf4c00e99a3cd33509335f884e138b +SOURCE_FILENAME=libreform-40fad776c33271ecc028b9260fb7f9e300998e5f.tar.gz diff --git a/conf/nginx.conf.j2 b/conf/nginx.conf.j2 index 9b741fd..608d752 100644 --- a/conf/nginx.conf.j2 +++ b/conf/nginx.conf.j2 @@ -1,9 +1,12 @@ -location {{ path }} { - alias {{ local_path }}/; +{% if path_url != "/" %} +rewrite ^{{ path_url }}$ {{ path_url }}/ permanent; +{% endif %} +location {{ path_url }}/ { + alias {{ final_path }}/; index index.php; # if (!-e $request_filename) #{ - # rewrite ^(.+)$ {{ path }}/index.php?q=$1 last; + # rewrite ^(.+)$ {{ path_url }}/index.php?q=$1 last; #} if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; @@ -24,6 +27,6 @@ location {{ path }} { include conf.d/yunohost_panel.conf.inc; } -location ~ ^{{ path }}(data|config|\.ht|db_structure\.xml|README) { +location ~ ^{{ path_url }}(data|config|\.ht|db_structure\.xml|README) { deny all; } diff --git a/conf/php-fpm.conf.j2 b/conf/php-fpm.conf.j2 index 3daf747..6464423 100644 --- a/conf/php-fpm.conf.j2 +++ b/conf/php-fpm.conf.j2 @@ -340,7 +340,7 @@ request_terminate_timeout = 1d ; Chdir to this directory at the start. ; Note: relative path can be used. ; Default Value: current directory or / when chroot -chdir = {{ local_path }} +chdir = {{ final_path }} ; Redirect worker stdout and stderr into main error log. If not set, stdout and ; stderr will be redirected to /dev/null according to FastCGI specs. diff --git a/conf/php-fpm.ini b/conf/php-fpm.ini.j2 similarity index 100% rename from conf/php-fpm.ini rename to conf/php-fpm.ini.j2 diff --git a/hooks/post_user_delete b/hooks/post_user_delete index 65ee262..30a47a8 100644 --- a/hooks/post_user_delete +++ b/hooks/post_user_delete @@ -1,4 +1,4 @@ #!/bin/bash # TODO delete user with LimeSurvey cli # An action need to be added to the cli with a patch -echo "[warn] You may need to delete this user in your LimeSurvey instances" +echo "[warn] You may need to delete this user in your LibreSurvey instances" diff --git a/manifest.json b/manifest.json index ba8b605..535c4fb 100644 --- a/manifest.json +++ b/manifest.json @@ -1,21 +1,21 @@ { - "name": "LimeSurvey", - "id": "limesurvey", + "name": "LibreSurvey", + "id": "libresurvey", "packaging_format": 1, - "version": "2.62.2", + "version": "2.62.5-1", "description": { - "en": "LimeSurvey is used to create advanced poll.", - "fr": "LimeSurvey est un outil de création et diffusion de sondage en ligne." + "en": "LibreSurvey is used to create advanced poll.", + "fr": "LibreSurvey est un outil de création et diffusion de sondage en ligne." }, "license": "GPL-2.0+", "maintainer": { "name": "ljf", - "email": "ljf@grimaud.me", + "email": "ljf+libresurvey_ynh@reflexlibre.net", "url": "http://www.limesurvey.org/" }, "url": "https://www.limesurvey.org/", "requirements": { - "yunohost": ">= 2.4" + "yunohost": ">= 2.7.2" }, "multi_instance": true, "services": [ @@ -29,8 +29,8 @@ "name": "domain", "type": "domain", "ask": { - "en": "Choose a domain for LimeSurvey", - "fr": "Choisissez un nom de domaine pour LimeSurvey" + "en": "Choose a domain for LibreSurvey", + "fr": "Choisissez un nom de domaine pour LibreSurvey" }, "example": "domain.org" }, @@ -38,8 +38,8 @@ "name": "path", "type": "path", "ask": { - "en": "Choose a path for LimeSurvey", - "fr": "Choisissez l'adresse pour LimeSurvey" + "en": "Choose a path for LibreSurvey", + "fr": "Choisissez l'adresse pour LibreSurvey" }, "example": "/poll", "default": "/poll" @@ -48,16 +48,16 @@ "name": "admin", "type": "user", "ask": { - "en": "Choose the LimeSurvey administrator (must be an existing YunoHost user)", - "fr": "Choisissez l'administrateur de LimeSurvey (doit être un utilisateur YunoHost)" + "en": "Choose the LibreSurvey administrator (must be an existing YunoHost user)", + "fr": "Choisissez l'administrateur de LibreSurvey (doit être un utilisateur YunoHost)" }, "example": "john" }, { "name": "language", "ask": { - "en": "Choose the default language of this LimeSurvey", - "fr": "Choisissez la langue par défault de LimeSurvey" + "en": "Choose the default language of this LibreSurvey", + "fr": "Choisissez la langue par défault de LibreSurvey" }, "choices": ["en", "fr","es", "de"], "default": "en" @@ -66,8 +66,8 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Will people without YunoHost account have LimeSurvey account to be able to create polls ?", - "fr": "Est-ce que des personnes sans compte YunoHost aurront un compte LimeSurvey pour créer des questionnaires ?" + "en": "Will people without YunoHost account have LibreSurvey account to be able to create polls ?", + "fr": "Est-ce que des personnes sans compte YunoHost aurront un compte LibreSurvey pour créer des questionnaires ?" }, "default": 1 } diff --git a/scripts/_common.sh b/scripts/_common.sh index 9b09134..51a92e4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,85 +1,57 @@ #!/bin/bash +#================================================= +# COMMON VARIABLES +#================================================= # App package root directory should be the parent folder PKG_DIR=$(cd ../; pwd) +pkg_dependencies="php5-cli php5-imap" + +#================================================= +# SPECIFIC HELPERS +#================================================= +set_permissions () { + + ynh_set_default_perm $final_path + find $final_path -type f -name "*.php" -print0 | xargs -0 chmod 400 \ + || echo "No file to modify" + #chown root: $final_path/application/config/config.php + chmod -R u+w $final_path/tmp + chmod -R u+w $final_path/templates + chmod -R u+w $final_path/upload + chmod -R u+w $final_path/application/config/ +} + +#================================================= +# COMMON HELPERS +#================================================= +ynh_set_default_perm () { + local DIRECTORY=$1 + # Set permissions + chown -R $app:www-data $DIRECTORY + chmod -R 440 $DIRECTORY + find $DIRECTORY -type d -print0 | xargs -0 chmod 550 \ + || echo "No file to modify" + +} ynh_check_var () { test -n "$1" || ynh_die "$2" } -ynh_exit_properly () { - exit_code=$? - if [ "$exit_code" -eq 0 ]; then - exit 0 - fi - trap '' EXIT - set +eu - echo -e "\e[91m \e[1m" - err "$app script has encountered an error." - - if type -t CLEAN_SETUP > /dev/null; then - CLEAN_SETUP - fi - - ynh_die -} - -# Activate signal capture -# Exit if a command fail, and if a variable is used unset. -# Capturing exit signals on shell script -# -# example: CLEAN_SETUP () { -# # Clean residual file un remove by remove script -# } -# ynh_trap_on -ynh_trap_on () { - set -eu - trap ynh_exit_properly EXIT # Capturing exit signals on shell script -} - ynh_export () { local ynh_arg="" for var in $@; do ynh_arg=$(echo $var | awk '{print toupper($0)}') + if [ "$var" == "path_url" ]; then + ynh_arg="PATH" + fi ynh_arg="YNH_APP_ARG_$ynh_arg" export $var=${!ynh_arg} done } -# Check availability of a web path -# -# example: ynh_path_validity $domain$path -# -# usage: ynh_path_validity $domain_and_path -# | arg: domain_and_path - complete path to check -ynh_path_validity () { - sudo yunohost app checkurl $1 -a $app -} - -# Normalize the url path syntax -# Handle the slash at the beginning of path and its absence at ending -# Return a normalized url path -# -# example: url_path=$(ynh_normalize_url_path $url_path) -# ynh_normalize_url_path example -> /example -# ynh_normalize_url_path /example -> /example -# ynh_normalize_url_path /example/ -> /example -# -# usage: ynh_normalize_url_path path_to_normalize -# | arg: url_path_to_normalize - URL path to normalize before using it -ynh_normalize_url_path () { - path=$1 - test -n "$path" || ynh_die "ynh_normalize_url_path expect a URL path as first argument and received nothing." - if [ "${path:0:1}" != "/" ]; then # If the first character is not a / - path="/$path" # Add / at begin of path variable - fi - if [ "${path:${#path}-1}" == "/" ] && [ ${#path} -gt 1 ]; then # If the last character is a / and that not the only character. - path="${path:0:${#path}-1}" # Delete the last character - fi - echo $path -} - # Check the path doesn't exist # usage: ynh_local_path_available PATH ynh_local_path_available () { @@ -94,31 +66,14 @@ ynh_local_path_available () { ynh_save_args () { for var in $@; do - ynh_app_setting_set $app $var ${!var} + local setting_var="$var" + if [ "$var" == "path_url" ]; then + setting_var="path" + fi + ynh_app_setting_set $app $setting_var ${!var} done } -# Create a database, an user and its password. Then store the password in the app's config -# -# User of database will be store in db_user's variable. -# Name of database will be store in db_name's variable. -# And password in db_pwd's variable. -# -# usage: ynh_mysql_generate_db user name -# | arg: user - Proprietary of the database -# | arg: name - Name of the database -ynh_mysql_generate_db () { - export db_user=${1//[-.]/_} # Mariadb doesn't support - and . in the name of databases. It will be replace by _ - export db_name=${2//[-.]/_} - - export db_pwd=$(ynh_string_random) # Generate a random password - ynh_check_var "$db_pwd" "db_pwd empty" - - ynh_mysql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database - - ynh_app_setting_set $app mysqlpwd $db_pwd # Store the password in the app's config -} - # Execute a command as another user # usage: ynh_exec_as USER COMMAND [ARG ...] ynh_exec_as() { @@ -133,80 +88,20 @@ ynh_exec_as() { fi } -# Get sources, setup it into dest directory and deploy patches -# Try to find locally the sources and download it if missing. -# Check the integrity with an hash program (default: sha256sum) -# Source hash and location are get from a "SOURCE_ID.src" file, -# by default the SOURCE_ID is "app". -# Patches should be located in a "patches" dir, they should be -# named like "SOURCE_ID-*.patch". -# -# example: ynh_setup_source "/var/www/limesurvey/" "limesurvey" -# -# usage: ynh_setup_source DEST_DIR [USER [SOURCE_ID]] - -ynh_setup_source () { - local DEST=$1 - local AS_USER=${2:-admin} - local SOURCE_ID=${3:-app} - local SOURCE_FILE="$YNH_APP_ID.tar.gz" - local SUM_PRG="sha256sum" - source ../$SOURCE_ID.src - local LOCAL_SOURCE="/opt/yunohost-apps-src/$YNH_APP_ID/$SOURCE_FILE" - - if test -e $LOCAL_SOURCE; then - cp $LOCAL_SOURCE $SOURCE_FILE - else - wget -nv $SOURCE_URL -O $SOURCE_FILE - fi - echo "$SOURCE_SUM $SOURCE_FILE" |$SUM_PRG -c --status \ - || ynh_die "Corrupt source" - - sudo mkdir -p "$DEST" - sudo chown $AS_USER: "$DEST" - if [ "$(echo ${SOURCE_FILE##*.})" == "gz" ]; then - ynh_exec_as "$AS_USER" tar xf $SOURCE_FILE -C "$DEST" --strip-components 1 - elif [ "$(echo ${SOURCE_FILE##*.})" == "bz2" ]; then - ynh_exec_as "$AS_USER" tar xjf $SOURCE_FILE -C "$DEST" --strip-components 1 - elif [ "$(echo ${SOURCE_FILE##*.})" == "zip" ]; then - mkdir -p "/tmp/$SOURCE_FILE" - ynh_exec_as "$AS_USER" unzip -q $SOURCE_FILE -d "/tmp/$SOURCE_FILE" - ynh_exec_as "$AS_USER" mv "/tmp/$SOURCE_FILE"/./. "$DEST" - rmdir "$/tmp/$SOURCE_FILE" - else - false - fi - - # Apply patches - if [ -f ${PKG_DIR}/patches/$SOURCE_ID-*.patch ]; then - (cd "$DEST" \ - && for p in ${PKG_DIR}/patches/$SOURCE_ID-*.patch; do \ - ynh_exec_as "$AS_USER" patch -p1 < $p; done) \ - || ynh_die "Unable to apply patches" - - fi - - # Apply persistent modules (upgrade only) - ynh_restore_persistent modules - - # Apply persistent data (upgrade only) - ynh_restore_persistent data - -} # TODO support SOURCE_ID ynh_save_persistent () { local TYPE=$1 local DIR=/tmp/ynh-persistent/$TYPE/$app/app - sudo mkdir -p $DIR - sudo touch $DIR/dir_names + mkdir -p $DIR + touch $DIR/dir_names shift i=1 for PERSISTENT_DIR in $@; do if [ -e $local_path/$PERSISTENT_DIR ]; then - sudo mv $local_path/$PERSISTENT_DIR $DIR/$i - sudo su -c "echo -n '$PERSISTENT_DIR ' >> $DIR/dir_names" + mv $local_path/$PERSISTENT_DIR $DIR/$i + echo -n '$PERSISTENT_DIR ' >> $DIR/dir_names ((i++)) fi done @@ -224,52 +119,43 @@ ynh_restore_persistent () { if [ "$TYPE" = "modules" ]; then for updated_subdir in $(ls $local_path/$PERSISTENT_DIR); do - sudo rm -Rf $DIR/$i/$updated_subdir + ynh_secure_remove $DIR/$i/$updated_subdir done fi if [ -d $DIR/$i ]; then - sudo mv $DIR/$i/* $local_path/$PERSISTENT_DIR/ 2> /dev/null || true + mv $DIR/$i/* $local_path/$PERSISTENT_DIR/ 2> /dev/null || true else - sudo mv $DIR/$i $local_path/$PERSISTENT_DIR 2> /dev/null || true + mv $DIR/$i $local_path/$PERSISTENT_DIR 2> /dev/null || true fi ((i++)) done - sudo rm -Rf $DIR + ynh_secure_remove $DIR fi } ynh_mv_to_home () { local APP_PATH="/home/yunohost.app/$app/" local DATA_PATH="$1" - sudo mkdir -p "$APP_PATH" - sudo chown $app: "$APP_PATH" + mkdir -p "$APP_PATH" + chown $app: "$APP_PATH" ynh_exec_as "$app" mv "$DATA_PATH" "$APP_PATH" ynh_exec_as "$app" ln -s "$APP_PATH$DATA_PATH" "$DATA_PATH" } -ynh_set_default_perm () { - local DIRECTORY=$1 - # Set permissions - sudo chown -R $app:$app $DIRECTORY - sudo chmod -R 664 $DIRECTORY - sudo find $DIRECTORY -type d -print0 | xargs -0 sudo chmod 775 \ - || echo "No file to modify" - -} ynh_sso_access () { ynh_app_setting_set $app unprotected_uris "/" if [[ $is_public -eq 0 ]]; then ynh_app_setting_set $app protected_uris "$1" fi - sudo yunohost app ssowatconf + yunohost app ssowatconf } ynh_exit_if_up_to_date () { if [ "${version}" = "${last_version}" ]; then info "Up-to-date, nothing to do" - exit 0 + ynh_die "Up-to-date, nothing to do" 0 fi } @@ -311,64 +197,6 @@ ynh_read_manifest () { fi } -ynh_app_dependencies (){ - export dependencies=$1 - export project_url=$(ynh_read_manifest 'url') - export version=$(ynh_read_manifest 'version') - export dep_app=${app/__/-} - mkdir -p ../conf - cat > ../conf/app-ynh-deps.control.j2 << EOF -Section: misc -Priority: optional -Homepage: {{ project_url }} -Standards-Version: 3.9.2 - -Package: {{ dep_app }}-ynh-deps -Version: {{ version }} -Depends: {{ dependencies }} -Architecture: all -Description: meta package for {{ app }} (YunoHost app) dependencies - This meta-package is only responsible of installing its dependencies. -EOF - - ynh_configure app-ynh-deps.control ./$dep_app-ynh-deps.control - ynh_package_install_from_equivs ./$dep_app-ynh-deps.control \ - || ynh_die "Unable to install dependencies" -} - - - - -# Create a system user -# -# usage: ynh_system_user_create user_name [home_dir] -# | arg: user_name - Name of the system user that will be create -# | arg: home_dir - Path of the home dir for the user. Usually the final path of the app. If this argument is omitted, the user will be created without home -ynh_system_user_create () { - if ! ynh_system_user_exists "$1" # Check if the user exists on the system - then # If the user doesn't exist - if [ $# -ge 2 ]; then # If a home dir is mentioned - user_home_dir="-d $2" - else - user_home_dir="--no-create-home" - fi - sudo useradd $user_home_dir --system --user-group $1 --shell /usr/sbin/nologin || ynh_die "Unable to create $1 system account" - fi -} - -# Delete a system user -# -# usage: ynh_system_user_delete user_name -# | arg: user_name - Name of the system user that will be create -ynh_system_user_delete () { - if ynh_system_user_exists "$1" # Check if the user exists on the system - then - sudo userdel $1 - else - echo "The user $1 was not found" >&2 - fi -} - ynh_configure () { local TEMPLATE=$1 @@ -378,82 +206,167 @@ ynh_configure () { sudo cp "${PKG_DIR}/conf/$TEMPLATE" "$DEST" } -ynh_configure_nginx () { - ynh_configure nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf - sudo service nginx reload +ynh_add_nginx_config () { + finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalnginxconf" + ynh_configure nginx.conf "$finalnginxconf" + ynh_store_file_checksum "$finalnginxconf" + service nginx reload } -ynh_configure_php_fpm () { - finalphpconf=/etc/php5/fpm/pool.d/$app.conf - ynh_configure php-fpm.conf /etc/php5/fpm/pool.d/$app.conf - sudo chown root: $finalphpconf - - finalphpini=/etc/php5/fpm/conf.d/20-$app.ini - sudo cp ../conf/php-fpm.ini $finalphpini - sudo chown root: $finalphpini - - sudo service php5-fpm reload +ynh_add_fpm_config () { + # Configure PHP-FPM 7.0 by default + local fpm_config_dir="/etc/php/7.0/fpm" + local fpm_service="php7.0-fpm" + # Configure PHP-FPM 5 on Debian Jessie + if is_jessie; then + fpm_config_dir="/etc/php5/fpm" + fpm_service="php5-fpm" + fi + ynh_app_setting_set $app fpm_config_dir "$fpm_config_dir" + ynh_app_setting_set $app fpm_service "$fpm_service" + finalphpconf="$fpm_config_dir/pool.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalphpconf" + ynh_configure php-fpm.conf "$finalphpconf" + sudo chown root: "$finalphpconf" + ynh_store_file_checksum "$finalphpconf" + + if [ -e "../conf/php-fpm.ini" ] + then + finalphpini="$fpm_config_dir/conf.d/20-$app.ini" + ynh_backup_if_checksum_is_different "$finalphpini" + ynh_configure php-fpm.ini "$finalphpini" + chown root: "$finalphpini" + ynh_store_file_checksum "$finalphpini" + fi + systemctl reload $fpm_service } -# Find a free port and return it +# Send an email to inform the administrator # -# example: port=$(ynh_find_port 8080) +# usage: ynh_send_readme_to_admin app_message [recipients] +# | arg: app_message - The message to send to the administrator. +# | arg: recipients - The recipients of this email. Use spaces to separate multiples recipients. - default: root +# example: "root admin@domain" +# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you +# example: "root admin@domain user1 user2" +ynh_send_readme_to_admin() { + local app_message="${1:-...No specific information...}" + local recipients="${2:-root}" + + # Retrieve the email of users + find_mails () { + local list_mails="$1" + local mail + local recipients=" " + # Read each mail in argument + for mail in $list_mails + do + # Keep root or a real email address as it is + if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@" + then + recipients="$recipients $mail" + else + # But replace an user name without a domain after by its email + if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null) + then + recipients="$recipients $mail" + fi + fi + done + echo "$recipients" + } + recipients=$(find_mails "$recipients") + + local mail_subject="☁️🆈🅽🅷☁️: \`$app\` was just installed!" + + local mail_message="This is an automated message from your beloved YunoHost server. +Specific information for the application $app. +$app_message +--- +Automatic diagnosis data from YunoHost +$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" + + # Send the email to the recipients + echo "$mail_message" | mail -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" +} + +# Exit without error if the package is up to date # -# usage: ynh_find_port begin_port -# | arg: begin_port - port to start to search -ynh_find_port () { - port=$1 - test -n "$port" || ynh_die "The argument of ynh_find_port must be a valid port." - while netcat -z 127.0.0.1 $port # Check if the port is free - do - port=$((port+1)) # Else, pass to next port - done - echo $port -} - - -### REMOVE SCRIPT - -# Remove a database if it exist and the associated user +# This helper should be used to avoid an upgrade of a package +# when it's not needed. # -# usage: ynh_mysql_remove_db user name -# | arg: user - Proprietary of the database -# | arg: name - Name of the database -ynh_mysql_remove_db () { - if mysqlshow -u root -p$(sudo cat $MYSQL_ROOT_PWD_FILE) | grep -q "^| $2"; then # Check if the database exist - ynh_mysql_drop_db $2 # Remove the database - ynh_mysql_drop_user $1 # Remove the associated user to database - else - echo "Database $2 not found" >&2 - fi +# To force an upgrade, even if the package is up to date, +# you have to set the variable YNH_FORCE_UPGRADE before. +# example: sudo YNH_FORCE_UPGRADE=1 yunohost app upgrade MyApp +# +# usage: ynh_abort_if_up_to_date +ynh_abort_if_up_to_date () { + local force_upgrade=${YNH_FORCE_UPGRADE:-0} + local package_check=${PACKAGE_CHECK_EXEC:-0} + + local version=$(ynh_read_manifest "/etc/yunohost/apps/$YNH_APP_INSTANCE_NAME/manifest.json" "version" || echo 1.0) + local last_version=$(ynh_read_manifest "../manifest.json" "version" || echo 1.0) + if [ "$version" = "$last_version" ] + then + if [ "$force_upgrade" != "0" ] + then + echo "Upgrade forced by YNH_FORCE_UPGRADE." >&2 + unset YNH_FORCE_UPGRADE + elif [ "$package_check" != "0" ] + then + echo "Upgrade forced for package check." >&2 + else + ynh_die "Up-to-date, nothing to do" 0 + fi + fi } -ynh_rm_nginx_conf () { - if [ -e "/etc/nginx/conf.d/$domain.d/$app.conf" ]; then - sudo rm "/etc/nginx/conf.d/$domain.d/$app.conf" - sudo service nginx reload - fi +# Remove any logs for all the following commands. +# +# usage: ynh_print_OFF +# WARNING: You should be careful with this helper, and never forgot to use ynh_print_ON as soon as possible to restore the logging. +ynh_print_OFF () { + set +x } -ynh_rm_php_fpm_conf () { - if [ -e "/etc/php5/fpm/pool.d/$app.conf" ]; then - sudo rm "/etc/php5/fpm/pool.d/$app.conf" - fi - if [ -e "/etc/php5/fpm/conf.d/20-$app.ini" ]; then - sudo rm "/etc/php5/fpm/conf.d/20-$app.ini" - fi - sudo service php5-fpm reload +# Restore the logging after ynh_print_OFF +# +# usage: ynh_print_ON +ynh_print_ON () { + set -x + # Print an echo only for the log, to be able to know that ynh_print_ON has been called. + echo ynh_print_ON > /dev/null +} +ynh_version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } + +# In upgrade script allow to test if the app is less than or equal a specific version +# +# usage: ynh_version_le "0.5" +ynh_version_le() { + local version=$(ynh_read_manifest "/etc/yunohost/apps/$YNH_APP_INSTANCE_NAME/manifest.json" "version" || echo 1.0) + ynh_version_gt "$1" "${version}" } -REMOVE_LOGROTATE_CONF () { - if [ -e "/etc/logrotate.d/$app" ]; then - sudo rm "/etc/logrotate.d/$app" - fi +ynh_debian_release () { + lsb_release --codename --short } -ynh_secure_rm () { - [[ "/var/www /opt /home/yunohost.app" =~ $1 ]] \ - || (test -n "$1" && sudo rm -Rf $1 ) +is_stretch () { + if [ "$(ynh_debian_release)" == "stretch" ] + then + return 0 + else + return 1 + fi } +is_jessie () { + if [ "$(ynh_debian_release)" == "jessie" ] + then + return 0 + else + return 1 + fi +} diff --git a/scripts/backup b/scripts/backup index 537c86c..bb742d4 100644 --- a/scripts/backup +++ b/scripts/backup @@ -1,34 +1,53 @@ #!/bin/bash -# causes the shell to exit if any subcommand or pipeline returns a non-zero status -set -e +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= +source /usr/share/yunohost/helpers -# Source YNH helpers -. /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= -backup_dir=$1 +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= -# Get app instance name app=$YNH_APP_INSTANCE_NAME -# Retrieve arguments domain=$(ynh_app_setting_get $app domain) -path=$(ynh_app_setting_get $app path) -local_path=$(ynh_app_setting_get $app local_path) +final_path=$(ynh_app_setting_get $app final_path) +db_name=$(ynh_app_setting_get $app db_name) +db_pwd=$(ynh_app_setting_get $app mysqlpwd) -my_ynh_backup () { - ynh_backup $@ - echo $2 $1 >> $backup_dir/list -} +#================================================= +# STANDARD BACKUP STEPS +#================================================= +# BACKUP OF THE MAIN DIR OF THE APP +#================================================= -# Copy the app files -my_ynh_backup "$local_path" "sources" +ynh_backup "$final_path" -# Copy the conf files -my_ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx.conf" -my_ynh_backup "/etc/php5/fpm/pool.d/$app.conf" "conf/php-fpm.conf" -my_ynh_backup "/etc/php5/fpm/conf.d/20-$app.ini" "conf/php-fpm.ini" +#================================================= +# BACKUP OF THE NGINX CONFIGURATION +#================================================= -# Save database -dbpass=$(ynh_app_setting_get "$app" mysqlpwd) -mysqldump -u "$app" -p"$dbpass" --no-create-db "$app" > ./dump.sql +ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# BACKUP OF THE PHP-FPM CONFIGURATION +#================================================= + +ynh_backup "/etc/php5/fpm/pool.d/$app.conf" +ynh_backup "/etc/php5/fpm/conf.d/20-$app.ini" + +#================================================= +# BACKUP OF THE SQL BDD +#================================================= + +ynh_mysql_dump_db "$db_name" > db.sql diff --git a/scripts/install b/scripts/install index 6eef0a2..d2c9835 100755 --- a/scripts/install +++ b/scripts/install @@ -1,62 +1,166 @@ #!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + source /usr/share/yunohost/helpers source _common.sh -ynh_trap_on +#================================================= +# MANAGE FAILURE OF THE SCRIPT +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= export app=$YNH_APP_INSTANCE_NAME -user=$app # Retrieve arguments -ynh_export domain path admin is_public language -export local_path=/var/www/$app +ynh_export domain path_url admin is_public language export prefix=lime_ +export db_name=$(ynh_sanitize_dbid $app) +export db_user=$db_name #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THIS ARGS #================================================= -ynh_check_var "$app" "app name not set" -ynh_user_exists "$admin" || ynh_die "User does not exist: $admin" -ynh_normalize_url_path "$path" -ynh_path_validity "$domain$path" -ynh_local_path_available "$local_path" + +export final_path=/var/www/$app +test ! -e "$final_path" || ynh_die "This path already contains a folder" + +# Normalize the url path syntax +path_url=$(ynh_normalize_url_path $path_url) + +# Check web path availability +ynh_webpath_available $domain $path_url +# Register (book) web path +ynh_webpath_register $app $domain $path_url #================================================= -# SETUP THE APP BY MODIFYING THE SYSTEM +# STANDARD MODIFICATIONS +#================================================= +# INSTALL DEPENDENCIES #================================================= -ynh_save_args domain path admin is_public language local_path prefix +ynh_install_app_dependencies $pkg_dependencies -ynh_app_dependencies php5-imap +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_save_args domain admin is_public language final_path prefix path_url db_name db_user -ynh_mysql_generate_db "$user" "$app" +#================================================= +# CREATE A SQL BDD +#================================================= -ynh_system_user_create "$user" "$local_path" +ynh_mysql_setup_db $db_user $db_name +export db_pwd=$(ynh_app_setting_get $app mysqlpwd) -ynh_setup_source "$local_path" "$user" - -ynh_configure config.php "$local_path/application/config/config.php" +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= -# Fill LimeSurvey database -sed "s/\`prefix_/\`$prefix/g" $local_path/installer/sql/create-mysql.sql > ./structure.sql +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +# Create a dedicated nginx config +ynh_add_nginx_config + +#================================================= +# CREATE DEDICATED USER +#================================================= + +# Create a system user +ynh_system_user_create $app + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= + +# Create a dedicated php-fpm config +ynh_add_fpm_config + +#================================================= +# SPECIFIC SETUP +#================================================= +# CONFIGURE +#================================================= +ynh_configure config.php "$final_path/application/config/config.php" + +#================================================= +# LOAD SQL CONFIG +#================================================= +cp $final_path/installer/sql/create-mysql.sql ./structure.sql +ynh_replace_string "\`prefix_" "\`$prefix" ./structure.sql mysql -u $db_user -p$db_pwd $db_user < ./structure.sql ynh_configure data.sql ./data.sql mysql -u $db_user -p$db_pwd $db_user < ./data.sql -# Randomize Password user -ls_cli=$local_path/application/commands/console.php -set +x -ynh_exec_as "$user" php $ls_cli resetpassword "$admin" "$(ynh_string_random 24)" -set -x +#================================================= +# Add nice themes +#================================================= +ynh_setup_source "$final_path/upload/templates/libreform" libreform +#ynh_setup_source "$final_path/upload/templates/librepoll" librepoll + +#================================================= +# STORE THE CHECKSUM OF THE CONFIG FILE +#================================================= + +# Calculate and store the config file checksum into the app settings +ynh_store_file_checksum "$final_path/application/config/config.php" + +#================================================= +# GENERIC FINALISATION +#================================================= +# SECURING FILES AND DIRECTORIES +#================================================= # Set permissions -ynh_set_default_perm $local_path -sudo chmod -R u+w $local_path/tmp -sudo chmod -R u+w $local_path/upload -sudo chmod -R u+w $local_path/application/config/ +set_permissions -sudo yunohost app addaccess $app -u $admin +#================================================= +# Randomize Password user +#================================================= +# Permission should be correctly set before to do this +ls_cli=$final_path/application/commands/console.php +set +x +ynh_exec_as "$app" php $ls_cli resetpassword "$admin" "$(ynh_string_random 24)" +set -x + +#================================================= +# SETUP FAIL2BAN +#================================================= + +#ynh_add_fail2ban_config "/var/log/nginx/${domain}-error.log" "PHP message: Leed: wrong login for .* client: " 5 + +#================================================= +# SETUP SSOWAT +#================================================= +yunohost app addaccess $app -u $admin ynh_sso_access "/index.php?r=admin,/index.php?r=plugins,/scripts" -ynh_configure_php_fpm -ynh_configure_nginx +#================================================= +# RELOAD NGINX +#================================================= + +systemctl reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= +ynh_print_OFF +message="You can now create a poll on this address: https://${domain}${path_url}/admin/ +If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/libresurvey_ynh" + +ynh_send_readme_to_admin "$message" "$admin" +ynh_print_ON diff --git a/scripts/remove b/scripts/remove index 3b89d91..6e457e5 100755 --- a/scripts/remove +++ b/scripts/remove @@ -1,27 +1,68 @@ #!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + source /usr/share/yunohost/helpers source _common.sh +#================================================= +# LOAD SETTINGS +#================================================= + app=$YNH_APP_INSTANCE_NAME -user=$app -local_path=$(ynh_app_setting_get $app local_path) + +final_path=$(ynh_app_setting_get $app final_path) +final_path=${final_path:-/var/www/$app} domain=$(ynh_app_setting_get $app domain) +db_name=$(ynh_app_setting_get $app db_name) -ynh_mysql_remove_db "$user" "$app" +#================================================= +# STANDARD REMOVE +#================================================= +# REMOVE DEPENDENCIES +#================================================= +# Remove metapackage and its dependencies +ynh_remove_app_dependencies -ynh_secure_rm "$local_path" -ynh_secure_rm "/home/yunohost.app/$app" +#================================================= +# REMOVE THE SQL BDD +#================================================= -ynh_rm_nginx_conf -ynh_rm_php_fpm_conf +# Remove a database if it exists, along with the associated user +ynh_mysql_remove_db $db_name $db_name -# Delete user after php5-fpm is restarted without the app conf -# We can't delete it before because php5-fpm use it -ynh_system_user_delete "$user" +#================================================= +# REMOVE THE MAIN DIR OF THE APP +#================================================= -dep_app=${app/__/-} -ynh_package_remove $dep_app-ynh-deps +# Remove the app directory securely +ynh_secure_remove "$final_path" +ynh_secure_remove "/home/yunohost.app/$app" -sudo yunohost app ssowatconf -echo -e "\e[0m" # Restore norml color +#================================================= +# REMOVE THE NGINX CONFIGURATION +#================================================= + +# Remove the dedicated nginx config +ynh_remove_nginx_config + +#================================================= +# REMOVE THE PHP-FPM CONFIGURATION +#================================================= + +# Remove the dedicated php-fpm config +ynh_remove_fpm_config + +#================================================= +# GENERIC FINALISATION +#================================================= +# REMOVE DEDICATED USER +#================================================= + +# Delete a system user +ynh_system_user_delete $app diff --git a/scripts/restore b/scripts/restore index d580474..44268e3 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,527 +1,94 @@ #!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + source /usr/share/yunohost/helpers -#source ../settings/scripts/_common.sh +source _common.sh -#================================================ +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= -# App package root directory should be the parent folder -PKG_DIR=$(cd ../; pwd) +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors -ynh_check_var () { - test -n "$1" || ynh_die "$2" -} - -ynh_exit_properly () { - exit_code=$? - if [ "$exit_code" -eq 0 ]; then - exit 0 - fi - trap '' EXIT - set +eu - echo -e "\e[91m \e[1m" - err "$app script has encountered an error." - - if type -t CLEAN_SETUP > /dev/null; then - CLEAN_SETUP - fi - - ynh_die -} - -# Activate signal capture -# Exit if a command fail, and if a variable is used unset. -# Capturing exit signals on shell script -# -# example: CLEAN_SETUP () { -# # Clean residual file un remove by remove script -# } -# ynh_trap_on -ynh_trap_on () { - set -eu - trap ynh_exit_properly EXIT # Capturing exit signals on shell script -} - -ynh_export () { - local ynh_arg="" - for var in $@; - do - ynh_arg=$(echo $var | awk '{print toupper($0)}') - ynh_arg="YNH_APP_ARG_$ynh_arg" - export $var=${!ynh_arg} - done -} - -# Check availability of a web path -# -# example: ynh_path_validity $domain$path -# -# usage: ynh_path_validity $domain_and_path -# | arg: domain_and_path - complete path to check -ynh_path_validity () { - sudo yunohost app checkurl $1 -a $app -} - -# Normalize the url path syntax -# Handle the slash at the beginning of path and its absence at ending -# Return a normalized url path -# -# example: url_path=$(ynh_normalize_url_path $url_path) -# ynh_normalize_url_path example -> /example -# ynh_normalize_url_path /example -> /example -# ynh_normalize_url_path /example/ -> /example -# -# usage: ynh_normalize_url_path path_to_normalize -# | arg: url_path_to_normalize - URL path to normalize before using it -ynh_normalize_url_path () { - path=$1 - test -n "$path" || ynh_die "ynh_normalize_url_path expect a URL path as first argument and received nothing." - if [ "${path:0:1}" != "/" ]; then # If the first character is not a / - path="/$path" # Add / at begin of path variable - fi - if [ "${path:${#path}-1}" == "/" ] && [ ${#path} -gt 1 ]; then # If the last character is a / and that not the only character. - path="${path:0:${#path}-1}" # Delete the last character - fi - echo $path -} - -# Check the path doesn't exist -# usage: ynh_local_path_available PATH -ynh_local_path_available () { - if [ -e "$1" ] - then - ynh_die "This path '$1' already contains a folder" - fi -} - -# Save listed var in YunoHost app settings -# usage: ynh_save_args VARNAME1 [VARNAME2 [...]] -ynh_save_args () { - for var in $@; - do - ynh_app_setting_set $app $var ${!var} - done -} - -# Create a database, an user and its password. Then store the password in the app's config -# -# User of database will be store in db_user's variable. -# Name of database will be store in db_name's variable. -# And password in db_pwd's variable. -# -# usage: ynh_mysql_generate_db user name -# | arg: user - Proprietary of the database -# | arg: name - Name of the database -ynh_mysql_generate_db () { - export db_user=${1//[-.]/_} # Mariadb doesn't support - and . in the name of databases. It will be replace by _ - export db_name=${2//[-.]/_} - - export db_pwd=$(ynh_string_random) # Generate a random password - ynh_check_var "$db_pwd" "db_pwd empty" - - ynh_mysql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database - - ynh_app_setting_set $app mysqlpwd $db_pwd # Store the password in the app's config -} - -# Execute a command as another user -# usage: ynh_exec_as USER COMMAND [ARG ...] -ynh_exec_as() { - local USER=$1 - shift 1 - - if [[ $USER = $(whoami) ]]; then - eval "$@" - else - # use sudo twice to be root and be allowed to use another user - sudo sudo -u "$USER" "$@" - fi -} - -# Get sources, setup it into dest directory and deploy patches -# Try to find locally the sources and download it if missing. -# Check the integrity with an hash program (default: sha256sum) -# Source hash and location are get from a "SOURCE_ID.src" file, -# by default the SOURCE_ID is "app". -# Patches should be located in a "patches" dir, they should be -# named like "SOURCE_ID-*.patch". -# -# example: ynh_setup_source "/var/www/limesurvey/" "limesurvey" -# -# usage: ynh_setup_source DEST_DIR [USER [SOURCE_ID]] - -ynh_setup_source () { - local DEST=$1 - local AS_USER=${2:-admin} - local SOURCE_ID=${3:-app} - local SOURCE_FILE="$YNH_APP_ID.tar.gz" - local SUM_PRG="sha256sum" - source ../$SOURCE_ID.src - local LOCAL_SOURCE="/opt/yunohost-apps-src/$YNH_APP_ID/$SOURCE_FILE" - - if test -e $LOCAL_SOURCE; then - cp $LOCAL_SOURCE $SOURCE_FILE - else - wget -nv $SOURCE_URL -O $SOURCE_FILE - fi - echo "$SOURCE_SUM $SOURCE_FILE" |$SUM_PRG -c --status \ - || ynh_die "Corrupt source" - - sudo mkdir -p "$DEST" - sudo chown $AS_USER: "$DEST" - if [ "$(echo ${SOURCE_FILE##*.})" == "gz" ]; then - ynh_exec_as "$AS_USER" tar xf $SOURCE_FILE -C "$DEST" --strip-components 1 - elif [ "$(echo ${SOURCE_FILE##*.})" == "bz2" ]; then - ynh_exec_as "$AS_USER" tar xjf $SOURCE_FILE -C "$DEST" --strip-components 1 - elif [ "$(echo ${SOURCE_FILE##*.})" == "zip" ]; then - mkdir -p "/tmp/$SOURCE_FILE" - ynh_exec_as "$AS_USER" unzip -q $SOURCE_FILE -d "/tmp/$SOURCE_FILE" - ynh_exec_as "$AS_USER" mv "/tmp/$SOURCE_FILE"/./. "$DEST" - rmdir "$/tmp/$SOURCE_FILE" - else - false - fi - - # Apply patches - if [ -f ${PKG_DIR}/patches/$SOURCE_ID-*.patch ]; then - (cd "$DEST" \ - && for p in ${PKG_DIR}/patches/$SOURCE_ID-*.patch; do \ - ynh_exec_as "$AS_USER" patch -p1 < $p; done) \ - || ynh_die "Unable to apply patches" - - fi - - # Apply persistent modules (upgrade only) - ynh_restore_persistent modules - - # Apply persistent data (upgrade only) - ynh_restore_persistent data - -} - -# TODO support SOURCE_ID -ynh_save_persistent () { - local TYPE=$1 - local DIR=/tmp/ynh-persistent/$TYPE/$app/app - sudo mkdir -p $DIR - sudo touch $DIR/dir_names - shift - i=1 - for PERSISTENT_DIR in $@; - do - if [ -e $local_path/$PERSISTENT_DIR ]; then - sudo mv $local_path/$PERSISTENT_DIR $DIR/$i - sudo su -c "echo -n '$PERSISTENT_DIR ' >> $DIR/dir_names" - ((i++)) - fi - done -} - -# TODO support SOURCE_ID -ynh_restore_persistent () { - local TYPE=$1 - local DIR=/tmp/ynh-persistent/$TYPE/$app/app - shift - if [ -d $DIR ]; then - i=1 - for PERSISTENT_DIR in $(cat $DIR/dir_names); - do - if [ "$TYPE" = "modules" ]; then - for updated_subdir in $(ls $local_path/$PERSISTENT_DIR); - do - sudo rm -Rf $DIR/$i/$updated_subdir - done - fi - if [ -d $DIR/$i ]; then - sudo mv $DIR/$i/* $local_path/$PERSISTENT_DIR/ 2> /dev/null || true - else - sudo mv $DIR/$i $local_path/$PERSISTENT_DIR 2> /dev/null || true - fi - ((i++)) - done - sudo rm -Rf $DIR - fi - -} -ynh_mv_to_home () { - local APP_PATH="/home/yunohost.app/$app/" - local DATA_PATH="$1" - sudo mkdir -p "$APP_PATH" - sudo chown $app: "$APP_PATH" - ynh_exec_as "$app" mv "$DATA_PATH" "$APP_PATH" - ynh_exec_as "$app" ln -s "$APP_PATH$DATA_PATH" "$DATA_PATH" - -} - -ynh_set_default_perm () { - local DIRECTORY=$1 - # Set permissions - sudo chown -R $app:$app $DIRECTORY - sudo chmod -R 664 $DIRECTORY - sudo find $DIRECTORY -type d -print0 | xargs -0 sudo chmod 775 \ - || echo "No file to modify" - -} -ynh_sso_access () { - ynh_app_setting_set $app unprotected_uris "/" - - if [[ $is_public -eq 0 ]]; then - ynh_app_setting_set $app protected_uris "$1" - fi - sudo yunohost app ssowatconf -} - -ynh_exit_if_up_to_date () { - if [ "${version}" = "${last_version}" ]; then - info "Up-to-date, nothing to do" - exit 0 - fi -} - -log() { - echo "${1}" -} - -info() { - log "[INFO] ${1}" -} - -warn() { - log "[WARN] ${1}" -} - -err() { - log "[ERR] ${1}" -} - -to_logs() { - - # When yunohost --verbose or bash -x - if $_ISVERBOSE; then - cat - else - cat > /dev/null - fi -} - -ynh_read_json () { - sudo python3 -c "import sys, json;print(json.load(open('$1'))['$2'])" -} - -ynh_read_manifest () { - if [ -f '../manifest.json' ] ; then - ynh_read_json '../manifest.json' "$1" - else - ynh_read_json '../settings/manifest.json' "$1" - fi -} - -ynh_app_dependencies (){ - export dependencies=$1 - export project_url=$(ynh_read_manifest 'url') - export version=$(ynh_read_manifest 'version') - export dep_app=${app/__/-} - mkdir -p ../conf - cat > ../conf/app-ynh-deps.control.j2 << EOF -Section: misc -Priority: optional -Homepage: {{ project_url }} -Standards-Version: 3.9.2 - -Package: {{ dep_app }}-ynh-deps -Version: {{ version }} -Depends: {{ dependencies }} -Architecture: all -Description: meta package for {{ app }} (YunoHost app) dependencies - This meta-package is only responsible of installing its dependencies. -EOF - - ynh_configure app-ynh-deps.control ./$dep_app-ynh-deps.control - ynh_package_install_from_equivs ./$dep_app-ynh-deps.control \ - || ynh_die "Unable to install dependencies" -} - - - - -# Create a system user -# -# usage: ynh_system_user_create user_name [home_dir] -# | arg: user_name - Name of the system user that will be create -# | arg: home_dir - Path of the home dir for the user. Usually the final path of the app. If this argument is omitted, the user will be created without home -ynh_system_user_create () { - if ! ynh_system_user_exists "$1" # Check if the user exists on the system - then # If the user doesn't exist - if [ $# -ge 2 ]; then # If a home dir is mentioned - user_home_dir="-d $2" - else - user_home_dir="--no-create-home" - fi - sudo useradd $user_home_dir --system --user-group $1 --shell /usr/sbin/nologin || ynh_die "Unable to create $1 system account" - fi -} - -# Delete a system user -# -# usage: ynh_system_user_delete user_name -# | arg: user_name - Name of the system user that will be create -ynh_system_user_delete () { - if ynh_system_user_exists "$1" # Check if the user exists on the system - then - sudo userdel $1 - else - echo "The user $1 was not found" >&2 - fi -} - - -ynh_configure () { - local TEMPLATE=$1 - local DEST=$2 - type j2 2>/dev/null || sudo pip install j2cli - j2 "${PKG_DIR}/conf/$TEMPLATE.j2" > "${PKG_DIR}/conf/$TEMPLATE" - sudo cp "${PKG_DIR}/conf/$TEMPLATE" "$DEST" -} - -ynh_configure_nginx () { - ynh_configure nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf - sudo service nginx reload -} - -ynh_configure_php_fpm () { - finalphpconf=/etc/php5/fpm/pool.d/$app.conf - ynh_configure php-fpm.conf /etc/php5/fpm/pool.d/$app.conf - sudo chown root: $finalphpconf - - finalphpini=/etc/php5/fpm/conf.d/20-$app.ini - sudo cp ../conf/php-fpm.ini $finalphpini - sudo chown root: $finalphpini - - sudo service php5-fpm reload -} - -# Find a free port and return it -# -# example: port=$(ynh_find_port 8080) -# -# usage: ynh_find_port begin_port -# | arg: begin_port - port to start to search -ynh_find_port () { - port=$1 - test -n "$port" || ynh_die "The argument of ynh_find_port must be a valid port." - while netcat -z 127.0.0.1 $port # Check if the port is free - do - port=$((port+1)) # Else, pass to next port - done - echo $port -} - - -### REMOVE SCRIPT - -# Remove a database if it exist and the associated user -# -# usage: ynh_mysql_remove_db user name -# | arg: user - Proprietary of the database -# | arg: name - Name of the database -ynh_mysql_remove_db () { - if mysqlshow -u root -p$(sudo cat $MYSQL_ROOT_PWD_FILE) | grep -q "^| $2"; then # Check if the database exist - ynh_mysql_drop_db $2 # Remove the database - ynh_mysql_drop_user $1 # Remove the associated user to database - else - echo "Database $2 not found" >&2 - fi -} - -ynh_rm_nginx_conf () { - if [ -e "/etc/nginx/conf.d/$domain.d/$app.conf" ]; then - sudo rm "/etc/nginx/conf.d/$domain.d/$app.conf" - sudo service nginx reload - fi -} - -ynh_rm_php_fpm_conf () { - if [ -e "/etc/php5/fpm/pool.d/$app.conf" ]; then - sudo rm "/etc/php5/fpm/pool.d/$app.conf" - fi - if [ -e "/etc/php5/fpm/conf.d/20-$app.ini" ]; then - sudo rm "/etc/php5/fpm/conf.d/20-$app.ini" - fi - sudo service php5-fpm reload -} - -REMOVE_LOGROTATE_CONF () { - if [ -e "/etc/logrotate.d/$app" ]; then - sudo rm "/etc/logrotate.d/$app" - fi -} - -ynh_secure_rm () { - [[ "/var/www /opt /home/yunohost.app" =~ $1 ]] \ - || (test -n "$1" && sudo rm -Rf $1 ) -} - - -ynh_check_restore () { - for dest in $(cat ./list| cut -d ' ' -f2); - do - ([[ -e $dest ]] && ynh_die \ -"The destination directory '$dest' already exists.\ -You should safely delete it before restoring this app.") || true - done -} - -ynh_restore () { - while IFS= read -r instruction - do - sudo cp -a ./$instruction - done < ./list -} -#================================================ - -ynh_trap_on +#================================================= +# LOAD SETTINGS +#================================================= export app=$YNH_APP_INSTANCE_NAME -user=$app export domain=$(ynh_app_setting_get $app domain) -export path=$(ynh_app_setting_get $app path) +export path_url=$(ynh_app_setting_get $app path_url) export admin=$(ynh_app_setting_get $app admin) -dbpass=$(ynh_app_setting_get $app mysqlpwd) -export local_path=$(ynh_app_setting_get $app local_path) +export final_path=$(ynh_app_setting_get $app final_path) export is_public=$(ynh_app_setting_get $app is_public) export prefix=$(ynh_app_setting_get $app prefix) -dbname=$app -dbuser=$user +export db_name=$(ynh_app_setting_get $app db_name) +export db_user=$(ynh_app_setting_get $app db_user) +export db_pwd=$(ynh_app_setting_get $app mysqlpwd) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -#ynh_path_validity "$domain$path" -ynh_check_restore +ynh_webpath_available $domain $path_url \ + || ynh_die "Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die "There is already a directory: $final_path " #================================================= -# RESTORE THE APP BY MODIFYING THE SYSTEM +# STANDARD RESTORE STEPS #================================================= -ynh_app_dependencies php5-imap +# INSTALL DEPENDENCIES +#================================================= +ynh_install_app_dependencies $pkg_dependencies -ynh_system_user_create "$user" "$local_path" +#================================================= +# RESTORE OF THE SQL BDD +#================================================= -# Create and restore the database -ynh_mysql_create_db "$dbname" "$dbuser" "$dbpass" -ynh_mysql_connect_as "$dbuser" "$dbpass" "$dbname" < ./dump.sql +ynh_mysql_setup_db $db_name $db_name $db_pwd +ynh_mysql_connect_as $db_name $db_pwd $db_name < ./db.sql -# Restore file +#================================================= +# RESTORE FILES +#================================================= +# Restore files ynh_restore -# Fix app ownerships & permissions -ynh_set_default_perm $local_path -sudo chmod -R u+w $local_path/tmp -sudo chmod -R u+w $local_path/upload -sudo chmod -R u+w $local_path/application/config/ +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_system_user_create "$app" "$final_path" +#================================================= +# RESTORE USER RIGHTS +#================================================= +set_permissions + +#================================================= +# SETUP SSOWAT +#================================================= ynh_sso_access "/index.php?r=admin,/index.php?r=plugins,/scripts" -# Reload services -sudo service php5-fpm restart || true -sudo service nginx reload || true +#================================================= +# GENERIC FINALISATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= + +ynh_system_reload php5-fpm +ynh_system_reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +message="If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/leed_ynh" + +ynh_send_readme_to_admin "$message" "$admin" diff --git a/scripts/upgrade b/scripts/upgrade index ab7bd87..2197b88 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,70 +1,128 @@ #!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + source /usr/share/yunohost/helpers source _common.sh -ynh_trap_on - +#================================================= +# LOAD SETTINGS +#================================================= export app=$YNH_APP_INSTANCE_NAME -user=$app export domain=$(ynh_app_setting_get $app domain) -export path=$(ynh_app_setting_get $app path) +export path_url=$(ynh_app_setting_get $app path) export admin=$(ynh_app_setting_get $app admin) -db_pwd=$(ynh_app_setting_get $app mysqlpwd) -export local_path=$(ynh_app_setting_get $app local_path) +export final_path=$(ynh_app_setting_get $app final_path) export is_public=$(ynh_app_setting_get $app is_public) -is_public=${is_public:-0} export prefix=$(ynh_app_setting_get $app prefix) -prefix=${prefix:-prefix_} -version=$(ynh_read_json "/etc/yunohost/apps/$app/manifest.json" 'version' 2> /dev/null || echo '2.0.5') -last_version=$(ynh_read_manifest 'version') +export db_pwd=$(ynh_app_setting_get $app mysqlpwd) +export db_name=$(ynh_app_setting_get $app db_name) +export db_user=$(ynh_app_setting_get $app db_user) -ynh_exit_if_up_to_date -ynh_check_var "$app" "app name not set" -ynh_user_exists "$admin" || err "User does not exist: $admin" -ynh_normalize_url_path "$path" +#================================================= +# CHECK VERSION +#================================================= -if [ "${version}" = "2.0.5" ]; then +ynh_abort_if_up_to_date - ynh_save_args path is_public prefix +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= - ynh_app_dependencies php5-imap +# 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 - ynh_system_user_create "$user" "$local_path" +#================================================= +# CHECK THE PATH +#================================================= - # Move the upload dir to local_path if needed +path_url=$(ynh_normalize_url_path $path_url) # Vérifie et corrige la syntaxe du path. + +#================================================= +# STEP Migrations +#================================================= +if ynh_version_le "2.0.5" ; then + is_public=${is_public:-0} + prefix=${prefix:-prefix_} + db_name=${db_name:-$app} + final_path=$(ynh_app_setting_get $app local_path) + ynh_save_args path_url is_public prefix db_name final_path db_user + + ynh_install_app_dependencies $pkg_dependencies + + # Move the upload dir to final_path if needed # The upload dir can't be symlinked in home (not supported by LS) upload_path=/home/yunohost.app/$app/upload - if [ -h $local_path/upload ]; then - sudo rm $local_path/upload - sudo mv $upload_path $local_path/ + if [ -h $final_path/upload ]; then + rm $final_path/upload + mv $upload_path $final_path/ fi ynh_app_setting_delete $app skipped_uris ynh_sso_access "/index.php?r=admin,/index.php?r=plugins,/scripts" - ynh_configure_php_fpm - ynh_configure_nginx - ynh_configure migrations/2.0.5.sql ./2.0.5.sql - mysql -u $app -p$db_pwd $app < ./2.0.5.sql + mysql -u $app -p$db_pwd $db_name < ./2.0.5.sql fi +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= + # Backup config, plugins and themes and delete previous files ynh_save_persistent modules themes plugins ynh_save_persistent data application/config/config.php upload # Copie new files and restore config, plugins, upload and themes -sudo rm -Rf $local_path -ynh_setup_source "$local_path" "$user" +ynh_secure_remove $final_path +ynh_setup_source "$final_path" # Télécharge la source, décompresse et copie dans $final_path -# Set permissions -ynh_set_default_perm $local_path -sudo chmod -R u+w $local_path/tmp -sudo chmod -R u+w $local_path/upload -sudo chmod -R u+w $local_path/application/config/ +#================================================= +# NGINX CONFIGURATION +#================================================= + +ynh_add_nginx_config + +#================================================= +# CREATE DEDICATED USER +#================================================= + +ynh_system_user_create $app # Create the dedicated user, if not exist + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= + +ynh_add_fpm_config # Créer le fichier de configuration du pool php-fpm et le configure. + +#================================================= +# SECURING FILES AND DIRECTORIES +#================================================= +set_permissions + +#================================================= +# UPGRADE DB +#================================================= # Migrate DB -cd $local_path/application/commands +cd $final_path/application/commands ynh_exec_as "$app" php console.php update +#================================================= +# RELOAD NGINX +#================================================= + +ynh_system_reload nginx