sysconf -- a sysctl(8)-like utility for managing /etc/rc.conf et. al.

Anthony Pankov ap00 at mail.ru
Sat Oct 23 12:02:11 UTC 2010


Greetings.

Just for note.

Some time ago i thought about the same problem.
I started something then had delayed it forever in favour of fast wrong
way.

So, the aim was:

---
NAME
 modcfg - modify configuration

SYNOPSIS
 modcfg  -f config_file -t config_type {-s param=val | -u param}
 modcfg -l
 modcfg -i plugin

DESCRIPTION
 The modcfg utility modifies configuration file in
 accordance to parameters.

 The following options are available:
 -f config_file    - the file itself which to be modified
 -t config_type    - type of config_file. Type specifies the internal
                     structure of config_file, or, more roughly,
                     program which this file belongs to. To
                     list available types see -l option.
 -s param=val     - set configuration parameter 'param' to value
                    'val'.
 -u param         - unset configuration parameter 'param' (or set it to default).

 -l               - list all supported types of config files.

 -i plugin        - install plugin 'plugin' for modcfg utility.
                    Plugin is used to support additional configuration file type.

EXAMPLES
 The command
  modcfg -f /etc/rc.conf  -t rc  -s keymap=ru.cp1251
 sets parameter 'keymap' to value 'ru.cp1251'in file rc.conf.
 
 The command
  modcfg -f /etc/rc.conf  -t rc  -u keymap
 resets parameter 'keymap' to default value.

 To install obtained plugin 'samba.mcfg' use
  modcfg -i samba.mcfg
 After that configuration type 'samba' will be supported.
 
---

INTERNALLY

 modcfg itself is very simple. It parse command line options, then load
 plugin (module) for specified 'config_type', then call _set(file,param,
 value) or _unset(file,param) function from this module.
 So, plugin (module) should have functions such as:
  _set(file, param, value) or, better name, {$type}_set. rc_set, for
  example.
  _unset(file, param)
  _description - for display in module list.

FUTURE
 Of course, better way is to run modcfg as:
  modcfg rc {-s ... | -u ...}
 i.e. reduce "-f /etc/rc.conf  -t rc" to the key "rc",
 i.e. add another call scheme
  modcfg subsystem {-s ... | -u ...}

 For rc it is trivial. But in general, for all installed programs and
 they instances, it is not possible now.



Wednesday, October 13, 2010, 3:06:25 AM, you wrote:

DT> On Tue, 2010-10-12 at 12:10 -0700, Doug Barton wrote:
>> On 2010-10-11 at 10:40 -0700, Doug Barton wrote: 
>> | So to summarize, the general idea is a good one and needed, and an area
>> | that I'd like to see more work in. Perhaps it might be a good idea to
>> | move the discussion about that to freebsd-rc@?
>> |
>> |On 2010-10-11 at 12:22 -0700, Devin Teske wrote: 
>> |> I'll look into signing up for the rc mailing list (didn't see that when
>> |> I checked last -- I'll have to look again). Maybe I'll post v2.0 to
>> |> there (but will cc back hackers cause I know folks may not be part of
>> |> both).
>> 
>> The canonical way to deal with that is to post the message to the proper
>> list (-rc@), then post a brief note to the other list (-hackers@) saying
>> where the discussion is being continued. We discourage people from
>> cc'ing multiple FreeBSD lists.


DT> This thread is moving over to the -rc@ list.
DT> New thread: sysrc(8) -- a sysctl(8)-like utility for managing rc.conf(5)

DT> The first post to the -rc@ list will be version 2.0 of the script which
DT> attempts to address the following (which were discussed in this thread
DT> here on -hackers@):

DT> 1. Style -- remove some personal styles in favor of standardized styles.
DT> (the FreeBSD environment doesn't need all the extra things that are
DT> required to run in an embedded environment -- which the first version
DT> was coded for)

