diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml
index cbe959b55..fabdcb923 100644
--- a/data/actionsmap/yunohost.yml
+++ b/data/actionsmap/yunohost.yml
@@ -1623,6 +1623,32 @@ tools:
full: --force
action: store_true
+ ### tools_regen_conf()
+ regen-conf:
+ action_help: Regenerate the configuration file(s)
+ api: PUT /tools/regenconf
+ arguments:
+ names:
+ help: Categories to regenerate configuration of (all by default)
+ nargs: "*"
+ metavar: NAME
+ -d:
+ full: --with-diff
+ help: Show differences in case of configuration changes
+ action: store_true
+ -f:
+ full: --force
+ help: Override all manual modifications in configuration files
+ action: store_true
+ -n:
+ full: --dry-run
+ help: Show what would have been regenerated
+ action: store_true
+ -p:
+ full: --list-pending
+ help: List pending configuration files and exit
+ action: store_true
+
subcategories:
migrations:
diff --git a/data/helpers.d/backend b/data/helpers.d/backend
index e710da9c7..710e6299b 100644
--- a/data/helpers.d/backend
+++ b/data/helpers.d/backend
@@ -3,17 +3,19 @@
# Use logrotate to manage the logfile
#
# usage: ynh_use_logrotate [--logfile=/log/file] [--nonappend] [--specific_user=user/group]
-# | arg: -l, --logfile= - absolute path of logfile
-# | arg: -n, --nonappend - (Option) Replace the config file instead of appending this new config.
+# | arg: -l, --logfile - absolute path of logfile
+# | arg: -n, --nonappend - (optional) Replace the config file instead of appending this new config.
# | arg: -u, --specific_user : run logrotate as the specified user and group. If not specified logrotate is runned as root.
#
-# If no argument provided, a standard directory will be use. /var/log/${app}
-# You can provide a path with the directory only or with the logfile.
+# If no --logfile is provided, /var/log/${app} will be used as default.
+# logfile can be just a directory, or a full path to a logfile :
# /parentdir/logdir
# /parentdir/logdir/logfile.log
#
-# It's possible to use this helper several times, each config will be added to the same logrotate config file.
-# Unless you use the option --non-append
+# It's possible to use this helper multiple times, each config will be added to
+# the same logrotate config file. Unless you use the option --non-append
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_use_logrotate () {
# Declare an array to define the options of this helper.
local legacy_args=lnuya
@@ -92,6 +94,8 @@ EOF
# Remove the app's logrotate config.
#
# usage: ynh_remove_logrotate
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_remove_logrotate () {
if [ -e "/etc/logrotate.d/$app" ]; then
sudo rm "/etc/logrotate.d/$app"
@@ -112,6 +116,7 @@ ynh_remove_logrotate () {
# __APP__ by $app
# __FINALPATH__ by $final_path
#
+# Requires YunoHost version 2.7.2 or higher.
ynh_add_systemd_config () {
# Declare an array to define the options of this helper.
local legacy_args=st
@@ -147,6 +152,7 @@ ynh_add_systemd_config () {
# usage: ynh_remove_systemd_config [--service=service]
# | arg: -s, --service - Service name (optionnal, $app by default)
#
+# Requires YunoHost version 2.7.2 or higher.
ynh_remove_systemd_config () {
# Declare an array to define the options of this helper.
local legacy_args=s
@@ -158,10 +164,10 @@ ynh_remove_systemd_config () {
local finalsystemdconf="/etc/systemd/system/$service.service"
if [ -e "$finalsystemdconf" ]; then
- sudo systemctl stop $service
- sudo systemctl disable $service
+ ynh_systemd_action --service_name=$service --action=stop
+ systemctl disable $service
ynh_secure_remove --file="$finalsystemdconf"
- sudo systemctl daemon-reload
+ systemctl daemon-reload
fi
}
@@ -169,8 +175,7 @@ ynh_remove_systemd_config () {
#
# usage: ynh_add_nginx_config "list of others variables to replace"
#
-# | arg: list of others variables to replace separeted by a space
-# | for example : 'path_2 port_2 ...'
+# | arg: list - (Optional) list of others variables to replace separated by spaces. For example : 'path_2 port_2 ...'
#
# This will use a template in ../conf/nginx.conf
# __PATH__ by $path_url
@@ -183,6 +188,7 @@ ynh_remove_systemd_config () {
# __PATH_2__ by $path_2
# __PORT_2__ by $port_2
#
+# Requires YunoHost version 2.7.2 or higher.
ynh_add_nginx_config () {
finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf"
local others_var=${1:-}
@@ -227,24 +233,38 @@ ynh_add_nginx_config () {
ynh_store_file_checksum --file="$finalnginxconf"
- sudo systemctl reload nginx
+ ynh_systemd_action --service_name=nginx --action=reload
}
# Remove the dedicated nginx config
#
# usage: ynh_remove_nginx_config
+#
+# Requires YunoHost version 2.7.2 or higher.
ynh_remove_nginx_config () {
ynh_secure_remove --file="/etc/nginx/conf.d/$domain.d/$app.conf"
- sudo systemctl reload nginx
+ ynh_systemd_action --service_name=nginx --action=reload
}
# Create a dedicated php-fpm config
#
-# usage: ynh_add_fpm_config
+# usage: ynh_add_fpm_config [--phpversion=7.X]
+# | arg: -v, --phpversion - Version of php to use.
+#
+# Requires YunoHost version 2.7.2 or higher.
ynh_add_fpm_config () {
+ # Declare an array to define the options of this helper.
+ local legacy_args=v
+ declare -Ar args_array=( [v]=phpversion= )
+ local phpversion
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
# Configure PHP-FPM 7.0 by default
- local fpm_config_dir="/etc/php/7.0/fpm"
- local fpm_service="php7.0-fpm"
+ phpversion="${phpversion:-7.0}"
+
+ local fpm_config_dir="/etc/php/$phpversion/fpm"
+ local fpm_service="php${phpversion}-fpm"
# Configure PHP-FPM 5 on Debian Jessie
if [ "$(ynh_get_debian_release)" == "jessie" ]; then
fpm_config_dir="/etc/php5/fpm"
@@ -258,6 +278,7 @@ ynh_add_fpm_config () {
ynh_replace_string --match_string="__NAMETOCHANGE__" --replace_string="$app" --target_file="$finalphpconf"
ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finalphpconf"
ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="$finalphpconf"
+ ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$finalphpconf"
sudo chown root: "$finalphpconf"
ynh_store_file_checksum --file="$finalphpconf"
@@ -270,12 +291,14 @@ ynh_add_fpm_config () {
sudo chown root: "$finalphpini"
ynh_store_file_checksum "$finalphpini"
fi
- sudo systemctl reload $fpm_service
+ ynh_systemd_action --service_name=$fpm_service --action=reload
}
# Remove the dedicated php-fpm config
#
# usage: ynh_remove_fpm_config
+#
+# Requires YunoHost version 2.7.2 or higher.
ynh_remove_fpm_config () {
local fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir)
local fpm_service=$(ynh_app_setting_get --app=$app --key=fpm_service)
@@ -286,7 +309,7 @@ ynh_remove_fpm_config () {
fi
ynh_secure_remove --file="$fpm_config_dir/pool.d/$app.conf"
ynh_secure_remove --file="$fpm_config_dir/conf.d/20-$app.ini" 2>&1
- sudo systemctl reload $fpm_service
+ ynh_systemd_action --service_name=$fpm_service --action=reload
}
# Create a dedicated fail2ban config (jail and filter conf files)
@@ -350,8 +373,10 @@ ynh_remove_fpm_config () {
# To validate your regex you can test with this command:
# fail2ban-regex /var/log/YOUR_LOG_FILE_PATH /etc/fail2ban/filter.d/YOUR_APP.conf
#
+# Requires YunoHost version 3.?.? or higher.
ynh_add_fail2ban_config () {
# Declare an array to define the options of this helper.
+ local legacy_args=lrmptv
declare -Ar args_array=( [l]=logpath= [r]=failregex= [m]=max_retry= [p]=ports= [t]=use_template [v]=others_var=)
local logpath
local failregex
@@ -429,6 +454,8 @@ EOF
# Remove the dedicated fail2ban config (jail and filter conf files)
#
# usage: ynh_remove_fail2ban_config
+#
+# Requires YunoHost version 3.?.? or higher.
ynh_remove_fail2ban_config () {
ynh_secure_remove "/etc/fail2ban/jail.d/$app.conf"
ynh_secure_remove "/etc/fail2ban/filter.d/$app.conf"
diff --git a/data/helpers.d/debug b/data/helpers.d/debug
index a8b7c8d69..7ad097dbd 100644
--- a/data/helpers.d/debug
+++ b/data/helpers.d/debug
@@ -5,6 +5,8 @@
# usage: ynh_debug [--message=message] [--trace=1/0]
# | arg: -m, --message= - The text to print
# | arg: -t, --trace= - Turn on or off the trace of the script. Usefull to trace nonly a small part of a script.
+#
+# Requires YunoHost version 3.?.? or higher.
ynh_debug () {
# Disable set xtrace for the helper itself, to not pollute the debug log
set +x
@@ -35,6 +37,8 @@ ynh_debug () {
PS4='$(basename ${BASH_SOURCE[0]})-L${LINENO}: '
# Force xtrace to stderr
BASH_XTRACEFD=2
+ # Force stdout to stderr
+ exec 1>&2
fi
if [ "$trace" == "0" ]
then
@@ -42,6 +46,8 @@ ynh_debug () {
set +x
# Put xtrace back to its original fild descriptor
BASH_XTRACEFD=$old_bash_xtracefd
+ # Restore stdout
+ exec 1>&1
fi
# Renable set xtrace
set -x
@@ -54,6 +60,8 @@ ynh_debug () {
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.?.? or higher.
ynh_debug_exec () {
ynh_debug --message="$(eval $@)"
}
diff --git a/data/helpers.d/filesystem b/data/helpers.d/filesystem
index 10123dea4..c471a6872 100644
--- a/data/helpers.d/filesystem
+++ b/data/helpers.d/filesystem
@@ -15,16 +15,13 @@ CAN_BIND=${CAN_BIND:-1}
# If DEST is ended by a slash it complete this path with the basename of SRC.
#
# usage: ynh_backup --src_path=src_path [--dest_path=dest_path] [--is_big] [--not_mandatory]
-# | arg: -s, --src_path - file or directory to bind or symlink or copy. it shouldn't be in
-# the backup dir.
-# | arg: -d, --dest_path - destination file or directory inside the
-# backup dir
+# | arg: -s, --src_path - file or directory to bind or symlink or copy. it shouldn't be in the backup dir.
+# | arg: -d, --dest_path - destination file or directory inside the backup dir
# | arg: -b, --is_big - Indicate data are big (mail, video, image ...)
# | arg: -m, --not_mandatory - Indicate that if the file is missing, the backup can ignore it.
# | arg: arg - Deprecated arg
#
-# example:
-# # Wordpress app context
+# Example in the context of a wordpress app
#
# ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"
# # => This line will be added into CSV file
@@ -46,6 +43,7 @@ CAN_BIND=${CAN_BIND:-1}
# ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "/conf/"
# # => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf/$app.conf"
#
+# Requires YunoHost version 2.4.0 or higher.
ynh_backup() {
# TODO find a way to avoid injection by file strange naming !
@@ -79,7 +77,7 @@ ynh_backup() {
echo "Source path '${src_path}' does not exist" >&2
if [ "$not_mandatory" == "0" ]
then
- echo "Source path '${SRC_PATH}' does not exist" >&2
+ echo "Source path '${src_path}' does not exist" >&2
# This is a temporary fix for fail2ban config files missing after the migration to stretch.
if echo "${src_path}" | grep --quiet "/etc/fail2ban"
@@ -158,6 +156,7 @@ ynh_backup() {
#
# usage: ynh_restore
#
+# Requires YunoHost version 2.6.4 or higher.
ynh_restore () {
# Deduce the relative path of $YNH_CWD
local REL_DIR="${YNH_CWD#$YNH_BACKUP_DIR/}"
@@ -196,29 +195,27 @@ with open(sys.argv[1], 'r') as backup_file:
# Restore a file or a directory
#
# Use the registered path in backup_list by ynh_backup to restore the file at
-# the good place.
+# the right place.
#
# usage: ynh_restore_file --origin_path=origin_path [--dest_path=dest_path] [--not_mandatory]
-# | arg: -o, --origin_path - Path where was located the file or the directory before
-# to be backuped or relative path to $YNH_CWD where it is located in the backup archive
-# | arg: -d, --dest_path - Path where restore the file or the dir, if unspecified,
-# the destination will be ORIGIN_PATH or if the ORIGIN_PATH doesn't exist in
-# the archive, the destination will be searched into backup.csv
+# | arg: -o, --origin_path - Path where was located the file or the directory before to be backuped or relative path to $YNH_CWD where it is located in the backup archive
+# | arg: -d, --dest_path - Path where restore the file or the dir, if unspecified, the destination will be ORIGIN_PATH or if the ORIGIN_PATH doesn't exist in the archive, the destination will be searched into backup.csv
# | arg: -m, --not_mandatory - Indicate that if the file is missing, the restore process can ignore it.
#
+# examples:
+# ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf"
+# # You can also use relative paths:
+# ynh_restore_file "conf/nginx.conf"
+#
# If DEST_PATH already exists and is lighter than 500 Mo, a backup will be made in
# /home/yunohost.conf/backup/. Otherwise, the existing file is removed.
#
-# examples:
-# ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf"
-# # if apps/wordpress/etc/nginx/conf.d/$domain.d/$app.conf exists, restore it into
-# # /etc/nginx/conf.d/$domain.d/$app.conf
-# # if no, search a correspondance in the csv (eg: conf/nginx.conf) and restore it into
-# # /etc/nginx/conf.d/$domain.d/$app.conf
-#
-# # DON'T GIVE THE ARCHIVE PATH:
-# ynh_restore_file "conf/nginx.conf"
+# if apps/wordpress/etc/nginx/conf.d/$domain.d/$app.conf exists, restore it into
+# /etc/nginx/conf.d/$domain.d/$app.conf
+# if no, search for a match in the csv (eg: conf/nginx.conf) and restore it into
+# /etc/nginx/conf.d/$domain.d/$app.conf
#
+# Requires YunoHost version 2.6.4 or higher.
ynh_restore_file () {
# Declare an array to define the options of this helper.
local legacy_args=odm
@@ -313,6 +310,8 @@ properly with chmod/chown." >&2
#
# usage: ynh_store_file_checksum --file=file
# | arg: -f, --file - The file on which the checksum will performed, then stored.
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_store_file_checksum () {
# Declare an array to define the options of this helper.
local legacy_args=f
@@ -343,8 +342,9 @@ ynh_store_file_checksum () {
#
# usage: ynh_backup_if_checksum_is_different --file=file
# | arg: -f, --file - The file on which the checksum test will be perfomed.
+# | ret: the name of a backup file, or nothing
#
-# | ret: Return the name a the backup file, or nothing
+# Requires YunoHost version 2.6.4 or higher.
ynh_backup_if_checksum_is_different () {
# Declare an array to define the options of this helper.
local legacy_args=f
@@ -376,6 +376,8 @@ ynh_backup_if_checksum_is_different () {
#
# usage: ynh_remove_file_checksum file
# | arg: -f, --file= - The file for which the checksum will be deleted
+#
+# Requires YunoHost version 3.3.1 or higher.
ynh_delete_file_checksum () {
# Declare an array to define the options of this helper.
local legacy_args=f
@@ -392,6 +394,8 @@ ynh_delete_file_checksum () {
#
# usage: ynh_secure_remove --file=path_to_remove
# | arg: -f, --file - File or directory to remove
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_secure_remove () {
# Declare an array to define the options of this helper.
local legacy_args=f
diff --git a/data/helpers.d/getopts b/data/helpers.d/getopts
index 7055325f1..b6cd95f3c 100644
--- a/data/helpers.d/getopts
+++ b/data/helpers.d/getopts
@@ -43,6 +43,8 @@
# 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.
+#
+# Requires YunoHost version 3.2.2 or higher.
ynh_handle_getopts_args () {
# Manage arguments only if there's some provided
set +x
@@ -150,10 +152,15 @@ ynh_handle_getopts_args () {
# 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]}\"
+ # For the record.
+ # We're using eval here to get the content of the variable stored itself as simple text in $option_var...
+ # Other ways to get that content would be to use either ${!option_var} or declare -g ${option_var}
+ # But... ${!option_var} can't be used as left part of an assignation.
+ # declare -g ${option_var} will create a local variable (despite -g !) and will not be available for the helper itself.
+ # So... Stop fucking arguing each time that eval is evil... Go find an other working solution if you can find one!
+
+ eval ${option_var}+='"${all_args[$i]}"'
shift_value=$(( shift_value + 1 ))
fi
done
@@ -191,12 +198,9 @@ ynh_handle_getopts_args () {
# 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]}\"
+ eval ${option_var}+='"${arguments[$i]}"'
done
unset legacy_args
else
diff --git a/data/helpers.d/ip b/data/helpers.d/ip
index c50d8be73..2ca4053d9 100644
--- a/data/helpers.d/ip
+++ b/data/helpers.d/ip
@@ -7,6 +7,7 @@
#
# example: ynh_validate_ip 4 111.222.333.444
#
+# Requires YunoHost version 2.2.4 or higher.
ynh_validate_ip()
{
# http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python#319298
@@ -40,6 +41,7 @@ EOF
# usage: ynh_validate_ip4 --ip_address=ip_address
# | ret: 0 for valid ipv4 addresses, 1 otherwise
#
+# Requires YunoHost version 2.2.4 or higher.
ynh_validate_ip4()
{
# Declare an array to define the options of this helper.
@@ -60,6 +62,7 @@ ynh_validate_ip4()
# usage: ynh_validate_ip6 --ip_address=ip_address
# | ret: 0 for valid ipv6 addresses, 1 otherwise
#
+# Requires YunoHost version 2.2.4 or higher.
ynh_validate_ip6()
{
# Declare an array to define the options of this helper.
diff --git a/data/helpers.d/mysql b/data/helpers.d/mysql
index fa1a61dab..d7400db2d 100644
--- a/data/helpers.d/mysql
+++ b/data/helpers.d/mysql
@@ -11,6 +11,8 @@ MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql
# | arg: -u, --user - the user name to connect as
# | arg: -p, --password - the user password
# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_connect_as() {
# Declare an array to define the options of this helper.
local legacy_args=upd
@@ -30,6 +32,8 @@ ynh_mysql_connect_as() {
# usage: ynh_mysql_execute_as_root --sql=sql [--database=database]
# | arg: -s, --sql - the SQL command to execute
# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_execute_as_root() {
# Declare an array to define the options of this helper.
local legacy_args=sd
@@ -49,6 +53,8 @@ ynh_mysql_execute_as_root() {
# usage: ynh_mysql_execute_file_as_root --file=file [--database=database]
# | arg: -f, --file - the file containing SQL commands
# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_execute_file_as_root() {
# Declare an array to define the options of this helper.
local legacy_args=fd
@@ -71,6 +77,8 @@ ynh_mysql_execute_file_as_root() {
# | arg: db - the database name to create
# | arg: user - the user to grant privilegies
# | arg: pwd - the password to identify user by
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_create_db() {
local db=$1
@@ -95,6 +103,8 @@ ynh_mysql_create_db() {
#
# usage: ynh_mysql_drop_db db
# | arg: db - the database name to drop
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_drop_db() {
ynh_mysql_execute_as_root --sql="DROP DATABASE ${1};"
}
@@ -106,6 +116,8 @@ ynh_mysql_drop_db() {
# usage: ynh_mysql_dump_db --database=database
# | arg: -d, --database - the database name to dump
# | ret: the mysqldump output
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_dump_db() {
# Declare an array to define the options of this helper.
local legacy_args=d
@@ -124,6 +136,8 @@ ynh_mysql_dump_db() {
# usage: ynh_mysql_create_user user pwd [host]
# | arg: user - the user name to create
# | arg: pwd - the password to identify user by
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_create_user() {
ynh_mysql_execute_as_root \
--sql="CREATE USER '${1}'@'localhost' IDENTIFIED BY '${2}';"
@@ -133,6 +147,8 @@ ynh_mysql_create_user() {
#
# usage: ynh_mysql_user_exists --user=user
# | arg: -u, --user - the user for which to check existence
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_user_exists()
{
# Declare an array to define the options of this helper.
@@ -156,6 +172,8 @@ ynh_mysql_user_exists()
#
# usage: ynh_mysql_drop_user user
# | arg: user - the user name to drop
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_mysql_drop_user() {
ynh_mysql_execute_as_root --sql="DROP USER '${1}'@'localhost';"
}
@@ -168,7 +186,9 @@ ynh_mysql_drop_user() {
# usage: ynh_mysql_setup_db --db_user=user --db_name=name [--db_pwd=pwd]
# | arg: -u, --db_user - Owner of the database
# | arg: -n, --db_name - Name of the database
-# | arg: -p, --db_pwd - Password of the database. If not given, a password will be generated
+# | arg: -p, --db_pwd - Password of the database. If not provided, a password will be generated
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_mysql_setup_db () {
# Declare an array to define the options of this helper.
local legacy_args=unp
@@ -180,7 +200,7 @@ ynh_mysql_setup_db () {
ynh_handle_getopts_args "$@"
local new_db_pwd=$(ynh_string_random) # Generate a random password
- # If $db_pwd is not given, use new_db_pwd instead for db_pwd
+ # If $db_pwd is not provided, use new_db_pwd instead for db_pwd
db_pwd="${db_pwd:-$new_db_pwd}"
ynh_mysql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database
@@ -192,6 +212,8 @@ ynh_mysql_setup_db () {
# usage: ynh_mysql_remove_db --db_user=user --db_name=name
# | arg: -u, --db_user - Owner of the database
# | arg: -n, --db_name - Name of the database
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_mysql_remove_db () {
# Declare an array to define the options of this helper.
local legacy_args=un
@@ -223,6 +245,8 @@ ynh_mysql_remove_db () {
# usage: ynh_sanitize_dbid --db_name=name
# | arg: -n, --db_name - name to correct/sanitize
# | ret: the corrected name
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_sanitize_dbid () {
# Declare an array to define the options of this helper.
local legacy_args=n
diff --git a/data/helpers.d/network b/data/helpers.d/network
index a765d6346..4dc080203 100644
--- a/data/helpers.d/network
+++ b/data/helpers.d/network
@@ -1,17 +1,21 @@
#!/bin/bash
# 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
-# ynh_normalize_url_path / -> /
+# examples:
+# 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
+# ynh_normalize_url_path / # -> /
#
# usage: ynh_normalize_url_path --path_url=path_to_normalize
# | arg: -p, --path_url - URL path to normalize before using it
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_normalize_url_path () {
# Declare an array to define the options of this helper.
local legacy_args=p
@@ -36,6 +40,8 @@ ynh_normalize_url_path () {
#
# usage: ynh_find_port --port=begin_port
# | arg: -p, --port - port to start to search
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_find_port () {
# Declare an array to define the options of this helper.
local legacy_args=p
@@ -59,6 +65,8 @@ ynh_find_port () {
# usage: ynh_webpath_available --domain=domain --path_url=path
# | arg: -d, --domain - the domain/host of the url
# | arg: -p, --path_url - the web path to check the availability of
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_webpath_available () {
# Declare an array to define the options of this helper.
local legacy_args=dp
@@ -79,6 +87,8 @@ ynh_webpath_available () {
# | arg: -a, --app - the app for which the domain should be registered
# | arg: -d, --domain - the domain/host of the web path
# | arg: -p, --path_url - the web path to be registered
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_webpath_register () {
# Declare an array to define the options of this helper.
local legacy_args=adp
diff --git a/data/helpers.d/nodejs b/data/helpers.d/nodejs
index 098ed4410..6833b7593 100644
--- a/data/helpers.d/nodejs
+++ b/data/helpers.d/nodejs
@@ -10,6 +10,8 @@ export N_PREFIX="$n_install_dir"
# [internal]
#
# usage: ynh_install_n
+#
+# Requires YunoHost version 2.7.12 or higher.
ynh_install_n () {
echo "Installation of N - Node.js version management" >&2
# Build an app.src for n
@@ -36,6 +38,8 @@ SOURCE_SUM=2ba3c9d4dd3c7e38885b37e02337906a1ee91febe6d5c9159d89a9050f2eea8f" > "
# That's means it has to be added to any systemd script.
#
# usage: ynh_use_nodejs
+#
+# Requires YunoHost version 2.7.12 or higher.
ynh_use_nodejs () {
nodejs_version=$(ynh_app_setting_get --app=$app --key=nodejs_version)
@@ -59,6 +63,8 @@ ynh_use_nodejs () {
# | arg: -n, --nodejs_version - Version of node to install.
# If possible, prefer to use major version number (e.g. 8 instead of 8.10.0).
# The crontab will handle the update of minor versions when needed.
+#
+# Requires YunoHost version 2.7.12 or higher.
ynh_install_nodejs () {
# Use n, https://github.com/tj/n to manage the nodejs versions
@@ -117,7 +123,7 @@ ynh_install_nodejs () {
fi
# Store the ID of this app and the version of node requested for it
- echo "$YNH_APP_ID:$nodejs_version" | tee --append "$n_install_dir/ynh_app_version"
+ echo "$YNH_APP_INSTANCE_NAME:$nodejs_version" | tee --append "$n_install_dir/ynh_app_version"
# Store nodejs_version into the config of this app
ynh_app_setting_set --app=$app --key=nodejs_version --value=$nodejs_version
@@ -135,11 +141,13 @@ ynh_install_nodejs () {
# If no other app uses node, n will be also removed.
#
# usage: ynh_remove_nodejs
+#
+# Requires YunoHost version 2.7.12 or higher.
ynh_remove_nodejs () {
nodejs_version=$(ynh_app_setting_get --app=$app --key=nodejs_version)
# Remove the line for this app
- sed --in-place "/$YNH_APP_ID:$nodejs_version/d" "$n_install_dir/ynh_app_version"
+ sed --in-place "/$YNH_APP_INSTANCE_NAME:$nodejs_version/d" "$n_install_dir/ynh_app_version"
# If no other app uses this version of nodejs, remove it.
if ! grep --quiet "$nodejs_version" "$n_install_dir/ynh_app_version"
@@ -164,6 +172,8 @@ ynh_remove_nodejs () {
# This cron will check and update all minor node versions used by your apps.
#
# usage: ynh_cron_upgrade_node
+#
+# Requires YunoHost version 2.7.12 or higher.
ynh_cron_upgrade_node () {
# Build the update script
cat > "$n_install_dir/node_update.sh" << EOF
diff --git a/data/helpers.d/package b/data/helpers.d/package
index 000b0ee74..9c2b58458 100644
--- a/data/helpers.d/package
+++ b/data/helpers.d/package
@@ -5,6 +5,8 @@
# [internal]
#
# usage: ynh_wait_dpkg_free
+#
+# Requires YunoHost version 3.3.1 or higher.
ynh_wait_dpkg_free() {
local try
# With seq 1 17, timeout will be almost 30 minutes
@@ -44,6 +46,8 @@ ynh_wait_dpkg_free() {
#
# usage: ynh_package_is_installed --package=name
# | arg: -p, --package - the package name to check
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_is_installed() {
# Declare an array to define the options of this helper.
local legacy_args=p
@@ -64,6 +68,8 @@ ynh_package_is_installed() {
# usage: ynh_package_version --package=name
# | arg: -p, --package - the package name to get version
# | ret: the version or an empty string
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_version() {
# Declare an array to define the options of this helper.
local legacy_args=p
@@ -84,6 +90,8 @@ ynh_package_version() {
# [internal]
#
# usage: ynh_apt update
+#
+# Requires YunoHost version 2.4.0.3 or higher.
ynh_apt() {
ynh_wait_dpkg_free
DEBIAN_FRONTEND=noninteractive apt-get -y $@
@@ -92,6 +100,8 @@ ynh_apt() {
# Update package index files
#
# usage: ynh_package_update
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_update() {
ynh_apt update
}
@@ -100,6 +110,8 @@ ynh_package_update() {
#
# usage: ynh_package_install name [name [...]]
# | arg: name - the package name to install
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_install() {
ynh_apt --no-remove -o Dpkg::Options::=--force-confdef \
-o Dpkg::Options::=--force-confold install $@
@@ -109,6 +121,8 @@ ynh_package_install() {
#
# usage: ynh_package_remove name [name [...]]
# | arg: name - the package name to remove
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_remove() {
ynh_apt remove $@
}
@@ -117,6 +131,8 @@ ynh_package_remove() {
#
# usage: ynh_package_autoremove name [name [...]]
# | arg: name - the package name to remove
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_autoremove() {
ynh_apt autoremove $@
}
@@ -125,6 +141,8 @@ ynh_package_autoremove() {
#
# usage: ynh_package_autopurge name [name [...]]
# | arg: name - the package name to autoremove and purge
+#
+# Requires YunoHost version 2.7.2 or higher.
ynh_package_autopurge() {
ynh_apt autoremove --purge $@
}
@@ -139,6 +157,8 @@ ynh_package_autopurge() {
#
# usage: ynh_package_install_from_equivs controlfile
# | arg: controlfile - path of the equivs control file
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_package_install_from_equivs () {
local controlfile=$1
@@ -181,6 +201,8 @@ ynh_package_install_from_equivs () {
# You can give a choice between some package with this syntax : "dep1|dep2"
# Example : ynh_install_app_dependencies dep1 dep2 "dep3|dep4|dep5"
# This mean in the dependence tree : dep1 & dep2 & (dep3 | dep4 | dep5)
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_install_app_dependencies () {
local dependencies=$@
local dependencies=${dependencies// /, }
@@ -217,6 +239,8 @@ EOF
# Dependencies will removed only if no other package need them.
#
# usage: ynh_remove_app_dependencies
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_remove_app_dependencies () {
local dep_app=${app//_/-} # Replace all '_' by '-'
ynh_package_autopurge ${dep_app}-ynh-deps # Remove the fake package and its dependencies if they not still used.
diff --git a/data/helpers.d/print b/data/helpers.d/print
index 7f37021ae..468c41e96 100644
--- a/data/helpers.d/print
+++ b/data/helpers.d/print
@@ -2,6 +2,8 @@
# Print a message to stderr and exit
# usage: ynh_die --message=MSG [--ret_code=RETCODE]
+#
+# Requires YunoHost version 2.4.0 or higher.
ynh_die() {
# Declare an array to define the options of this helper.
local legacy_args=mc
@@ -18,6 +20,8 @@ ynh_die() {
# Display a message in the 'INFO' logging category
#
# usage: ynh_print_info --message="Some message"
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_info() {
# Declare an array to define the options of this helper.
local legacy_args=m
@@ -37,6 +41,8 @@ ynh_print_info() {
#
# Simply duplicate the log, execute the yunohost command and replace the log without the result of this command
# It's a very badly hack...
+#
+# Requires YunoHost version 2.6.4 or higher.
ynh_no_log() {
local ynh_cli_log=/var/log/yunohost/yunohost-cli.log
sudo cp -a ${ynh_cli_log} ${ynh_cli_log}-move
@@ -50,6 +56,7 @@ ynh_no_log() {
#
# [internal]
#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_log () {
echo -e "${1}"
}
@@ -58,6 +65,8 @@ ynh_print_log () {
#
# usage: ynh_print_warn --message="Text to print"
# | arg: -m, --message - The text to print
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_warn () {
# Declare an array to define the options of this helper.
local legacy_args=m
@@ -73,6 +82,8 @@ ynh_print_warn () {
#
# usage: ynh_print_err --message="Text to print"
# | arg: -m, --message - The text to print
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_err () {
# Declare an array to define the options of this helper.
local legacy_args=m
@@ -89,8 +100,11 @@ ynh_print_err () {
# usage: ynh_exec_err command to execute
# usage: ynh_exec_err "command to execute | following command"
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
+# If the command to execute uses double quotes, they have to be escaped or they will be interpreted and removed.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_exec_err () {
ynh_print_err "$(eval $@)"
}
@@ -100,8 +114,11 @@ ynh_exec_err () {
# usage: ynh_exec_warn command to execute
# usage: ynh_exec_warn "command to execute | following command"
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
+# If the command to execute uses double quotes, they have to be escaped or they will be interpreted and removed.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_exec_warn () {
ynh_print_warn "$(eval $@)"
}
@@ -111,8 +128,11 @@ ynh_exec_warn () {
# usage: ynh_exec_warn_less command to execute
# usage: ynh_exec_warn_less "command to execute | following command"
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
+# If the command to execute uses double quotes, they have to be escaped or they will be interpreted and removed.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_exec_warn_less () {
eval $@ 2>&1
}
@@ -122,8 +142,11 @@ ynh_exec_warn_less () {
# usage: ynh_exec_quiet command to execute
# usage: ynh_exec_quiet "command to execute | following command"
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
+# If the command to execute uses double quotes, they have to be escaped or they will be interpreted and removed.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_exec_quiet () {
eval $@ > /dev/null
}
@@ -133,8 +156,11 @@ ynh_exec_quiet () {
# usage: ynh_exec_fully_quiet command to execute
# usage: ynh_exec_fully_quiet "command to execute | following command"
# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be sent to the next pipe.
+# If the command to execute uses double quotes, they have to be escaped or they will be interpreted and removed.
#
# | arg: command - command to execute
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_exec_fully_quiet () {
eval $@ > /dev/null 2>&1
}
@@ -143,6 +169,8 @@ ynh_exec_fully_quiet () {
#
# usage: ynh_print_OFF
# WARNING: You should be careful with this helper, and never forget to use ynh_print_ON as soon as possible to restore the logging.
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_OFF () {
set +x
}
@@ -150,6 +178,8 @@ ynh_print_OFF () {
# Restore the logging after ynh_print_OFF
#
# usage: ynh_print_ON
+#
+# Requires YunoHost version 3.2.0 or higher.
ynh_print_ON () {
set -x
# Print an echo only for the log, to be able to know that ynh_print_ON has been called.
@@ -162,13 +192,17 @@ ynh_print_ON () {
# | arg: -m, --message= - The text to print
# | arg: -w, --weight= - The weight for this progression. This value is 1 by default. Use a bigger value for a longer part of the script.
# | arg: -t, --time= - Print the execution time since the last call to this helper. Especially usefull to define weights.
+# The execution time is given for the duration since the previous call. So the weight should be applied to this previous call.
# | arg: -l, --last= - Use for the last call of the helper, to fill te progression bar.
+#
+# Requires YunoHost version 3.?.? or higher.
increment_progression=0
previous_weight=0
# Define base_time when the file is sourced
base_time=$(date +%s)
ynh_script_progression () {
# Declare an array to define the options of this helper.
+ local legacy_args=mwtl
declare -Ar args_array=( [m]=message= [w]=weight= [t]=time [l]=last )
local message
local weight
@@ -190,9 +224,9 @@ ynh_script_progression () {
local weight_calls=$(grep --perl-regexp --count "^[^#]*ynh_script_progression.*(--weight|-w )" $0)
# Get the weight of each occurrences of 'ynh_script_progression' in the script using --weight
- local weight_valuesA="$(grep --perl-regexp "^[^#]*ynh_script_progression.*--weight" $0 | sed 's/.*--weight[= ]\([[:digit:]].*\)/\1/g')"
- # Get the weight of each occurrences of 'ynh_script_progression' in the script using -w
- local weight_valuesB="$(grep --perl-regexp "^[^#]*ynh_script_progression.*-w " $0 | sed 's/.*-w[= ]\([[:digit:]].*\)/\1/g')"
+ local weight_valuesA="$(grep --perl-regexp "^[^#]*ynh_script_progression.*--weight" $0 | sed 's/.*--weight[= ]\([[:digit:]]*\).*/\1/g')"
+ # Get the weight of each occurrences of 'ynh_script_progression' in the script using -w
+ local weight_valuesB="$(grep --perl-regexp "^[^#]*ynh_script_progression.*-w " $0 | sed 's/.*-w[= ]\([[:digit:]]*\).*/\1/g')"
# Each value will be on a different line.
# Remove each 'end of line' and replace it by a '+' to sum the values.
local weight_values=$(( $(echo "$weight_valuesA" | tr '\n' '+') + $(echo "$weight_valuesB" | tr '\n' '+') 0 ))
diff --git a/data/helpers.d/psql b/data/helpers.d/psql
index 2ef13482a..c5e065f07 100644
--- a/data/helpers.d/psql
+++ b/data/helpers.d/psql
@@ -1,21 +1,277 @@
+#!/bin/bash
+
+PSQL_ROOT_PWD_FILE=/etc/yunohost/psql
+
+# Open a connection as a user
+#
+# example: ynh_psql_connect_as 'user' 'pass' <<< "UPDATE ...;"
+# example: ynh_psql_connect_as 'user' 'pass' < /path/to/file.sql
+#
+# usage: ynh_psql_connect_as --user=user --password=password [--database=database]
+# | arg: -u, --user - the user name to connect as
+# | arg: -p, --password - the user password
+# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_connect_as() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=upd
+ declare -Ar args_array=([u]=user= [p]=password= [d]=database=)
+ local user
+ local password
+ local database
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+ database="${database:-}"
+
+ sudo --login --user=postgres PGUSER="$user" PGPASSWORD="$password" psql "$database"
+}
+
+# Execute a command as root user
+#
+# usage: ynh_psql_execute_as_root --sql=sql [--database=database]
+# | arg: -s, --sql - the SQL command to execute
+# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_execute_as_root() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=sd
+ declare -Ar args_array=([s]=sql= [d]=database=)
+ local sql
+ local database
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+ database="${database:-}"
+
+ ynh_psql_connect_as --user="postgres" --password="$(sudo cat $PSQL_ROOT_PWD_FILE)" \
+ --database="$database" <<<"$sql"
+}
+
+# Execute a command from a file as root user
+#
+# usage: ynh_psql_execute_file_as_root --file=file [--database=database]
+# | arg: -f, --file - the file containing SQL commands
+# | arg: -d, --database - the database to connect to
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_execute_file_as_root() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=fd
+ declare -Ar args_array=([f]=file= [d]=database=)
+ local file
+ local database
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+ database="${database:-}"
+
+ ynh_psql_connect_as --user="postgres" --password="$(sudo cat $PSQL_ROOT_PWD_FILE)" \
+ --database="$database" <"$file"
+}
+
+# Create a database and grant optionnaly privilegies to a user
+#
+# [internal]
+#
+# usage: ynh_psql_create_db db [user]
+# | arg: db - the database name to create
+# | arg: user - the user to grant privilegies
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_create_db() {
+ local db=$1
+ local user=${2:-}
+
+ local sql="CREATE DATABASE ${db};"
+
+ # grant all privilegies to user
+ if [ -n "$user" ]; then
+ sql+="GRANT ALL PRIVILEGES ON DATABASE ${db} TO ${user} WITH GRANT OPTION;"
+ fi
+
+ ynh_psql_execute_as_root --sql="$sql"
+}
+
+# Drop a database
+#
+# [internal]
+#
+# If you intend to drop the database *and* the associated user,
+# consider using ynh_psql_remove_db instead.
+#
+# usage: ynh_psql_drop_db db
+# | arg: db - the database name to drop
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_drop_db() {
+ local db=$1
+ sudo --login --user=postgres dropdb $db
+}
+
+# Dump a database
+#
+# example: ynh_psql_dump_db 'roundcube' > ./dump.sql
+#
+# usage: ynh_psql_dump_db --database=database
+# | arg: -d, --database - the database name to dump
+# | ret: the psqldump output
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_dump_db() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=d
+ declare -Ar args_array=([d]=database=)
+ local database
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
+ sudo --login --user=postgres pg_dump "$database"
+}
+
+# Create a user
+#
+# [internal]
+#
+# usage: ynh_psql_create_user user pwd
+# | arg: user - the user name to create
+# | arg: pwd - the password to identify user by
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_create_user() {
+ local user=$1
+ local pwd=$2
+ ynh_psql_execute_as_root --sql="CREATE USER $user WITH ENCRYPTED PASSWORD '$pwd'"
+}
+
+# Check if a psql user exists
+#
+# usage: ynh_psql_user_exists --user=user
+# | arg: -u, --user - the user for which to check existence
+ynh_psql_user_exists() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=u
+ declare -Ar args_array=([u]=user=)
+ local user
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
+ if ! sudo --login --user=postgres PGUSER="postgres" PGPASSWORD="$(sudo cat $PSQL_ROOT_PWD_FILE)" psql -tAc "SELECT rolname FROM pg_roles WHERE rolname='$user';" | grep --quiet "$user" ; then
+ return 1
+ else
+ return 0
+ fi
+}
+
+# Check if a psql database exists
+#
+# usage: ynh_psql_database_exists --database=database
+# | arg: -d, --database - the database for which to check existence
+ynh_psql_database_exists() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=d
+ declare -Ar args_array=([d]=database=)
+ local database
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
+ if ! sudo --login --user=postgres PGUSER="postgres" PGPASSWORD="$(sudo cat $PSQL_ROOT_PWD_FILE)" psql -tAc "SELECT datname FROM pg_database WHERE datname='$database';" | grep --quiet "$database"; then
+ return 1
+ else
+ return 0
+ fi
+}
+
+# Drop a user
+#
+# [internal]
+#
+# usage: ynh_psql_drop_user user
+# | arg: user - the user name to drop
+#
+# Requires YunoHost version 3.?.? or higher.
+ynh_psql_drop_user() {
+ ynh_psql_execute_as_root --sql="DROP USER ${1};"
+}
+
+# Create a database, an user and its password. Then store the password in the app's config
+#
+# After executing this helper, the password of the created database will be available in $db_pwd
+# It will also be stored as "psqlpwd" into the app settings.
+#
+# usage: ynh_psql_setup_db --db_user=user --db_name=name [--db_pwd=pwd]
+# | arg: -u, --db_user - Owner of the database
+# | arg: -n, --db_name - Name of the database
+# | arg: -p, --db_pwd - Password of the database. If not given, a password will be generated
+ynh_psql_setup_db() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=unp
+ declare -Ar args_array=([u]=db_user= [n]=db_name= [p]=db_pwd=)
+ local db_user
+ local db_name
+ db_pwd=""
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
+ local new_db_pwd=$(ynh_string_random) # Generate a random password
+ # If $db_pwd is not given, use new_db_pwd instead for db_pwd
+ db_pwd="${db_pwd:-$new_db_pwd}"
+
+ if ! ynh_psql_user_exists --user=$db_user; then
+ ynh_psql_create_user "$db_user" "$db_pwd"
+ fi
+
+ ynh_psql_create_db "$db_name" "$db_user" # Create the database
+ ynh_app_setting_set --app=$app --key=psqlpwd --value=$db_pwd # Store the password in the app's config
+}
+
+# Remove a database if it exists, and the associated user
+#
+# usage: ynh_psql_remove_db --db_user=user --db_name=name
+# | arg: -u, --db_user - Owner of the database
+# | arg: -n, --db_name - Name of the database
+ynh_psql_remove_db() {
+ # Declare an array to define the options of this helper.
+ local legacy_args=un
+ declare -Ar args_array=([u]=db_user= [n]=db_name=)
+ local db_user
+ local db_name
+ # Manage arguments with getopts
+ ynh_handle_getopts_args "$@"
+
+ local psql_root_password=$(sudo cat $PSQL_ROOT_PWD_FILE)
+ if ynh_psql_database_exists --database=$db_name; then # Check if the database exists
+ echo "Removing database $db_name" >&2
+ ynh_psql_drop_db $db_name # Remove the database
+ else
+ echo "Database $db_name not found" >&2
+ fi
+
+ # Remove psql user if it exists
+ if ynh_psql_user_exists --user=$db_user; then
+ echo "Removing user $db_user" >&2
+ ynh_psql_drop_user $db_user
+ else
+ echo "User $db_user not found" >&2
+ fi
+}
+
# Create a master password and set up global settings
# Please always call this script in install and restore scripts
#
# usage: ynh_psql_test_if_first_run
ynh_psql_test_if_first_run() {
- if [ -f /etc/yunohost/psql ];
- then
+ if [ -f "$PSQL_ROOT_PWD_FILE" ]; then
echo "PostgreSQL is already installed, no need to create master password"
else
local pgsql="$(ynh_string_random)"
- echo "$pgsql" > /etc/yunohost/psql
+ echo "$pgsql" >/etc/yunohost/psql
- if [ -e /etc/postgresql/9.4/ ]
- then
+ if [ -e /etc/postgresql/9.4/ ]; then
local pg_hba=/etc/postgresql/9.4/main/pg_hba.conf
- elif [ -e /etc/postgresql/9.6/ ]
- then
+ local logfile=/var/log/postgresql/postgresql-9.4-main.log
+ elif [ -e /etc/postgresql/9.6/ ]; then
local pg_hba=/etc/postgresql/9.6/main/pg_hba.conf
+ local logfile=/var/log/postgresql/postgresql-9.6-main.log
else
ynh_die "postgresql shoud be 9.4 or 9.6"
fi
@@ -27,122 +283,12 @@ ynh_psql_test_if_first_run() {
# https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html#EXAMPLE-PG-HBA.CONF
# Note: we can't use peer since YunoHost create users with nologin
# See: https://github.com/YunoHost/yunohost/blob/unstable/data/helpers.d/user
- sed -i '/local\s*all\s*all\s*peer/i \
- local all all password' "$pg_hba"
+ ynh_replace_string --match_string="local\(\s*\)all\(\s*\)all\(\s*\)peer" --replace_string="local\1all\2all\3password" --target_file="$pg_hba"
+
+ # Advertise service in admin panel
+ yunohost service add postgresql --log "$logfile"
+
systemctl enable postgresql
systemctl reload postgresql
fi
}
-
-# Open a connection as a user
-#
-# example: ynh_psql_connect_as 'user' 'pass' <<< "UPDATE ...;"
-# example: ynh_psql_connect_as 'user' 'pass' < /path/to/file.sql
-#
-# usage: ynh_psql_connect_as user pwd [db]
-# | arg: user - the user name to connect as
-# | arg: pwd - the user password
-# | arg: db - the database to connect to
-ynh_psql_connect_as() {
- local user="$1"
- local pwd="$2"
- local db="$3"
- sudo --login --user=postgres PGUSER="$user" PGPASSWORD="$pwd" psql "$db"
-}
-
-# # Execute a command as root user
-#
-# usage: ynh_psql_execute_as_root sql [db]
-# | arg: sql - the SQL command to execute
-ynh_psql_execute_as_root () {
- local sql="$1"
- sudo --login --user=postgres psql <<< "$sql"
-}
-
-# Execute a command from a file as root user
-#
-# usage: ynh_psql_execute_file_as_root file [db]
-# | arg: file - the file containing SQL commands
-# | arg: db - the database to connect to
-ynh_psql_execute_file_as_root() {
- local file="$1"
- local db="$2"
- sudo --login --user=postgres psql "$db" < "$file"
-}
-
-# Create a database, an user and its password. Then store the password in the app's config
-#
-# After executing this helper, the password of the created database will be available in $db_pwd
-# It will also be stored as "psqlpwd" into the app settings.
-#
-# usage: ynh_psql_setup_db user name [pwd]
-# | arg: user - Owner of the database
-# | arg: name - Name of the database
-# | arg: pwd - Password of the database. If not given, a password will be generated
-ynh_psql_setup_db () {
- local db_user="$1"
- local db_name="$2"
- local new_db_pwd=$(ynh_string_random) # Generate a random password
- # If $3 is not given, use new_db_pwd instead for db_pwd.
- local db_pwd="${3:-$new_db_pwd}"
- ynh_psql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database
- ynh_app_setting_set "$app" psqlpwd "$db_pwd" # Store the password in the app's config
-}
-
-# Create a database and grant privilegies to a user
-#
-# usage: ynh_psql_create_db db [user [pwd]]
-# | arg: db - the database name to create
-# | arg: user - the user to grant privilegies
-# | arg: pwd - the user password
-ynh_psql_create_db() {
- local db="$1"
- local user="$2"
- local pwd="$3"
- ynh_psql_create_user "$user" "$pwd"
- sudo --login --user=postgres createdb --owner="$user" "$db"
-}
-
-# Drop a database
-#
-# usage: ynh_psql_drop_db db
-# | arg: db - the database name to drop
-# | arg: user - the user to drop
-ynh_psql_remove_db() {
- local db="$1"
- local user="$2"
- sudo --login --user=postgres dropdb "$db"
- ynh_psql_drop_user "$user"
-}
-
-# Dump a database
-#
-# example: ynh_psql_dump_db 'roundcube' > ./dump.sql
-#
-# usage: ynh_psql_dump_db db
-# | arg: db - the database name to dump
-# | ret: the psqldump output
-ynh_psql_dump_db() {
- local db="$1"
- sudo --login --user=postgres pg_dump "$db"
-}
-
-
-# Create a user
-#
-# usage: ynh_psql_create_user user pwd [host]
-# | arg: user - the user name to create
-ynh_psql_create_user() {
- local user="$1"
- local pwd="$2"
- sudo --login --user=postgres psql -c"CREATE USER $user WITH PASSWORD '$pwd'" postgres
-}
-
-# Drop a user
-#
-# usage: ynh_psql_drop_user user
-# | arg: user - the user name to drop
-ynh_psql_drop_user() {
- local user="$1"
- sudo --login --user=postgres dropuser "$user"
-}
diff --git a/data/helpers.d/setting b/data/helpers.d/setting
index 6f75f6c80..63d9104f3 100644
--- a/data/helpers.d/setting
+++ b/data/helpers.d/setting
@@ -5,6 +5,8 @@
# usage: ynh_app_setting_get --app=app --key=key
# | arg: -a, --app - the application id
# | arg: -k, --key - the setting to get
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_get() {
# Declare an array to define the options of this helper.
local legacy_args=ak
@@ -14,7 +16,7 @@ ynh_app_setting_get() {
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
- sudo yunohost app setting "$app" "$key" --output-as plain --quiet
+ ynh_app_setting "get" "$app" "$key"
}
# Set an application setting
@@ -23,6 +25,8 @@ ynh_app_setting_get() {
# | arg: -a, --app - the application id
# | arg: -k, --key - the setting name to set
# | arg: -v, --value - the setting value to set
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_set() {
# Declare an array to define the options of this helper.
local legacy_args=akv
@@ -33,7 +37,7 @@ ynh_app_setting_set() {
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
- sudo yunohost app setting "$app" "$key" --value="$value" --quiet
+ ynh_app_setting "set" "$app" "$key" "$value"
}
# Delete an application setting
@@ -41,6 +45,8 @@ ynh_app_setting_set() {
# usage: ynh_app_setting_delete --app=app --key=key
# | arg: -a, --app - the application id
# | arg: -k, --key - the setting to delete
+#
+# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_delete() {
# Declare an array to define the options of this helper.
local legacy_args=ak
@@ -50,5 +56,38 @@ ynh_app_setting_delete() {
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
- sudo yunohost app setting -d "$app" "$key" --quiet
+ ynh_app_setting "delete" "$app" "$key"
+}
+
+# Small "hard-coded" interface to avoid calling "yunohost app" directly each
+# time dealing with a setting is needed (which may be so slow on ARM boards)
+#
+# [internal]
+#
+ynh_app_setting()
+{
+ ACTION="$1" APP="$2" KEY="$3" VALUE="${4:-}" python - <
Arguments:
App helpers
-{% for category, helpers in data %}
+{% for category, helpers in data.helpers %}
{{ category }}
@@ -27,8 +27,12 @@
- {% for name, descr in h.args %}
-
{{ name }}
: {{ descr }}{{ infos[0] }}
: {{ infos[1] }}{{ infos[0] }}
, {{ infos[1] }}
: {{ infos[2] }}
Example: {{ h.example }}
+ Examples:
{{ example }}
+ {% else %}
+ {{ example.strip("# ") }}
+ {% endif %}
+ Details: @@ -63,6 +81,8 @@ {% endfor %} {% endfor %} +
Generated by this script on {{data.date}} (Yunohost version {{data.version}})
+