The Properties plugin is a connector plugin that adds information from properties files into client metadata instances.
First, mkdir /var/lib/bcfg2/Properties. Each property XML file goes in this directory. Each will automatically be cached by the server, and reread/reparsed upon changes. Add Properties to your plugins line in /etc/bcfg2.conf.
Properties adds a new dictionary to client metadata instances that maps property file names to PropertyFile instances. PropertyFile instances contain parsed XML data as the “data” attribute.
The XML data in a property file is arbitrary, but a matching .xsd file can be created to assign a schema to a property file, which will be checked when running bcfg2-lint. For instance, given:
Properties/dns-config.xml
Properties/dns-config.xsd
dns-config.xml will be validated against dns-config.xsd.
Specific property files can be referred to in templates as metadata.Properties[<filename>]. The xdata attribute is an LXML element object. (Documented here)
Currently, only one access method is defined for this data, Match. Match parses the Group and Client tags in the file and returns a list of elements that apply to the client described by a set of metadata. (See Bundler for more details on how Group and Client tags are parsed.) For instance:
{% python
ntp_servers = [el.text
for el in metadata.Properties['ntp.xml'].Match(metadata):
if el.tag == "Server"]
%}
If you need to make persistent changes to properties data, you can use the write method of the PropertyFile class:
{% python
import lxml.etree
from genshi.template import TemplateError
lxml.etree.SubElement(metadata.Properties['foo.xml'],
"Client",
name=metadata.hostname)
if not metadata.Properties['foo.xml'].write():
raise TemplateError("Failed to write changes back to foo.xml")
The write method checks the data in the object against its schema before writing it; see Data Structures for details.
As we formulate more common use cases, we will add them to the PropertyFile class as methods. This will simplify templates.
You can also access the XML data that comprises a property file directly in one of several ways:
Access contents of Properties/auth.xml:
${metadata.Properties['auth.xml'].xdata.find('file').find('bcfg2.key').text}