Each DataONE CN maintains a debian backend database named ‘dataone-cn-os-core’. The database is populated by the dataone-cn-os-core debian package. Debian package installation for DataONE requires data input to the dataone-cn-os-core debian backend database for each environment, and sometimes each CN, such as IP address, passwords, node Ids, etc. Debian installation scripts can read the data written to the ‘dataone-cn-os-core’ debian backend database and use the data to configure software. In order to lessen the amount of typing (and errors) during the debian installation process, debian configuration is automated as much as possible.
The debian backend database is setup during a debian installation by the availability of a templates file. The templates file contains multiple variable names (database fields), each a ‘Template’. Each ‘Template’ has a question to ask a user and the data type of the ‘Template’ to be persisted in the debian backend database. Typically, a debian preinst script is used to decide which questions will be asked to a user during installation. DataONE uses a different strategy.
DataONE debian installation uses an xml configuration (d1DebConfig.xml) file to fill in the ‘Template’ variable (field) questions that would typically be asked to a user. d1DebConfig.xml is evaluated by the dataone-cn-os-core package’s postinst script during debian installation. d1DebConfig.xml is divided into two parts. The first part mimics the templates file in the debian installation, the second part contains the data that debian expects the user to answer. Each ‘template’ node in d1DebConfig.xml contains a key that is the field name associated with a debian ‘Template’. A ‘template’ node contains the question of the template, the type of the template and various flags. The flags and the field name are the most important. There are DataONE configuration specific flags for each ‘template’ node. The ‘derived-value’ flag, the ‘user-entered-value’ flag and the ‘configured-value’ flag must each be set for each template. Only one of the three flags should be set to true. The ‘derived-value’ flag indicates to the postinst script that the value of the field is set programmatically by the postinst script. For each ‘derived-value’ flag, there is custom logic in postinst to populate the debian backend database. The ‘user-entered-value’ flag prompts the user for input in the traditional way that a debian package installation would. The ‘configured-value’ flag indicates that postinst is able to parse the value of the field from d1DebConfig.xml.
The second part of the d1DebConfig.xml contains the data for each of the templates defined in the first half of the file. In the second part of d1DebConfig.xml are ‘environment’ nodes. ‘environment’ nodes contain answers to questions or contain ‘machine’ nodes that then contain answers to questions. Each ‘environment’ node has a context key that names the environment to which the answers or machines belong. Each template in the first half of d1DebConfig.xml should have an answered question in the second half for each environment. If the question is a machine dependent question, then the ‘question’ node should a child of a ‘machine’ node. If the question is the same for every machine of an environment, then the ‘question’ node should be a child of an ‘environment’ node. For ‘derived-value’ and ‘user-entered-value’ flagged questions, the ‘question’ node should be left empty.
The steps below demonstrate how to ask for user input during debian installation of a package. The assumption is that the user input will be applied to configuration settings of a downstream dataone package.
As a note, the postinst script requires datastructures to maintain the information parsed from xml files and to evaluate if data in the backend database should be changed upon upgrade. Debian requires the use of shell scripts (bash) for postinst. Unfortunately, bash is fairly weak when it comes to datastructures and so the postinst code to maintain automated configuration is fairly complicated. This complication is in addition to the code needed to configure 8 different software packages for Dataone, LDAP being the most complicated. The dataone-cn-os-core postinst code must be run before any other dataone debian package may install correctly.
Additonal Resources: