From 0e108f1261c9840612da94e6a99132dfd70927a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Fri, 15 Feb 2019 17:42:39 +0100 Subject: [PATCH] Use ynh_systemd_action to control service start --- scripts/change_url | 3 +- scripts/experimental_helper.sh | 134 +++++++++++++++++++++------------ scripts/install | 4 +- scripts/restore | 4 +- scripts/upgrade | 4 +- 5 files changed, 91 insertions(+), 58 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 3a8de48..a0d945c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,5 +50,4 @@ config_nginx config_gitea # RELOAD services -ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gitea.log" -sleep 1 +ynh_systemd_action -l "Serving \[::\]:$port with pid" -p "systemd" -a restart diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh index 600a653..9e3869c 100644 --- a/scripts/experimental_helper.sh +++ b/scripts/experimental_helper.sh @@ -9,53 +9,91 @@ ynh_delete_file_checksum () { ynh_app_setting_delete $app $checksum_setting_name } -# Start or restart a service and follow its booting +# Start (or other actions) a service, print a log in case of failure and optionnaly wait until the service is completely started # -# usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name] +# usage: ynh_systemd_action [-n service_name] [-a action] [ [-l "line to match"] [-p log_path] [-t timeout] [-e length] ] +# | arg: -n, --service_name= - Name of the service to reload. Default : $app +# | arg: -a, --action= - Action to perform with systemctl. Default: start +# | arg: -l, --line_match= - Line to match - The line to find in the log to attest the service have finished to boot. +# If not defined it don't wait until the service is completely started. +# | arg: -p, --log_path= - Log file - Path to the log file. Default : /var/log/$app/$app.log +# | arg: -t, --timeout= - Timeout - The maximum time to wait before ending the watching. Default : 300 seconds. +# | arg: -e, --length= - Length of the error log : Default : 20 +ynh_systemd_action() { + # Declare an array to define the options of this helper. + declare -Ar args_array=( [n]=service_name= [a]=action= [l]=line_match= [p]=log_path= [t]=timeout= [e]=length= ) + local service_name + local action + local line_match + local length + local log_path + local timeout + + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + local service_name="${service_name:-$app}" + local action=${action:-start} + local log_path="${log_path:-/var/log/$service_name/$service_name.log}" + local length=${length:-20} + local timeout=${timeout:-300} + + # Start to read the log + if [[ -n "${line_match:-}" ]] + then + local templog="$(mktemp)" + # Following the starting of the app in its log + if [ "$log_path" == "systemd" ] ; then + # Read the systemd journal + journalctl --unit=$service_name --follow --since=-0 --quiet > "$templog" & + else + # Read the specified log file + tail -F -n0 "$log_path" > "$templog" & + fi + # Get the PID of the tail command + local pid_tail=$! + fi + + echo "${action^} the service $service_name" >&2 + systemctl $action $service_name \ + || ( journalctl --lines=$length -u $service_name >&2 \ + ; test -e "$log_path" && echo "--" && tail --lines=$length "$log_path" >&2 \ + ; false ) + + # Start the timeout and try to find line_match + if [[ -n "${line_match:-}" ]] + then + local i=0 + for i in $(seq 1 $timeout) + do + # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout + if grep --quiet "$line_match" "$templog" + then + echo "The service $service_name has correctly started." >&2 + break + fi + echo -n "." >&2 + sleep 1 + done + if [ $i -eq $timeout ] + then + echo "The service $service_name didn't fully started before the timeout." >&2 + echo "Please find here an extract of the end of the log of the service $service_name:" + journalctl --lines=$length -u $service_name >&2 + test -e "$log_path" && echo "--" && tail --lines=$length "$log_path" >&2 + fi + + echo "" + ynh_clean_check_starting + fi +} + +# Clean temporary process and file used by ynh_check_starting +# (usually used in ynh_clean_setup scripts) # -# | arg: Line to match - The line to find in the log to attest the service have finished to boot. -# | arg: Log file - The log file to watch -# | arg: Service name -# /var/log/$app/$app.log will be used if no other log is defined. -# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. -ynh_check_starting () { - local line_to_match="$1" - local service_name="${4:-$app}" - local app_log="${2:-/var/log/$service_name/$service_name.log}" - local timeout=${3:-300} - - ynh_clean_check_starting () { - # Stop the execution of tail. - kill -s 15 $pid_tail 2>&1 - ynh_secure_remove "$templog" 2>&1 - } - - echo "Starting of $service_name" >&2 - systemctl stop $service_name - local templog="$(mktemp)" - # Following the starting of the app in its log - tail -F -n0 "$app_log" > "$templog" & - # Get the PID of the tail command - local pid_tail=$! - systemctl start $service_name - - local i=0 - for i in `seq 1 $timeout` - do - # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout - if grep --quiet "$line_to_match" "$templog" - then - echo "The service $service_name has correctly started." >&2 - break - fi - echo -n "." >&2 - sleep 1 - done - if [ $i -eq $timeout ] - then - echo "The service $service_name didn't fully started before the timeout." >&2 - fi - - echo "" - ynh_clean_check_starting -} \ No newline at end of file +# usage: ynh_clean_check_starting +ynh_clean_check_starting () { + # Stop the execution of tail. + kill -s 15 $pid_tail 2>&1 + ynh_secure_remove "$templog" 2>&1 +} diff --git a/scripts/install b/scripts/install index 0ff36d1..4e62ea8 100644 --- a/scripts/install +++ b/scripts/install @@ -113,6 +113,4 @@ yunohost service add "$app" --log "/var/log/$app/$app.log" ynh_use_logrotate "/var/log/$app" # Reload services -# ynh_check_starting "Serving [::]:$port with pid" "/var/log/$app/gitea.log" -sleep 20 -systemctl start gitea +ynh_systemd_action -l "Serving \[::\]:$port with pid" -p "systemd" diff --git a/scripts/restore b/scripts/restore index 185f048..80b5d93 100644 --- a/scripts/restore +++ b/scripts/restore @@ -19,6 +19,7 @@ domain=$(ynh_app_setting_get "$app" domain) path_url=$(ynh_app_setting_get "$app" path) dbpass=$(ynh_app_setting_get "$app" mysqlpwd) admin=$(ynh_app_setting_get "$app" adminusername) +port=$(ynh_app_setting_get "$app" web_port) # Check domain/path availability with app helper ynh_webpath_available $domain $path_url || ynh_die "$domain is not available as domain, please use an other domain." @@ -68,5 +69,4 @@ yunohost service add "$app" --log /var/log/"$app"/"$app".log # Reload services systemctl reload nginx.service -sleep 20 -systemctl start gitea \ No newline at end of file +ynh_systemd_action -l "Serving \[::\]:$port with pid" -p "systemd" diff --git a/scripts/upgrade b/scripts/upgrade index 68314ee..2f626a8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -110,6 +110,4 @@ set_permission set_access_settings # Reload services -# ynh_check_starting "INFO] Listen: http://0.0.0.0:" "/var/log/$app/gitea.log" -sleep 20 -systemctl restart gitea +ynh_systemd_action -l "Serving \[::\]:$port with pid" -p "systemd"