#!/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 () { set +x } # Restore the logging after ynh_print_OFF # # usage: ynh_print_ON # # Requires YunoHost version 3.2.0 or higher. ynh_print_ON () { set -x # Print an echo only for the log, to be able to know that ynh_print_ON has been called. 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.?.? or higher. increment_progression=0 previous_weight=0 # Define base_time when the file is sourced base_time=$(date +%s) ynh_script_progression () { # Declare an array to define the options of this helper. local legacy_args=mwtl declare -Ar args_array=( [m]=message= [w]=weight= [t]=time [l]=last ) local message local weight 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) # 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 local max_progression=$(( $helper_calls - $weight_calls + $weight_values )) # 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 # Set the scale of the progression bar local scale=20 # progress_string(0,1,2) should have the size of the scale. local progress_string2="####################" local progress_string1="++++++++++++++++++++" local progress_string0="...................." # Reduce $increment_progression to the size of the scale if [ $last -eq 0 ] then local effective_progression=$(( $increment_progression * $scale / $max_progression )) # If last is specified, fill immediately the progression_bar else local effective_progression=$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 ) * $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="$(( $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.?.? 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.?.? or higher. ynh_debug_exec () { ynh_debug --message="$(eval $@)" }