git: 51dbdd1d8634 - stable/14 - rc: improve NAME_setup handling
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 14 Aug 2025 13:47:39 UTC
The branch stable/14 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=51dbdd1d8634bf0d5af2a3d5a521a6576cc93a37
commit 51dbdd1d8634bf0d5af2a3d5a521a6576cc93a37
Author: Franco Fichtner <franco@opnsense.org>
AuthorDate: 2024-05-24 16:38:56 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-08-14 13:41:18 +0000
rc: improve NAME_setup handling
Reload is used for service reconfiguration as well
and lacks a NAME_prepend-like mechanism so it makes
sense to extend the NAME_reload hook into this
action.
precmd may use configuration checks and blocks setup
from doing its designated work (e.g. nginx). In moving
the invoke of the setup script in front allows us to
provide custom scripts for config file generation and
fixing prior to precmd checking configuration integrity.
Also introduce _run_rc_setup to separate the launcher
from the main one. Let it run correctly in the case
of restart_precmd and block further execution as
would be the case in start due to the internal plumbing
of restart being split into calling stop and start
afterwards.
Differential-Revsiion: https://reviews.freebsd.org/D36259
Signed-off-by: Franco Fichtner <franco@opnsense.org>
Reviewed by: imp, oshogbo
Pull Request: https://github.com/freebsd/freebsd-src/pull/1258
(cherry picked from commit 11333dd580b704fb4ff0836e1d1a0634099b0cf6)
---
libexec/rc/rc.subr | 72 ++++++++++++++++++++++++++++++++----------------
share/man/man8/rc.subr.8 | 11 ++++++--
2 files changed, 57 insertions(+), 26 deletions(-)
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index 75110a0313cd..239ec4707b33 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -813,7 +813,8 @@ startmsg()
#
# ${name}_prepend n Command added before ${command}.
#
-# ${name}_setup n Command executed before ${command}.
+# ${name}_setup n Command executed during start, restart and
+# reload before ${rc_arg}_precmd is run.
#
# ${name}_login_class n Login class to use, else "daemon".
#
@@ -1075,9 +1076,9 @@ run_rc_command()
return 1
fi
- # if there's a custom ${XXX_cmd},
- # run that instead of the default
- #
+ # if there's a custom ${XXX_cmd},
+ # run that instead of the default
+ #
eval _cmd=\$${rc_arg}_cmd \
_precmd=\$${rc_arg}_precmd \
_postcmd=\$${rc_arg}_postcmd
@@ -1086,6 +1087,15 @@ run_rc_command()
if [ -n "$_env" ]; then
eval "export -- $_env"
fi
+
+ # service can redefine all so
+ # check for valid setup target
+ if [ "$rc_arg" = 'start' -o \
+ "$rc_arg" = 'restart' -o \
+ "$rc_arg" = 'reload' ]; then
+ _run_rc_setup || \
+ warn "failed to setup ${name}"
+ fi
_run_rc_precmd || return 1
_run_rc_doit "$_cpusetcmd $_cmd $rc_extra_args" || return 1
_run_rc_postcmd
@@ -1135,13 +1145,14 @@ run_rc_command()
return 1
fi
+ _run_rc_setup || warn "failed to setup ${name}"
if ! _run_rc_precmd; then
warn "failed precmd routine for ${name}"
return 1
fi
- # setup the full command to run
- #
+ # setup the full command to run
+ #
startmsg "Starting ${name}."
if [ -n "$_chroot" ]; then
_cd=
@@ -1172,24 +1183,18 @@ $_cpusetcmd $command $rc_flags $command_args"
fi
fi
- if [ -n "$_setup" ]; then
- if ! _run_rc_doit "$_setup"; then
- warn "failed to setup ${name}"
- fi
- fi
-
- # Prepend default limits
+ # Prepend default limits
_doit="$_cd limits -C $_login_class $_limits $_doit"
- # run the full command
- #
+ # run the full command
+ #
if ! _run_rc_doit "$_doit"; then
warn "failed to start ${name}"
return 1
fi
- # finally, run postcmd
- #
+ # finally, run postcmd
+ #
_run_rc_postcmd
;;
@@ -1202,14 +1207,14 @@ $_cpusetcmd $command $rc_flags $command_args"
_run_rc_precmd || return 1
- # send the signal to stop
- #
+ # send the signal to stop
+ #
echo "Stopping ${name}."
_doit=$(_run_rc_killcmd "${sig_stop:-TERM}")
_run_rc_doit "$_doit" || return 1
- # wait for the command to exit,
- # and run postcmd.
+ # wait for the command to exit,
+ # and run postcmd.
wait_for_pids $rc_pid
_run_rc_postcmd
@@ -1221,6 +1226,8 @@ $_cpusetcmd $command $rc_flags $command_args"
return 1
fi
+ _run_rc_setup || warn "failed to setup ${name}"
+
_run_rc_precmd || return 1
_doit=$(_run_rc_killcmd "${sig_reload:-HUP}")
@@ -1230,9 +1237,11 @@ $_cpusetcmd $command $rc_flags $command_args"
;;
restart)
- # prevent restart being called more
- # than once by any given script
- #
+ _run_rc_setup || warn "failed to setup ${name}"
+
+ # prevent restart being called more
+ # than once by any given script
+ #
if ${_rc_restart_done:-false}; then
return 0
fi
@@ -1346,6 +1355,7 @@ $_cpusetcmd $command $rc_flags $command_args"
# _precmd R
# _postcmd R
# _return W
+# _setup R
#
_run_rc_offcmd()
{
@@ -1391,6 +1401,20 @@ _run_rc_postcmd()
return 0
}
+_run_rc_setup()
+{
+ # prevent multiple execution on restart => stop/start split
+ if ! ${_rc_restart_done:-false} && [ -n "$_setup" ]; then
+ debug "run_rc_command: ${rc_arg}_setup: $_setup"
+ eval "$_setup"
+ _return=$?
+ if [ $_return -ne 0 ]; then
+ return 1
+ fi
+ fi
+ return 0
+}
+
_run_rc_doit()
{
local _m
diff --git a/share/man/man8/rc.subr.8 b/share/man/man8/rc.subr.8
index 844ba0356692..d61307f483b2 100644
--- a/share/man/man8/rc.subr.8
+++ b/share/man/man8/rc.subr.8
@@ -686,8 +686,15 @@ This is a generic version of
or
.Va ${name}_nice .
.It Va ${name}_setup
-Command to be run prior to
-.Va command .
+Optional command to be run during
+.Cm start ,
+.Cm restart ,
+and
+.Cm reload
+prior to the respective
+.Ar argument Ns Va _precmd .
+If the command fails for any reason it will output a warning,
+but execution will continue.
.It Ar argument Ns Va _cmd
Shell commands which override the default method for
.Ar argument .