Merge pull request #561 from YunoHost/use_getops

Use getops
This commit is contained in:
Alexandre Aubin 2019-02-06 13:13:40 +01:00 committed by GitHub
commit 69a896e1c3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 667 additions and 328 deletions

View file

@ -1,9 +1,11 @@
#!/bin/bash
# Use logrotate to manage the logfile # Use logrotate to manage the logfile
# #
# usage: ynh_use_logrotate [logfile] [--non-append|--append] [specific_user/specific_group] # usage: ynh_use_logrotate [--logfile=/log/file] [--nonappend] [--specific_user=user/group]
# | arg: logfile - absolute path of logfile # | arg: -l, --logfile= - absolute path of logfile
# | arg: --non-append - (Option) Replace the config file instead of appending this new config. # | arg: -n, --nonappend - (Option) Replace the config file instead of appending this new config.
# | arg: specific_user : run logrotate as the specified user and group. If not specified logrotate is runned as root. # | 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} # 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. # You can provide a path with the directory only or with the logfile.
@ -13,28 +15,53 @@
# It's possible to use this helper several times, each config will be added to the same logrotate config file. # 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 # Unless you use the option --non-append
ynh_use_logrotate () { ynh_use_logrotate () {
local customtee="tee -a" # Declare an array to define the options of this helper.
local user_group="${3:-}" local legacy_args=lnuya
declare -Ar args_array=( [l]=logfile= [n]=nonappend [u]=specific_user= [y]=non [a]=append )
# [y]=non [a]=append are only for legacy purpose, to not fail on the old option '--non-append'
local logfile
local nonappend
local specific_user
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local logfile="${logfile:-}"
local nonappend="${nonappend:-0}"
local specific_user="${specific_user:-}"
# LEGACY CODE - PRE GETOPTS
if [ $# -gt 0 ] && [ "$1" == "--non-append" ]; then if [ $# -gt 0 ] && [ "$1" == "--non-append" ]; then
customtee="tee" nonappend=1
# Destroy this argument for the next command. # Destroy this argument for the next command.
shift shift
elif [ $# -gt 1 ] && [ "$2" == "--non-append" ]; then elif [ $# -gt 1 ] && [ "$2" == "--non-append" ]; then
customtee="tee" nonappend=1
fi fi
if [ $# -gt 0 ]; then
if [ $# -gt 0 ] && [ "$(echo ${1:0:1})" != "-" ]; then
if [ "$(echo ${1##*.})" == "log" ]; then # Keep only the extension to check if it's a logfile if [ "$(echo ${1##*.})" == "log" ]; then # Keep only the extension to check if it's a logfile
local logfile=$1 # In this case, focus logrotate on the logfile local logfile=$1 # In this case, focus logrotate on the logfile
else else
local logfile=$1/*.log # Else, uses the directory and all logfile into it. local logfile=$1/*.log # Else, uses the directory and all logfile into it.
fi fi
fi
# LEGACY CODE
local customtee="tee -a"
if [ "$nonappend" -eq 1 ]; then
customtee="tee"
fi
if [ -n "$logfile" ]
then
if [ "$(echo ${logfile##*.})" != "log" ]; then # Keep only the extension to check if it's a logfile
local logfile="$1/*.log" # Else, uses the directory and all logfile into it.
fi
else else
local logfile="/var/log/${app}/*.log" # Without argument, use a defaut directory in /var/log logfile="/var/log/${app}/*.log" # Without argument, use a defaut directory in /var/log
fi fi
local su_directive="" local su_directive=""
if [[ -n $user_group ]]; then if [[ -n $specific_user ]]; then
su_directive=" # Run logorotate as specific user - group su_directive=" # Run logorotate as specific user - group
su ${user_group%/*} ${user_group#*/}" su ${specific_user%/*} ${specific_user#*/}"
fi fi
cat > ./${app}-logrotate << EOF # Build a config file for logrotate cat > ./${app}-logrotate << EOF # Build a config file for logrotate
@ -73,9 +100,9 @@ ynh_remove_logrotate () {
# Create a dedicated systemd config # Create a dedicated systemd config
# #
# usage: ynh_add_systemd_config [service] [template] # usage: ynh_add_systemd_config [--service=service] [--template=template]
# | arg: service - Service name (optionnal, $app by default) # | arg: -s, --service - Service name (optionnal, $app by default)
# | arg: template - Name of template file (optionnal, this is 'systemd' by default, meaning ./conf/systemd.service will be used as template) # | arg: -t, --template - Name of template file (optionnal, this is 'systemd' by default, meaning ./conf/systemd.service will be used as template)
# #
# This will use the template ../conf/<templatename>.service # This will use the template ../conf/<templatename>.service
# to generate a systemd config, by replacing the following keywords # to generate a systemd config, by replacing the following keywords
@ -86,40 +113,54 @@ ynh_remove_logrotate () {
# __FINALPATH__ by $final_path # __FINALPATH__ by $final_path
# #
ynh_add_systemd_config () { ynh_add_systemd_config () {
local service_name="${1:-$app}" # Declare an array to define the options of this helper.
local legacy_args=st
declare -Ar args_array=( [s]=service= [t]=template= )
local service
local template
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local service="${service:-$app}"
local template="${nonappend:-systemd.service}"
finalsystemdconf="/etc/systemd/system/$service_name.service" finalsystemdconf="/etc/systemd/system/$service.service"
ynh_backup_if_checksum_is_different "$finalsystemdconf" ynh_backup_if_checksum_is_different --file="$finalsystemdconf"
sudo cp ../conf/${2:-systemd.service} "$finalsystemdconf" sudo cp ../conf/$template "$finalsystemdconf"
# To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable. # To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable.
# Substitute in a nginx config file only if the variable is not empty # Substitute in a nginx config file only if the variable is not empty
if test -n "${final_path:-}"; then if test -n "${final_path:-}"; then
ynh_replace_string "__FINALPATH__" "$final_path" "$finalsystemdconf" ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finalsystemdconf"
fi fi
if test -n "${app:-}"; then if test -n "${app:-}"; then
ynh_replace_string "__APP__" "$app" "$finalsystemdconf" ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$finalsystemdconf"
fi fi
ynh_store_file_checksum "$finalsystemdconf" ynh_store_file_checksum --file="$finalsystemdconf"
sudo chown root: "$finalsystemdconf" sudo chown root: "$finalsystemdconf"
sudo systemctl enable $service_name sudo systemctl enable $service
sudo systemctl daemon-reload sudo systemctl daemon-reload
} }
# Remove the dedicated systemd config # Remove the dedicated systemd config
# #
# usage: ynh_remove_systemd_config [service] # usage: ynh_remove_systemd_config [--service=service]
# | arg: service - Service name (optionnal, $app by default) # | arg: -s, --service - Service name (optionnal, $app by default)
# #
ynh_remove_systemd_config () { ynh_remove_systemd_config () {
local service_name="${1:-$app}" # Declare an array to define the options of this helper.
local legacy_args=s
declare -Ar args_array=( [s]=service= )
local service
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local service="${service:-$app}"
local finalsystemdconf="/etc/systemd/system/$service_name.service" local finalsystemdconf="/etc/systemd/system/$service.service"
if [ -e "$finalsystemdconf" ]; then if [ -e "$finalsystemdconf" ]; then
sudo systemctl stop $service_name sudo systemctl stop $service
sudo systemctl disable $service_name sudo systemctl disable $service
ynh_secure_remove "$finalsystemdconf" ynh_secure_remove --file="$finalsystemdconf"
sudo systemctl daemon-reload sudo systemctl daemon-reload
fi fi
} }
@ -145,7 +186,7 @@ ynh_remove_systemd_config () {
ynh_add_nginx_config () { ynh_add_nginx_config () {
finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf" finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf"
local others_var=${1:-} local others_var=${1:-}
ynh_backup_if_checksum_is_different "$finalnginxconf" ynh_backup_if_checksum_is_different --file="$finalnginxconf"
sudo cp ../conf/nginx.conf "$finalnginxconf" sudo cp ../conf/nginx.conf "$finalnginxconf"
# To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable. # To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable.
@ -153,20 +194,20 @@ ynh_add_nginx_config () {
if test -n "${path_url:-}"; then if test -n "${path_url:-}"; then
# path_url_slash_less is path_url, or a blank value if path_url is only '/' # path_url_slash_less is path_url, or a blank value if path_url is only '/'
local path_url_slash_less=${path_url%/} local path_url_slash_less=${path_url%/}
ynh_replace_string "__PATH__/" "$path_url_slash_less/" "$finalnginxconf" ynh_replace_string --match_string="__PATH__/" --replace_string="$path_url_slash_less/" --target_file="$finalnginxconf"
ynh_replace_string "__PATH__" "$path_url" "$finalnginxconf" ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$finalnginxconf"
fi fi
if test -n "${domain:-}"; then if test -n "${domain:-}"; then
ynh_replace_string "__DOMAIN__" "$domain" "$finalnginxconf" ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$finalnginxconf"
fi fi
if test -n "${port:-}"; then if test -n "${port:-}"; then
ynh_replace_string "__PORT__" "$port" "$finalnginxconf" ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="$finalnginxconf"
fi fi
if test -n "${app:-}"; then if test -n "${app:-}"; then
ynh_replace_string "__NAME__" "$app" "$finalnginxconf" ynh_replace_string --match_string="__NAME__" --replace_string="$app" --target_file="$finalnginxconf"
fi fi
if test -n "${final_path:-}"; then if test -n "${final_path:-}"; then
ynh_replace_string "__FINALPATH__" "$final_path" "$finalnginxconf" ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finalnginxconf"
fi fi
# Replace all other variable given as arguments # Replace all other variable given as arguments
@ -174,17 +215,17 @@ ynh_add_nginx_config () {
do do
# ${var_to_replace^^} make the content of the variable on upper-cases # ${var_to_replace^^} make the content of the variable on upper-cases
# ${!var_to_replace} get the content of the variable named $var_to_replace # ${!var_to_replace} get the content of the variable named $var_to_replace
ynh_replace_string "__${var_to_replace^^}__" "${!var_to_replace}" "$finalnginxconf" ynh_replace_string --match_string="__${var_to_replace^^}__" --replace_string="${!var_to_replace}" --target_file="$finalnginxconf"
done done
if [ "${path_url:-}" != "/" ] if [ "${path_url:-}" != "/" ]
then then
ynh_replace_string "^#sub_path_only" "" "$finalnginxconf" ynh_replace_string --match_string="^#sub_path_only" --replace_string="" --target_file="$finalnginxconf"
else else
ynh_replace_string "^#root_path_only" "" "$finalnginxconf" ynh_replace_string --match_string="^#root_path_only" --replace_string="" --target_file="$finalnginxconf"
fi fi
ynh_store_file_checksum "$finalnginxconf" ynh_store_file_checksum --file="$finalnginxconf"
sudo systemctl reload nginx sudo systemctl reload nginx
} }
@ -193,7 +234,7 @@ ynh_add_nginx_config () {
# #
# usage: ynh_remove_nginx_config # usage: ynh_remove_nginx_config
ynh_remove_nginx_config () { ynh_remove_nginx_config () {
ynh_secure_remove "/etc/nginx/conf.d/$domain.d/$app.conf" ynh_secure_remove --file="/etc/nginx/conf.d/$domain.d/$app.conf"
sudo systemctl reload nginx sudo systemctl reload nginx
} }
@ -209,16 +250,16 @@ ynh_add_fpm_config () {
fpm_config_dir="/etc/php5/fpm" fpm_config_dir="/etc/php5/fpm"
fpm_service="php5-fpm" fpm_service="php5-fpm"
fi fi
ynh_app_setting_set $app fpm_config_dir "$fpm_config_dir" ynh_app_setting_set --app=$app --key=fpm_config_dir --value="$fpm_config_dir"
ynh_app_setting_set $app fpm_service "$fpm_service" ynh_app_setting_set --app=$app --key=fpm_service --value="$fpm_service"
finalphpconf="$fpm_config_dir/pool.d/$app.conf" finalphpconf="$fpm_config_dir/pool.d/$app.conf"
ynh_backup_if_checksum_is_different "$finalphpconf" ynh_backup_if_checksum_is_different --file="$finalphpconf"
sudo cp ../conf/php-fpm.conf "$finalphpconf" sudo cp ../conf/php-fpm.conf "$finalphpconf"
ynh_replace_string "__NAMETOCHANGE__" "$app" "$finalphpconf" ynh_replace_string --match_string="__NAMETOCHANGE__" --replace_string="$app" --target_file="$finalphpconf"
ynh_replace_string "__FINALPATH__" "$final_path" "$finalphpconf" ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finalphpconf"
ynh_replace_string "__USER__" "$app" "$finalphpconf" ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="$finalphpconf"
sudo chown root: "$finalphpconf" sudo chown root: "$finalphpconf"
ynh_store_file_checksum "$finalphpconf" ynh_store_file_checksum --file="$finalphpconf"
if [ -e "../conf/php-fpm.ini" ] if [ -e "../conf/php-fpm.ini" ]
then then
@ -236,14 +277,14 @@ ynh_add_fpm_config () {
# #
# usage: ynh_remove_fpm_config # usage: ynh_remove_fpm_config
ynh_remove_fpm_config () { ynh_remove_fpm_config () {
local fpm_config_dir=$(ynh_app_setting_get $app fpm_config_dir) local fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir)
local fpm_service=$(ynh_app_setting_get $app fpm_service) local fpm_service=$(ynh_app_setting_get --app=$app --key=fpm_service)
# Assume php version 7 if not set # Assume php version 7 if not set
if [ -z "$fpm_config_dir" ]; then if [ -z "$fpm_config_dir" ]; then
fpm_config_dir="/etc/php/7.0/fpm" fpm_config_dir="/etc/php/7.0/fpm"
fpm_service="php7.0-fpm" fpm_service="php7.0-fpm"
fi fi
ynh_secure_remove "$fpm_config_dir/pool.d/$app.conf" ynh_secure_remove --file="$fpm_config_dir/pool.d/$app.conf"
ynh_secure_remove "$fpm_config_dir/conf.d/20-$app.ini" 2>&1 ynh_secure_remove --file="$fpm_config_dir/conf.d/20-$app.ini" 2>&1
sudo systemctl reload $fpm_service sudo systemctl reload $fpm_service
} }

View file

@ -1,3 +1,7 @@
#!/bin/bash
source /usr/share/yunohost/helpers.d/getopts
CAN_BIND=${CAN_BIND:-1} CAN_BIND=${CAN_BIND:-1}
# Add a file or a directory to the list of paths to backup # Add a file or a directory to the list of paths to backup
@ -10,13 +14,13 @@ CAN_BIND=${CAN_BIND:-1}
# #
# If DEST is ended by a slash it complete this path with the basename of SRC. # If DEST is ended by a slash it complete this path with the basename of SRC.
# #
# usage: ynh_backup src [dest [is_big [not_mandatory [arg]]]] # usage: ynh_backup --src_path=src_path [--dest_path=dest_path] [--is_big] [--not_mandatory]
# | arg: src - file or directory to bind or symlink or copy. it shouldn't be in # | arg: -s, --src_path - file or directory to bind or symlink or copy. it shouldn't be in
# the backup dir. # the backup dir.
# | arg: dest - destination file or directory inside the # | arg: -d, --dest_path - destination file or directory inside the
# backup dir # backup dir
# | arg: is_big - 1 to indicate data are big (mail, video, image ...) # | arg: -b, --is_big - Indicate data are big (mail, video, image ...)
# | arg: not_mandatory - 1 to indicate that if the file is missing, the backup can ignore it. # | arg: -m, --not_mandatory - Indicate that if the file is missing, the backup can ignore it.
# | arg: arg - Deprecated arg # | arg: arg - Deprecated arg
# #
# example: # example:
@ -44,16 +48,26 @@ CAN_BIND=${CAN_BIND:-1}
# #
ynh_backup() { ynh_backup() {
# TODO find a way to avoid injection by file strange naming ! # TODO find a way to avoid injection by file strange naming !
local SRC_PATH="$1"
local DEST_PATH="${2:-}" # Declare an array to define the options of this helper.
local IS_BIG="${3:-0}" local legacy_args=sdbm
local NOT_MANDATORY="${4:-0}" declare -Ar args_array=( [s]=src_path= [d]=dest_path= [b]=is_big [m]=not_mandatory )
local src_path
local dest_path
local is_big
local not_mandatory
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local dest_path="${dest_path:-}"
local is_big="${is_big:-0}"
local not_mandatory="${not_mandatory:-0}"
BACKUP_CORE_ONLY=${BACKUP_CORE_ONLY:-0} BACKUP_CORE_ONLY=${BACKUP_CORE_ONLY:-0}
# If backing up core only (used by ynh_backup_before_upgrade), # If backing up core only (used by ynh_backup_before_upgrade),
# don't backup big data items # don't backup big data items
if [ "$IS_BIG" == "1" ] && [ "$BACKUP_CORE_ONLY" == "1" ] ; then if [ "$is_big" == "1" ] && [ "$BACKUP_CORE_ONLY" == "1" ] ; then
echo "$SRC_PATH will not be saved, because backup_core_only is set." >&2 echo "$src_path will not be saved, because backup_core_only is set." >&2
return 0 return 0
fi fi
@ -61,15 +75,16 @@ ynh_backup() {
# Format correctly source and destination paths # Format correctly source and destination paths
# ============================================================================== # ==============================================================================
# Be sure the source path is not empty # Be sure the source path is not empty
[[ -e "${SRC_PATH}" ]] || { [[ -e "${src_path}" ]] || {
if [ "$NOT_MANDATORY" == "0" ] echo "Source path '${src_path}' does not exist" >&2
if [ "$not_mandatory" == "0" ]
then 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. # This is a temporary fix for fail2ban config files missing after the migration to stretch.
if echo "${SRC_PATH}" | grep --quiet "/etc/fail2ban" if echo "${src_path}" | grep --quiet "/etc/fail2ban"
then then
touch "${SRC_PATH}" touch "${src_path}"
echo "The missing file will be replaced by a dummy one for the backup !!!" >&2 echo "The missing file will be replaced by a dummy one for the backup !!!" >&2
else else
return 1 return 1
@ -81,17 +96,17 @@ ynh_backup() {
# Transform the source path as an absolute path # Transform the source path as an absolute path
# If it's a dir remove the ending / # If it's a dir remove the ending /
SRC_PATH=$(realpath "$SRC_PATH") src_path=$(realpath "$src_path")
# If there is no destination path, initialize it with the source path # If there is no destination path, initialize it with the source path
# relative to "/". # relative to "/".
# eg: SRC_PATH=/etc/yunohost -> DEST_PATH=etc/yunohost # eg: src_path=/etc/yunohost -> dest_path=etc/yunohost
if [[ -z "$DEST_PATH" ]]; then if [[ -z "$dest_path" ]]; then
DEST_PATH="${SRC_PATH#/}" dest_path="${src_path#/}"
else else
if [[ "${DEST_PATH:0:1}" == "/" ]]; then if [[ "${dest_path:0:1}" == "/" ]]; then
# If the destination path is an absolute path, transform it as a path # If the destination path is an absolute path, transform it as a path
# relative to the current working directory ($YNH_CWD) # relative to the current working directory ($YNH_CWD)
@ -100,43 +115,43 @@ ynh_backup() {
# $YNH_BACKUP_DIR/apps/APP_INSTANCE_NAME/backup/ # $YNH_BACKUP_DIR/apps/APP_INSTANCE_NAME/backup/
# #
# If it's a system part backup script, YNH_CWD is equal to $YNH_BACKUP_DIR # If it's a system part backup script, YNH_CWD is equal to $YNH_BACKUP_DIR
DEST_PATH="${DEST_PATH#$YNH_CWD/}" dest_path="${dest_path#$YNH_CWD/}"
# Case where $2 is an absolute dir but doesn't begin with $YNH_CWD # Case where $2 is an absolute dir but doesn't begin with $YNH_CWD
[[ "${DEST_PATH:0:1}" == "/" ]] \ [[ "${dest_path:0:1}" == "/" ]] \
&& DEST_PATH="${DEST_PATH#/}" && dest_path="${dest_path#/}"
fi fi
# Complete DEST_PATH if ended by a / # Complete dest_path if ended by a /
[[ "${DEST_PATH: -1}" == "/" ]] \ [[ "${dest_path: -1}" == "/" ]] \
&& DEST_PATH="${DEST_PATH}/$(basename $SRC_PATH)" && dest_path="${dest_path}/$(basename $src_path)"
fi fi
# Check if DEST_PATH already exists in tmp archive # Check if dest_path already exists in tmp archive
[[ ! -e "${DEST_PATH}" ]] || { [[ ! -e "${dest_path}" ]] || {
echo "Destination path '${DEST_PATH}' already exist" >&2 echo "Destination path '${dest_path}' already exist" >&2
return 1 return 1
} }
# Add the relative current working directory to the destination path # Add the relative current working directory to the destination path
local REL_DIR="${YNH_CWD#$YNH_BACKUP_DIR}" local rel_dir="${YNH_CWD#$YNH_BACKUP_DIR}"
REL_DIR="${REL_DIR%/}/" rel_dir="${rel_dir%/}/"
DEST_PATH="${REL_DIR}${DEST_PATH}" dest_path="${rel_dir}${dest_path}"
DEST_PATH="${DEST_PATH#/}" dest_path="${dest_path#/}"
# ============================================================================== # ==============================================================================
# ============================================================================== # ==============================================================================
# Write file to backup into backup_list # Write file to backup into backup_list
# ============================================================================== # ==============================================================================
local SRC=$(echo "${SRC_PATH}" | sed -r 's/"/\"\"/g') local src=$(echo "${src_path}" | sed -r 's/"/\"\"/g')
local DEST=$(echo "${DEST_PATH}" | sed -r 's/"/\"\"/g') local dest=$(echo "${dest_path}" | sed -r 's/"/\"\"/g')
echo "\"${SRC}\",\"${DEST}\"" >> "${YNH_BACKUP_CSV}" echo "\"${src}\",\"${dest}\"" >> "${YNH_BACKUP_CSV}"
# ============================================================================== # ==============================================================================
# Create the parent dir of the destination path # Create the parent dir of the destination path
# It's for retro compatibility, some script consider ynh_backup creates this dir # It's for retro compatibility, some script consider ynh_backup creates this dir
mkdir -p $(dirname "$YNH_BACKUP_DIR/${DEST_PATH}") mkdir -p $(dirname "$YNH_BACKUP_DIR/${dest_path}")
} }
# Restore all files linked to the restore hook or to the restore app script # Restore all files linked to the restore hook or to the restore app script
@ -153,7 +168,7 @@ ynh_restore () {
while read line; do while read line; do
local ORIGIN_PATH=$(echo "$line" | grep -ohP "^\"\K.*(?=\",\".*\"$)") local ORIGIN_PATH=$(echo "$line" | grep -ohP "^\"\K.*(?=\",\".*\"$)")
local ARCHIVE_PATH=$(echo "$line" | grep -ohP "^\".*\",\"$REL_DIR\K.*(?=\"$)") local ARCHIVE_PATH=$(echo "$line" | grep -ohP "^\".*\",\"$REL_DIR\K.*(?=\"$)")
ynh_restore_file "$ARCHIVE_PATH" "$ORIGIN_PATH" ynh_restore_file --origin_path="$ARCHIVE_PATH" --dest_path="$ORIGIN_PATH"
done done
} }
@ -183,13 +198,13 @@ with open(sys.argv[1], 'r') as backup_file:
# Use the registered path in backup_list by ynh_backup to restore the file at # Use the registered path in backup_list by ynh_backup to restore the file at
# the good place. # the good place.
# #
# usage: ynh_restore_file ORIGIN_PATH [ DEST_PATH [NOT_MANDATORY]] # usage: ynh_restore_file --origin_path=origin_path [--dest_path=dest_path] [--not_mandatory]
# | arg: ORIGIN_PATH - Path where was located the file or the directory before # | 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 # to be backuped or relative path to $YNH_CWD where it is located in the backup archive
# | arg: DEST_PATH - Path where restore the file or the dir, if unspecified, # | 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 destination will be ORIGIN_PATH or if the ORIGIN_PATH doesn't exist in
# the archive, the destination will be searched into backup.csv # the archive, the destination will be searched into backup.csv
# | arg: NOT_MANDATORY - 1 to indicate that if the file is missing, the restore process can ignore it. # | arg: -m, --not_mandatory - Indicate that if the file is missing, the restore process can ignore it.
# #
# If DEST_PATH already exists and is lighter than 500 Mo, a backup will be made in # 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. # /home/yunohost.conf/backup/. Otherwise, the existing file is removed.
@ -205,49 +220,58 @@ with open(sys.argv[1], 'r') as backup_file:
# ynh_restore_file "conf/nginx.conf" # ynh_restore_file "conf/nginx.conf"
# #
ynh_restore_file () { ynh_restore_file () {
local ORIGIN_PATH="/${1#/}" # Declare an array to define the options of this helper.
local ARCHIVE_PATH="$YNH_CWD${ORIGIN_PATH}" local legacy_args=odm
# Default value for DEST_PATH = /$ORIGIN_PATH declare -Ar args_array=( [o]=origin_path= [d]=dest_path= [m]=not_mandatory )
local DEST_PATH="${2:-$ORIGIN_PATH}" local origin_path
local NOT_MANDATORY="${3:-0}" local archive_path
local dest_path
local not_mandatory
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local origin_path="/${origin_path#/}"
local archive_path="$YNH_CWD${origin_path}"
# Default value for dest_path = /$origin_path
local dest_path="${dest_path:-$origin_path}"
local not_mandatory="${not_mandatory:-0}"
# If ARCHIVE_PATH doesn't exist, search for a corresponding path in CSV # If archive_path doesn't exist, search for a corresponding path in CSV
if [ ! -d "$ARCHIVE_PATH" ] && [ ! -f "$ARCHIVE_PATH" ] && [ ! -L "$ARCHIVE_PATH" ]; then if [ ! -d "$archive_path" ] && [ ! -f "$archive_path" ] && [ ! -L "$archive_path" ]; then
if [ "$NOT_MANDATORY" == "0" ] if [ "$not_mandatory" == "0" ]
then then
ARCHIVE_PATH="$YNH_BACKUP_DIR/$(_get_archive_path \"$ORIGIN_PATH\")" archive_path="$YNH_BACKUP_DIR/$(_get_archive_path \"$origin_path\")"
else else
return 0 return 0
fi fi
fi fi
# Move the old directory if it already exists # Move the old directory if it already exists
if [[ -e "${DEST_PATH}" ]] if [[ -e "${dest_path}" ]]
then then
# Check if the file/dir size is less than 500 Mo # Check if the file/dir size is less than 500 Mo
if [[ $(du -sb ${DEST_PATH} | cut -d"/" -f1) -le "500000000" ]] if [[ $(du -sb ${dest_path} | cut -d"/" -f1) -le "500000000" ]]
then then
local backup_file="/home/yunohost.conf/backup/${DEST_PATH}.backup.$(date '+%Y%m%d.%H%M%S')" local backup_file="/home/yunohost.conf/backup/${dest_path}.backup.$(date '+%Y%m%d.%H%M%S')"
mkdir -p "$(dirname "$backup_file")" mkdir -p "$(dirname "$backup_file")"
mv "${DEST_PATH}" "$backup_file" # Move the current file or directory mv "${dest_path}" "$backup_file" # Move the current file or directory
else else
ynh_secure_remove ${DEST_PATH} ynh_secure_remove --file=${dest_path}
fi fi
fi fi
# Restore ORIGIN_PATH into DEST_PATH # Restore origin_path into dest_path
mkdir -p $(dirname "$DEST_PATH") mkdir -p $(dirname "$dest_path")
# Do a copy if it's just a mounting point # Do a copy if it's just a mounting point
if mountpoint -q $YNH_BACKUP_DIR; then if mountpoint -q $YNH_BACKUP_DIR; then
if [[ -d "${ARCHIVE_PATH}" ]]; then if [[ -d "${archive_path}" ]]; then
ARCHIVE_PATH="${ARCHIVE_PATH}/." archive_path="${archive_path}/."
mkdir -p "$DEST_PATH" mkdir -p "$dest_path"
fi fi
cp -a "$ARCHIVE_PATH" "${DEST_PATH}" cp -a "$archive_path" "${dest_path}"
# Do a move if YNH_BACKUP_DIR is already a copy # Do a move if YNH_BACKUP_DIR is already a copy
else else
mv "$ARCHIVE_PATH" "${DEST_PATH}" mv "$archive_path" "${dest_path}"
fi fi
} }
@ -287,11 +311,18 @@ properly with chmod/chown." >&2
# #
# $app should be defined when calling this helper # $app should be defined when calling this helper
# #
# usage: ynh_store_file_checksum file # usage: ynh_store_file_checksum --file=file
# | arg: file - The file on which the checksum will performed, then stored. # | arg: -f, --file - The file on which the checksum will performed, then stored.
ynh_store_file_checksum () { ynh_store_file_checksum () {
local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' # Declare an array to define the options of this helper.
ynh_app_setting_set $app $checksum_setting_name $(sudo md5sum "$1" | cut -d' ' -f1) local legacy_args=f
declare -Ar args_array=( [f]=file= )
local file
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_'
ynh_app_setting_set --app=$app --key=$checksum_setting_name --value=$(sudo md5sum "$file" | cut -d' ' -f1)
} }
# Verify the checksum and backup the file if it's different # Verify the checksum and backup the file if it's different
@ -300,14 +331,20 @@ ynh_store_file_checksum () {
# #
# $app should be defined when calling this helper # $app should be defined when calling this helper
# #
# usage: ynh_backup_if_checksum_is_different file # usage: ynh_backup_if_checksum_is_different --file=file
# | arg: file - The file on which the checksum test will be perfomed. # | arg: -f, --file - The file on which the checksum test will be perfomed.
# #
# | ret: Return the name a the backup file, or nothing # | ret: Return the name a the backup file, or nothing
ynh_backup_if_checksum_is_different () { ynh_backup_if_checksum_is_different () {
local file=$1 # Declare an array to define the options of this helper.
local legacy_args=f
declare -Ar args_array=( [f]=file= )
local file
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_' local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_'
local checksum_value=$(ynh_app_setting_get $app $checksum_setting_name) local checksum_value=$(ynh_app_setting_get --app=$app --key=$checksum_setting_name)
if [ -n "$checksum_value" ] if [ -n "$checksum_value" ]
then # Proceed only if a value was stored into the app settings then # Proceed only if a value was stored into the app settings
if ! echo "$checksum_value $file" | sudo md5sum -c --status if ! echo "$checksum_value $file" | sudo md5sum -c --status
@ -329,21 +366,28 @@ ynh_backup_if_checksum_is_different () {
# | arg: -f, --file= - The file for which the checksum will be deleted # | arg: -f, --file= - The file for which the checksum will be deleted
ynh_delete_file_checksum () { ynh_delete_file_checksum () {
# Declare an array to define the options of this helper. # Declare an array to define the options of this helper.
local legacy_args=f
declare -Ar args_array=( [f]=file= ) declare -Ar args_array=( [f]=file= )
local file local file
# Manage arguments with getopts # Manage arguments with getopts
ynh_handle_getopts_args "$@" ynh_handle_getopts_args "$@"
local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_' local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_'
ynh_app_setting_delete $app $checksum_setting_name ynh_app_setting_delete --app=$app --key=$checksum_setting_name
} }
# Remove a file or a directory securely # Remove a file or a directory securely
# #
# usage: ynh_secure_remove path_to_remove # usage: ynh_secure_remove --file=path_to_remove
# | arg: path_to_remove - File or directory to remove # | arg: -f, --file - File or directory to remove
ynh_secure_remove () { ynh_secure_remove () {
local path_to_remove=$1 # Declare an array to define the options of this helper.
local legacy_args=f
declare -Ar args_array=( [f]=file= )
local file
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local forbidden_path=" \ local forbidden_path=" \
/var/www \ /var/www \
/home/yunohost.app" /home/yunohost.app"
@ -353,20 +397,20 @@ ynh_secure_remove () {
echo "/!\ Packager ! You provided a second argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time." >&2 echo "/!\ Packager ! You provided a second argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time." >&2
fi fi
if [[ "$forbidden_path" =~ "$path_to_remove" \ if [[ "$forbidden_path" =~ "$file" \
# Match all paths or subpaths in $forbidden_path # Match all paths or subpaths in $forbidden_path
|| "$path_to_remove" =~ ^/[[:alnum:]]+$ \ || "$file" =~ ^/[[:alnum:]]+$ \
# Match all first level paths from / (Like /var, /root, etc...) # Match all first level paths from / (Like /var, /root, etc...)
|| "${path_to_remove:${#path_to_remove}-1}" = "/" ]] || "${file:${#file}-1}" = "/" ]]
# Match if the path finishes by /. Because it seems there is an empty variable # Match if the path finishes by /. Because it seems there is an empty variable
then then
echo "Avoid deleting $path_to_remove." >&2 echo "Avoid deleting $file." >&2
else else
if [ -e "$path_to_remove" ] if [ -e "$file" ]
then then
sudo rm -R "$path_to_remove" sudo rm -R "$file"
else else
echo "$path_to_remove wasn't deleted because it doesn't exist." >&2 echo "$file wasn't deleted because it doesn't exist." >&2
fi fi
fi fi
} }

View file

@ -98,10 +98,10 @@ ynh_handle_getopts_args () {
if [ "$parameter" = "?" ] if [ "$parameter" = "?" ]
then then
ynh_die "Invalid argument: -${OPTARG:-}" ynh_die --message="Invalid argument: -${OPTARG:-}"
elif [ "$parameter" = ":" ] elif [ "$parameter" = ":" ]
then then
ynh_die "-$OPTARG parameter requires an argument." ynh_die --message="-$OPTARG parameter requires an argument."
else else
local shift_value=1 local shift_value=1
# Use the long option, corresponding to the short option read by getopts, as a variable # Use the long option, corresponding to the short option read by getopts, as a variable
@ -179,7 +179,7 @@ ynh_handle_getopts_args () {
# Get the option_flag from getopts_parameters, by using the option_flag according to the position of the argument. # 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} option_flag=${getopts_parameters:$i:1}
if [ -z "$option_flag" ]; then if [ -z "$option_flag" ]; then
ynh_print_warn "Too many arguments ! \"${arguments[$i]}\" will be ignored." ynh_print_warn --message="Too many arguments ! \"${arguments[$i]}\" will be ignored."
continue continue
fi fi
# Use the long option, corresponding to the option_flag, as a variable # Use the long option, corresponding to the option_flag, as a variable

View file

@ -1,6 +1,8 @@
#!/bin/bash
# Validate an IP address # Validate an IP address
# #
# usage: ynh_validate_ip [family] [ip_address] # usage: ynh_validate_ip --family=family --ip_address=ip_address
# | ret: 0 for valid ip addresses, 1 otherwise # | ret: 0 for valid ip addresses, 1 otherwise
# #
# example: ynh_validate_ip 4 111.222.333.444 # example: ynh_validate_ip 4 111.222.333.444
@ -9,17 +11,22 @@ ynh_validate_ip()
{ {
# http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python#319298 # http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python#319298
local IP_ADDRESS_FAMILY=$1 # Declare an array to define the options of this helper.
local IP_ADDRESS=$2 local legacy_args=fi
declare -Ar args_array=( [f]=family= [i]=ip_address= )
local family
local ip_address
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
[ "$IP_ADDRESS_FAMILY" == "4" ] || [ "$IP_ADDRESS_FAMILY" == "6" ] || return 1 [ "$family" == "4" ] || [ "$family" == "6" ] || return 1
python /dev/stdin << EOF python /dev/stdin << EOF
import socket import socket
import sys import sys
family = { "4" : socket.AF_INET, "6" : socket.AF_INET6 } family = { "4" : socket.AF_INET, "6" : socket.AF_INET6 }
try: try:
socket.inet_pton(family["$IP_ADDRESS_FAMILY"], "$IP_ADDRESS") socket.inet_pton(family["$family"], "$ip_address")
except socket.error: except socket.error:
sys.exit(1) sys.exit(1)
sys.exit(0) sys.exit(0)
@ -30,12 +37,19 @@ EOF
# #
# example: ynh_validate_ip4 111.222.333.444 # example: ynh_validate_ip4 111.222.333.444
# #
# usage: ynh_validate_ip4 <ip_address> # usage: ynh_validate_ip4 --ip_address=ip_address
# | ret: 0 for valid ipv4 addresses, 1 otherwise # | ret: 0 for valid ipv4 addresses, 1 otherwise
# #
ynh_validate_ip4() ynh_validate_ip4()
{ {
ynh_validate_ip 4 $1 # Declare an array to define the options of this helper.
local legacy_args=i
declare -Ar args_array=( [i]=ip_address= )
local ip_address
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_validate_ip 4 $ip_address
} }
@ -43,10 +57,17 @@ ynh_validate_ip4()
# #
# example: ynh_validate_ip6 2000:dead:beef::1 # example: ynh_validate_ip6 2000:dead:beef::1
# #
# usage: ynh_validate_ip6 <ip_address> # usage: ynh_validate_ip6 --ip_address=ip_address
# | ret: 0 for valid ipv6 addresses, 1 otherwise # | ret: 0 for valid ipv6 addresses, 1 otherwise
# #
ynh_validate_ip6() ynh_validate_ip6()
{ {
ynh_validate_ip 6 $1 # Declare an array to define the options of this helper.
local legacy_args=i
declare -Ar args_array=( [i]=ip_address= )
local ip_address
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_validate_ip 6 $ip_address
} }

View file

@ -1,3 +1,5 @@
#!/bin/bash
MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql
# Open a connection as a user # Open a connection as a user
@ -5,32 +7,60 @@ MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql
# example: ynh_mysql_connect_as 'user' 'pass' <<< "UPDATE ...;" # example: ynh_mysql_connect_as 'user' 'pass' <<< "UPDATE ...;"
# example: ynh_mysql_connect_as 'user' 'pass' < /path/to/file.sql # example: ynh_mysql_connect_as 'user' 'pass' < /path/to/file.sql
# #
# usage: ynh_mysql_connect_as user pwd [db] # usage: ynh_mysql_connect_as --user=user --password=password [--database=database]
# | arg: user - the user name to connect as # | arg: -u, --user - the user name to connect as
# | arg: pwd - the user password # | arg: -p, --password - the user password
# | arg: db - the database to connect to # | arg: -d, --database - the database to connect to
ynh_mysql_connect_as() { ynh_mysql_connect_as() {
mysql -u "$1" --password="$2" -B "${3:-}" # 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:-}"
mysql -u "$user" --password="$password" -B "$database"
} }
# Execute a command as root user # Execute a command as root user
# #
# usage: ynh_mysql_execute_as_root sql [db] # usage: ynh_mysql_execute_as_root --sql=sql [--database=database]
# | arg: sql - the SQL command to execute # | arg: -s, --sql - the SQL command to execute
# | arg: db - the database to connect to # | arg: -d, --database - the database to connect to
ynh_mysql_execute_as_root() { ynh_mysql_execute_as_root() {
ynh_mysql_connect_as "root" "$(sudo cat $MYSQL_ROOT_PWD_FILE)" \ # Declare an array to define the options of this helper.
"${2:-}" <<< "$1" 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_mysql_connect_as --user="root" --password="$(sudo cat $MYSQL_ROOT_PWD_FILE)" \
--database="$database" <<< "$sql"
} }
# Execute a command from a file as root user # Execute a command from a file as root user
# #
# usage: ynh_mysql_execute_file_as_root file [db] # usage: ynh_mysql_execute_file_as_root --file=file [--database=database]
# | arg: file - the file containing SQL commands # | arg: -f, --file - the file containing SQL commands
# | arg: db - the database to connect to # | arg: -d, --database - the database to connect to
ynh_mysql_execute_file_as_root() { ynh_mysql_execute_file_as_root() {
ynh_mysql_connect_as "root" "$(sudo cat $MYSQL_ROOT_PWD_FILE)" \ # Declare an array to define the options of this helper.
"${2:-}" < "$1" 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_mysql_connect_as --user="root" --password="$(sudo cat $MYSQL_ROOT_PWD_FILE)" \
--database="$database" < "$file"
} }
# Create a database and grant optionnaly privilegies to a user # Create a database and grant optionnaly privilegies to a user
@ -53,7 +83,7 @@ ynh_mysql_create_db() {
sql+=" WITH GRANT OPTION;" sql+=" WITH GRANT OPTION;"
fi fi
ynh_mysql_execute_as_root "$sql" ynh_mysql_execute_as_root --sql="$sql"
} }
# Drop a database # Drop a database
@ -66,18 +96,25 @@ ynh_mysql_create_db() {
# usage: ynh_mysql_drop_db db # usage: ynh_mysql_drop_db db
# | arg: db - the database name to drop # | arg: db - the database name to drop
ynh_mysql_drop_db() { ynh_mysql_drop_db() {
ynh_mysql_execute_as_root "DROP DATABASE ${1};" ynh_mysql_execute_as_root --sql="DROP DATABASE ${1};"
} }
# Dump a database # Dump a database
# #
# example: ynh_mysql_dump_db 'roundcube' > ./dump.sql # example: ynh_mysql_dump_db 'roundcube' > ./dump.sql
# #
# usage: ynh_mysql_dump_db db # usage: ynh_mysql_dump_db --database=database
# | arg: db - the database name to dump # | arg: -d, --database - the database name to dump
# | ret: the mysqldump output # | ret: the mysqldump output
ynh_mysql_dump_db() { ynh_mysql_dump_db() {
mysqldump -u "root" -p"$(sudo cat $MYSQL_ROOT_PWD_FILE)" --single-transaction --skip-dump-date "$1" # 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 "$@"
mysqldump -u "root" -p"$(sudo cat $MYSQL_ROOT_PWD_FILE)" --single-transaction --skip-dump-date "$database"
} }
# Create a user # Create a user
@ -89,17 +126,23 @@ ynh_mysql_dump_db() {
# | arg: pwd - the password to identify user by # | arg: pwd - the password to identify user by
ynh_mysql_create_user() { ynh_mysql_create_user() {
ynh_mysql_execute_as_root \ ynh_mysql_execute_as_root \
"CREATE USER '${1}'@'localhost' IDENTIFIED BY '${2}';" --sql="CREATE USER '${1}'@'localhost' IDENTIFIED BY '${2}';"
} }
# Check if a mysql user exists # Check if a mysql user exists
# #
# usage: ynh_mysql_user_exists user # usage: ynh_mysql_user_exists --user=user
# | arg: user - the user for which to check existence # | arg: -u, --user - the user for which to check existence
ynh_mysql_user_exists() ynh_mysql_user_exists()
{ {
local user=$1 # Declare an array to define the options of this helper.
if [[ -z $(ynh_mysql_execute_as_root "SELECT User from mysql.user WHERE User = '$user';") ]] local legacy_args=u
declare -Ar args_array=( [u]=user= )
local user
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
if [[ -z $(ynh_mysql_execute_as_root --sql="SELECT User from mysql.user WHERE User = '$user';") ]]
then then
return 1 return 1
else else
@ -114,7 +157,7 @@ ynh_mysql_user_exists()
# usage: ynh_mysql_drop_user user # usage: ynh_mysql_drop_user user
# | arg: user - the user name to drop # | arg: user - the user name to drop
ynh_mysql_drop_user() { ynh_mysql_drop_user() {
ynh_mysql_execute_as_root "DROP USER '${1}'@'localhost';" ynh_mysql_execute_as_root --sql="DROP USER '${1}'@'localhost';"
} }
# Create a database, an user and its password. Then store the password in the app's config # Create a database, an user and its password. Then store the password in the app's config
@ -122,28 +165,42 @@ ynh_mysql_drop_user() {
# After executing this helper, the password of the created database will be available in $db_pwd # After executing this helper, the password of the created database will be available in $db_pwd
# It will also be stored as "mysqlpwd" into the app settings. # It will also be stored as "mysqlpwd" into the app settings.
# #
# usage: ynh_mysql_setup_db user name [pwd] # usage: ynh_mysql_setup_db --db_user=user --db_name=name [--db_pwd=pwd]
# | arg: user - Owner of the database # | arg: -u, --db_user - Owner of the database
# | arg: name - Name of the database # | arg: -n, --db_name - Name of the database
# | arg: pwd - Password of the database. If not given, a password will be generated # | arg: -p, --db_pwd - Password of the database. If not given, a password will be generated
ynh_mysql_setup_db () { ynh_mysql_setup_db () {
local db_user="$1" # Declare an array to define the options of this helper.
local db_name="$2" 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 local new_db_pwd=$(ynh_string_random) # Generate a random password
# If $3 is not given, use new_db_pwd instead for db_pwd. # If $db_pwd is not given, use new_db_pwd instead for db_pwd
db_pwd="${3:-$new_db_pwd}" db_pwd="${db_pwd:-$new_db_pwd}"
ynh_mysql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database ynh_mysql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database
ynh_app_setting_set $app mysqlpwd $db_pwd # Store the password in the app's config ynh_app_setting_set --app=$app --key=mysqlpwd --value=$db_pwd # Store the password in the app's config
} }
# Remove a database if it exists, and the associated user # Remove a database if it exists, and the associated user
# #
# usage: ynh_mysql_remove_db user name # usage: ynh_mysql_remove_db --db_user=user --db_name=name
# | arg: user - Owner of the database # | arg: -u, --db_user - Owner of the database
# | arg: name - Name of the database # | arg: -n, --db_name - Name of the database
ynh_mysql_remove_db () { ynh_mysql_remove_db () {
local db_user="$1" # Declare an array to define the options of this helper.
local db_name="$2" 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 mysql_root_password=$(sudo cat $MYSQL_ROOT_PWD_FILE) local mysql_root_password=$(sudo cat $MYSQL_ROOT_PWD_FILE)
if mysqlshow -u root -p$mysql_root_password | grep -q "^| $db_name"; then # Check if the database exists if mysqlshow -u root -p$mysql_root_password | grep -q "^| $db_name"; then # Check if the database exists
echo "Removing database $db_name" >&2 echo "Removing database $db_name" >&2
@ -153,7 +210,7 @@ ynh_mysql_remove_db () {
fi fi
# Remove mysql user if it exists # Remove mysql user if it exists
if $(ynh_mysql_user_exists $db_user); then if $(ynh_mysql_user_exists --user=$db_user); then
ynh_mysql_drop_user $db_user ynh_mysql_drop_user $db_user
fi fi
} }
@ -163,10 +220,17 @@ ynh_mysql_remove_db () {
# #
# example: dbname=$(ynh_sanitize_dbid $app) # example: dbname=$(ynh_sanitize_dbid $app)
# #
# usage: ynh_sanitize_dbid name # usage: ynh_sanitize_dbid --db_name=name
# | arg: name - name to correct/sanitize # | arg: -n, --db_name - name to correct/sanitize
# | ret: the corrected name # | ret: the corrected name
ynh_sanitize_dbid () { ynh_sanitize_dbid () {
local dbid=${1//[-.]/_} # We should avoid having - and . in the name of databases. They are replaced by _ # Declare an array to define the options of this helper.
echo $dbid local legacy_args=n
declare -Ar args_array=( [n]=db_name= )
local db_name
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
# We should avoid having - and . in the name of databases. They are replaced by _
echo ${db_name//[-.]/_}
} }

View file

@ -1,3 +1,5 @@
#!/bin/bash
# Normalize the url path syntax # Normalize the url path syntax
# Handle the slash at the beginning of path and its absence at ending # Handle the slash at the beginning of path and its absence at ending
# Return a normalized url path # Return a normalized url path
@ -8,11 +10,17 @@
# ynh_normalize_url_path /example/ -> /example # ynh_normalize_url_path /example/ -> /example
# ynh_normalize_url_path / -> / # ynh_normalize_url_path / -> /
# #
# usage: ynh_normalize_url_path path_to_normalize # usage: ynh_normalize_url_path --path_url=path_to_normalize
# | arg: url_path_to_normalize - URL path to normalize before using it # | arg: -p, --path_url - URL path to normalize before using it
ynh_normalize_url_path () { ynh_normalize_url_path () {
local path_url=$1 # Declare an array to define the options of this helper.
test -n "$path_url" || ynh_die "ynh_normalize_url_path expect a URL path as first argument and received nothing." local legacy_args=p
declare -Ar args_array=( [p]=path_url= )
local path_url
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
test -n "$path_url" || ynh_die --message="ynh_normalize_url_path expect a URL path as first argument and received nothing."
if [ "${path_url:0:1}" != "/" ]; then # If the first character is not a / if [ "${path_url:0:1}" != "/" ]; then # If the first character is not a /
path_url="/$path_url" # Add / at begin of path variable path_url="/$path_url" # Add / at begin of path variable
fi fi
@ -24,13 +32,19 @@ ynh_normalize_url_path () {
# Find a free port and return it # Find a free port and return it
# #
# example: port=$(ynh_find_port 8080) # example: port=$(ynh_find_port --port=8080)
# #
# usage: ynh_find_port begin_port # usage: ynh_find_port --port=begin_port
# | arg: begin_port - port to start to search # | arg: -p, --port - port to start to search
ynh_find_port () { ynh_find_port () {
local port=$1 # Declare an array to define the options of this helper.
test -n "$port" || ynh_die "The argument of ynh_find_port must be a valid port." local legacy_args=p
declare -Ar args_array=( [p]=port= )
local port
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
test -n "$port" || ynh_die --message="The argument of ynh_find_port must be a valid port."
while netcat -z 127.0.0.1 $port # Check if the port is free while netcat -z 127.0.0.1 $port # Check if the port is free
do do
port=$((port+1)) # Else, pass to next port port=$((port+1)) # Else, pass to next port
@ -40,28 +54,40 @@ ynh_find_port () {
# Check availability of a web path # Check availability of a web path
# #
# example: ynh_webpath_available some.domain.tld /coffee # example: ynh_webpath_available --domain=some.domain.tld --path_url=/coffee
# #
# usage: ynh_webpath_available domain path # usage: ynh_webpath_available --domain=domain --path_url=path
# | arg: domain - the domain/host of the url # | arg: -d, --domain - the domain/host of the url
# | arg: path - the web path to check the availability of # | arg: -p, --path_url - the web path to check the availability of
ynh_webpath_available () { ynh_webpath_available () {
local domain=$1 # Declare an array to define the options of this helper.
local path=$2 local legacy_args=dp
sudo yunohost domain url-available $domain $path declare -Ar args_array=( [d]=domain= [p]=path_url= )
local domain
local path_url
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost domain url-available $domain $path_url
} }
# Register/book a web path for an app # Register/book a web path for an app
# #
# example: ynh_webpath_register wordpress some.domain.tld /coffee # example: ynh_webpath_register --app=wordpress --domain=some.domain.tld --path_url=/coffee
# #
# usage: ynh_webpath_register app domain path # usage: ynh_webpath_register --app=app --domain=domain --path_url=path
# | arg: app - the app for which the domain should be registered # | arg: -a, --app - the app for which the domain should be registered
# | arg: domain - the domain/host of the web path # | arg: -d, --domain - the domain/host of the web path
# | arg: path - the web path to be registered # | arg: -p, --path_url - the web path to be registered
ynh_webpath_register () { ynh_webpath_register () {
local app=$1 # Declare an array to define the options of this helper.
local domain=$2 local legacy_args=adp
local path=$3 declare -Ar args_array=( [a]=app= [d]=domain= [p]=path_url= )
sudo yunohost app register-url $app $domain $path local app
local domain
local path_url
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost app register-url $app $domain $path_url
} }

View file

@ -1,3 +1,5 @@
#!/bin/bash
n_install_dir="/opt/node_n" n_install_dir="/opt/node_n"
node_version_path="$n_install_dir/n/versions/node" node_version_path="$n_install_dir/n/versions/node"
# N_PREFIX is the directory of n, it needs to be loaded as a environment variable. # N_PREFIX is the directory of n, it needs to be loaded as a environment variable.
@ -15,7 +17,7 @@ ynh_install_n () {
echo "SOURCE_URL=https://github.com/tj/n/archive/v2.1.7.tar.gz echo "SOURCE_URL=https://github.com/tj/n/archive/v2.1.7.tar.gz
SOURCE_SUM=2ba3c9d4dd3c7e38885b37e02337906a1ee91febe6d5c9159d89a9050f2eea8f" > "../conf/n.src" SOURCE_SUM=2ba3c9d4dd3c7e38885b37e02337906a1ee91febe6d5c9159d89a9050f2eea8f" > "../conf/n.src"
# Download and extract n # Download and extract n
ynh_setup_source "$n_install_dir/git" n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n
# Install n # Install n
(cd "$n_install_dir/git" (cd "$n_install_dir/git"
PREFIX=$N_PREFIX make install 2>&1) PREFIX=$N_PREFIX make install 2>&1)
@ -35,7 +37,7 @@ SOURCE_SUM=2ba3c9d4dd3c7e38885b37e02337906a1ee91febe6d5c9159d89a9050f2eea8f" > "
# #
# usage: ynh_use_nodejs # usage: ynh_use_nodejs
ynh_use_nodejs () { ynh_use_nodejs () {
nodejs_version=$(ynh_app_setting_get $app nodejs_version) nodejs_version=$(ynh_app_setting_get --app=$app --key=nodejs_version)
nodejs_use_version="echo \"Deprecated command, should be removed\"" nodejs_use_version="echo \"Deprecated command, should be removed\""
@ -53,13 +55,19 @@ ynh_use_nodejs () {
# #
# ynh_install_nodejs will install the version of node provided as argument by using n. # ynh_install_nodejs will install the version of node provided as argument by using n.
# #
# usage: ynh_install_nodejs [nodejs_version] # usage: ynh_install_nodejs --nodejs_version=nodejs_version
# | arg: nodejs_version - Version of node to install. # | 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). # 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. # The crontab will handle the update of minor versions when needed.
ynh_install_nodejs () { ynh_install_nodejs () {
# Use n, https://github.com/tj/n to manage the nodejs versions # Use n, https://github.com/tj/n to manage the nodejs versions
nodejs_version="$1"
# Declare an array to define the options of this helper.
local legacy_args=n
declare -Ar args_array=( [n]=nodejs_version= )
local nodejs_version
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
# Create $n_install_dir # Create $n_install_dir
mkdir -p "$n_install_dir" mkdir -p "$n_install_dir"
@ -80,7 +88,7 @@ ynh_install_nodejs () {
fi fi
# Modify the default N_PREFIX in n script # Modify the default N_PREFIX in n script
ynh_replace_string "^N_PREFIX=\${N_PREFIX-.*}$" "N_PREFIX=\${N_PREFIX-$N_PREFIX}" "$n_install_dir/bin/n" ynh_replace_string --match_string="^N_PREFIX=\${N_PREFIX-.*}$" --replace_string="N_PREFIX=\${N_PREFIX-$N_PREFIX}" --target_file="$n_install_dir/bin/n"
# Restore /usr/local/bin in PATH # Restore /usr/local/bin in PATH
PATH=$CLEAR_PATH PATH=$CLEAR_PATH
@ -106,7 +114,7 @@ ynh_install_nodejs () {
echo "$YNH_APP_ID:$nodejs_version" | tee --append "$n_install_dir/ynh_app_version" echo "$YNH_APP_ID:$nodejs_version" | tee --append "$n_install_dir/ynh_app_version"
# Store nodejs_version into the config of this app # Store nodejs_version into the config of this app
ynh_app_setting_set $app nodejs_version $nodejs_version ynh_app_setting_set --app=$app --key=nodejs_version --value=$nodejs_version
# Build the update script and set the cronjob # Build the update script and set the cronjob
ynh_cron_upgrade_node ynh_cron_upgrade_node
@ -122,7 +130,7 @@ ynh_install_nodejs () {
# #
# usage: ynh_remove_nodejs # usage: ynh_remove_nodejs
ynh_remove_nodejs () { ynh_remove_nodejs () {
nodejs_version=$(ynh_app_setting_get $app nodejs_version) nodejs_version=$(ynh_app_setting_get --app=$app --key=nodejs_version)
# Remove the line for this app # 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_ID:$nodejs_version/d" "$n_install_dir/ynh_app_version"
@ -136,8 +144,8 @@ ynh_remove_nodejs () {
# If no other app uses n, remove n # If no other app uses n, remove n
if [ ! -s "$n_install_dir/ynh_app_version" ] if [ ! -s "$n_install_dir/ynh_app_version" ]
then then
ynh_secure_remove "$n_install_dir" ynh_secure_remove --file="$n_install_dir"
ynh_secure_remove "/usr/local/n" ynh_secure_remove --file="/usr/local/n"
sed --in-place "/N_PREFIX/d" /root/.bashrc sed --in-place "/N_PREFIX/d" /root/.bashrc
rm -f /etc/cron.daily/node_update rm -f /etc/cron.daily/node_update
fi fi

View file

@ -1,3 +1,5 @@
#!/bin/bash
# Check if apt is free to use, or wait, until timeout. # Check if apt is free to use, or wait, until timeout.
# #
# [internal] # [internal]
@ -23,26 +25,40 @@ ynh_wait_dpkg_free() {
# Check either a package is installed or not # Check either a package is installed or not
# #
# example: ynh_package_is_installed 'yunohost' && echo "ok" # example: ynh_package_is_installed --package=yunohost && echo "ok"
# #
# usage: ynh_package_is_installed name # usage: ynh_package_is_installed --package=name
# | arg: name - the package name to check # | arg: -p, --package - the package name to check
ynh_package_is_installed() { ynh_package_is_installed() {
# Declare an array to define the options of this helper.
local legacy_args=p
declare -Ar args_array=( [p]=package= )
local package
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_wait_dpkg_free ynh_wait_dpkg_free
dpkg-query -W -f '${Status}' "$1" 2>/dev/null \ dpkg-query -W -f '${Status}' "$package" 2>/dev/null \
| grep -c "ok installed" &>/dev/null | grep -c "ok installed" &>/dev/null
} }
# Get the version of an installed package # Get the version of an installed package
# #
# example: version=$(ynh_package_version 'yunohost') # example: version=$(ynh_package_version --package=yunohost)
# #
# usage: ynh_package_version name # usage: ynh_package_version --package=name
# | arg: name - the package name to get version # | arg: -p, --package - the package name to get version
# | ret: the version or an empty string # | ret: the version or an empty string
ynh_package_version() { ynh_package_version() {
if ynh_package_is_installed "$1"; then # Declare an array to define the options of this helper.
dpkg-query -W -f '${Version}' "$1" 2>/dev/null local legacy_args=p
declare -Ar args_array=( [p]=package= )
local package
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
if ynh_package_is_installed "$package"; then
dpkg-query -W -f '${Version}' "$package" 2>/dev/null
else else
echo '' echo ''
fi fi
@ -135,7 +151,7 @@ ynh_package_install_from_equivs () {
(cd "$TMPDIR" (cd "$TMPDIR"
equivs-build ./control 1> /dev/null equivs-build ./control 1> /dev/null
dpkg --force-depends -i "./${pkgname}_${pkgversion}_all.deb" 2>&1) dpkg --force-depends -i "./${pkgname}_${pkgversion}_all.deb" 2>&1)
ynh_package_install -f || ynh_die "Unable to install dependencies" ynh_package_install -f || ynh_die --message="Unable to install dependencies"
[[ -n "$TMPDIR" ]] && rm -rf $TMPDIR # Remove the temp dir. [[ -n "$TMPDIR" ]] && rm -rf $TMPDIR # Remove the temp dir.
# check if the package is actually installed # check if the package is actually installed
@ -176,9 +192,9 @@ Description: Fake package for ${app} (YunoHost app) dependencies
This meta-package is only responsible of installing its dependencies. This meta-package is only responsible of installing its dependencies.
EOF EOF
ynh_package_install_from_equivs /tmp/${dep_app}-ynh-deps.control \ ynh_package_install_from_equivs /tmp/${dep_app}-ynh-deps.control \
|| ynh_die "Unable to install dependencies" # Install the fake package and its dependencies || ynh_die --message="Unable to install dependencies" # Install the fake package and its dependencies
rm /tmp/${dep_app}-ynh-deps.control rm /tmp/${dep_app}-ynh-deps.control
ynh_app_setting_set $app apt_dependencies $dependencies ynh_app_setting_set --app=$app --key=apt_dependencies --value="$dependencies"
} }
# Remove fake package and its dependencies # Remove fake package and its dependencies

View file

@ -1,15 +1,32 @@
#!/bin/bash
# Print a message to stderr and exit # Print a message to stderr and exit
# usage: ynh_die MSG [RETCODE] # usage: ynh_die --message=MSG [--ret_code=RETCODE]
ynh_die() { ynh_die() {
echo "$1" 1>&2 # Declare an array to define the options of this helper.
exit "${2:-1}" local legacy_args=mc
declare -Ar args_array=( [m]=message= [c]=ret_code= )
local message
local ret_code
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
echo "$message" 1>&2
exit "${ret_code:-1}"
} }
# Display a message in the 'INFO' logging category # Display a message in the 'INFO' logging category
# #
# usage: ynh_print_info "Some message" # usage: ynh_print_info --message="Some message"
ynh_print_info() { ynh_print_info() {
echo "$1" >> "$YNH_STDINFO" # Declare an array to define the options of this helper.
local legacy_args=m
declare -Ar args_array=( [m]=message= )
local message
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
echo "$message" >> "$YNH_STDINFO"
} }
# Ignore the yunohost-cli log to prevent errors with conditional commands # Ignore the yunohost-cli log to prevent errors with conditional commands
@ -39,18 +56,32 @@ ynh_print_log () {
# Print a warning on stderr # Print a warning on stderr
# #
# usage: ynh_print_warn "Text to print" # usage: ynh_print_warn --message="Text to print"
# | arg: text - The text to print # | arg: -m, --message - The text to print
ynh_print_warn () { ynh_print_warn () {
ynh_print_log "\e[93m\e[1m[WARN]\e[0m ${1}" >&2 # Declare an array to define the options of this helper.
local legacy_args=m
declare -Ar args_array=( [m]=message= )
local message
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_print_log "\e[93m\e[1m[WARN]\e[0m ${message}" >&2
} }
# Print an error on stderr # Print an error on stderr
# #
# usage: ynh_print_err "Text to print" # usage: ynh_print_err --message="Text to print"
# | arg: text - The text to print # | arg: -m, --message - The text to print
ynh_print_err () { ynh_print_err () {
ynh_print_log "\e[91m\e[1m[ERR]\e[0m ${1}" >&2 # Declare an array to define the options of this helper.
local legacy_args=m
declare -Ar args_array=( [m]=message= )
local message
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
ynh_print_log "\e[91m\e[1m[ERR]\e[0m ${message}" >&2
} }
# Execute a command and print the result as an error # Execute a command and print the result as an error

View file

@ -1,27 +1,54 @@
#!/bin/bash
# Get an application setting # Get an application setting
# #
# usage: ynh_app_setting_get app key # usage: ynh_app_setting_get --app=app --key=key
# | arg: app - the application id # | arg: -a, --app - the application id
# | arg: key - the setting to get # | arg: -k, --key - the setting to get
ynh_app_setting_get() { ynh_app_setting_get() {
sudo yunohost app setting "$1" "$2" --output-as plain --quiet # Declare an array to define the options of this helper.
local legacy_args=ak
declare -Ar args_array=( [a]=app= [k]=key= )
local app
local key
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost app setting "$app" "$key" --output-as plain --quiet
} }
# Set an application setting # Set an application setting
# #
# usage: ynh_app_setting_set app key value # usage: ynh_app_setting_set --app=app --key=key --value=value
# | arg: app - the application id # | arg: -a, --app - the application id
# | arg: key - the setting name to set # | arg: -k, --key - the setting name to set
# | arg: value - the setting value to set # | arg: -v, --value - the setting value to set
ynh_app_setting_set() { ynh_app_setting_set() {
sudo yunohost app setting "$1" "$2" --value="$3" --quiet # Declare an array to define the options of this helper.
local legacy_args=akv
declare -Ar args_array=( [a]=app= [k]=key= [v]=value= )
local app
local key
local value
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost app setting "$app" "$key" --value="$value" --quiet
} }
# Delete an application setting # Delete an application setting
# #
# usage: ynh_app_setting_delete app key # usage: ynh_app_setting_delete --app=app --key=key
# | arg: app - the application id # | arg: -a, --app - the application id
# | arg: key - the setting to delete # | arg: -k, --key - the setting to delete
ynh_app_setting_delete() { ynh_app_setting_delete() {
sudo yunohost app setting -d "$1" "$2" --quiet # Declare an array to define the options of this helper.
local legacy_args=ak
declare -Ar args_array=( [a]=app= [k]=key= )
local app
local key
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost app setting -d "$app" "$key" --quiet
} }

View file

@ -1,51 +1,71 @@
#!/bin/bash
# Generate a random string # Generate a random string
# #
# example: pwd=$(ynh_string_random 8) # example: pwd=$(ynh_string_random --length=8)
# #
# usage: ynh_string_random [length] # usage: ynh_string_random [--length=string_length]
# | arg: length - the string length to generate (default: 24) # | arg: -l, --length - the string length to generate (default: 24)
ynh_string_random() { ynh_string_random() {
# Declare an array to define the options of this helper.
local legacy_args=l
declare -Ar args_array=( [l]=length= )
local length
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
length=${length:-24}
dd if=/dev/urandom bs=1 count=1000 2> /dev/null \ dd if=/dev/urandom bs=1 count=1000 2> /dev/null \
| tr -c -d 'A-Za-z0-9' \ | tr -c -d 'A-Za-z0-9' \
| sed -n 's/\(.\{'"${1:-24}"'\}\).*/\1/p' | sed -n 's/\(.\{'"$length"'\}\).*/\1/p'
} }
# Substitute/replace a string (or expression) by another in a file # Substitute/replace a string (or expression) by another in a file
# #
# usage: ynh_replace_string match_string replace_string target_file # usage: ynh_replace_string --match_string=match_string --replace_string=replace_string --target_file=target_file
# | arg: match_string - String to be searched and replaced in the file # | arg: -m, --match_string - String to be searched and replaced in the file
# | arg: replace_string - String that will replace matches # | arg: -r, --replace_string - String that will replace matches
# | arg: target_file - File in which the string will be replaced. # | arg: -f, --target_file - File in which the string will be replaced.
# #
# As this helper is based on sed command, regular expressions and # As this helper is based on sed command, regular expressions and
# references to sub-expressions can be used # references to sub-expressions can be used
# (see sed manual page for more information) # (see sed manual page for more information)
ynh_replace_string () { ynh_replace_string () {
local delimit=@ # Declare an array to define the options of this helper.
local match_string=$1 local legacy_args=mrf
local replace_string=$2 declare -Ar args_array=( [m]=match_string= [r]=replace_string= [f]=target_file= )
local workfile=$3 local match_string
local replace_string
local target_file
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
local delimit=@
# Escape the delimiter if it's in the string. # Escape the delimiter if it's in the string.
match_string=${match_string//${delimit}/"\\${delimit}"} match_string=${match_string//${delimit}/"\\${delimit}"}
replace_string=${replace_string//${delimit}/"\\${delimit}"} replace_string=${replace_string//${delimit}/"\\${delimit}"}
sudo sed --in-place "s${delimit}${match_string}${delimit}${replace_string}${delimit}g" "$workfile" sudo sed --in-place "s${delimit}${match_string}${delimit}${replace_string}${delimit}g" "$target_file"
} }
# Substitute/replace a special string by another in a file # Substitute/replace a special string by another in a file
# #
# usage: ynh_replace_special_string match_string replace_string target_file # usage: ynh_replace_special_string --match_string=match_string --replace_string=replace_string --target_file=target_file
# | arg: match_string - String to be searched and replaced in the file # | arg: -m, --match_string - String to be searched and replaced in the file
# | arg: replace_string - String that will replace matches # | arg: -r, --replace_string - String that will replace matches
# | arg: target_file - File in which the string will be replaced. # | arg: -t, --target_file - File in which the string will be replaced.
# #
# This helper will use ynh_replace_string, but as you can use special # This helper will use ynh_replace_string, but as you can use special
# characters, you can't use some regular expressions and sub-expressions. # characters, you can't use some regular expressions and sub-expressions.
ynh_replace_special_string () { ynh_replace_special_string () {
local match_string=$1 # Declare an array to define the options of this helper.
local replace_string=$2 local legacy_args=mrf
local workfile=$3 declare -Ar args_array=( [m]=match_string= [r]=replace_string= [f]=target_file= )
local match_string
local replace_string
local target_file
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
# Escape any backslash to preserve them as simple backslash. # Escape any backslash to preserve them as simple backslash.
match_string=${match_string//\\/"\\\\"} match_string=${match_string//\\/"\\\\"}
@ -55,5 +75,5 @@ ynh_replace_special_string () {
match_string=${match_string//&/"\&"} match_string=${match_string//&/"\&"}
replace_string=${replace_string//&/"\&"} replace_string=${replace_string//&/"\&"}
ynh_replace_string "$match_string" "$replace_string" "$workfile" ynh_replace_string --match_string="$match_string" --replace_string="$replace_string" --target_file="$target_file"
} }

View file

@ -1,3 +1,5 @@
#!/bin/bash
# Manage a fail of the script # Manage a fail of the script
# #
# [internal] # [internal]

View file

@ -1,23 +1,40 @@
#!/bin/bash
# Check if a YunoHost user exists # Check if a YunoHost user exists
# #
# example: ynh_user_exists 'toto' || exit 1 # example: ynh_user_exists 'toto' || exit 1
# #
# usage: ynh_user_exists username # usage: ynh_user_exists --username=username
# | arg: username - the username to check # | arg: -u, --username - the username to check
ynh_user_exists() { ynh_user_exists() {
sudo yunohost user list --output-as json | grep -q "\"username\": \"${1}\"" # Declare an array to define the options of this helper.
local legacy_args=u
declare -Ar args_array=( [u]=username= )
local username
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost user list --output-as json | grep -q "\"username\": \"${username}\""
} }
# Retrieve a YunoHost user information # Retrieve a YunoHost user information
# #
# example: mail=$(ynh_user_get_info 'toto' 'mail') # example: mail=$(ynh_user_get_info 'toto' 'mail')
# #
# usage: ynh_user_get_info username key # usage: ynh_user_get_info --username=username --key=key
# | arg: username - the username to retrieve info from # | arg: -u, --username - the username to retrieve info from
# | arg: key - the key to retrieve # | arg: -k, --key - the key to retrieve
# | ret: string - the key's value # | ret: string - the key's value
ynh_user_get_info() { ynh_user_get_info() {
sudo yunohost user info "$1" --output-as plain | ynh_get_plain_key "$2" # Declare an array to define the options of this helper.
local legacy_args=uk
declare -Ar args_array=( [u]=username= [k]=key= )
local username
local key
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
sudo yunohost user info "$username" --output-as plain | ynh_get_plain_key "$key"
} }
# Get the list of YunoHost users # Get the list of YunoHost users
@ -33,10 +50,17 @@ ynh_user_list() {
# Check if a user exists on the system # Check if a user exists on the system
# #
# usage: ynh_system_user_exists username # usage: ynh_system_user_exists --username=username
# | arg: username - the username to check # | arg: -u, --username - the username to check
ynh_system_user_exists() { ynh_system_user_exists() {
getent passwd "$1" &>/dev/null # Declare an array to define the options of this helper.
local legacy_args=u
declare -Ar args_array=( [u]=username= )
local username
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
getent passwd "$username" &>/dev/null
} }
# Create a system user # Create a system user
@ -54,7 +78,7 @@ ynh_system_user_exists() {
# If this argument is omitted, the user will be created with /usr/sbin/nologin shell # If this argument is omitted, the user will be created with /usr/sbin/nologin shell
ynh_system_user_create () { ynh_system_user_create () {
# Declare an array to define the options of this helper. # Declare an array to define the options of this helper.
local legacy_args=uh local legacy_args=uhs
declare -Ar args_array=( [u]=username= [h]=home_dir= [s]=use_shell ) declare -Ar args_array=( [u]=username= [h]=home_dir= [s]=use_shell )
local username local username
local home_dir local home_dir
@ -82,14 +106,21 @@ ynh_system_user_create () {
# Delete a system user # Delete a system user
# #
# usage: ynh_system_user_delete user_name # usage: ynh_system_user_delete --username=user_name
# | arg: user_name - Name of the system user that will be create # | arg: -u, --username - Name of the system user that will be create
ynh_system_user_delete () { ynh_system_user_delete () {
if ynh_system_user_exists "$1" # Check if the user exists on the system # Declare an array to define the options of this helper.
local legacy_args=u
declare -Ar args_array=( [u]=username= )
local username
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
if ynh_system_user_exists "$username" # Check if the user exists on the system
then then
echo "Remove the user $1" >&2 echo "Remove the user $username" >&2
sudo userdel $1 sudo userdel $username
else else
echo "The user $1 was not found" >&2 echo "The user $username was not found" >&2
fi fi
} }

View file

@ -1,3 +1,5 @@
#!/bin/bash
# Extract a key from a plain command output # Extract a key from a plain command output
# #
# example: yunohost user info tata --output-as plain | ynh_get_plain_key mail # example: yunohost user info tata --output-as plain | ynh_get_plain_key mail
@ -49,7 +51,7 @@ ynh_restore_upgradebackup () {
sudo yunohost app remove $app sudo yunohost app remove $app
# Restore the backup # Restore the backup
sudo yunohost backup restore $app_bck-pre-upgrade$backup_number --apps $app --force --debug sudo yunohost backup restore $app_bck-pre-upgrade$backup_number --apps $app --force --debug
ynh_die "The app was restored to the way it was before the failed upgrade." ynh_die --message="The app was restored to the way it was before the failed upgrade."
fi fi
else else
echo "\$NO_BACKUP_UPGRADE is set, that means there's no backup to restore. You have to fix this upgrade by yourself !" >&2 echo "\$NO_BACKUP_UPGRADE is set, that means there's no backup to restore. You have to fix this upgrade by yourself !" >&2
@ -97,7 +99,7 @@ ynh_backup_before_upgrade () {
sudo yunohost backup delete $app_bck-pre-upgrade$old_backup_number > /dev/null sudo yunohost backup delete $app_bck-pre-upgrade$old_backup_number > /dev/null
fi fi
else else
ynh_die "Backup failed, the upgrade process was aborted." ynh_die --message="Backup failed, the upgrade process was aborted."
fi fi
else else
echo "\$NO_BACKUP_UPGRADE is set, backup will be avoided. Be careful, this upgrade is going to be operated without a security backup" echo "\$NO_BACKUP_UPGRADE is set, backup will be avoided. Be careful, this upgrade is going to be operated without a security backup"
@ -145,22 +147,28 @@ ynh_backup_before_upgrade () {
# sources/extra_files/$src_id will be applied to dest_dir # sources/extra_files/$src_id will be applied to dest_dir
# #
# #
# usage: ynh_setup_source dest_dir [source_id] # usage: ynh_setup_source --dest_dir=dest_dir [--source_id=source_id]
# | arg: dest_dir - Directory where to setup sources # | arg: -d, --dest_dir - Directory where to setup sources
# | arg: source_id - Name of the app, if the package contains more than one app # | arg: -s, --source_id - Name of the app, if the package contains more than one app
ynh_setup_source () { ynh_setup_source () {
local dest_dir=$1 # Declare an array to define the options of this helper.
local src_id=${2:-app} # If the argument is not given, source_id equals "app" local legacy_args=ds
declare -Ar args_array=( [d]=dest_dir= [s]=source_id= )
local dest_dir
local source_id
# Manage arguments with getopts
ynh_handle_getopts_args "$@"
source_id="${source_id:-app}" # If the argument is not given, source_id equals "app"
# Load value from configuration file (see above for a small doc about this file # Load value from configuration file (see above for a small doc about this file
# format) # format)
local src_url=$(grep 'SOURCE_URL=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_url=$(grep 'SOURCE_URL=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_sum=$(grep 'SOURCE_SUM=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_sum=$(grep 'SOURCE_SUM=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_sumprg=$(grep 'SOURCE_SUM_PRG=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_sumprg=$(grep 'SOURCE_SUM_PRG=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_format=$(grep 'SOURCE_FORMAT=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_format=$(grep 'SOURCE_FORMAT=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_extract=$(grep 'SOURCE_EXTRACT=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_extract=$(grep 'SOURCE_EXTRACT=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_in_subdir=$(grep 'SOURCE_IN_SUBDIR=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_in_subdir=$(grep 'SOURCE_IN_SUBDIR=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
local src_filename=$(grep 'SOURCE_FILENAME=' "$YNH_CWD/../conf/${src_id}.src" | cut -d= -f2-) local src_filename=$(grep 'SOURCE_FILENAME=' "$YNH_CWD/../conf/${source_id}.src" | cut -d= -f2-)
# Default value # Default value
src_sumprg=${src_sumprg:-sha256sum} src_sumprg=${src_sumprg:-sha256sum}
@ -169,7 +177,7 @@ ynh_setup_source () {
src_format=$(echo "$src_format" | tr '[:upper:]' '[:lower:]') src_format=$(echo "$src_format" | tr '[:upper:]' '[:lower:]')
src_extract=${src_extract:-true} src_extract=${src_extract:-true}
if [ "$src_filename" = "" ] ; then if [ "$src_filename" = "" ] ; then
src_filename="${src_id}.${src_format}" src_filename="${source_id}.${src_format}"
fi fi
local local_src="/opt/yunohost-apps-src/${YNH_APP_ID}/${src_filename}" local local_src="/opt/yunohost-apps-src/${YNH_APP_ID}/${src_filename}"
@ -177,12 +185,12 @@ ynh_setup_source () {
then # Use the local source file if it is present then # Use the local source file if it is present
cp $local_src $src_filename cp $local_src $src_filename
else # If not, download the source else # If not, download the source
local out=`wget -nv -O $src_filename $src_url 2>&1` || ynh_print_err $out local out=`wget -nv -O $src_filename $src_url 2>&1` || ynh_print_err --message="$out"
fi fi
# Check the control sum # Check the control sum
echo "${src_sum} ${src_filename}" | ${src_sumprg} -c --status \ echo "${src_sum} ${src_filename}" | ${src_sumprg} -c --status \
|| ynh_die "Corrupt source" || ynh_die --message="Corrupt source"
# Extract source into the app dir # Extract source into the app dir
mkdir -p "$dest_dir" mkdir -p "$dest_dir"
@ -198,7 +206,7 @@ ynh_setup_source () {
local tmp_dir=$(mktemp -d) local tmp_dir=$(mktemp -d)
unzip -quo $src_filename -d "$tmp_dir" unzip -quo $src_filename -d "$tmp_dir"
cp -a $tmp_dir/*/. "$dest_dir" cp -a $tmp_dir/*/. "$dest_dir"
ynh_secure_remove "$tmp_dir" ynh_secure_remove --file="$tmp_dir"
else else
unzip -quo $src_filename -d "$dest_dir" unzip -quo $src_filename -d "$dest_dir"
fi fi
@ -216,23 +224,23 @@ ynh_setup_source () {
if [[ "$src_format" =~ ^tar.gz|tar.bz2|tar.xz$ ]] ; then if [[ "$src_format" =~ ^tar.gz|tar.bz2|tar.xz$ ]] ; then
tar -xf $src_filename -C "$dest_dir" $strip tar -xf $src_filename -C "$dest_dir" $strip
else else
ynh_die "Archive format unrecognized." ynh_die --message="Archive format unrecognized."
fi fi
fi fi
# Apply patches # Apply patches
if (( $(find $YNH_CWD/../sources/patches/ -type f -name "${src_id}-*.patch" 2> /dev/null | wc -l) > "0" )); then if (( $(find $YNH_CWD/../sources/patches/ -type f -name "${source_id}-*.patch" 2> /dev/null | wc -l) > "0" )); then
local old_dir=$(pwd) local old_dir=$(pwd)
(cd "$dest_dir" \ (cd "$dest_dir" \
&& for p in $YNH_CWD/../sources/patches/${src_id}-*.patch; do \ && for p in $YNH_CWD/../sources/patches/${source_id}-*.patch; do \
patch -p1 < $p; done) \ patch -p1 < $p; done) \
|| ynh_die "Unable to apply patches" || ynh_die --message="Unable to apply patches"
cd $old_dir cd $old_dir
fi fi
# Add supplementary files # Add supplementary files
if test -e "$YNH_CWD/../sources/extra_files/${src_id}"; then if test -e "$YNH_CWD/../sources/extra_files/${source_id}"; then
cp -a $YNH_CWD/../sources/extra_files/$src_id/. "$dest_dir" cp -a $YNH_CWD/../sources/extra_files/$source_id/. "$dest_dir"
fi fi
} }