Add new rc keywords: enable, disable, delete

This adds new keywords to rc/service to enable/disable a service's
rc.conf(5) variable and "delete" to remove the variable.

When the "service_delete_empty" variable in rc.conf(5) is set to "YES"
(default is "NO") an rc.conf.d file (in /etc/ or /usr/local/etc) is
deleted if empty after modification using "service $foo delete".

Submitted by:	lme (modified)
Reviewed by:	0mp (previous version), lme, bcr
Relnotes:	yes
Sponsored by:	Smule, Inc.
Differential Revision:	https://reviews.freebsd.org/D17113
This commit is contained in:
dteske 2018-10-31 20:37:12 +00:00
parent 465089cc01
commit 1f052ff0ad
4 changed files with 56 additions and 5 deletions

View File

@ -617,6 +617,7 @@ savecore_enable="YES" # Extract core from dump devices if any
savecore_flags="-m 10" # Used if dumpdev is enabled above, and present.
# By default, only the 10 most recent kernel dumps
# are saved.
service_delete_empty="NO" # Have 'service delete' remove empty rc.conf.d files.
crashinfo_enable="YES" # Automatically generate crash dump summary.
crashinfo_program="/usr/sbin/crashinfo" # Script to generate crash dump summary.
quota_enable="NO" # turn on quotas on startup (or NO).

View File

@ -922,7 +922,7 @@ run_rc_command()
eval _override_command=\$${name}_program
command=${_override_command:-$command}
_keywords="start stop restart rcvar enabled describe extracommands $extra_commands"
_keywords="start stop restart rcvar enable disable delete enabled describe extracommands $extra_commands"
rc_pid=
_pidcmd=
_procname=${procname:-${command}}
@ -977,12 +977,13 @@ run_rc_command()
if [ "$_elem" != "$rc_arg" ]; then
continue
fi
# if ${rcvar} is set, $1 is not "rcvar" and not "describe"
# and ${rc_pid} is not set, then run
# if ${rcvar} is set, $1 is not "rcvar", "describe",
# "enable" or "delete", and ${rc_pid} is not set, run:
# checkyesno ${rcvar}
# and return if that failed
#
if [ -n "${rcvar}" -a "$rc_arg" != "rcvar" -a "$rc_arg" != "stop" \
-a "$rc_arg" != "delete" -a "$rc_arg" != "enable" \
-a "$rc_arg" != "describe" ] ||
[ -n "${rcvar}" -a "$rc_arg" = "stop" -a -z "${rc_pid}" ]; then
if ! checkyesno ${rcvar}; then
@ -1030,6 +1031,31 @@ run_rc_command()
echo "$extra_commands"
;;
enable)
_out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=YES") &&
echo "$name enabled in ${_out%%:*}"
;;
disable)
_out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=NO") &&
echo "$name disabled in ${_out%%:*}"
;;
delete)
_files=
for _file in $(sysrc -lEs "$name"); do
_out=$(sysrc -Fif $_file "$rcvar") && _files="$_files $_file"
done
/usr/sbin/sysrc -x "$rcvar" && echo "$rcvar deleted in ${_files# }"
# delete file in rc.conf.d if desired and empty.
checkyesno service_delete_empty || _files=
for _file in $_files; do
[ "$_file" = "${_file#*/rc.conf.d/}" ] && continue
[ $(/usr/bin/stat -f%z $_file) -gt 0 ] && continue
/bin/rm "$_file" && echo "Empty file $_file removed"
done
;;
status)
_run_rc_precmd || return 1
if [ -n "$rc_pid" ]; then

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd August 22, 2018
.Dd October 24, 2018
.Dt RC.CONF 5
.Os
.Sh NAME
@ -4509,6 +4509,14 @@ at boot time.
The directory where the files exported by USB LUN are located.
The default directory is
.Pa /var/cfumass .
.It Va service_delete_empty
.Pq Vt bool
If set to
.Dq Li YES ,
.Ql Li service delete
removes empty
.Dq Li rc.conf.d
files.
.El
.Sh FILES
.Bl -tag -width ".Pa /etc/defaults/rc.conf" -compact
@ -4597,6 +4605,7 @@ The default directory is
.Xr rwhod 8 ,
.Xr savecore 8 ,
.Xr sdpd 8 ,
.Xr service 8 ,
.Xr sshd 8 ,
.Xr swapon 8 ,
.Xr sysctl 8 ,

View File

@ -31,7 +31,7 @@
.\" @(#)rc.8 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
.\"
.Dd April 25, 2017
.Dd September 18, 2018
.Dt RC 8
.Os
.Sh NAME
@ -327,6 +327,21 @@ If the script starts a process (rather than performing a one-off
operation), show the status of the process.
Otherwise it is not necessary to support this argument.
Defaults to displaying the process ID of the program (if running).
.It Cm enable
Enable the service in
.Xr rc.conf 5 .
.It Cm disable
Disable the service in
.Xr rc.conf 5 .
.It Cm delete
Remove the service from
.Xr rc.conf 5 .
If
.Ql Li service_delete_empty
is set to
.Dq Li YES ,
.Pa /etc/rc.conf.d/$servicename
will be deleted if empty after modification.
.It Cm describe
Print a short description of what the script does.
.It Cm extracommands