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 names 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 groups that
do not contain any options, only a list of
args.
As stated previously, args are generally
ignored. This is used to adjust the indentation produced by the
default --help option.