1241149Sdteske#!/bin/sh 2241149Sdteske#- 3272191Sdteske# Copyright (c) 2010-2014 Devin Teske 4241149Sdteske# All rights reserved. 5241149Sdteske# 6241149Sdteske# Redistribution and use in source and binary forms, with or without 7241149Sdteske# modification, are permitted provided that the following conditions 8241149Sdteske# are met: 9241149Sdteske# 1. Redistributions of source code must retain the above copyright 10241149Sdteske# notice, this list of conditions and the following disclaimer. 11241149Sdteske# 2. Redistributions in binary form must reproduce the above copyright 12241149Sdteske# notice, this list of conditions and the following disclaimer in the 13241149Sdteske# documentation and/or other materials provided with the distribution. 14241149Sdteske# 15241149Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16252987Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17241149Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18241149Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19241149Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20241149Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21241149Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22241149Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23241149Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24241149Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25241149Sdteske# SUCH DAMAGE. 26241149Sdteske# 27241149Sdteske# $FreeBSD$ 28241149Sdteske# 29241149Sdteske############################################################ INCLUDES 30241149Sdteske 31260679Sdteske# Prevent `-d' from being interpreted as a debug flag by common.subr 32260679SdteskeDEBUG_SELF_INITIALIZE= 33260679Sdteske 34241149SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 35241149Sdteske[ "$_COMMON_SUBR" ] || . $BSDCFG_SHARE/common.subr || exit 1 36241149Sdteske[ "$_SYSRC_SUBR" ] || f_include $BSDCFG_SHARE/sysrc.subr 37241149Sdteske 38241149Sdteske############################################################ GLOBALS 39241149Sdteske 40241149Sdteske# 41260679Sdteske# Version information 42260679Sdteske# 43272191SdteskeSYSRC_VERSION="6.1 Jul-18,2014" 44260679Sdteske 45260679Sdteske# 46241149Sdteske# Options 47241149Sdteske# 48260679SdteskeCHECK_ONLY= 49241149SdteskeDELETE= 50241149SdteskeDESCRIBE= 51241149SdteskeIGNORE_UNKNOWNS= 52241149SdteskeJAIL= 53241149SdteskeQUIET= 54241149SdteskeROOTDIR= 55241149SdteskeSHOW_ALL= 56241149SdteskeSHOW_EQUALS= 57241149SdteskeSHOW_FILE= 58241149SdteskeSHOW_NAME=1 59241149SdteskeSHOW_VALUE=1 60252797SdteskeSYSRC_VERBOSE= 61241149Sdteske 62241149Sdteske############################################################ FUNCTIONS 63241149Sdteske 64241149Sdteske# die [ $fmt [ $opts ... ]] 65241149Sdteske# 66241149Sdteske# Optionally print a message to stderr before exiting with failure status. 67241149Sdteske# 68241149Sdteskedie() 69241149Sdteske{ 70241149Sdteske local fmt="$1" 71241149Sdteske [ $# -gt 0 ] && shift 1 72241149Sdteske [ "$fmt" ] && f_err "$fmt\n" "$@" 73241149Sdteske 74241149Sdteske exit $FAILURE 75241149Sdteske} 76241149Sdteske 77241149Sdteske# usage 78241149Sdteske# 79241149Sdteske# Prints a short syntax statement and exits. 80241149Sdteske# 81241149Sdteskeusage() 82241149Sdteske{ 83241149Sdteske f_err "Usage: %s [OPTIONS] name[=value] ...\n" "$pgm" 84241149Sdteske f_err "Try \`%s --help' for more information.\n" "$pgm" 85241149Sdteske die 86241149Sdteske} 87241149Sdteske 88241149Sdteske# help 89241149Sdteske# 90241149Sdteske# Prints a full syntax statement and exits. 91241149Sdteske# 92241149Sdteskehelp() 93241149Sdteske{ 94241149Sdteske local optfmt="\t%-11s%s\n" 95241149Sdteske local envfmt="\t%-17s%s\n" 96241149Sdteske 97241149Sdteske f_err "Usage: %s [OPTIONS] name[=value] ...\n" "$pgm" 98241149Sdteske 99241149Sdteske f_err "OPTIONS:\n" 100241149Sdteske f_err "$optfmt" "-a" \ 101241149Sdteske "Dump a list of all non-default configuration variables." 102241149Sdteske f_err "$optfmt" "-A" \ 103241149Sdteske "Dump a list of all configuration variables (incl. defaults)." 104260679Sdteske f_err "$optfmt" "-c" \ 105272191Sdteske "Check. Return success if set or no changes, else error." 106241149Sdteske f_err "$optfmt" "-d" \ 107241149Sdteske "Print a description of the given variable." 108241149Sdteske f_err "$optfmt" "-D" \ 109241149Sdteske "Show default value(s) only (this is the same as setting" 110241149Sdteske f_err "$optfmt" "" \ 111241149Sdteske "RC_CONFS to NULL or passing \`-f' with a NULL file-argument)." 112241149Sdteske f_err "$optfmt" "-e" \ 113241149Sdteske "Print query results as \`var=value' (useful for producing" 114241149Sdteske f_err "$optfmt" "" \ 115241149Sdteske "output to be fed back in). Ignored if \`-n' is specified." 116241149Sdteske f_err "$optfmt" "-f file" \ 117241149Sdteske "Operate on the specified file(s) instead of rc_conf_files." 118241149Sdteske f_err "$optfmt" "" \ 119241149Sdteske "Can be specified multiple times for additional files." 120241149Sdteske f_err "$optfmt" "-F" \ 121241149Sdteske "Show only the last rc.conf(5) file each directive is in." 122241149Sdteske f_err "$optfmt" "-h" \ 123241149Sdteske "Print a short usage statement to stderr and exit." 124241149Sdteske f_err "$optfmt" "--help" \ 125241149Sdteske "Print this message to stderr and exit." 126241149Sdteske f_err "$optfmt" "-i" \ 127241149Sdteske "Ignore unknown variables." 128241149Sdteske f_err "$optfmt" "-j jail" \ 129241149Sdteske "The jid or name of the jail to operate within (overrides" 130241149Sdteske f_err "$optfmt" "" \ 131241149Sdteske "\`-R dir'; requires jexec(8))." 132241149Sdteske f_err "$optfmt" "-n" \ 133241149Sdteske "Show only variable values, not their names." 134241149Sdteske f_err "$optfmt" "-N" \ 135241149Sdteske "Show only variable names, not their values." 136241149Sdteske f_err "$optfmt" "-q" \ 137272191Sdteske "Quiet. Disable verbose and hide certain errors." 138241149Sdteske f_err "$optfmt" "-R dir" \ 139241149Sdteske "Operate within the root directory \`dir' rather than \`/'." 140241149Sdteske f_err "$optfmt" "-v" \ 141241149Sdteske "Verbose. Print the pathname of the specific rc.conf(5)" 142241149Sdteske f_err "$optfmt" "" \ 143241149Sdteske "file where the directive was found." 144260679Sdteske f_err "$optfmt" "--version" \ 145260679Sdteske "Print version information to stdout and exit." 146241149Sdteske f_err "$optfmt" "-x" \ 147241149Sdteske "Remove variable(s) from specified file(s)." 148241149Sdteske f_err "\n" 149241149Sdteske 150241149Sdteske f_err "ENVIRONMENT:\n" 151241149Sdteske f_err "$envfmt" "RC_CONFS" \ 152241149Sdteske "Override default rc_conf_files (even if set to NULL)." 153241149Sdteske f_err "$envfmt" "RC_DEFAULTS" \ 154241149Sdteske "Location of \`/etc/defaults/rc.conf' file." 155241149Sdteske 156241149Sdteske die 157241149Sdteske} 158241149Sdteske 159241149Sdteske# jail_depend 160241149Sdteske# 161241149Sdteske# Dump dependencies such as language-file variables and include files to stdout 162241149Sdteske# to be piped-into sh(1) running via jexec(8)/chroot(8). As a security measure, 163241149Sdteske# this prevents existing language files and library files from being loaded in 164241149Sdteske# the jail. This also relaxes the requirement to have these files in every jail 165241149Sdteske# before sysrc can be used on said jail. 166241149Sdteske# 167241149Sdteskejail_depend() 168241149Sdteske{ 169241149Sdteske # 170241149Sdteske # Indicate that we are jailed 171241149Sdteske # 172241149Sdteske echo export _SYSRC_JAILED=1 173241149Sdteske 174241149Sdteske # 175241149Sdteske # Print i18n language variables (their current values are sanitized 176241149Sdteske # and re-printed for interpretation so that the i18n language files 177241149Sdteske # do not need to exist within the jail). 178241149Sdteske # 179241149Sdteske local var val 180241149Sdteske for var in \ 181241149Sdteske msg_cannot_create_permission_denied \ 182241149Sdteske msg_permission_denied \ 183241149Sdteske msg_previous_syntax_errors \ 184241149Sdteske ; do 185241149Sdteske val=$( eval echo \"\$$var\" | 186241149Sdteske awk '{ gsub(/'\''/, "'\''\\'\'\''"); print }' ) 187241149Sdteske echo $var="'$val'" 188241149Sdteske done 189241149Sdteske 190241149Sdteske # 191241149Sdteske # Print include dependencies 192241149Sdteske # 193260679Sdteske echo DEBUG_SELF_INITIALIZE= 194241149Sdteske cat $BSDCFG_SHARE/common.subr 195241149Sdteske cat $BSDCFG_SHARE/sysrc.subr 196241149Sdteske} 197241149Sdteske 198241149Sdteske############################################################ MAIN SOURCE 199241149Sdteske 200241149Sdteske# 201241149Sdteske# Perform sanity checks 202241149Sdteske# 203241149Sdteske[ $# -gt 0 ] || usage 204241149Sdteske 205241149Sdteske# 206260679Sdteske# Check for `--help' and `--version' command-line option 207241149Sdteske# 208241149Sdteske( # Operate in sub-shell to protect $@ in parent 209241149Sdteske while [ $# -gt 0 ]; do 210241149Sdteske case "$1" in 211260679Sdteske --help) help ;; 212260679Sdteske --version) # see GLOBALS 213260679Sdteske echo "$SYSRC_VERSION" 214260679Sdteske exit 1 ;; 215241149Sdteske -[fRj]) # These flags take an argument 216260679Sdteske shift 1 ;; 217241149Sdteske esac 218241149Sdteske shift 1 219241149Sdteske done 220241149Sdteske exit 0 221260679Sdteske) || die 222241149Sdteske 223241149Sdteske# 224241149Sdteske# Process command-line flags 225241149Sdteske# 226260679Sdteskewhile getopts aAcdDef:Fhij:nNqR:vxX flag; do 227241149Sdteske case "$flag" in 228241149Sdteske a) SHOW_ALL=${SHOW_ALL:-1};; 229241149Sdteske A) SHOW_ALL=2;; 230260679Sdteske c) CHECK_ONLY=1;; 231241149Sdteske d) DESCRIBE=1;; 232241149Sdteske D) RC_CONFS=;; 233241149Sdteske e) SHOW_EQUALS=1;; 234241149Sdteske f) RC_CONFS="$RC_CONFS${RC_CONFS:+ }$OPTARG";; 235241149Sdteske F) SHOW_FILE=1;; 236241149Sdteske h) usage;; 237241149Sdteske i) IGNORE_UNKNOWNS=1;; 238241149Sdteske j) [ "$OPTARG" ] || die \ 239241149Sdteske "%s: Missing or null argument to \`-j' flag" "$pgm" 240241149Sdteske JAIL="$OPTARG";; 241241149Sdteske n) SHOW_NAME=;; 242241149Sdteske N) SHOW_VALUE=;; 243241149Sdteske q) QUIET=1 SYSRC_VERBOSE=;; 244241149Sdteske R) [ "$OPTARG" ] || die \ 245241149Sdteske "%s: Missing or null argument to \`-R' flag" "$pgm" 246241149Sdteske ROOTDIR="$OPTARG";; 247241149Sdteske v) SYSRC_VERBOSE=1 QUIET=;; 248241149Sdteske x) DELETE=${DELETE:-1};; 249241149Sdteske X) DELETE=2;; 250241149Sdteske \?) usage;; 251241149Sdteske esac 252241149Sdteskedone 253241149Sdteskeshift $(( $OPTIND - 1 )) 254241149Sdteske 255241149Sdteske# 256241149Sdteske# [More] Sanity checks (e.g., "sysrc --") 257241149Sdteske# 258241149Sdteske[ $# -eq 0 -a ! "$SHOW_ALL" ] && usage 259241149Sdteske 260241149Sdteske# 261241149Sdteske# Taint-check all rc.conf(5) files 262241149Sdteske# 263241149Sdteskeerrmsg="$pgm: Exiting due to previous syntax errors" 264241565Sdteskeif [ "${RC_CONFS+set}" ]; then 265241149Sdteske ( for i in $RC_CONFS; do 266241149Sdteske [ -e "$i" ] || continue 267241149Sdteske /bin/sh -n "$i" || exit $FAILURE 268241149Sdteske done 269241149Sdteske exit $SUCCESS 270241149Sdteske ) || die "$errmsg" 271241149Sdteskeelse 272241149Sdteske /bin/sh -n "$RC_DEFAULTS" || die "$errmsg" 273241149Sdteske ( . "$RC_DEFAULTS" 274241149Sdteske for i in $rc_conf_files; do 275241149Sdteske [ -e "$i" ] || continue 276241149Sdteske /bin/sh -n "$i" || exit $FAILURE 277241149Sdteske done 278241149Sdteske exit $SUCCESS 279241149Sdteske ) || die "$errmsg" 280241149Sdteskefi 281241149Sdteske 282241149Sdteske# 283241149Sdteske# Process `-x' (and secret `-X') command-line options 284241149Sdteske# 285241149Sdteskeerrmsg="$pgm: \`-x' option incompatible with \`-a'/\`-A' options" 286241149Sdteskeerrmsg="$errmsg (use \`-X' to override)" 287241149Sdteskeif [ "$DELETE" -a "$SHOW_ALL" ]; then 288241149Sdteske [ "$DELETE" = "2" ] || die "$errmsg" 289241149Sdteskefi 290241149Sdteske 291241149Sdteske# 292260679Sdteske# Pre-flight for `-c' command-line option 293260679Sdteske# 294260679Sdteske[ "$CHECK_ONLY" -a "$SHOW_ALL" ] && 295260679Sdteske die "$pgm: \`-c' option incompatible with \`-a'/\`-A' options" 296260679Sdteske 297260679Sdteske# 298241149Sdteske# Process `-e', `-n', and `-N' command-line options 299241149Sdteske# 300241149SdteskeSEP=': ' 301260679Sdteske[ "$SHOW_FILE" ] && SHOW_EQUALS= 302241149Sdteske[ "$SHOW_NAME" ] || SHOW_EQUALS= 303241149Sdteske[ "$SYSRC_VERBOSE" = "0" ] && SYSRC_VERBOSE= 304241149Sdteskeif [ ! "$SHOW_VALUE" ]; then 305241149Sdteske SHOW_NAME=1 306241149Sdteske SHOW_EQUALS= 307241149Sdteskefi 308260679Sdteske[ "$SHOW_EQUALS" ] && SEP='="' 309241149Sdteske 310241149Sdteske# 311241149Sdteske# Process `-j jail' and `-R dir' command-line options 312241149Sdteske# 313241149Sdteskeif [ "$JAIL" -o "$ROOTDIR" ]; then 314241149Sdteske # 315241149Sdteske # Reconstruct the arguments that we want to carry-over 316241149Sdteske # 317241149Sdteske args=" 318241149Sdteske ${SYSRC_VERBOSE:+-v} 319241149Sdteske ${QUIET:+-q} 320241149Sdteske $( [ "$DELETE" = "1" ] && echo \ -x ) 321241149Sdteske $( [ "$DELETE" = "2" ] && echo \ -X ) 322241149Sdteske $( [ "$SHOW_ALL" = "1" ] && echo \ -a ) 323241149Sdteske $( [ "$SHOW_ALL" = "2" ] && echo \ -A ) 324260679Sdteske ${CHECK_ONLY:+-c} 325241149Sdteske ${DESCRIBE:+-d} 326241149Sdteske ${SHOW_EQUALS:+-e} 327241149Sdteske ${IGNORE_UNKNOWNS:+-i} 328241149Sdteske $( [ "$SHOW_NAME" ] || echo \ -n ) 329241149Sdteske $( [ "$SHOW_VALUE" ] || echo \ -N ) 330241149Sdteske $( [ "$SHOW_FILE" ] && echo \ -F ) 331241149Sdteske " 332241565Sdteske if [ "${RC_CONFS+set}" ]; then 333241149Sdteske args="$args -f '$RC_CONFS'" 334241149Sdteske fi 335241149Sdteske for arg in "$@"; do 336241149Sdteske args="$args '$arg'" 337241149Sdteske done 338241149Sdteske 339241149Sdteske # 340241149Sdteske # If both are supplied, `-j jail' supercedes `-R dir' 341241149Sdteske # 342241149Sdteske if [ "$JAIL" ]; then 343241149Sdteske # 344241149Sdteske # Re-execute ourselves with sh(1) via jexec(8) 345241149Sdteske # 346241149Sdteske ( echo set -- $args 347241149Sdteske jail_depend 348241149Sdteske cat $0 349241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 350241149Sdteske /usr/sbin/jexec "$JAIL" /bin/sh 351241149Sdteske exit $? 352241149Sdteske elif [ "$ROOTDIR" ]; then 353241149Sdteske # 354241149Sdteske # Make sure that the root directory specified is not to any 355241149Sdteske # running jails. 356241149Sdteske # 357241149Sdteske # NOTE: To maintain backward compatibility with older jails on 358241149Sdteske # older systems, we will not perform this check if either the 359241149Sdteske # jls(1) or jexec(8) utilities are missing. 360241149Sdteske # 361241149Sdteske if f_have jexec && f_have jls; then 362241149Sdteske jid="`jls jid path | \ 363241149Sdteske ( 364241149Sdteske while read JID JROOT; do 365241149Sdteske [ "$JROOT" = "$ROOTDIR" ] || continue 366241149Sdteske echo $JID 367241149Sdteske done 368241149Sdteske )`" 369241149Sdteske 370241149Sdteske # 371241149Sdteske # If multiple running jails match the specified root 372241149Sdteske # directory, exit with error. 373241149Sdteske # 374241149Sdteske if [ "$jid" -a "${jid%[$IFS]*}" != "$jid" ]; then 375241149Sdteske die "%s: %s: %s" "$pgm" "$ROOTDIR" \ 376241149Sdteske "$( echo "Multiple jails claim this" \ 377241149Sdteske "directory as their root." \ 378241149Sdteske "(use \`-j jail' instead)" )" 379241149Sdteske fi 380241149Sdteske 381241149Sdteske # 382241149Sdteske # If only a single running jail matches the specified 383241149Sdteske # root directory, implicitly use `-j jail'. 384241149Sdteske # 385241149Sdteske if [ "$jid" ]; then 386241149Sdteske # 387241149Sdteske # Re-execute outselves with sh(1) via jexec(8) 388241149Sdteske # 389241149Sdteske ( echo set -- $args 390241149Sdteske jail_depend 391241149Sdteske cat $0 392241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 393241149Sdteske /usr/sbin/jexec "$jid" /bin/sh 394241149Sdteske exit $? 395241149Sdteske fi 396241149Sdteske 397241149Sdteske # Otherwise, fall through and allow chroot(8) 398241149Sdteske fi 399241149Sdteske 400241149Sdteske # 401241149Sdteske # Re-execute ourselves with sh(1) via chroot(8) 402241149Sdteske # 403241149Sdteske ( echo set -- $args 404241149Sdteske jail_depend 405241149Sdteske cat $0 406241149Sdteske ) | env - RC_DEFAULTS="$RC_DEFAULTS" \ 407241149Sdteske /usr/sbin/chroot "$ROOTDIR" /bin/sh 408241149Sdteske exit $? 409241149Sdteske fi 410241149Sdteskefi 411241149Sdteske 412241149Sdteske# 413241149Sdteske# Process `-a' or `-A' command-line options 414241149Sdteske# 415241149Sdteskeif [ "$SHOW_ALL" ]; then 416241149Sdteske # 417241149Sdteske # Get a list of variables that are currently set in the rc.conf(5) 418241149Sdteske # files (included `/etc/defaults/rc.conf') by performing a call to 419241149Sdteske # source_rc_confs() in a clean environment. 420241149Sdteske # 421241149Sdteske ( # Operate in a sub-shell to protect the parent environment 422241149Sdteske # 423241149Sdteske # Set which variables we want to preserve in the environment. 424241149Sdteske # Append the pipe-character (|) to the list of internal field 425241149Sdteske # separation (IFS) characters, allowing us to use the below 426241149Sdteske # list both as an extended grep (-E) pattern and argument list 427241149Sdteske # (required to first get f_clean_env() to preserve these in the 428241149Sdteske # environment and then later to prune them from the list of 429241149Sdteske # variables produced by set(1)). 430241149Sdteske # 431241149Sdteske IFS="$IFS|" 432241149Sdteske EXCEPT="IFS|EXCEPT|PATH|RC_DEFAULTS|OPTIND|DESCRIBE|SEP" 433241149Sdteske EXCEPT="$EXCEPT|DELETE|SHOW_ALL|SHOW_EQUALS|SHOW_NAME" 434241149Sdteske EXCEPT="$EXCEPT|SHOW_VALUE|SHOW_FILE|SYSRC_VERBOSE|RC_CONFS" 435260679Sdteske EXCEPT="$EXCEPT|pgm|SUCCESS|FAILURE|CHECK_ONLY" 436241149Sdteske EXCEPT="$EXCEPT|f_sysrc_desc_awk|f_sysrc_delete_awk" 437241149Sdteske 438241149Sdteske # 439241149Sdteske # Clean the environment (except for our required variables) 440241149Sdteske # and then source the required files. 441241149Sdteske # 442241149Sdteske f_clean_env --except $EXCEPT 443241149Sdteske if [ -f "$RC_DEFAULTS" -a -r "$RC_DEFAULTS" ]; then 444241149Sdteske . "$RC_DEFAULTS" 445241149Sdteske 446241149Sdteske # 447241149Sdteske # If passed `-a' (rather than `-A'), re-purge the 448241149Sdteske # environment, removing the rc.conf(5) defaults. 449241149Sdteske # 450241149Sdteske [ "$SHOW_ALL" = "1" ] \ 451241149Sdteske && f_clean_env --except rc_conf_files $EXCEPT 452241149Sdteske 453241149Sdteske # 454241149Sdteske # If `-f file' was passed, set $rc_conf_files to an 455241149Sdteske # explicit value, modifying the default behavior of 456241149Sdteske # source_rc_confs(). 457241149Sdteske # 458241565Sdteske [ "${RC_CONFS+set}" ] && rc_conf_files="$RC_CONFS" 459241149Sdteske 460241149Sdteske source_rc_confs 461241149Sdteske 462241149Sdteske # 463241149Sdteske # If passed `-a' (rather than `-A'), remove 464241149Sdteske # `rc_conf_files' unless it was defined somewhere 465241149Sdteske # other than rc.conf(5) defaults. 466241149Sdteske # 467241149Sdteske [ "$SHOW_ALL" = "1" -a \ 468241149Sdteske "$( f_sysrc_find rc_conf_files )" = "$RC_DEFAULTS" \ 469241149Sdteske ] \ 470241149Sdteske && unset rc_conf_files 471241149Sdteske fi 472241149Sdteske 473241149Sdteske for NAME in $( set | 474241149Sdteske awk -F= '/^[[:alpha:]_][[:alnum:]_]*=/ {print $1}' | 475241149Sdteske grep -Ev "^($EXCEPT)$" 476241149Sdteske ); do 477241149Sdteske # 478241149Sdteske # If enabled, describe rather than expand value 479241149Sdteske # 480241149Sdteske if [ "$DESCRIBE" ]; then 481241149Sdteske echo "$NAME: $( f_sysrc_desc "$NAME" )" 482241149Sdteske continue 483241149Sdteske fi 484241149Sdteske 485241149Sdteske # 486241149Sdteske # If `-F' is passed, find it and move on 487241149Sdteske # 488241149Sdteske if [ "$SHOW_FILE" ]; then 489241149Sdteske [ "$SHOW_NAME" ] && echo -n "$NAME: " 490241149Sdteske f_sysrc_find "$NAME" 491241149Sdteske continue 492241149Sdteske fi 493241149Sdteske 494241149Sdteske # 495241149Sdteske # If `-X' is passed, delete the variables 496241149Sdteske # 497241149Sdteske if [ "$DELETE" = "2" ]; then 498241149Sdteske f_sysrc_delete "$NAME" 499241149Sdteske continue 500241149Sdteske fi 501241149Sdteske 502241149Sdteske [ "$SYSRC_VERBOSE" ] && \ 503241149Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 504241149Sdteske 505241149Sdteske # 506241149Sdteske # If `-N' is passed, simplify the output 507241149Sdteske # 508241149Sdteske if [ ! "$SHOW_VALUE" ]; then 509241149Sdteske echo "$NAME" 510241149Sdteske continue 511241149Sdteske fi 512241149Sdteske 513241149Sdteske echo "${SHOW_NAME:+$NAME$SEP}$( 514241149Sdteske f_sysrc_get "$NAME" )${SHOW_EQUALS:+\"}" 515241149Sdteske 516241149Sdteske done 517241149Sdteske ) 518241149Sdteske 519241149Sdteske # 520241149Sdteske # Ignore the remainder of positional arguments. 521241149Sdteske # 522241149Sdteske exit $SUCCESS 523241149Sdteskefi 524241149Sdteske 525241149Sdteske# 526241149Sdteske# Process command-line arguments 527241149Sdteske# 528272191Sdteskestatus=$SUCCESS 529241149Sdteskewhile [ $# -gt 0 ]; do 530241149Sdteske NAME="${1%%=*}" 531241149Sdteske 532241149Sdteske [ "$DESCRIBE" ] && \ 533241149Sdteske echo "$NAME: $( f_sysrc_desc "$NAME" )" 534241149Sdteske 535241149Sdteske case "$1" in 536241149Sdteske *=*) 537241149Sdteske # 538241149Sdteske # Like sysctl(8), if both `-d' AND "name=value" is passed, 539260679Sdteske # first describe (done above), then attempt to set 540241149Sdteske # 541241149Sdteske 542260679Sdteske # If verbose, prefix line with where the directive lives 543260679Sdteske if [ "$SYSRC_VERBOSE" -a ! "$CHECK_ONLY" ]; then 544241149Sdteske file=$( f_sysrc_find "$NAME" ) 545241149Sdteske [ "$file" = "$RC_DEFAULTS" -o ! "$file" ] && \ 546241149Sdteske file=$( f_sysrc_get 'rc_conf_files%%[$IFS]*' ) 547260679Sdteske if [ "$SHOW_EQUALS" ]; then 548260679Sdteske echo -n ": $file; " 549260679Sdteske else 550260679Sdteske echo -n "$file: " 551260679Sdteske fi 552241149Sdteske fi 553241149Sdteske 554241149Sdteske # 555241149Sdteske # If `-x' or `-X' is passed, delete the variable and ignore the 556241149Sdteske # desire to set some value 557241149Sdteske # 558241149Sdteske if [ "$DELETE" ]; then 559272191Sdteske f_sysrc_delete "$NAME" || status=$FAILURE 560241149Sdteske shift 1 561241149Sdteske continue 562241149Sdteske fi 563241149Sdteske 564241149Sdteske # 565260679Sdteske # If `-c' is passed, simply compare and move on 566260679Sdteske # 567260679Sdteske if [ "$CHECK_ONLY" ]; then 568260679Sdteske if ! IGNORED=$( f_sysrc_get "$NAME?" ); then 569272191Sdteske status=$FAILURE 570272191Sdteske [ "$SYSRC_VERBOSE" ] && 571272191Sdteske echo "$NAME: not currently set" 572272191Sdteske shift 1 573272191Sdteske continue 574260679Sdteske fi 575272191Sdteske value=$( f_sysrc_get "$NAME" ) 576272191Sdteske if [ "$value" != "${1#*=}" ]; then 577272191Sdteske status=$FAILURE 578272191Sdteske if [ "$SYSRC_VERBOSE" ]; then 579272191Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 580272191Sdteske echo -n "$NAME: would change from " 581272191Sdteske echo "\`$value' to \`${1#*=}'" 582272191Sdteske fi 583272191Sdteske elif [ "$SYSRC_VERBOSE" ]; then 584272191Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 585272191Sdteske echo "$NAME: already set to \`$value'" 586272191Sdteske fi 587260679Sdteske shift 1 588260679Sdteske continue 589260679Sdteske fi 590260679Sdteske 591260679Sdteske # 592241149Sdteske # If `-N' is passed, simplify the output 593241149Sdteske # 594241149Sdteske if [ ! "$SHOW_VALUE" ]; then 595241149Sdteske echo "$NAME" 596241149Sdteske f_sysrc_set "$NAME" "${1#*}" 597241149Sdteske else 598241149Sdteske if [ "$SHOW_FILE" ]; then 599241149Sdteske before=$( f_sysrc_find "$NAME" ) 600241149Sdteske else 601241149Sdteske before=$( f_sysrc_get "$NAME" ) 602241149Sdteske fi 603241149Sdteske if f_sysrc_set "$NAME" "${1#*=}"; then 604241149Sdteske if [ "$SHOW_FILE" ]; then 605241149Sdteske after=$( f_sysrc_find "$NAME" ) 606241149Sdteske else 607241149Sdteske after=$( f_sysrc_get "$NAME" ) 608241149Sdteske fi 609260679Sdteske echo -n "${SHOW_NAME:+$NAME$SEP}" 610260679Sdteske echo -n "$before${SHOW_EQUALS:+\" #}" 611260679Sdteske echo -n " -> ${SHOW_EQUALS:+\"}$after" 612260679Sdteske echo "${SHOW_EQUALS:+\"}" 613241149Sdteske fi 614241149Sdteske fi 615241149Sdteske ;; 616241149Sdteske *) 617260679Sdteske if ! IGNORED=$( f_sysrc_get "$NAME?" ); then 618272191Sdteske [ "$IGNORE_UNKNOWNS" -o "$QUIET" ] || 619260679Sdteske echo "$pgm: unknown variable '$NAME'" 620241149Sdteske shift 1 621272191Sdteske status=$FAILURE 622241149Sdteske continue 623241149Sdteske fi 624241149Sdteske 625260679Sdteske # The above check told us what we needed for `-c' 626260679Sdteske if [ "$CHECK_ONLY" ]; then 627260679Sdteske shift 1 628260679Sdteske continue 629260679Sdteske fi 630260679Sdteske 631241149Sdteske # 632260679Sdteske # Like sysctl(8), when `-d' is passed, desribe it 633260679Sdteske # (already done above) rather than expanding it 634241149Sdteske # 635241149Sdteske 636241149Sdteske if [ "$DESCRIBE" ]; then 637241149Sdteske shift 1 638241149Sdteske continue 639241149Sdteske fi 640241149Sdteske 641241149Sdteske # 642241149Sdteske # If `-x' or `-X' is passed, delete the variable 643241149Sdteske # 644241149Sdteske if [ "$DELETE" ]; then 645272191Sdteske f_sysrc_delete "$NAME" || status=$FAILURE 646241149Sdteske shift 1 647241149Sdteske continue 648241149Sdteske fi 649241149Sdteske 650241149Sdteske # 651241149Sdteske # If `-F' is passed, find it and move on 652241149Sdteske # 653241149Sdteske if [ "$SHOW_FILE" ]; then 654241149Sdteske [ "$SHOW_NAME" ] && echo -n "$NAME: " 655241149Sdteske f_sysrc_find "$NAME" 656241149Sdteske shift 1 657241149Sdteske continue 658241149Sdteske fi 659241149Sdteske 660260679Sdteske if [ "$SYSRC_VERBOSE" ]; then 661260679Sdteske if [ "$SHOW_EQUALS" ]; then 662260679Sdteske echo -n ": $( f_sysrc_find "$NAME" ); " 663260679Sdteske else 664260679Sdteske echo -n "$( f_sysrc_find "$NAME" ): " 665260679Sdteske fi 666260679Sdteske fi 667241149Sdteske 668241149Sdteske # 669241149Sdteske # If `-N' is passed, simplify the output 670241149Sdteske # 671241149Sdteske if [ ! "$SHOW_VALUE" ]; then 672241149Sdteske echo "$NAME" 673241149Sdteske else 674241149Sdteske echo "${SHOW_NAME:+$NAME$SEP}$( 675241149Sdteske f_sysrc_get "$NAME" )${SHOW_EQUALS:+\"}" 676241149Sdteske fi 677241149Sdteske esac 678241149Sdteske shift 1 679241149Sdteskedone 680260679Sdteske 681272191Sdteskeexit $status # $SUCCESS unless error occurred with either `-c' or `-x' 682260679Sdteske 683260679Sdteske################################################################################ 684260679Sdteske# END 685260679Sdteske################################################################################ 686