mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
349 lines
12 KiB
Bash
349 lines
12 KiB
Bash
#!/bin/bash
|
|
|
|
# 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
|
|
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
|
|
#
|
|
# 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
|
|
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
|
|
#
|
|
# [internal]
|
|
#
|
|
# usage: ynh_no_log COMMAND
|
|
#
|
|
# 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
|
|
eval $@
|
|
local exit_code=$?
|
|
sudo mv ${ynh_cli_log}-move ${ynh_cli_log}
|
|
return $?
|
|
}
|
|
|
|
# Main printer, just in case in the future we have to change anything about that.
|
|
#
|
|
# [internal]
|
|
#
|
|
# Requires YunoHost version 3.2.0 or higher.
|
|
ynh_print_log () {
|
|
echo -e "${1}"
|
|
}
|
|
|
|
# Print a warning on stderr
|
|
#
|
|
# 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
|
|
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
|
|
#
|
|
# 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
|
|
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
|
|
#
|
|
# 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 $@)"
|
|
}
|
|
|
|
# Execute a command and print the result as a warning
|
|
#
|
|
# 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 $@)"
|
|
}
|
|
|
|
# Execute a command and force the result to be printed on stdout
|
|
#
|
|
# 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
|
|
}
|
|
|
|
# Execute a command and redirect stdout in /dev/null
|
|
#
|
|
# 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
|
|
}
|
|
|
|
# Execute a command and redirect stdout and stderr in /dev/null
|
|
#
|
|
# 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
|
|
}
|
|
|
|
# Remove any logs for all the following commands.
|
|
#
|
|
# 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 () {
|
|
exec {BASH_XTRACEFD}>/dev/null
|
|
}
|
|
|
|
# Restore the logging after ynh_print_OFF
|
|
#
|
|
# usage: ynh_print_ON
|
|
#
|
|
# Requires YunoHost version 3.2.0 or higher.
|
|
ynh_print_ON () {
|
|
exec {BASH_XTRACEFD}>&1
|
|
# Print an echo only for the log, to be able to know that ynh_print_ON has been called.
|
|
echo ynh_print_ON > /dev/null
|
|
}
|
|
|
|
# Print a message as INFO and show progression during an app script
|
|
#
|
|
# usage: ynh_script_progression --message=message [--weight=weight] [--time]
|
|
# | 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.5.0 or higher.
|
|
increment_progression=0
|
|
previous_weight=0
|
|
max_progression=-1
|
|
# Set the scale of the progression bar
|
|
# progress_string(0,1,2) should have the size of the scale.
|
|
progress_scale=20
|
|
progress_string2="####################"
|
|
progress_string1="++++++++++++++++++++"
|
|
progress_string0="...................."
|
|
# 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
|
|
local time
|
|
local last
|
|
# Manage arguments with getopts
|
|
ynh_handle_getopts_args "$@"
|
|
weight=${weight:-1}
|
|
time=${time:-0}
|
|
last=${last:-0}
|
|
|
|
# Get execution time since the last $base_time
|
|
local exec_time=$(( $(date +%s) - $base_time ))
|
|
base_time=$(date +%s)
|
|
|
|
# Compute $max_progression (if we didn't already)
|
|
if [ "$max_progression" = -1 ]
|
|
then
|
|
# Get the number of occurrences of 'ynh_script_progression' in the script. Except those are commented.
|
|
local helper_calls="$(grep --count "^[^#]*ynh_script_progression" $0)"
|
|
# Get the number of call with a weight value
|
|
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')"
|
|
# 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 ))
|
|
|
|
# max_progression is a total number of calls to this helper.
|
|
# Less the number of calls with a weight value.
|
|
# Plus the total of weight values
|
|
max_progression=$(( $helper_calls - $weight_calls + $weight_values ))
|
|
fi
|
|
|
|
# Increment each execution of ynh_script_progression in this script by the weight of the previous call.
|
|
increment_progression=$(( $increment_progression + $previous_weight ))
|
|
# Store the weight of the current call in $previous_weight for next call
|
|
previous_weight=$weight
|
|
|
|
# Reduce $increment_progression to the size of the scale
|
|
if [ $last -eq 0 ]
|
|
then
|
|
local effective_progression=$(( $increment_progression * $progress_scale / $max_progression ))
|
|
# If last is specified, fill immediately the progression_bar
|
|
else
|
|
local effective_progression=$progress_scale
|
|
fi
|
|
|
|
# Build $progression_bar from progress_string(0,1,2) according to $effective_progression and the weight of the current task
|
|
# expected_progression is the progression expected after the current task
|
|
local expected_progression="$(( ( $increment_progression + $weight ) * $progress_scale / $max_progression - $effective_progression ))"
|
|
if [ $last -eq 1 ]
|
|
then
|
|
expected_progression=0
|
|
fi
|
|
# left_progression is the progression not yet done
|
|
local left_progression="$(( $progress_scale - $effective_progression - $expected_progression ))"
|
|
# Build the progression bar with $effective_progression, work done, $expected_progression, current work and $left_progression, work to be done.
|
|
local progression_bar="${progress_string2:0:$effective_progression}${progress_string1:0:$expected_progression}${progress_string0:0:$left_progression}"
|
|
|
|
local print_exec_time=""
|
|
if [ $time -eq 1 ]
|
|
then
|
|
print_exec_time=" [$(date +%Hh%Mm,%Ss --date="0 + $exec_time sec")]"
|
|
fi
|
|
|
|
ynh_print_info "[$progression_bar] > ${message}${print_exec_time}"
|
|
}
|
|
|
|
# Debugger for app packagers
|
|
#
|
|
# 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.5.0 or higher.
|
|
ynh_debug () {
|
|
# Disable set xtrace for the helper itself, to not pollute the debug log
|
|
set +x
|
|
# Declare an array to define the options of this helper.
|
|
local legacy_args=mt
|
|
declare -Ar args_array=( [m]=message= [t]=trace= )
|
|
local message
|
|
local trace
|
|
# Manage arguments with getopts
|
|
ynh_handle_getopts_args "$@"
|
|
# Redisable xtrace, ynh_handle_getopts_args set it back
|
|
set +x
|
|
message=${message:-}
|
|
trace=${trace:-}
|
|
|
|
if [ -n "$message" ]
|
|
then
|
|
ynh_print_log "\e[34m\e[1m[DEBUG]\e[0m ${message}" >&2
|
|
fi
|
|
|
|
if [ "$trace" == "1" ]
|
|
then
|
|
ynh_debug --message="Enable debugging"
|
|
set +x
|
|
# Get the current file descriptor of xtrace
|
|
old_bash_xtracefd=$BASH_XTRACEFD
|
|
# Add the current file name and the line number of any command currently running while tracing.
|
|
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
|
|
ynh_debug --message="Disable debugging"
|
|
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
|
|
}
|
|
|
|
# Execute a command and print the result as debug
|
|
#
|
|
# usage: ynh_debug_exec command to execute
|
|
# usage: ynh_debug_exec "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.
|
|
#
|
|
# | arg: command - command to execute
|
|
#
|
|
# Requires YunoHost version 3.5.0 or higher.
|
|
ynh_debug_exec () {
|
|
ynh_debug --message="$(eval $@)"
|
|
}
|