DT> 2. Remove a disgusting-amount of comments (the first release of the
DT> script had a hurdle to climb in that it had to establish rapport with
DT> the targeted audience -- y'all).

DT> 3. Remove shell inheritance of SUCCESS/FAILURE (this was silly for a
DT> finished product).

DT> 4. Remove unnecessary code-sense (some things just don't need to be
DT> tested for in a known environment -- such as FreeBSD vs. embedded).

DT> 5. Remove dependency checks (have(), depend(), and show_deps() are
DT> gone).

DT> 6. Remove fake "function" keywords (public objections win)

DT> 7. Rename sysrc() function to sysrc_get() to:
DT> a. prevent confusion between the script and the internal function
DT> b. to coincide with the remainder of related functions (sysrc_get,
DT> sysrc_set, sysrc_find, and sysrc_desc).

DT> 8. Fix sysrc_get() function to mask positional parameters (don't expand
DT> "1", "2", etc.)

DT> 9. Fix sysrc_get() function to clean the environment prior to sourcing
DT> rc.conf(5) files (preventing expansion of normals such as PS1, TERM,
DT> etc.)

DT> 10. New function: `sysrc_find $varname'
DT> Find which file holds the effective last-assignment to a given variable
DT> within the rc.conf(5) file(s). If the variable is found in any of the
DT> rc.conf(5) files, the function prints the filename it was found in and
DT> then returns success. Otherwise output is NULL and the function returns
DT> with error status.

DT> 11. Fix sysrc_set() function to use mktemp(1) (prevent race-conditions
DT> where sysrc(8) could be executing in concurrence, possibly whacking the
DT> output-file in an unexpected manner).

DT> 12. New function: `sysrc_desc $varname'
DT> Attempts to return the comments associated with varname from the rc.conf
DT> (5) defaults file `/etc/defaults/rc.conf' (or whatever RC_DEFAULTS
DT> points to). Multi-line comments are joined together. Results are NULL if
DT> no description could be found.

DT> 13. Use getopts(1) to parse command-line options rather than manually
DT> parsing (now we can support grouping of flags -- i.e. "-avN").

DT> 14. Remove `--help' option (using getopts(1) now ... that was the only
DT> long-option we had, and we don't need it).

DT> 15. Remove `-d' as we know it. No longer dump internal dependency list,
DT> but mimick `-d' from sysctl(8) -- Print a description of the given
DT> variable.

DT> 16. Remove `SYSRC_SHOW_DEPS' environment variable.

DT> 17. Add `SYSRC_VERBOSE' environment variable (inheritable from the
DT> shell, so that folks whom don't want to always pass `-v' can plop
DT> `SYSRC_VERBOSE=1' into their shell startup scripts, `~/.bash_profile'
DT> and `~/.profile' for example).

DT> 18. Add `-f file' option.
DT> Operate on the specified file(s) instead of rc_conf_files.

DT> 19. Add `-a' option.
DT> Dump a list of non-default configuration variables.

DT> 20. Add `-A' option.
DT> Dump a list of all configuration variables (incl. defaults).

DT> 21. Add `-v' option.
DT> Verbose. Print the pathname of the specific rc.conf(5) file where the
DT> directive was found.

DT> 22. Add `-i' option.
DT> Ignore unknown variables.

DT> 23. Add `-N' option.
DT> Show only variable names, not their values.



DT> And, here's the new usage:

DT> Usage: sysrc [OPTIONS] name[=value] ...
DT> OPTIONS:
DT>         -h         Print this message to stderr and exit.
DT>         -f file    Operate on the specified file(s) instead of rc_conf_files.
DT>         -a         Dump a list of non-default configuration variables.
DT>         -A         Dump a list of all configuration variables (incl. defaults).
DT>         -d         Print a description of the given variable.
DT>         -e         Print query results as `var=value' (useful for producing
DT>                    output to be fed back in). Ignored if -n is specified.
DT>         -v         Verbose. Print the pathname of the specific rc.conf(5)
DT>                    file where the directive was found.
DT>         -i         Ignore unknown variables.
DT>         -n         Show only variable values, not their names.
DT>         -N         Show only variable names, not their values.

DT> ENVIRONMENT:
DT>         RC_DEFAULTS      Location of `/etc/defaults/rc.conf' file.
DT>         SYSRC_VERBOSE    Default verbosity. Set to non-NULL to enable.


DT> See you all on the -rc@ list.



-- 
Best regards,
 Anthony                            mailto:ap00 at mail.ru




More information about the freebsd-hackers mailing list