tree¶
This command handles a tree containing a set of services.
Interface¶
tree [ -h ] create|admin|remove|enable|disable|current|status|resolve|init|start|stop|free tree
The tree command functions similarly to services, wherein each tree can have dependencies or be required-by another tree. These subcommands facilitate various actions such as creating, managing, activating, and checking the status of trees, among other functionalities, within the system. Additionally, it manages dependencies between different trees, enabling effective control and organization of tree structures.
The default tree named global is provided. This tree is automatically created using basic creation configuration, with the key difference that this tree is enabled by default. The default name can also be changed at compile time by passing the --with-default-tree-name= option to configure. If the global is removed, a simple invocation of a 66 command will create it again.
Configuration of the tree during its creation can be managed through a configuration file called seed.—see Seed files.
Services within tree need to be enabled, with the 66 enable command, to be managed by the start subcommand. The stop and free subcommand manages any running services within tree.
A non-existing tree can also be created automatically when invocating of the 66 -t option with commands that accept it. For example, the 66 -t treefoo enable foo call automatically creates the tree treefoo if it doesn't exist yet, applying the basic creation configuration or utilizing the seed file configuration if such file exists.
Why trees?¶
The usefulness of having several trees with different services can be explained with a simplified example:
tree named network contains services dhcpcd and ntpd
tree named print contains services cups and nfs
tree named graphic contains services xorg, notification-daemon, gvfsd and dbus
When booting your machine and opting for console-only usage, your concern might solely be a working internet connection, disregarding xorg or cups. Initially, you would only enable network at the base level. Upon every boot, this tree and all its enabled services will automatically start.
Later, when you need to print a document stored on another server, you'd typically start cups and then nfs. By leveraging the tree concept, you can start print, making all necessary services available. After finishing the printing task, instead of individually stopping the required services, you can simply stop print, and all services within it will cease automatically.
The functionality extends further: say, you now wish to watch a video, requiring an active X server and potentially other services. Enter graphics, specifically designed for such purposes.
Options¶
- -h: prints this help.
Subcommands¶
- create: creates a new tree.
- admin: manages tree.
- remove: removes tree
- enable: activates tree for the next boot.
- disable: deactivates tree for the next boot.
- current: mark tree as current.
- status: displays information about tree
- resolve: displays resolve file of tree
- init: initiate all services marked enabled from tree
- start: bring up all enabled services from tree
- stop: bring down all services from tree
- free: bring down and unsupervise all services from tree
Usage examples¶
Create a non-existing tree named network
66 tree create network
Create a non-existing tree named print which depends on tree network and associated to the admin group
66 tree create -o depends=network:groups=admin print
Create a non-existing tree named graphics which depends on tree network
66 tree create -o depends=network graphics
Enables a tree called network
66 tree enable network
Starts the tree called print. Any enabled services associated with this tree are brought up
66 tree start print
Stops the tree called print. Any running services will be stopped and unsupervised
66 tree free print
Create¶
This subcommand creates a tree that doesn't exist and potentially configures it based on the options used.
Interface¶
tree create [ -h ] [ -o depends=:requiredby=:... ] *tree*
After creation tree do not contain any services. You need to associate services within tree with the 66 enable command.
This command handles interdependencies.
Options¶
-
-h: prints this help.
-
-o: list of options separated by colons.
valid fields for -o options are:
- depends=: comma separated list of dependencies for tree or
none. If the name of the tree passed as dependencies doesn't exist, it will be automatically created. - requiredby=: comma separated list of trees required-by tree or none. If the name of the tree passed as required-by dependencies doesn't exist, it will be automatically created.
- groups=: add tree to the specified groups. Accepted group are
boot,admin,userandnone—see Groups behavior. - allow=: comma separated list of account to allow at tree. Account must be valid on the system. name account is expected not the corresponding
UIDof the account. The termuseris also accepted to significate that all user neither root of the system can use tree. - deny=: comma separated list of account to deny at tree. Account must be valid on the system. name account is expected not the corresponding
UIDof the account. The termuseris also accepted to significate that all user neither root of the system can use tree. - clone=: make a clone of tree. This create an exact copy of the configuration of the tree, with the exception that no services are associated with the cloned tree. The name of the clone must not already exists int the system.
- noseed: do not use seed file to build the tree. Even if a seed file exists, ignore it and create tree only with options passed or basic creation configuration.
- enable: activate the tree at the next boot.
Usage examples¶
Creates a tree named treefoo
66 tree create treefoo
Creates, configures and clones a tree named treefoo where the clone of treefoo is named treefoo2
66 tree create -o depends=treebar,treebaz:groups=admin:deny=none:allow=root:clone=treefoo2 treefoo
Admin¶
This command allow to manage configuration of an already existing tree.
Interface¶
tree admin [ -h ] [ -o depends=:requiredby=:... ] tree
If the tree does not exist, it is created and configured based on the options used.
This command handles interdependencies.
Options¶
-
-h: prints this help.
-
-o: list of options separated by colons.
valid fields for -o options are:
- depends= trees: comma separated list of trees dependencies for tree or
none. If the name of the tree passed as dependencies doesn't exist, it will be automatically created. - requiredby=: comma separated list of trees required-by dependencies for tree or none. If the name of the tree passed as required-by dependencies doesn't exist, it will be automatically created.
- groups= group: add tree to the specified group. Accepted group are
boot,admin,userandnone—see Groups behavior. - allow= user: comma separated list of user account to allow at tree. Account must be valid on the system. name account is expected not the corresponding
UIDof the account. The termuseris also accepted to significate that all user neither root of the system can use tree. Any user not explicitly allowed is automatically denied for configuring the given tree. - deny= user: comma separated list of user account to deny at tree. Account must be valid on the system. name account is expected not the corresponding
UIDof the account. The termuseris also accepted to significate that all user neither root of the system can use tree. - clone= name: make a clone name of tree. This create an exact copy of the configuration of the tree, with the exception that no services are associated with the cloned tree. The name of the clone must not already exists int the system.
Usage examples¶
Changes the dependencies of treefoo to treebaz where treefoo depended previously of tree treebar
66 tree admin -o depends=treebaz treefoo
Deny all user of treefoo
66 tree admin -o deny=user treefoo
Remove¶
This command remove a tree. This operation cannot be undone. Process with caution.
Interface¶
tree remove [ -h ] tree
Services associated with the tree are switched to the tree marked current or to the global in other cases. The state of services remains unchanged during the switch.
Tree dependencies, including required-by dependencies, are managed. For instance, if treefoo is required-by treebar, the dependencies of treebar are adjusted, removing treefoo as a dependency. This adjustment is done recursively, ensuring all interdependencies are updated. Therefore, the entire tree dependency graph is reconstructed.
Options¶
- -h: prints this help.
Usage examples¶
Removes treefoo tree
66 tree remove treefoo
Enable¶
This command enables a tree for the next boot.
Interface¶
tree enable [ -h ] tree
If the tree does not exist, it is created and configured with basic creation configuration.
Trees associated to the boot group cannot be enabled.
This command handles interdependencies.
Options¶
- -h: prints this help.
Usage examples¶
Enables treefoo tree
66 tree enable treefoo
Disable¶
This command is the exact opposite of enable command.
Interface¶
tree disable [ -h ] tree
This command handles interdependencies.
Options¶
- -h: prints this help.
Usage examples¶
Disables treefoo tree
66 tree disable treefoo
Current¶
This command a tree as the current one.
Interface¶
66 tree [ -h ] current tree
After marking a tree as current, the 66 command using the -t reacts to that tree without the need to specify the -t option.
Options¶
- -h: prints this help.
Usage examples¶
Marks treefoo as current
66 tree current treefoo
Status¶
This command displays information about a tree.
Interface¶
tree status [ -h ] [ -n ] [ -o name,enabled,... ] [ -g ] [ -d depth ] [ -r ] tree
If tree is not specified, the command return information of all trees available of the system.
Options¶
- -h: prints this help.
- -n: do not display the names of fields. Combining this options with the
-ofacilitates scripting usage. - -o: comma separated list of field to display.
- -g: displays the contents field as graph allowing to view interdependencies of services.
- -d: increase the depth view of the contents field recursion. Default value is
1. Only have effect with the-goption. - -r: reverse the contents field. By default, the order corresponds to a
startprocess.
valid fields for -o options are:
- name: displays the name of the tree.
- current: displays a boolean value of the current state.
- enabled: displays a boolean value of the enable state.
- depends: displays the list of tree(s) started before.
- requiredby: displays the list of tree(s) started after.
- allowed: displays a list of allowed user to use the tree.
- contents: displays the list of services associated to tree.
Usage and output examples¶
Displays all information of all trees
66 tree status
Only display the field name and enabled of all trees
66 tree status -o name,enabled
Only display the field enabled of tree treefoo without displaying the name of the field
66 tree status -n -o enabled treefoo
In a script you can do
#!/bin/sh
tree="${1}"
isenabled=$(66 tree status -no enabled ${tree})
if [ ${isenabled} = "no" ]; then
echo ${tree} is not enabled
else
echo ${tree} is enabled
fi
Displays information of associated services of tree global using graph mode
66 tree status -g global
Name : global
Current : yes
Enabled : yes
Allowed : root
Groups : admin
Depends : \
└─None
required by : \
└─session (Enabled)
Contents : \
├─dbus-log (pid=719, state=Enabled, type=classic, tree=global)
├─consolekit-log (pid=716, state=Enabled, type=classic, tree=global)
├─networkmanager-log (pid=715, state=Enabled, type=classic, tree=global)
├─sshd-log (pid=722, state=Enabled, type=classic, tree=global)
├─openntpd-log (pid=720, state=Enabled, type=classic, tree=global)
├─dbus (pid=728, state=Enabled, type=classic, tree=global)
├─sshd (pid=730, state=Enabled, type=classic, tree=global)
├─consolekit (pid=745, state=Enabled, type=classic, tree=global)
├─networkmanager (pid=746, state=Enabled, type=classic, tree=global)
└─openntpd (pid=736, state=Enabled, type=classic, tree=global)
global within () parentheses, which are self-explainatory.
Displays information about the associated services of the global tree in reverse graph mode, representing the process for stop
66 tree status -g -r global
Name : global
Current : yes
Enabled : yes
Allowed : root
Groups : admin
Depends : \
└─None
required by : \
└─session (Enabled)
Contents : \
├─openntpd (pid=736, state=Enabled, type=classic, tree=global)
├─networkmanager (pid=746, state=Enabled, type=classic, tree=global)
├─consolekit (pid=745, state=Enabled, type=classic, tree=global)
├─sshd (pid=730, state=Enabled, type=classic, tree=global)
├─dbus (pid=728, state=Enabled, type=classic, tree=global)
├─openntpd-log (pid=720, state=Enabled, type=classic, tree=global)
├─sshd-log (pid=722, state=Enabled, type=classic, tree=global)
├─networkmanager-log (pid=715, state=Enabled, type=classic, tree=global)
├─consolekit-log (pid=716, state=Enabled, type=classic, tree=global)
└─dbus-log (pid=719, state=Enabled, type=classic, tree=global)
Resolve¶
This command displays the complete contents of the resolve file of the tree.
Interface¶
66 tree resolve [ -h ] tree
Resolve file are used internally by 66 to know tree information. This subcommand is purely a debug command used by system administrator or developers.
Options¶
- -h: prints this help.
Usage examples¶
Displays contents of the treefoo resolve file
66 tree resolve treefoo
Init¶
This command initiate services of a tree to a scandir directory
Interface¶
66 tree init [ -h ] tree
The behavior of this subcommand will depends of the state of the scandir. If the scandir is not running, this command will initiate earlier services of tree, in other case its initiate all enabled services within tree.
Users, even system administrator, should not need to directly invoke this command. This subcommand is primarily used internally by 66 boot command to initiate earlier services of tree. Initiation of services is made automatically at each invocation of 66 start or 66 tree start command is services was not initiate previously.
Options¶
- -h: prints this help.
Initialization process¶
The command will make an exact copy of the enabled service files and directories of the tree inside a scandir directory at /run/66/state/UID where UID is the uid of the current owner of the process. The scandir does not need to be necessarily running. This is useful at boot time to initiate an early service before starting the scandir. Once the scandir starts—see 66 scandir start command, the already present services start automatically.
Usage examples¶
Initiates all enabled services of treefoo to a running scandir
66 tree init treefoo
Start¶
This command starts all services marked enabled within tree
Interface¶
tree start [ -h ] [ -f ] tree
If tree is not specified, the command manages all enabled services within all enabled trees available of the system.
This command handles interdependencies.
Options¶
- -h: prints this help.
Usage examples¶
Starts all services marked enabled of all enabled trees of the system
66 tree start
Starts all services marked enabled of tree treefoo
66 tree start treefoo
Stop¶
This command stops all running services within tree
Interface¶
66 tree stop [ -h ] [ -f ] tree
If tree is not specified, the command manages all services within all enabled trees available of the system.
This command handles interdependencies.
Options¶
- -h: prints this help.
- -f: fork the process and lose the controlling terminal. This option should be used only for a shutdown process.
Usage examples¶
Stops all services from all enabled trees available on the system
66 tree stop
Stops all services of tree treefoo
66 tree stop treefoo
Free¶
This command stops and unsupervise tree.
Interface¶
66 tree free [ -h ] [ -f ] tree
If tree is not specified, the command manages all services within all enabled trees available of the system.
This command handles interdependencies.
Options¶
- -h: prints this help.
- -f: fork the process and lose the controlling terminal. This option should be used only for a shutdown process.
Usage examples¶
Stops and unsuperives all services from all enabled trees available on the system
66 tree stop
Stops and unsupervise all services of tree treefoo
66 tree stop treefoo
Basic creation configuration¶
By default, tree is created with the following configuration which can be translated to seed file format:
depends = none
requiredby = none
enable = false
## Depending on the owner of the current process,
## it will be the name of the account system.
allow = root
current = false
## Depending on the owner of the current process,
## it will be *admin* for root or *user* for regular user.
groups = admin
Seed files¶
A seed file can be provided to automatically configure the tree during its creation. This file is expected to be found at /etc/66/seed, /usr/share/66/seed or $HOME/.66/seed, depending of the owner of the process. These locations can also be changed at compile time by passing the --with-sysadmin-seed=, --with-system-seed= and --with-user-seed= options in configure, respectively.
The seed file name need to correspond to the name of the tree to be configured.
The following template is self-explained
## An empty field is not allowed. If the key is define, the value must exist and valid.
## In other case, simply comment it.
## This file use the two following type format:
## Boolean: use false or true. Default false for an absent key.
## List: a comma separated string list.
## Type: List
## Corresponds to e.g. '66 tree admin -o depends=treebar treefoo' or '66 tree create -o depends=treebar treefoo' command
## You can use the term 'none'.
#depends = none
## Type: List
## Corresponds to e.g. '66 tree admin -o requiredby=treebar treefoo' or '66 tree create -o requiredby=treebar treefoo' command
## You can use the term 'none'
#requiredby = none
## Type: Boolean
## Corresponds to e.g. '66 tree enable treefoo' command
#enable = false
## Type: List
## Corresponds to e.g. '66 tree admin -o allow=root treefoo' or '66 tree create -o allow=root treefoo' command
## If you want to allow any regular account without specifying a particular account name,
## you can use the term 'user'. The account name must be valid on the system.
#allow = root
## Type: List
## Corresponds to e.g. '66 tree admin -o deny=root treefoo' or '66 tree create -o deny=root treefoo' command
## If you want to allow any regular account without specifying a particular account name,
## you can use the term 'user'. The account name must be valid on the system.
#deny = user
## Type: Boolean
## Corresponds to '66 tree current' command
#current = false
## Corresponds to e.g. '66 tree admin -o groups=boot treefoo' or '66 tree create -o groups=boot treefoo' command
## Can be one of the term: 'boot', 'admin', 'user' or 'none'.
## Only one group is allowed.
#groups = admin
This template example of seed file can be found at contributions/seed directory of the 66 git project.
Groups behavior¶
This feature is in progress. Currently, the only group that has an effect is the boot group. A tree set to the boot group cannot be enabled. Trees associated with the boot group are automatically managed by 66 during boot time. Enabling a tree within the boot group results in services within the tree starting twice, which is likely not the intended behavior.
The primary purpose and future goal of this feature are to manage tree permissions and provide the ability to handle multiple trees simultaneously. For instance, requesting to start the admin group will initiate all trees within this group.
(!) This option and its mechanisms can be subject to change in future releases of 66.
Associated service to a tree¶
Different manner to process can be used to associate a service to a specific tree. You can accomplish this using the following method where foo is the name of the service and treefoo the name of the tree:
- The
66 -t treefoo enable foocommand will associatefoototreefoo. Every call of this command will switch the service to specified tree, e.g.66 -t global enable fooswitchfootoglobalwhatever the previous location offoo. - If the service was never parsed and you launch the command
66 -t treefoo start foo, foo will be parsed first and associated totreefoo. In such case,foois a part oftreefoobut not enabled. - Automatically at parse process setting the
InTree=treefookey through the frontend service file of the service. In such case, at very first use of the service on the system, the service is associated totreefoo.