Add sysrc(8) support for "rc.conf.d" file(s) when given "-s name" to
indicate service(8) script. While here, add "-l" option for listing the set of configuration file(s) considered (in order; separated by space). Also add "-L" for exploring all configuration files and "-E" to omit files that don't exist from operations. Differential Revision: https://reviews.freebsd.org/D3551 Reviewed by: allanjude MFC after: 1 week X-MFC-to: stable/10 Relnotes: yes
This commit is contained in:
parent
0755c17500
commit
4fb1de4304
@ -40,18 +40,23 @@ BSDCFG_SHARE="/usr/share/bsdconfig"
|
||||
#
|
||||
# Version information
|
||||
#
|
||||
SYSRC_VERSION="6.5 Sep-1,2015"
|
||||
SYSRC_VERSION="7.0 Sep-13,2015"
|
||||
|
||||
#
|
||||
# Options
|
||||
#
|
||||
CHECK_ONLY=
|
||||
DEFAULT=
|
||||
DELETE=
|
||||
DESCRIBE=
|
||||
EXISTING_ONLY=
|
||||
IGNORE_UNKNOWNS=
|
||||
JAIL=
|
||||
LIST_SERVICE_CONFS=
|
||||
LIST_CONFS=
|
||||
QUIET=
|
||||
ROOTDIR=
|
||||
SERVICE=
|
||||
SHOW_ALL=
|
||||
SHOW_EQUALS=
|
||||
SHOW_FILE=
|
||||
@ -80,7 +85,8 @@ die()
|
||||
#
|
||||
usage()
|
||||
{
|
||||
f_err "Usage: %s [OPTIONS] name[[+|-]=value] ...\n" "$pgm"
|
||||
f_err "Usage: %s [OPTIONS] %s\n" "$pgm" \
|
||||
"{name[[+|-]=value] ... | -a | -A | -l | -L [name ...]}"
|
||||
f_err "Try \`%s --help' for more information.\n" "$pgm"
|
||||
die
|
||||
}
|
||||
@ -95,6 +101,8 @@ help()
|
||||
local envfmt="\t%-17s%s\n"
|
||||
|
||||
f_err "Usage: %s [OPTIONS] name[[+|-]=value] ...\n" "$pgm"
|
||||
f_err "Usage: %s [OPTIONS] -a | -A\n" "$pgm"
|
||||
f_err "Usage: %s [OPTIONS] -l | -L [name ...]\n" "$pgm"
|
||||
|
||||
f_err "OPTIONS:\n"
|
||||
f_err "$optfmt" "-a" \
|
||||
@ -113,6 +121,8 @@ help()
|
||||
"Print query results as \`var=value' (useful for producing"
|
||||
f_err "$optfmt" "" \
|
||||
"output to be fed back in). Ignored if \`-n' is specified."
|
||||
f_err "$optfmt" "-E" \
|
||||
"Existing files only with \`-[lL]' or when changing a setting."
|
||||
f_err "$optfmt" "-f file" \
|
||||
"Operate on the specified file(s) instead of rc_conf_files."
|
||||
f_err "$optfmt" "" \
|
||||
@ -129,12 +139,20 @@ help()
|
||||
"The jid or name of the jail to operate within (overrides"
|
||||
f_err "$optfmt" "" \
|
||||
"\`-R dir'; requires jexec(8))."
|
||||
f_err "$optfmt" "-l" \
|
||||
"List configuration files used at startup on stdout and exit."
|
||||
f_err "$optfmt" "-L" \
|
||||
"List all configuration files including rc.conf.d entries."
|
||||
f_err "$optfmt" "-n" \
|
||||
"Show only variable values, not their names."
|
||||
f_err "$optfmt" "-N" \
|
||||
"Show only variable names, not their values."
|
||||
f_err "$optfmt" "-q" \
|
||||
"Quiet. Disable verbose and hide certain errors."
|
||||
f_err "$optfmt" "-s name" \
|
||||
"Process additional \`rc.conf.d' entries for service name."
|
||||
f_err "$optfmt" "" \
|
||||
"Ignored if \`-f file' is given."
|
||||
f_err "$optfmt" "-R dir" \
|
||||
"Operate within the root directory \`dir' rather than \`/'."
|
||||
f_err "$optfmt" "-v" \
|
||||
@ -245,27 +263,33 @@ unset arg
|
||||
#
|
||||
# Process command-line flags
|
||||
#
|
||||
while getopts aAcdDef:Fhij:nNqR:vxX flag; do
|
||||
while getopts aAcdDeEf:Fhij:lLnNqR:s:vxX flag; do
|
||||
case "$flag" in
|
||||
a) SHOW_ALL=${SHOW_ALL:-1} ;;
|
||||
A) SHOW_ALL=2 ;;
|
||||
c) CHECK_ONLY=1 ;;
|
||||
d) DESCRIBE=1 ;;
|
||||
D) RC_CONFS= ;;
|
||||
D) DEFAULT=1 RC_CONFS= ;;
|
||||
e) SHOW_EQUALS=1 ;;
|
||||
f) RC_CONFS="$RC_CONFS${RC_CONFS:+ }$OPTARG" ;;
|
||||
E) EXISTING_ONLY=1 ;;
|
||||
f) DEFAULT= RC_CONFS="$RC_CONFS${RC_CONFS:+ }$OPTARG" ;;
|
||||
F) SHOW_FILE=1 ;;
|
||||
h) usage ;; # NOTREACHED
|
||||
i) IGNORE_UNKNOWNS=1 ;;
|
||||
j) [ "$OPTARG" ] ||
|
||||
die "%s: Missing or null argument to \`-j' flag" "$pgm"
|
||||
JAIL="$OPTARG" ;;
|
||||
l) LIST_CONFS=1 ;;
|
||||
L) LIST_SERVICE_CONFS=1 ;;
|
||||
n) SHOW_NAME= ;;
|
||||
N) SHOW_VALUE= ;;
|
||||
q) QUIET=1 VERBOSE= ;;
|
||||
R) [ "$OPTARG" ] ||
|
||||
die "%s: Missing or null argument to \`-R' flag" "$pgm"
|
||||
ROOTDIR="$OPTARG" ;;
|
||||
s) [ "$OPTARG" ] ||
|
||||
die "%s: Missing or null argument to \`-s' flag" "$pgm"
|
||||
SERVICE="$OPTARG" ;;
|
||||
v) VERBOSE=1 QUIET= ;;
|
||||
x) DELETE=${DELETE:-1} ;;
|
||||
X) DELETE=2 ;;
|
||||
@ -274,6 +298,129 @@ while getopts aAcdDef:Fhij:nNqR:vxX flag; do
|
||||
done
|
||||
shift $(( $OPTIND - 1 ))
|
||||
|
||||
#
|
||||
# Process `-L' flag
|
||||
#
|
||||
if [ "$LIST_SERVICE_CONFS" ]; then
|
||||
list=
|
||||
|
||||
#
|
||||
# List rc_conf_files if no service names given
|
||||
#
|
||||
files=
|
||||
[ $# -eq 0 ] && files=$( f_sysrc_get rc_conf_files )
|
||||
for file in $files; do
|
||||
if [ "$EXISTING_ONLY" ]; then
|
||||
[ -e "$file" -a ! -d "$file" ] || continue
|
||||
fi
|
||||
case "$list" in
|
||||
"$file"|*" $file"|"$file "*|*" $file "*) continue ;;
|
||||
esac
|
||||
list="$list $file"
|
||||
done
|
||||
list="${list# }"
|
||||
if [ $# -eq 0 ]; then
|
||||
if [ "$VERBOSE" ]; then
|
||||
echo rc_conf_files: $list
|
||||
elif [ "$SHOW_EQUALS" ]; then
|
||||
echo "rc_conf_files=\"$list\""
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# List rc.conf.d entries
|
||||
#
|
||||
retval=$SUCCESS
|
||||
for service in ${*:-$( service -l )}; do
|
||||
slist=
|
||||
f_sysrc_service_configs $service files || retval=$? continue
|
||||
for file in $files; do
|
||||
if [ "$EXISTING_ONLY" ]; then
|
||||
[ -e "$file" -a ! -d "$file" ] || continue
|
||||
fi
|
||||
if [ ! "$VERBOSE" -a ! "$SHOW_EQUALS" ]; then
|
||||
case "$list" in
|
||||
"$file"|*" $file"|"$file "*|*" $file "*)
|
||||
continue ;;
|
||||
esac
|
||||
fi
|
||||
slist="$slist $file"
|
||||
done
|
||||
slist="${slist# }"
|
||||
if [ $# -gt 0 ]; then
|
||||
[ "$slist" ] || retval=$?
|
||||
fi
|
||||
if [ "$VERBOSE" ]; then
|
||||
[ "$slist" ] && echo "$service: $slist"
|
||||
continue
|
||||
elif [ "$SHOW_EQUALS" ]; then
|
||||
[ "$slist" ] && echo "$service=\"$slist\""
|
||||
continue
|
||||
fi
|
||||
list="$list${slist:+ }$slist"
|
||||
done
|
||||
if [ ! "$VERBOSE" -a ! "$SHOW_EQUALS" ]; then
|
||||
if [ $# -eq 0 -o ! "$QUIET" ]; then
|
||||
list="${list# }"
|
||||
[ "$list" ] && echo $list
|
||||
fi
|
||||
fi
|
||||
|
||||
exit $retval
|
||||
fi
|
||||
|
||||
#
|
||||
# Process `-s name' argument
|
||||
#
|
||||
if [ "$SERVICE" -a ! "${RC_CONFS+set}" ]; then
|
||||
if f_sysrc_service_configs "$SERVICE" RC_CONFS; then
|
||||
rc_conf_files=$( f_sysrc_get rc_conf_files )
|
||||
RC_CONFS="$rc_conf_files${RC_CONFS:+ }$RC_CONFS"
|
||||
unset rc_conf_files
|
||||
else
|
||||
unset RC_CONFS
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# Process `-E' option flag
|
||||
#
|
||||
if [ "$EXISTING_ONLY" ]; then
|
||||
#
|
||||
# To get f_sysrc_*() to ignore missing rc_conf_files, we have to use
|
||||
# RC_CONFS to override the unpreened value. If RC_CONFS already has a
|
||||
# value (`-D', `-f file', `-s name', or inherited from parent), use it.
|
||||
# Otherwise, include filtered contents of rc_conf_files.
|
||||
#
|
||||
RC_CONFS=$(
|
||||
if [ "${RC_CONFS+set}" ]; then
|
||||
set -- $RC_CONFS
|
||||
else
|
||||
set -- $( f_sysrc_get rc_conf_files )
|
||||
fi
|
||||
while [ $# -gt 0 ]; do
|
||||
[ -f "$1" ] && echo -n " $1"
|
||||
shift
|
||||
done
|
||||
)
|
||||
RC_CONFS="${RC_CONFS# }"
|
||||
fi
|
||||
|
||||
#
|
||||
# Process `-l' option flag
|
||||
#
|
||||
if [ "$LIST_CONFS" ]; then
|
||||
[ $# -eq 0 ] || usage
|
||||
if [ "$DEFAULT" ]; then
|
||||
echo "$RC_DEFAULTS"
|
||||
elif [ "${RC_CONFS+set}" ]; then
|
||||
echo "$RC_CONFS"
|
||||
else
|
||||
f_sysrc_get rc_conf_files
|
||||
fi
|
||||
exit $SUCCESS
|
||||
fi
|
||||
|
||||
#
|
||||
# [More] Sanity checks (e.g., "sysrc --")
|
||||
#
|
||||
@ -344,6 +491,10 @@ if [ "$JAIL" -o "$ROOTDIR" ]; then
|
||||
$( [ "$SHOW_ALL" = "1" ] && echo \ -a )
|
||||
$( [ "$SHOW_ALL" = "2" ] && echo \ -A )
|
||||
${CHECK_ONLY:+-c}
|
||||
${DEFAULT:+-D}
|
||||
${EXISTING_ONLY:+-E}
|
||||
${LIST_CONFS:+-l}
|
||||
${LIST_SERVICE_CONFS:+-L}
|
||||
${DESCRIBE:+-d}
|
||||
${SHOW_EQUALS:+-e}
|
||||
${IGNORE_UNKNOWNS:+-i}
|
||||
@ -351,6 +502,11 @@ if [ "$JAIL" -o "$ROOTDIR" ]; then
|
||||
$( [ "$SHOW_VALUE" ] || echo \ -N )
|
||||
$( [ "$SHOW_FILE" ] && echo \ -F )
|
||||
"
|
||||
if [ "$SERVICE" ]; then
|
||||
escape "$SERVICE" _SERVICE
|
||||
args="$args -s '$_SERVICE'"
|
||||
unset _SERVICE
|
||||
fi
|
||||
if [ "${RC_CONFS+set}" ]; then
|
||||
escape "$RC_CONFS" _RC_CONFS
|
||||
args="$args -f '$_RC_CONFS'"
|
||||
@ -454,9 +610,10 @@ if [ "$SHOW_ALL" ]; then
|
||||
#
|
||||
IFS="$IFS|"
|
||||
EXCEPT="IFS|EXCEPT|PATH|RC_DEFAULTS|OPTIND|DESCRIBE|SEP"
|
||||
EXCEPT="$EXCEPT|DELETE|SHOW_ALL|SHOW_EQUALS|SHOW_NAME"
|
||||
EXCEPT="$EXCEPT|SHOW_VALUE|SHOW_FILE|VERBOSE|RC_CONFS"
|
||||
EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE|CHECK_ONLY"
|
||||
EXCEPT="$EXCEPT|DELETE|SHOW_ALL|SHOW_EQUALS|SHOW_NAME|DEFAULT"
|
||||
EXCEPT="$EXCEPT|SHOW_VALUE|SHOW_FILE|VERBOSE|RC_CONFS|SERVICE"
|
||||
EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE|CHECK_ONLY|EXISTING_ONLY"
|
||||
EXCEPT="$EXCEPT|LIST_CONFS|LIST_SERVICE_CONFS"
|
||||
EXCEPT="$EXCEPT|f_sysrc_desc_awk|f_sysrc_delete_awk"
|
||||
|
||||
#
|
||||
@ -479,7 +636,13 @@ if [ "$SHOW_ALL" ]; then
|
||||
# explicit value, modifying the default behavior of
|
||||
# source_rc_confs().
|
||||
#
|
||||
[ "${RC_CONFS+set}" ] && rc_conf_files="$RC_CONFS"
|
||||
if [ "${RC_CONFS+set}" ]; then
|
||||
[ "$SHOW_ALL" = "1" -a "$SERVICE" -a \
|
||||
! "$DEFAULT" ] || rc_conf_files=
|
||||
rc_conf_files="$rc_conf_files $RC_CONFS"
|
||||
rc_conf_files="${rc_conf_files# }"
|
||||
rc_conf_files="${rc_conf_files% }"
|
||||
fi
|
||||
|
||||
source_rc_confs
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 2, 2015
|
||||
.Dd September 12, 2015
|
||||
.Dt SYSRC 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -32,16 +32,27 @@
|
||||
.Nd safely edit system rc files
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl cdDeFhinNqvx
|
||||
.Op Fl cdDeEFhinNqvx
|
||||
.Op Fl s Ar name
|
||||
.Op Fl f Ar file
|
||||
.Op Fl j Ar jail | Fl R Ar dir
|
||||
.Ar name Ns Op Ns Oo +|- Oc Ns = Ns Ar value
|
||||
.Ar ...
|
||||
.Nm
|
||||
.Op Fl cdDeFhinNqvx
|
||||
.Op Fl cdDeEFhinNqvx
|
||||
.Op Fl s Ar name
|
||||
.Op Fl f Ar file
|
||||
.Op Fl j Ar jail | Fl R Ar dir
|
||||
.Fl a | A
|
||||
.Nm
|
||||
.Op Fl E
|
||||
.Op Fl s Ar name
|
||||
.Op Fl f Ar file
|
||||
.Fl l
|
||||
.Nm
|
||||
.Op Fl eEqv
|
||||
.Fl L
|
||||
.Op Ar name ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@ -81,6 +92,13 @@ Ignored if either
|
||||
or
|
||||
.Ql Fl F
|
||||
is specified.
|
||||
.It Fl E
|
||||
When given
|
||||
.Sq Fl l
|
||||
or
|
||||
.Sq Fl L
|
||||
to list configuration files, only list those that exist.
|
||||
When changing a setting, prefer to modify existing files.
|
||||
.It Fl f Ar file
|
||||
Operate on the specified file(s) instead of the files obtained by reading the
|
||||
.Sq rc_conf_files
|
||||
@ -105,6 +123,17 @@ or name of the
|
||||
.Ar jail
|
||||
to operate within
|
||||
.Pq overrides So Fl R Ar dir Sc ; requires Xr jexec 8 .
|
||||
.It Fl l
|
||||
List configuration files used at startup on stdout and exit.
|
||||
.It Fl L
|
||||
List all configuration files including rc.conf.d entries on stdout and exit.
|
||||
Can be combined with
|
||||
.Sq Fl v
|
||||
or
|
||||
.Sq Fl e
|
||||
to show service names.
|
||||
.Nm
|
||||
exits with success if all named services are installed, failure otherwise.
|
||||
.It Fl n
|
||||
Show only variable values, not their names.
|
||||
.It Fl N
|
||||
@ -112,11 +141,40 @@ Show only variable names, not their values.
|
||||
.It Fl q
|
||||
Quiet.
|
||||
Disable verbose and hide certain errors.
|
||||
When combined with
|
||||
.Sq Fl L
|
||||
and one or more
|
||||
.Li Ar name
|
||||
arguments, provide only exit status and no output.
|
||||
.It Fl R Ar dir
|
||||
Operate within the root directory
|
||||
.Sq Ar dir
|
||||
rather than
|
||||
.Sq / .
|
||||
.It Fl s Ar name
|
||||
If an
|
||||
.Li rc.d
|
||||
script of
|
||||
.Ar name
|
||||
exists
|
||||
.Po
|
||||
in
|
||||
.Dq /etc/rc.d
|
||||
or
|
||||
.Li local_startup
|
||||
directories
|
||||
.Pc ,
|
||||
process its
|
||||
.Dq rc.conf.d
|
||||
entries as potential overrides to
|
||||
.Sq rc_conf_files .
|
||||
See
|
||||
.Xr rc.subr 8
|
||||
for additional information on
|
||||
.Dq rc.conf.d .
|
||||
Can be combined with
|
||||
.Sq Fl l
|
||||
to list configuration files used by service at startup.
|
||||
.It Fl v
|
||||
Verbose.
|
||||
Print the pathname of the specific
|
||||
@ -336,6 +394,10 @@ and
|
||||
.It Pa /etc/defaults/rc.conf
|
||||
.It Pa /etc/rc.conf
|
||||
.It Pa /etc/rc.conf.local
|
||||
.It Pa /etc/rc.conf.d/name
|
||||
.It Pa /etc/rc.conf.d/name/*
|
||||
.It Pa /usr/local/etc/rc.conf.d/name
|
||||
.It Pa /usr/local/etc/rc.conf.d/name/*
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
Below are some simple examples of how
|
||||
@ -397,6 +459,7 @@ cloned_interfaces+"alternate"
|
||||
.Sh SEE ALSO
|
||||
.Xr jls 1 ,
|
||||
.Xr rc.conf 5 ,
|
||||
.Xr rc.subr 8 ,
|
||||
.Xr jail 8 ,
|
||||
.Xr jexec 8 ,
|
||||
.Xr rc 8 ,
|
||||
|
Loading…
Reference in New Issue
Block a user