.. -*- mode: rst -*- .. _server-plugins-connectors-properties: ========== Properties ========== The Properties plugin is a connector plugin that adds information from properties files into client metadata instances. Enabling Properties =================== 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``. Data Structures =============== 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``. Usage ===== Specific property files can be referred to in templates as ``metadata.Properties[]``. 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 :ref:`server-plugins-structures-bundler-index` 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: * ``metadata.Properties['prop-file'].xdata`` is an lxml.etree._Element object representing the top-level element in the file. * ``metadata.Properties['prop-file'].data`` is the raw contents of the property file as a string. * ``metadata.Properties['prop-file'].entries`` is a list of lxml.etree._Element objects representing the direct children of the top-level element. (I.e., everything directly under the ```` tag.) Accessing Properties contents from TGenshi ========================================== Access contents of ``Properties/auth.xml``:: ${metadata.Properties['auth.xml'].xdata.find('file').find('bcfg2.key').text}