From 4d8b2a45c81366a5276f1d4e44806e2577bd1f07 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 17 Feb 2019 15:42:09 +0100 Subject: [PATCH 1/5] Normalization from example_ynh --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++-- conf/config.inc.php | 10 +++---- conf/create_db.sql | 12 ++++----- conf/nginx.conf | 5 +++- manifest.json | 2 +- scripts/_common.sh | 41 +++++++++-------------------- scripts/backup | 14 +--------- scripts/install | 41 +++++++++++++++++++---------- scripts/restore | 17 +++--------- scripts/upgrade | 40 +++++++++++++++++++--------- 10 files changed, 149 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index 43fbf19..15ed236 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ -# phpmyadmin for yunohost +# Phpmyadmin for YunoHost -* https://www.phpmyadmin.net/ +[![Integration level](https://dash.yunohost.org/integration/phpmyadmin.svg)](https://dash.yunohost.org/appci/app/phpmyadmin) +[![Install Phpmyadmin with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=phpmyadmin) +> *This package allow you to install Phpmyadmin 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.* + +## Overview + +phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement. + +**Shipped version:** 4.8.5 + +## Screenshots + +![](https://www.phpmyadmin.net/static/images/screenshots/structure.png) + +## Demo + +* [YunoHost demo](https://demo.yunohost.org/phpmyadmin/) +* [Official demo](https://demo.phpmyadmin.net/master-config/) + +## Configuration + +## Documentation + + * Official documentation: https://www.phpmyadmin.net/docs/ + * YunoHost documentation: If specific documentation is needed, feel free to contribute. + +## YunoHost specific features + +#### Multi-users support + +#### Supported architectures + +* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/phpmyadmin%20%28Official%29.svg)](https://ci-apps.yunohost.org/ci/apps/phpmyadmin/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/phpmyadmin%20%28Official%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/phpmyadmin/) +* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/phpmyadmin%20%28Official%29.svg)](https://ci-stretch.nohost.me/ci/apps/phpmyadmin/) + +## Limitations + +## Additionnal informations + +## Links + + * Report a bug: https://github.com/YunoHost-Apps/phpmyadmin_ynh/issues + * Phpmyadmin website: https://www.phpmyadmin.net/ + * YunoHost website: https://yunohost.org/ + +--- + +Developers infos +---------------- + +Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/phpmyadmin_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/phpmyadmin_ynh/tree/testing --debug +or +sudo yunohost app upgrade phpmyadmin -u https://github.com/YunoHost-Apps/phpmyadmin_ynh/tree/testing --debug +``` diff --git a/conf/config.inc.php b/conf/config.inc.php index 1ac8df4..b42cffd 100644 --- a/conf/config.inc.php +++ b/conf/config.inc.php @@ -28,8 +28,8 @@ $i = 0; $i++; /* Authentication type */ $cfg['Servers'][$i]['auth_type'] = 'config'; -$cfg['Servers'][$i]['user'] = 'YNH_PMA_ADMIN_USER'; -$cfg['Servers'][$i]['password'] = 'YNH_PMA_ADMIN_PASSWORD'; +$cfg['Servers'][$i]['user'] = '__YNH_PMA_ADMIN_USER__'; +$cfg['Servers'][$i]['password'] = '__YNH_PMA_ADMIN_PASSWORD__'; /* Server parameters */ /* $cfg['Servers'][$i]['host'] = 'localhost'; @@ -49,11 +49,11 @@ $cfg['Servers'][$i]['AllowNoPassword'] = false; /* User used to manipulate with storage */ // $cfg['Servers'][$i]['controlhost'] = ''; // $cfg['Servers'][$i]['controlport'] = ''; -$cfg['Servers'][$i]['controluser'] = 'YNH_PMA_USER'; -$cfg['Servers'][$i]['controlpass'] = 'YNH_PMA_PASSWORD'; +$cfg['Servers'][$i]['controluser'] = '__YNH_PMA_USER__'; +$cfg['Servers'][$i]['controlpass'] = '__YNH_PMA_PASSWORD__'; /* Storage database and tables */ -$cfg['Servers'][$i]['pmadb'] = 'YNH_PMA_USER'; +$cfg['Servers'][$i]['pmadb'] = '__YNH_PMA_USER__'; $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark'; $cfg['Servers'][$i]['relation'] = 'pma__relation'; $cfg['Servers'][$i]['table_info'] = 'pma__table_info'; diff --git a/conf/create_db.sql b/conf/create_db.sql index b7dc28e..d603e62 100644 --- a/conf/create_db.sql +++ b/conf/create_db.sql @@ -14,14 +14,14 @@ -- -------------------------------------------------------- -DROP DATABASE `YNH_PMA_USER`; +DROP DATABASE `__YNH_PMA_USER__`; -- --- Database : `YNH_PMA_USER` +-- Database : `__YNH_PMA_USER__` -- -CREATE DATABASE IF NOT EXISTS `YNH_PMA_USER` +CREATE DATABASE IF NOT EXISTS `__YNH_PMA_USER__` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; -USE YNH_PMA_USER; +USE __YNH_PMA_USER__; -GRANT SELECT, INSERT, DELETE, UPDATE ON `YNH_PMA_USER`.* TO - 'YNH_PMA_USER'@localhost; +GRANT SELECT, INSERT, DELETE, UPDATE ON `__YNH_PMA_USER__`.* TO + '__YNH_PMA_USER__'@localhost; diff --git a/conf/nginx.conf b/conf/nginx.conf index fac6349..416a2a4 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,7 +1,10 @@ -location __PATH__ { +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location __PATH__/ { + # Path to source alias __FINALPATH__/ ; + # Force usage of https if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } diff --git a/manifest.json b/manifest.json index f91a123..095a654 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Manage MySQL databases over the web", "fr": "Application web de gestion des bases de données MySQL" }, - "version": "4.8.5~ynh1", + "version": "4.8.5~ynh2", "url": "http://www.phpmyadmin.net", "license": "GPL-2.0-only", "maintainer": { diff --git a/scripts/_common.sh b/scripts/_common.sh index 1dcc1ac..e5b02a2 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,35 +1,18 @@ #!/bin/bash -# ============================================================================= -# COMPOSER -# ============================================================================= +#================================================= +# EXPERIMENTAL HELPERS +#================================================= -# Execute a composer command from a given directory -# usage: composer_exec workdir COMMAND [ARG ...] -exec_composer() { - local workdir=$1 +# Execute a command as another user +# usage: exec_as USER COMMAND [ARG ...] +exec_as() { + local USER=$1 shift 1 - COMPOSER_HOME="${workdir}/.composer" \ - php "${workdir}/composer.phar" $@ \ - -d "${workdir}" --quiet --no-interaction -} - -# Install and initialize Composer in the given directory -# usage: init_composer destdir -init_composer() { - local destdir=$1 - - # install composer - curl -sS https://getcomposer.org/installer \ - | COMPOSER_HOME="${destdir}/.composer" \ - php -- --quiet --install-dir="$destdir" \ - || ynh_die "Unable to install Composer" - - # Force the dependence to PHP 5.6 - exec_composer "$destdir" config -g platform.php 5.6 - exec_composer "$destdir" update --no-dev - # update dependencies to create composer.lock - exec_composer "$destdir" install --no-dev \ - || ynh_die "Unable to update PhpMyAdmin core dependencies" + if [[ $USER = $(whoami) ]]; then + eval "$@" + else + sudo -u "$USER" "$@" + fi } diff --git a/scripts/backup b/scripts/backup index da545a5..7c2ad47 100644 --- a/scripts/backup +++ b/scripts/backup @@ -2,23 +2,11 @@ #================================================= # GENERIC START -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit on command errors and treat access to unset variables as an error -set -eu - #================================================= # IMPORT GENERIC HELPERS #================================================= -# if [ ! -e _common.sh ]; then -# # Get the _common.sh file if it's not in the current directory -# cp ../settings/scripts/_common.sh ./_common.sh -# chmod a+rx _common.sh -# fi -# source _common.sh +# source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers #================================================= diff --git a/scripts/install b/scripts/install index d4b1569..64a5926 100644 --- a/scripts/install +++ b/scripts/install @@ -36,8 +36,6 @@ 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 @@ -65,11 +63,13 @@ ynh_app_setting_set $app db_admin_user $db_admin_user db_admin_pwd="$(ynh_string_random)" ynh_app_setting_set $app db_admin_pwd $db_admin_pwd -if ! ynh_mysql_user_exists "$db_admin_user" ; then +if ! ynh_mysql_user_exists "$db_admin_user" +then ynh_mysql_create_user "$db_admin_user" "$db_admin_pwd" ynh_mysql_execute_as_root "GRANT ALL PRIVILEGES ON *.* TO '$db_admin_user'@'localhost' IDENTIFIED BY '$db_admin_pwd' WITH GRANT OPTION; FLUSH PRIVILEGES;" mysql fi + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -105,7 +105,7 @@ ynh_add_fpm_config # POPULATE THE DATABASE #================================================= -ynh_replace_string "YNH_PMA_USER" "$db_name" ../conf/create_db.sql +ynh_replace_string "__YNH_PMA_USER__" "$db_name" ../conf/create_db.sql ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ < ../conf/create_db.sql ynh_replace_string "phpmyadmin" "$db_name" $final_path/sql/create_tables.sql @@ -116,26 +116,39 @@ ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ # CONFIGURE PHPMYADMIN #================================================= -ynh_replace_string "YNH_DOMAIN" "$domain" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_ADMIN_USER" "$db_admin_user" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_ADMIN_PASSWORD" "$db_admin_pwd" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_USER" "$db_name" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_PASSWORD" "$db_pwd" ../conf/config.inc.php -ynh_replace_string "YNH_MYSQL_ROOT_PASSWORD" "$(cat $MYSQL_ROOT_PWD_FILE)" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_ADMIN_USER__" "$db_admin_user" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_ADMIN_PASSWORD__" "$db_admin_pwd" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_USER__" "$db_name" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_PASSWORD__" "$db_pwd" ../conf/config.inc.php + cp ../conf/config.inc.php $final_path -# Recalculate and store the config file checksum into the app settings +# Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.inc.php" #================================================= -# INSTALL DEPENDENCIES +# INSTALL DEPENDENCIES WITH COMPOSER #================================================= +# Set permissions for initialization +chown -R $app: "$final_path" + # Install composer -init_composer "$final_path" +curl -sS https://getcomposer.org/installer \ + | COMPOSER_HOME="$final_path/.composer" \ + php -- --quiet --install-dir="$final_path" \ + || ynh_die "Unable to install Composer" + +# Update dependencies to create composer.lock +exec_as $app COMPOSER_HOME="$final_path/.composer" \ + php "$final_path/composer.phar" install --no-dev \ + -d "$final_path" --quiet --no-interaction \ + || ynh_die "Unable to update core dependencies with Composer" # Install dependencies -exec_composer "$final_path" update --no-dev +ynh_exec_warn_less exec_as $app COMPOSER_HOME="$final_path/.composer" \ + php "$final_path/composer.phar" update --no-dev \ + -d "$final_path" --quiet --no-interaction #================================================= # GENERIC FINALIZATION diff --git a/scripts/restore b/scripts/restore index 26b8c71..9fd772a 100644 --- a/scripts/restore +++ b/scripts/restore @@ -2,23 +2,11 @@ #================================================= # GENERIC START -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit on command errors and treat access to unset variables as an error -set -eu - #================================================= # IMPORT GENERIC HELPERS #================================================= -# if [ ! -e _common.sh ]; then -# # Get the _common.sh file if it's not in the current directory -# cp ../settings/scripts/_common.sh ./_common.sh -# chmod a+rx _common.sh -# fi -# source _common.sh +# source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers #================================================= @@ -80,6 +68,7 @@ if ! ynh_mysql_user_exists "$db_admin_user" ; then ynh_mysql_execute_as_root "GRANT ALL PRIVILEGES ON *.* TO '$db_admin_user'@'localhost' IDENTIFIED BY '$db_admin_pwd' WITH GRANT OPTION; FLUSH PRIVILEGES;" mysql fi + #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -94,6 +83,8 @@ ynh_system_user_create $app # config.inc.php contains sensitive data, restrict its access chown root:$app $final_path/config.inc.php +chown $app: $final_path/tmp + #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c34ca74..31c3549 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -66,11 +66,14 @@ fi # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_backup_before_upgrade # Backup the current version of the app +# Backup the current version of the app +ynh_backup_before_upgrade ynh_clean_setup () { - ynh_restore_upgradebackup # restore it if the upgrade fails + # restore it if the upgrade fails + ynh_restore_upgradebackup } -ynh_abort_if_errors # Exit if an error occurs during the execution of the script +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors #================================================= # CHECK THE PATH @@ -99,7 +102,7 @@ ynh_add_nginx_config # CREATE DEDICATED USER #================================================= -# Create a system user +# Create a dedicated user (if not existing) ynh_system_user_create $app #================================================= @@ -138,12 +141,11 @@ ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ # Verify the checksum and backup the file if it's different ynh_backup_if_checksum_is_different "$final_path/config.inc.php" -ynh_replace_string "YNH_DOMAIN" "$domain" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_ADMIN_USER" "$db_admin_user" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_ADMIN_PASSWORD" "$db_admin_pwd" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_USER" "$db_name" ../conf/config.inc.php -ynh_replace_string "YNH_PMA_PASSWORD" "$db_pwd" ../conf/config.inc.php -ynh_replace_string "YNH_MYSQL_ROOT_PASSWORD" "$(cat $MYSQL_ROOT_PWD_FILE)" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_ADMIN_USER__" "$db_admin_user" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_ADMIN_PASSWORD__" "$db_admin_pwd" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_USER__" "$db_name" ../conf/config.inc.php +ynh_replace_string "__YNH_PMA_PASSWORD__" "$db_pwd" ../conf/config.inc.php + cp ../conf/config.inc.php $final_path # Recalculate and store the config file checksum into the app settings @@ -153,11 +155,25 @@ ynh_store_file_checksum "$final_path/config.inc.php" # INSTALL DEPENDENCIES #================================================= +# Set permissions for initialization +chown -R $app: "$final_path" + # Install composer -init_composer "$final_path" +curl -sS https://getcomposer.org/installer \ + | COMPOSER_HOME="$final_path/.composer" \ + php -- --quiet --install-dir="$final_path" \ + || ynh_die "Unable to install Composer" + +# Update dependencies to create composer.lock +exec_as $app COMPOSER_HOME="$final_path/.composer" \ + php "$final_path/composer.phar" install --no-dev \ + -d "$final_path" --quiet --no-interaction \ + || ynh_die "Unable to update core dependencies with Composer" # Install dependencies -exec_composer "$final_path" update --no-dev +ynh_exec_warn_less exec_as $app COMPOSER_HOME="$final_path/.composer" \ + php "$final_path/composer.phar" update --no-dev \ + -d "$final_path" --quiet --no-interaction #================================================= # GENERIC FINALIZATION From 24158eb8d031b8706fffb4c0a54a9616ac05bcd9 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 17 Feb 2019 15:42:49 +0100 Subject: [PATCH 2/5] Use php7 --- conf/nginx.conf | 2 +- conf/php-fpm.conf | 104 +++++++++++++++++++++++++++++++--------------- manifest.json | 4 +- scripts/backup | 2 +- scripts/restore | 4 +- 5 files changed, 77 insertions(+), 39 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 416a2a4..4796506 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -16,7 +16,7 @@ location __PATH__/ { try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php5-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 261c431..88b5479 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -1,10 +1,11 @@ ; Start a new pool named 'www'. -; the variable $pool can we used in any directive and will be replaced by the +; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [__NAMETOCHANGE__] ; Per pool prefix ; It only applies on the following directives: +; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' @@ -24,28 +25,35 @@ group = __USER__ ; The address on which to accept FastCGI requests. ; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; -; 'port' - to listen on a TCP socket to all addresses on a -; specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php5-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php7.0-fpm-__NAMETOCHANGE__.sock -; Set listen(2) backlog. A value of '-1' means unlimited. -; Default Value: 128 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 128 +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. +; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0660 listen.owner = www-data listen.group = www-data ;listen.mode = 0660 - -; List of ipv4 addresses of FastCGI clients which are allowed to connect. +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address ; must be separated by a comma. If this value is left blank, connections will be @@ -59,7 +67,13 @@ listen.group = www-data ; - The pool processes will inherit the master process priority ; unless it specified otherwise ; Default Value: no set -; priority = -19 +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes ; Choose how the process manager will control the number of child processes. ; Possible Values: @@ -96,7 +110,7 @@ pm = dynamic ; forget to tweak pm.* to fit your needs. ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' ; Note: This value is mandatory. -pm.max_children = 10 +pm.max_children = 5 ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' @@ -117,12 +131,12 @@ pm.max_spare_servers = 3 ; Note: Used only when pm is set to 'ondemand' ; Default Value: 10s ;pm.process_idle_timeout = 10s; - + ; The number of requests each child process should execute before respawning. ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 -pm.max_requests = 500 +;pm.max_requests = 500 ; The URI to view the FPM status page. If this value is not set, no URI will be ; recognized as a status page. It shows the following informations: @@ -170,7 +184,7 @@ pm.max_requests = 500 ; ; By default the status page only outputs short status. Passing 'full' in the ; query string will also return status for each pool process. -; Example: +; Example: ; http://www.foo.bar/status?full ; http://www.foo.bar/status?json&full ; http://www.foo.bar/status?html&full @@ -215,7 +229,7 @@ pm.max_requests = 500 ; last request memory: 0 ; ; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: ${prefix}/share/fpm/status.html +; It's available in: /usr/share/php/7.0/fpm/status.html ; ; Note: The value must start with a leading slash (/). The value can be ; anything, but it may not be a good idea to use the .php extension or it @@ -275,7 +289,7 @@ pm.max_requests = 500 ; - %{megabytes}M ; - %{mega}M ; %n: pool name -; %o: ouput header +; %o: output header ; it must be associated with embraces to specify the name of the header: ; - %{Content-Type}o ; - %{X-Powered-By}o @@ -283,7 +297,7 @@ pm.max_requests = 500 ; - .... ; %p: PID of the child that serviced the request ; %P: PID of the parent of the child that serviced the request -; %q: the query string +; %q: the query string ; %Q: the '?' character if query string exists ; %r: the request URI (without the query string, see %q and %Q) ; %R: remote IP address @@ -291,47 +305,51 @@ pm.max_requests = 500 ; %t: server time the request was received ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %T: time the log has been written (the request has finished) ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %u: remote user ; ; Default: "%R - %u %t \"%m %r\" %s" ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - + ; The log file for slow requests ; Default Value: not set ; Note: slowlog is mandatory if request_slowlog_timeout is set -slowlog = /var/log/nginx/__NAMETOCHANGE__.slow.log - +;slowlog = log/$pool.log.slow + ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 -request_slowlog_timeout = 5s - +;request_slowlog_timeout = 0 + ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option ; does not stop script execution for some reason. A value of '0' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 request_terminate_timeout = 1d - + ; Set open file descriptor rlimit. ; Default Value: system defined value ;rlimit_files = 1024 - + ; Set max core size rlimit. ; Possible Values: 'unlimited' or an integer greater or equal to 0 ; Default Value: system defined value ;rlimit_core = 0 - + ; Chroot to this directory at the start. This value must be defined as an ; absolute path. When this value is not set, chroot is not used. ; Note: you can prefix with '$prefix' to chroot to the pool prefix or one ; of its subdirectories. If the pool prefix is not set, the global prefix ; will be used instead. -; Note: chrooting is a great security feature and should be used whenever +; Note: chrooting is a great security feature and should be used whenever ; possible. However, all PHP paths will be relative to the chroot ; (error_log, sessions.save_path, ...). ; Default Value: not set @@ -347,16 +365,25 @@ chdir = __FINALPATH__ ; Note: on highloaded environement, this can cause some delay in the page ; process time (several ms). ; Default Value: no -catch_workers_output = yes +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no ; Limits the extensions of the main script FPM will allow to parse. This can ; prevent configuration mistakes on the web server side. You should only limit ; FPM to .php extensions to prevent malicious users to use other extensions to -; exectute php code. +; execute php code. ; Note: set an empty value to allow all extensions. ; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 - +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. ; Default Value: clean env @@ -370,7 +397,7 @@ catch_workers_output = yes ; overwrite the values previously defined in the php.ini. The directives are the ; same as the PHP SAPI: ; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. +; be overwritten from PHP call 'ini_set'. ; php_admin_value/php_admin_flag - these directives won't be overwritten by ; PHP call 'ini_set' ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. @@ -391,6 +418,17 @@ catch_workers_output = yes ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +; php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On + php_value[upload_max_filesize] = 50M php_value[post_max_size] = 50M php_value[mail.add_x_header] = Off diff --git a/manifest.json b/manifest.json index 095a654..1508fd8 100644 --- a/manifest.json +++ b/manifest.json @@ -14,12 +14,12 @@ "email": "julien.malik@paraiso.me" }, "requirements": { - "yunohost": ">= 2.7.2" + "yunohost": ">= 3.0" }, "multi_instance": false, "services": [ "nginx", - "php5-fpm", + "php7.0-fpm", "mysql" ], "arguments": { diff --git a/scripts/backup b/scripts/backup index 7c2ad47..e96b150 100644 --- a/scripts/backup +++ b/scripts/backup @@ -44,7 +44,7 @@ ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_backup "/etc/php5/fpm/pool.d/$app.conf" +ynh_backup "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP THE MYSQL DATABASE diff --git a/scripts/restore b/scripts/restore index 9fd772a..6551559 100644 --- a/scripts/restore +++ b/scripts/restore @@ -89,7 +89,7 @@ chown $app: $final_path/tmp # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_restore_file "/etc/php5/fpm/pool.d/$app.conf" +ynh_restore_file "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # GENERIC FINALIZATION @@ -97,5 +97,5 @@ ynh_restore_file "/etc/php5/fpm/pool.d/$app.conf" # RELOAD NGINX AND PHP-FPM #================================================= -systemctl reload php5-fpm +systemctl reload php7.0-fpm systemctl reload nginx From 086dfd2fe19a8942b8d8e4980059499bd4fe23be Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 17 Feb 2019 20:58:14 +0100 Subject: [PATCH 3/5] Add progression with ynh_print_info --- scripts/backup | 11 +++++++++++ scripts/install | 18 ++++++++++++++++++ scripts/remove | 12 ++++++++++++ scripts/restore | 12 ++++++++++++ scripts/upgrade | 18 ++++++++++++++++++ 5 files changed, 71 insertions(+) diff --git a/scripts/backup b/scripts/backup index e96b150..9a7aca7 100644 --- a/scripts/backup +++ b/scripts/backup @@ -19,6 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= +ynh_print_info "Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -31,23 +32,33 @@ db_name=$(ynh_app_setting_get $app db_name) #================================================= # BACKUP THE APP MAIN DIR #================================================= +ynh_print_info "Backing up the main app directory..." ynh_backup "$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= +ynh_print_info "Backing up nginx web server configuration..." ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= +ynh_print_info "Backing up php-fpm configuration..." ynh_backup "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP THE MYSQL DATABASE #================================================= +ynh_print_info "Backing up the MySQL database..." ynh_mysql_dump_db "$db_name" > db.sql + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info "Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index 64a5926..27ec007 100644 --- a/scripts/install +++ b/scripts/install @@ -29,6 +29,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= +ynh_print_info "Validating installation parameters..." final_path=/var/www/$app test ! -e "$final_path" || ynh_die "This path already contains a folder" @@ -42,6 +43,7 @@ ynh_webpath_register $app $domain $path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= +ynh_print_info "Storing installation settings..." ynh_app_setting_set $app domain $domain ynh_app_setting_set $app path $path_url @@ -52,6 +54,7 @@ ynh_app_setting_set $app admin $admin #================================================= # CREATE A MYSQL DATABASE #================================================= +ynh_print_info "Creating a MySQL database..." db_name=$(ynh_sanitize_dbid $app) ynh_app_setting_set $app db_name $db_name @@ -73,6 +76,7 @@ fi #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_print_info "Setting up source files..." ynh_app_setting_set $app final_path $final_path # Download, check integrity, uncompress and patch the source from app.src @@ -81,6 +85,7 @@ ynh_setup_source "$final_path" #================================================= # NGINX CONFIGURATION #================================================= +ynh_print_info "Configuring nginx web server..." # Create a dedicated nginx config ynh_add_nginx_config @@ -88,6 +93,7 @@ ynh_add_nginx_config #================================================= # CREATE DEDICATED USER #================================================= +ynh_print_info "Configuring system user..." # Create a system user ynh_system_user_create $app @@ -95,6 +101,7 @@ ynh_system_user_create $app #================================================= # PHP-FPM CONFIGURATION #================================================= +ynh_print_info "Configuring php-fpm..." # Create a dedicated php-fpm config ynh_add_fpm_config @@ -104,6 +111,7 @@ ynh_add_fpm_config #================================================= # POPULATE THE DATABASE #================================================= +ynh_print_info "Filling database..." ynh_replace_string "__YNH_PMA_USER__" "$db_name" ../conf/create_db.sql ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ @@ -115,6 +123,7 @@ ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ #================================================= # CONFIGURE PHPMYADMIN #================================================= +ynh_print_info "Configuring phpmyadmin..." ynh_replace_string "__YNH_PMA_ADMIN_USER__" "$db_admin_user" ../conf/config.inc.php ynh_replace_string "__YNH_PMA_ADMIN_PASSWORD__" "$db_admin_pwd" ../conf/config.inc.php @@ -129,6 +138,7 @@ ynh_store_file_checksum "$final_path/config.inc.php" #================================================= # INSTALL DEPENDENCIES WITH COMPOSER #================================================= +ynh_print_info "Installing dependencies with Composer..." # Set permissions for initialization chown -R $app: "$final_path" @@ -168,6 +178,7 @@ chown $app: $final_path/tmp #================================================= # SETUP SSOWAT #================================================= +ynh_print_info "Configuring SSOwat..." # Restrict access to admin only yunohost app addaccess --users=$admin $app @@ -175,5 +186,12 @@ yunohost app addaccess --users=$admin $app #================================================= # RELOAD NGINX #================================================= +ynh_print_info "Reloading nginx web server..." systemctl reload nginx + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info "Installation of $app completed" diff --git a/scripts/remove b/scripts/remove index a7133c0..131f200 100644 --- a/scripts/remove +++ b/scripts/remove @@ -12,6 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= +ynh_print_info "Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -25,6 +26,7 @@ db_admin_user=$(ynh_app_setting_get $app db_admin_user) #================================================= # REMOVE THE MYSQL DATABASE #================================================= +ynh_print_info "Removing the MySQL database" # Remove a database if it exists, along with the associated user ynh_mysql_remove_db $db_name $db_name @@ -35,6 +37,7 @@ ynh_mysql_drop_user $db_admin_user #================================================= # REMOVE APP MAIN DIR #================================================= +ynh_print_info "Removing app main directory" # Remove the app directory securely ynh_secure_remove "$final_path" @@ -42,6 +45,7 @@ ynh_secure_remove "$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= +ynh_print_info "Removing nginx web server configuration" # Remove the dedicated nginx config ynh_remove_nginx_config @@ -49,6 +53,7 @@ ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= +ynh_print_info "Removing php-fpm configuration" # Remove the dedicated php-fpm config ynh_remove_fpm_config @@ -58,6 +63,13 @@ ynh_remove_fpm_config #================================================= # REMOVE DEDICATED USER #================================================= +ynh_print_info "Removing the dedicated system user" # Delete a system user ynh_system_user_delete $app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info "Removal of $app completed" diff --git a/scripts/restore b/scripts/restore index 6551559..8f350ab 100644 --- a/scripts/restore +++ b/scripts/restore @@ -19,6 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= +ynh_print_info "Loading settings..." app=$YNH_APP_INSTANCE_NAME @@ -31,6 +32,7 @@ db_name=$(ynh_app_setting_get $app db_name) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= +ynh_print_info "Validating restoration parameters..." ynh_webpath_available $domain $path_url \ || ynh_die "Path not available: ${domain}${path_url}" @@ -48,12 +50,14 @@ ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE APP MAIN DIR #================================================= +ynh_print_info "Restoring the app main directory..." ynh_restore_file "$final_path" #================================================= # RESTORE THE MYSQL DATABASE #================================================= +ynh_print_info "Restoring the MySQL database..." db_pwd=$(ynh_app_setting_get $app mysqlpwd) ynh_mysql_setup_db $db_name $db_name $db_pwd @@ -72,6 +76,7 @@ fi #================================================= # RECREATE THE DEDICATED USER #================================================= +ynh_print_info "Recreating the dedicated system user..." # Create the dedicated user (if not existing) ynh_system_user_create $app @@ -96,6 +101,13 @@ ynh_restore_file "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= +ynh_print_info "Reloading nginx web server and php-fpm..." systemctl reload php7.0-fpm systemctl reload nginx + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info "Restoration completed for $app" diff --git a/scripts/upgrade b/scripts/upgrade index 31c3549..23c78a2 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,6 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= +ynh_print_info "Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -26,6 +27,7 @@ db_admin_pwd=$(ynh_app_setting_get $app db_admin_pwd) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= +ynh_print_info "Ensuring downward compatibility..." # If db_name doesn't exist, create it if [ -z $db_name ]; then @@ -65,6 +67,7 @@ fi #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= +ynh_print_info "Backing up the app before upgrading (may take a while)..." # Backup the current version of the app ynh_backup_before_upgrade @@ -87,6 +90,7 @@ path_url=$(ynh_normalize_url_path $path_url) #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_print_info "Upgrading source files..." # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source "$final_path" @@ -94,6 +98,7 @@ ynh_setup_source "$final_path" #================================================= # NGINX CONFIGURATION #================================================= +ynh_print_info "Upgrading nginx web server configuration..." # Create a dedicated nginx config ynh_add_nginx_config @@ -101,6 +106,7 @@ ynh_add_nginx_config #================================================= # CREATE DEDICATED USER #================================================= +ynh_print_info "Making sure dedicated system user exists..." # Create a dedicated user (if not existing) ynh_system_user_create $app @@ -108,6 +114,7 @@ ynh_system_user_create $app #================================================= # PHP-FPM CONFIGURATION #================================================= +ynh_print_info "Upgrading php-fpm configuration..." # Create a dedicated php-fpm config ynh_add_fpm_config @@ -117,6 +124,7 @@ ynh_add_fpm_config #================================================= # UPGRADE THE DATABASE #================================================= +ynh_print_info "Upgrading database..." db_pwd=$(ynh_app_setting_get $app mysqlpwd) # Handle upgrade from a version before latest version @@ -137,6 +145,7 @@ ynh_mysql_connect_as "$db_name" "$db_pwd" "$db_name" \ #================================================= # CONFIGURE PHPMYADMIN #================================================= +ynh_print_info "Reconfiguring phpmyadmin..." # Verify the checksum and backup the file if it's different ynh_backup_if_checksum_is_different "$final_path/config.inc.php" @@ -154,6 +163,7 @@ ynh_store_file_checksum "$final_path/config.inc.php" #================================================= # INSTALL DEPENDENCIES #================================================= +ynh_print_info "Upgrading dependencies with Composer..." # Set permissions for initialization chown -R $app: "$final_path" @@ -193,6 +203,7 @@ chown -R $app: $final_path/tmp #================================================= # SETUP SSOWAT #================================================= +ynh_print_info "Upgrading SSOwat configuration..." # Restrict access to admin only yunohost app addaccess --users=$admin $app @@ -200,5 +211,12 @@ yunohost app addaccess --users=$admin $app #================================================= # RELOAD NGINX #================================================= +ynh_print_info "Reloading nginx web server..." systemctl reload nginx + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info "Upgrade of $app completed" From a2e8d78dd296adb60f1899a73ae2e6f059605f1b Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 28 Feb 2019 00:02:46 +0100 Subject: [PATCH 4/5] Use composer helpers --- scripts/_common.sh | 43 ++++++++ scripts/_getopts_fix.sh | 213 ++++++++++++++++++++++++++++++++++++++++ scripts/install | 22 ++--- scripts/upgrade | 21 +--- 4 files changed, 267 insertions(+), 32 deletions(-) create mode 100644 scripts/_getopts_fix.sh diff --git a/scripts/_common.sh b/scripts/_common.sh index e5b02a2..54f3ad5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,3 +16,46 @@ exec_as() { sudo -u "$USER" "$@" fi } + +# Execute a command with Composer +# +# usage: ynh_composer_exec [--workdir=$final_path] --commands="commands" +# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. +# | arg: -c, --commands - Commands to execute. +ynh_composer_exec () { + # Declare an array to define the options of this helper. + local legacy_args=wc + declare -Ar args_array=( [w]=workdir= [c]=commands= ) + local workdir + local commands + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + workdir="${workdir:-$final_path}" + + COMPOSER_HOME="$workdir/.composer" \ + php "$workdir/composer.phar" $commands \ + -d "$workdir" --quiet --no-interaction +} + +# Install and initialize Composer in the given directory +# +# usage: ynh_install_composer [--workdir=$final_path] +# | arg: -w, --workdir - The directory from where the command will be executed. Default $final_path. +ynh_install_composer () { + # Declare an array to define the options of this helper. + local legacy_args=w + declare -Ar args_array=( [w]=workdir= ) + local workdir + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + workdir="${workdir:-$final_path}" + + curl -sS https://getcomposer.org/installer \ + | COMPOSER_HOME="$workdir/.composer" \ + php -- --quiet --install-dir="$workdir" \ + || ynh_die "Unable to install Composer." + + # update dependencies to create composer.lock + ynh_composer_exec --workdir="$workdir" --commands="install --no-dev" \ + || ynh_die "Unable to update core dependencies with Composer." +} diff --git a/scripts/_getopts_fix.sh b/scripts/_getopts_fix.sh new file mode 100644 index 0000000..25a71be --- /dev/null +++ b/scripts/_getopts_fix.sh @@ -0,0 +1,213 @@ +#!/bin/bash + +#================================================= +# FIX OF YNH_HANDLE_GETOPTS_ARGS FROM UNSTABLE +#================================================= + +# Internal helper design to allow helpers to use getopts to manage their arguments +# +# [internal] +# +# example: function my_helper() +# { +# declare -Ar args_array=( [a]=arg1= [b]=arg2= [c]=arg3 ) +# local arg1 +# local arg2 +# local arg3 +# ynh_handle_getopts_args "$@" +# +# [...] +# } +# my_helper --arg1 "val1" -b val2 -c +# +# usage: ynh_handle_getopts_args "$@" +# | arg: $@ - Simply "$@" to tranfert all the positionnal arguments to the function +# +# This helper need an array, named "args_array" with all the arguments used by the helper +# that want to use ynh_handle_getopts_args +# Be carreful, this array has to be an associative array, as the following example: +# declare -Ar args_array=( [a]=arg1 [b]=arg2= [c]=arg3 ) +# Let's explain this array: +# a, b and c are short options, -a, -b and -c +# arg1, arg2 and arg3 are the long options associated to the previous short ones. --arg1, --arg2 and --arg3 +# For each option, a short and long version has to be defined. +# Let's see something more significant +# declare -Ar args_array=( [u]=user [f]=finalpath= [d]=database ) +# +# NB: Because we're using 'declare' without -g, the array will be declared as a local variable. +# +# Please keep in mind that the long option will be used as a variable to store the values for this option. +# For the previous example, that means that $finalpath will be fill with the value given as argument for this option. +# +# Also, in the previous example, finalpath has a '=' at the end. That means this option need a value. +# So, the helper has to be call with --finalpath /final/path, --finalpath=/final/path or -f /final/path, the variable $finalpath will get the value /final/path +# If there's many values for an option, -f /final /path, the value will be separated by a ';' $finalpath=/final;/path +# For an option without value, like --user in the example, the helper can be called only with --user or -u. $user will then get the value 1. +# +# To keep a retrocompatibility, a package can still call a helper, using getopts, with positional arguments. +# The "legacy mode" will manage the positional arguments and fill the variable in the same order than they are given in $args_array. +# e.g. for `my_helper "val1" val2`, arg1 will be filled with val1, and arg2 with val2. +ynh_handle_getopts_args () { + # Manage arguments only if there's some provided + set +x + if [ $# -ne 0 ] + then + # Store arguments in an array to keep each argument separated + local arguments=("$@") + + # For each option in the array, reduce to short options for getopts (e.g. for [u]=user, --user will be -u) + # And built parameters string for getopts + # ${!args_array[@]} is the list of all option_flags in the array (An option_flag is 'u' in [u]=user, user is a value) + local getopts_parameters="" + local option_flag="" + for option_flag in "${!args_array[@]}" + do + # Concatenate each option_flags of the array to build the string of arguments for getopts + # Will looks like 'abcd' for -a -b -c -d + # If the value of an option_flag finish by =, it's an option with additionnal values. (e.g. --user bob or -u bob) + # Check the last character of the value associate to the option_flag + if [ "${args_array[$option_flag]: -1}" = "=" ] + then + # For an option with additionnal values, add a ':' after the letter for getopts. + getopts_parameters="${getopts_parameters}${option_flag}:" + else + getopts_parameters="${getopts_parameters}${option_flag}" + fi + # Check each argument given to the function + local arg="" + # ${#arguments[@]} is the size of the array + for arg in `seq 0 $(( ${#arguments[@]} - 1 ))` + do + # And replace long option (value of the option_flag) by the short option, the option_flag itself + # (e.g. for [u]=user, --user will be -u) + # Replace long option with = + arguments[arg]="${arguments[arg]//--${args_array[$option_flag]}/-${option_flag} }" + # And long option without = + arguments[arg]="${arguments[arg]//--${args_array[$option_flag]%=}/-${option_flag}}" + done + done + + # Read and parse all the arguments + # Use a function here, to use standart arguments $@ and be able to use shift. + parse_arg () { + # Read all arguments, until no arguments are left + while [ $# -ne 0 ] + do + # Initialize the index of getopts + OPTIND=1 + # Parse with getopts only if the argument begin by -, that means the argument is an option + # getopts will fill $parameter with the letter of the option it has read. + local parameter="" + getopts ":$getopts_parameters" parameter || true + + if [ "$parameter" = "?" ] + then + ynh_die --message="Invalid argument: -${OPTARG:-}" + elif [ "$parameter" = ":" ] + then + ynh_die --message="-$OPTARG parameter requires an argument." + else + local shift_value=1 + # Use the long option, corresponding to the short option read by getopts, as a variable + # (e.g. for [u]=user, 'user' will be used as a variable) + # Also, remove '=' at the end of the long option + # The variable name will be stored in 'option_var' + local option_var="${args_array[$parameter]%=}" + # If this option doesn't take values + # if there's a '=' at the end of the long option name, this option takes values + if [ "${args_array[$parameter]: -1}" != "=" ] + then + # 'eval ${option_var}' will use the content of 'option_var' + eval ${option_var}=1 + else + # Read all other arguments to find multiple value for this option. + # Load args in a array + local all_args=("$@") + + # If the first argument is longer than 2 characters, + # There's a value attached to the option, in the same array cell + if [ ${#all_args[0]} -gt 2 ]; then + # Remove the option and the space, so keep only the value itself. + all_args[0]="${all_args[0]#-${parameter} }" + # Reduce the value of shift, because the option has been removed manually + shift_value=$(( shift_value - 1 )) + fi + + # Declare the content of option_var as a variable. + eval ${option_var}="" + # Then read the array value per value + local i + for i in `seq 0 $(( ${#all_args[@]} - 1 ))` + do + # If this argument is an option, end here. + if [ "${all_args[$i]:0:1}" == "-" ] + then + # Ignore the first value of the array, which is the option itself + if [ "$i" -ne 0 ]; then + break + fi + else + # Else, add this value to this option + # Each value will be separated by ';' + if [ -n "${!option_var}" ] + then + # If there's already another value for this option, add a ; before adding the new value + eval ${option_var}+="\;" + fi + # Escape double quote to prevent any interpretation during the eval + all_args[$i]="${all_args[$i]//\"/\\\"}" + + eval ${option_var}+=\"${all_args[$i]}\" + shift_value=$(( shift_value + 1 )) + fi + done + fi + fi + + # Shift the parameter and its argument(s) + shift $shift_value + done + } + + # LEGACY MODE + # Check if there's getopts arguments + if [ "${arguments[0]:0:1}" != "-" ] + then + # If not, enter in legacy mode and manage the arguments as positionnal ones.. + # Dot not echo, to prevent to go through a helper output. But print only in the log. + set -x; echo "! Helper used in legacy mode !" > /dev/null; set +x + local i + for i in `seq 0 $(( ${#arguments[@]} -1 ))` + do + # Try to use legacy_args as a list of option_flag of the array args_array + # Otherwise, fallback to getopts_parameters to get the option_flag. But an associative arrays isn't always sorted in the correct order... + # Remove all ':' in getopts_parameters + getopts_parameters=${legacy_args:-${getopts_parameters//:}} + # Get the option_flag from getopts_parameters, by using the option_flag according to the position of the argument. + option_flag=${getopts_parameters:$i:1} + if [ -z "$option_flag" ]; then + ynh_print_warn --message="Too many arguments ! \"${arguments[$i]}\" will be ignored." + continue + fi + # Use the long option, corresponding to the option_flag, as a variable + # (e.g. for [u]=user, 'user' will be used as a variable) + # Also, remove '=' at the end of the long option + # The variable name will be stored in 'option_var' + local option_var="${args_array[$option_flag]%=}" + + # Escape double quote to prevent any interpretation during the eval + arguments[$i]="${arguments[$i]//\"/\\\"}" + + # Store each value given as argument in the corresponding variable + # The values will be stored in the same order than $args_array + eval ${option_var}+=\"${arguments[$i]}\" + done + unset legacy_args + else + # END LEGACY MODE + # Call parse_arg and pass the modified list of args as an array of arguments. + parse_arg "${arguments[@]}" + fi + fi + set -x +} diff --git a/scripts/install b/scripts/install index 27ec007..427b462 100644 --- a/scripts/install +++ b/scripts/install @@ -8,6 +8,9 @@ source _common.sh source /usr/share/yunohost/helpers +# Overload the helper ynh_handle_getopts_args to have fixes from unstable. +# Needed for composer helpers +source _getopts_fix.sh #================================================= # MANAGE SCRIPT FAILURE @@ -140,25 +143,12 @@ ynh_store_file_checksum "$final_path/config.inc.php" #================================================= ynh_print_info "Installing dependencies with Composer..." -# Set permissions for initialization -chown -R $app: "$final_path" - # Install composer -curl -sS https://getcomposer.org/installer \ - | COMPOSER_HOME="$final_path/.composer" \ - php -- --quiet --install-dir="$final_path" \ - || ynh_die "Unable to install Composer" - -# Update dependencies to create composer.lock -exec_as $app COMPOSER_HOME="$final_path/.composer" \ - php "$final_path/composer.phar" install --no-dev \ - -d "$final_path" --quiet --no-interaction \ - || ynh_die "Unable to update core dependencies with Composer" +ynh_install_composer # Install dependencies -ynh_exec_warn_less exec_as $app COMPOSER_HOME="$final_path/.composer" \ - php "$final_path/composer.phar" update --no-dev \ - -d "$final_path" --quiet --no-interaction +# ynh_exec_warn_less ynh_composer_exec --commands="update --no-dev" +ynh_composer_exec --commands="update --no-dev" #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 23c78a2..e0f607e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -8,6 +8,9 @@ source _common.sh source /usr/share/yunohost/helpers +# Overload the helper ynh_handle_getopts_args to have fixes from unstable. +# Needed for composer helpers +source _getopts_fix.sh #================================================= # LOAD SETTINGS @@ -165,25 +168,11 @@ ynh_store_file_checksum "$final_path/config.inc.php" #================================================= ynh_print_info "Upgrading dependencies with Composer..." -# Set permissions for initialization -chown -R $app: "$final_path" - # Install composer -curl -sS https://getcomposer.org/installer \ - | COMPOSER_HOME="$final_path/.composer" \ - php -- --quiet --install-dir="$final_path" \ - || ynh_die "Unable to install Composer" - -# Update dependencies to create composer.lock -exec_as $app COMPOSER_HOME="$final_path/.composer" \ - php "$final_path/composer.phar" install --no-dev \ - -d "$final_path" --quiet --no-interaction \ - || ynh_die "Unable to update core dependencies with Composer" +ynh_install_composer # Install dependencies -ynh_exec_warn_less exec_as $app COMPOSER_HOME="$final_path/.composer" \ - php "$final_path/composer.phar" update --no-dev \ - -d "$final_path" --quiet --no-interaction +ynh_exec_warn_less ynh_composer_exec --commands=\"update --no-dev\" #================================================= # GENERIC FINALIZATION From c8d39409d4c2477f679f1a0723b634afe92a62dd Mon Sep 17 00:00:00 2001 From: JimboJoe Date: Sun, 10 Mar 2019 11:16:46 +0100 Subject: [PATCH 5/5] Update manifest.json Co-Authored-By: maniackcrudelis --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 1508fd8..0ef61a3 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "email": "julien.malik@paraiso.me" }, "requirements": { - "yunohost": ">= 3.0" + "yunohost": ">= 3.2.0" }, "multi_instance": false, "services": [