mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
378 lines
12 KiB
Bash
378 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 your_command
|
|
# usage: ynh_exec_err "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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 your_command
|
|
# usage: ynh_exec_warn "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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 your_command
|
|
# usage: ynh_exec_warn_less "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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 your_command
|
|
# usage: ynh_exec_quiet "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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 your_command
|
|
# usage: ynh_exec_fully_quiet "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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
|
|
}
|
|
|
|
# Initial definitions for ynh_script_progression
|
|
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)
|
|
|
|
# Print a progress bar showing the progression of 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.
|
|
ynh_script_progression () {
|
|
set +x
|
|
# 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 "$@"
|
|
set +x
|
|
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}"
|
|
set -x
|
|
}
|
|
|
|
# Return data to the Yunohost core for later processing
|
|
# (to be used by special hooks like app config panel and core diagnosis)
|
|
#
|
|
# usage: ynh_return somedata
|
|
#
|
|
# Requires YunoHost version 3.6.0 or higher.
|
|
ynh_return () {
|
|
echo "$1" >> "$YNH_STDRETURN"
|
|
}
|
|
|
|
# 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 your_command
|
|
# usage: ynh_debug_exec "your_command | other_command"
|
|
#
|
|
# When using pipes, double quotes are required - otherwise, this helper will run the first command, and the whole output will be sent through 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.5.0 or higher.
|
|
ynh_debug_exec () {
|
|
ynh_debug --message="$(eval $@)"
|
|
}
|