Skip to content

Commit

Permalink
MFC r342792, r342805: Provide rc_service variable for rc service scripts
Browse files Browse the repository at this point in the history
r342792: rc.subr: Provide rc_service variable for service scripts

Some rc scripts in ports (e.g. uwsgi, apache, openvpn) allow for
'application profiles' that usually require the rc script to be invoked
again for each active profile. Because there's no consistent way to
determine the path because it differs between manual/service(8) invocations
and /etc/rc invocations, this leads to patterns like these:

- www/uwsgi hardcodes the script path
- security/openvpn guesses either $_file or $0 based on $0 = /etc/rc

Instead of forcing rc scripts to guess, provide an rc_service variable to
the scripts that gets set appropriately both for direct execution or when a
script is being executed via run_rc_script (e.g. /etc/rc).

This is our analog of an OpenRC variable with the same name, different case
(RC_SERVICE).

r342805: rc.subr: Fix typo

Originally intended as 'in case in needs to be re-invoked', but it was later
decided (by myself) that 're-invoke itself' makes it more clear that the
script is expected to use this in a way.

PR:		234614
  • Loading branch information
kevans91 committed Jan 15, 2019
1 parent 5c2dc49 commit 4ce65c9
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
12 changes: 12 additions & 0 deletions etc/rc.subr
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ ID="/usr/bin/id"
IDCMD="if [ -x $ID ]; then $ID -un; fi"
PS="/bin/ps -ww"
JID=0
# rc_service provides the path to the service script that we are executing.
# This is not being set here in an execution context, necessarily, so it's
# really just a reasonable guess, and it will get overwritten later if
# we are executing from some other means than direct execution by service(8)
# or manual invocation of the service script. The prime example of this is
# during system startup, all rc scripts will be invoked via /etc/rc, so
# run_rc_script will overwrite rc_service with the file being sourced.
rc_service="$0"

#
# functions
Expand Down Expand Up @@ -863,6 +871,9 @@ check_startmsgs()
# by $flags from the environment.
# This variable may be changed by the precmd method.
#
# rc_service Path to the service being executed, in case the service
# needs to re-invoke itself.
#
# rc_pid PID of command (if appropriate)
#
# rc_fast Not empty if "fast" was provided (q.v.)
Expand Down Expand Up @@ -1333,6 +1344,7 @@ run_rc_script()
required_vars
eval unset ${_arg}_cmd ${_arg}_precmd ${_arg}_postcmd

rc_service="$_file"
case "$_file" in
/etc/rc.d/*.sh) # no longer allowed in the base
warn "Ignoring old-style startup script $_file"
Expand Down
6 changes: 4 additions & 2 deletions share/man/man8/rc.subr.8
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd February 4, 2016
.Dd January 15, 2019
.Dt RC.SUBR 8
.Os
.Sh NAME
Expand Down Expand Up @@ -764,7 +764,7 @@ The following variables are available to the methods
as well as after
.Ic run_rc_command
has completed:
.Bl -tag -width ".Va rc_flags" -offset indent
.Bl -tag -width ".Va rc_service" -offset indent
.It Va rc_arg
Argument provided to
.Ic run_rc_command ,
Expand All @@ -778,6 +778,8 @@ unless overridden by the environment variable
This variable may be changed by the
.Ar argument Ns Va _precmd
method.
.It Va rc_service
Path to the service script being executed, in case it needs to re-invoke itself.
.It Va rc_pid
PID of
.Va command
Expand Down

0 comments on commit 4ce65c9

Please sign in to comment.