A large list of options can be divided into subgroups, with each subgroup being enabled by a top level option. Within each subgroup, the option parameter names have a separate namespace. An option in a subgroup may use the same short one character name or a long name than an option in a different subgroup.
<optclass name="testoptions"> <option> <name>clustkey</name> <type>bool</type> <longopt>clustkey</longopt> <descr>Cluster key management</descr> <group> <option> <name>clustkey_generate</name> <type>bool</type> <longopt>generate</longopt> <descr>Generate a new cluster key</descr> <group> <option> <name>clustkey_name</name> <type>string</type> <opt>n</opt> <longopt>name</longopt> <descr>Cluster key's name</descr> <hasvalue /> <argdescr>name</argdescr> </option> <option> <name>clustkey_bits</name> <type>int</type> <opt>b</opt> <longopt>bits</longopt> <descr>Key's bit size</descr> <hasvalue /> <argdescr>bits</argdescr> <default>1024</default> </option> <option> <name>clustkey_expire</name> <type>ymd_interval</type> <opt>e</opt> <longopt>expires</longopt> <descr>Key's expiration</descr> <hasvalue /> <argdescr>interval</argdescr> <default>x::ymd::interval("5 years")</default> </option> <option> <name>clustkey_type</name> <type>string</type> <opt>t</opt> <longopt>type</longopt> <descr>Key type (rsa or dsa)</descr> <hasvalue /> <argdescr>interval</argdescr> <default>"rsa"</default> </option> <arg> <name>directory</name> <required /> </arg> </group> </option> <option> <name>clustkey_remove</name> <type>bool</type> <opt>r</opt> <longopt>remove</longopt> <descr>Remove key</descr> <group> <arg> <name>directory</name> <required /> </arg> <arg> <name>keyname</name> <required /> </arg> </group> </option> <option> <name>clustkey_list</name> <type>bool</type> <opt>l</opt> <longopt>list</longopt> <descr>List existing keys</descr> <group> <arg> <name>directory</name> <required /> </arg> </group> </option> <option> <name>clustkey_export</name> <type>bool</type> <opt>e</opt> <longopt>export</longopt> <descr>Export updated cluster keys to a node key directory</descr> <group> <arg> <name>directory</name> <required /> </arg> <arg> <name>nodekeydirectory</name> <required /> </arg> </group> </option> </group> </option> <option> <name>nodekey</name> <type>bool</type> <longopt>nodekey</longopt> <descr>Node key management</descr> <group> <option> <name>nodekey_generate</name> <type>bool</type> <longopt>generate</longopt> <descr>Generate a new node key</descr> <group> <option> <name>nodekey_name</name> <type>string</type> <opt>n</opt> <longopt>name</longopt> <descr>Node key's name</descr> <hasvalue /> <argdescr>name</argdescr> </option> <option> <name>nodekey_bits</name> <type>int</type> <opt>b</opt> <longopt>bits</longopt> <descr>Key's bit size</descr> <hasvalue /> <argdescr>bits</argdescr> <default>1024</default> </option> <option> <name>nodekey_expire</name> <type>ymd_interval</type> <opt>e</opt> <longopt>expires</longopt> <descr>Key's expiration</descr> <hasvalue /> <argdescr>interval</argdescr> <default>x::ymd::interval("1 year")</default> </option> <option> <name>nodekey_signkey</name> <type>string</type> <opt>k</opt> <longopt>signkey</longopt> <hasvalue /> <descr>Signing cluster key (default: newest)</descr> <argdescr>keyname</argdescr> <group> <arg> <name>directory</name> <required /> </arg> <arg> <name>clusterkeydirectory</name> <required /> </arg> </group> </option> </group> </option> </group> </option> <defaultoptions /> </optclass>
This example defines two options, --clustkey
and --nodekey
. These two options are the only two
options that are initially defined. When one of them gets specified,
the remaining options must come from its
group
. It's as if the
group
becomes the effective option list, for
the remaining options, and the initial list of --clustkey
and --nodekey
is no longer in effect.
This means that, for example, after specifying
--clustkey
, --nodekey
can no longer
be specified, the only remaning options are the one that are listed in
the group
.
All option name
s must be unique,
name
gives the name of the member object in
the option class, but different groups may use option with the same
opt
and longopt
.
In this example the --clustkey
option group contains
the
--generate
,
--remove
,
--list
, and
--export
; and the
--nodekey
option group contains a single option
--generate
which is a different option. Either
--clustkey
or --nodekey
must be
specified first, to open the respective option group, then
--generate
selects the specified option in the
option group.
Groups may be nested within other group. In this example,
the first --generate
option is a group containing
the --name
,
--bits
,
--expires
, and
--type
options.
The second --generate
option, in the
--nodekey
group, contains its own
--name
,
--bits
,
--expires
, and
--signkey
options.
A group option's
type
would typically be
bool
, but it may be any type, and have a value.
The option's group
takes effect after
the option's value gets set.
This example also has several group
s that
do not contain any option
s, only a list of
arg
s.
As stated previously, arg
s are generally
ignored. This is used to adjust the indentation produced by the
default --help
option.