blob: 7695e902c83182305fa75244ede676c0db7862a8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
.. -*- 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[<filename>]``. The
``xdata`` attribute is an LXML element object. (Documented
`here <http://codespeak.net/lxml/tutorial.html#the-element-class>`_)
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
``<Properties>`` tag.)
Accessing Properties contents from TGenshi
==========================================
Access contents of ``Properties/auth.xml``::
${metadata.Properties['auth.xml'].xdata.find('file').find('bcfg2.key').text}
|