diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2012-11-09 15:00:17 +0100 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-06 04:52:35 +0100 |
commit | a3ed36842d1e4762f81d8ad9c10bd36dc73a26c3 (patch) | |
tree | 9e8c5d9a27e58e906193c955865294ef620421c0 | |
parent | 7c51b8e02cc221ed3d9d9f2f7da4ad03f27d2046 (diff) | |
download | bcfg2-a3ed36842d1e4762f81d8ad9c10bd36dc73a26c3.tar.gz bcfg2-a3ed36842d1e4762f81d8ad9c10bd36dc73a26c3.tar.bz2 bcfg2-a3ed36842d1e4762f81d8ad9c10bd36dc73a26c3.zip |
pingdata.xml: add new file for dynamic ping data of the clients
bcfg2-ping-sweep saved the pingdata into clients.xml. This is problematic
if the repository is tracked by a vcs. Now the dynamic data is saved into
pingdata.xml and the DBStat plugin reads the data from there. So the
pingdata.xml could be ignored by the vcs.
-rw-r--r-- | schemas/clients.xsd | 2 | ||||
-rw-r--r-- | schemas/pingdata.xsd | 28 | ||||
-rw-r--r-- | src/lib/Server/Lint/Validate.py | 4 | ||||
-rw-r--r-- | src/lib/Server/Plugins/DBStats.py | 2 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Metadata.py | 12 | ||||
-rwxr-xr-x | src/sbin/bcfg2-ping-sweep | 12 |
6 files changed, 49 insertions, 11 deletions
diff --git a/schemas/clients.xsd b/schemas/clients.xsd index b79be385c..50ac4e347 100644 --- a/schemas/clients.xsd +++ b/schemas/clients.xsd @@ -22,13 +22,11 @@ </xsd:choice> <xsd:attribute type='xsd:string' name='name' use='required'/> <xsd:attribute type='xsd:string' name='profile' use='required'/> - <xsd:attribute type='xsd:string' name='pingable' use='optional'/> <xsd:attribute type='xsd:string' name='auth' use='optional'/> <xsd:attribute type='xsd:string' name='uuid'/> <xsd:attribute type='xsd:string' name='password'/> <xsd:attribute type='xsd:string' name='location'/> <xsd:attribute type='xsd:string' name='secure'/> - <xsd:attribute type='xsd:string' name='pingtime' use='optional'/> <xsd:attribute type='xsd:string' name='address'/> </xsd:complexType> diff --git a/schemas/pingdata.xsd b/schemas/pingdata.xsd new file mode 100644 index 000000000..dfb123efa --- /dev/null +++ b/schemas/pingdata.xsd @@ -0,0 +1,28 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en"> + + <xsd:annotation> + <xsd:documentation> + pingdata schema for bcfg2 + Alexander Sulfrian + </xsd:documentation> + </xsd:annotation> + + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="xml.xsd"/> + + <xsd:complexType name='PingStatisticType'> + <xsd:attribute type='xsd:string' name='name' use='required'/> + <xsd:attribute type='xsd:string' name='pingable' use='required'/> + <xsd:attribute type='xsd:string' name='pingtime' use='optional'/> + </xsd:complexType> + + <xsd:complexType name='PingStatisticsType'> + <xsd:sequence minOccurs='0' maxOccurs='unbounded'> + <xsd:element name='Client' type='PingStatisticType'/> + </xsd:sequence> + <xsd:attribute name='version' type='xsd:string'/> + <xsd:attribute ref="xml:base"/> + </xsd:complexType> + + <xsd:element name='PingStatistics' type='PingStatisticsType'/> +</xsd:schema> diff --git a/src/lib/Server/Lint/Validate.py b/src/lib/Server/Lint/Validate.py index 952a65365..50c3956a4 100644 --- a/src/lib/Server/Lint/Validate.py +++ b/src/lib/Server/Lint/Validate.py @@ -14,6 +14,7 @@ class Validate(Bcfg2.Server.Lint.ServerlessPlugin): Bcfg2.Server.Lint.ServerlessPlugin.__init__(self, *args, **kwargs) self.filesets = {"metadata:groups":"%s/metadata.xsd", "metadata:clients":"%s/clients.xsd", + "metadata:pingdata":"%s/pingdata.xsd", "info":"%s/info.xsd", "%s/Bundler/*.xml":"%s/bundle.xsd", "%s/Bundler/*.genshi":"%s/bundle.xsd", @@ -148,7 +149,8 @@ class Validate(Bcfg2.Server.Lint.ServerlessPlugin): # about those. for fname in all_metadata: if (fname not in self.filelists['metadata:groups'] and - fname not in self.filelists['metadata:clients']): + fname not in self.filelists['metadata:clients'] and + fname not in self.filelists['metadata:pingdata']): self.LintError("broken-xinclude-chain", "Broken XInclude chain: Could not determine file type of %s" % fname) diff --git a/src/lib/Server/Plugins/DBStats.py b/src/lib/Server/Plugins/DBStats.py index 56420f646..07798b09e 100644 --- a/src/lib/Server/Plugins/DBStats.py +++ b/src/lib/Server/Plugins/DBStats.py @@ -54,7 +54,7 @@ class DBStats(Bcfg2.Server.Plugin.Plugin, start = time.time() for i in [1, 2, 3]: try: - Bcfg2.Server.Reports.importscript.load_stats(self.core.metadata.clients_xml.xdata, + Bcfg2.Server.Reports.importscript.load_stats(self.core.metadata.pingdata_xml.xdata, container, self.core.encoding, 0, diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py index 4f0ca9686..f89c98d2c 100644 --- a/src/lib/Server/Plugins/Metadata.py +++ b/src/lib/Server/Plugins/Metadata.py @@ -237,16 +237,19 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, try: core.fam.AddMonitor("%s/%s" % (self.data, "groups.xml"), self) core.fam.AddMonitor("%s/%s" % (self.data, "clients.xml"), self) + core.fam.AddMonitor("%s/%s" % (self.data, "pingdata.xml"), self) except: - print("Unable to add file monitor for groups.xml or clients.xml") + print("Unable to add file monitor for groups.xml, clients.xml or pingdata.xml") raise Bcfg2.Server.Plugin.PluginInitError self.clients_xml = XMLMetadataConfig(self, watch_clients, 'clients.xml') + self.pingdata_xml = XMLMetadataConfig(self, watch_clients, 'pingdata.xml') self.groups_xml = XMLMetadataConfig(self, watch_clients, 'groups.xml') self.states = {} if watch_clients: self.states = {"groups.xml": False, - "clients.xml": False} + "clients.xml": False, + "pingdata.xml": False} self.addresses = {} self.auth = dict() self.clients = {} @@ -266,7 +269,8 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, self.default = None self.pdirty = False self.extra = {'groups.xml': [], - 'clients.xml': []} + 'clients.xml': [], + 'pingdata.xml': []} self.password = core.password self.query = MetadataQuery(core.build_metadata, lambda: list(self.clients.keys()), @@ -530,6 +534,8 @@ class Metadata(Bcfg2.Server.Plugin.Plugin, ggg)) [self.groups[group][0].add(bund) for bund in bundles] self.states['groups.xml'] = True + elif self.pingdata_xml.HandleEvent(event): + self.states['pingdata.xml'] = True if False not in list(self.states.values()): # check that all client groups are real and complete real = list(self.groups.keys()) diff --git a/src/sbin/bcfg2-ping-sweep b/src/sbin/bcfg2-ping-sweep index 70f718690..585e1cc11 100755 --- a/src/sbin/bcfg2-ping-sweep +++ b/src/sbin/bcfg2-ping-sweep @@ -20,6 +20,7 @@ if __name__ == '__main__': cfpath = setup['configfile'] clientdatapath = "%s/Metadata/clients.xml" % setup['repo'] + pingdatapath = "%s/Metadata/pingdata.xml" % setup['repo'] clientElement = lxml.etree.parse(clientdatapath) hostlist = [client.get('name') @@ -32,6 +33,7 @@ if __name__ == '__main__': #/bin/ping on linux /sbin/ping on os x osname = uname()[0] + container = lxml.etree.Element("PingStatistics") while hostlist or pids: if hostlist and len(list(pids.keys())) < 15: host = hostlist.pop() @@ -58,15 +60,17 @@ if __name__ == '__main__': continue chost = pids[cpid] del pids[cpid] - elm = clientElement.xpath("//Client[@name='%s']" % chost)[0] + elm = lxml.etree.Element('Client', name=chost) if status == 0: elm.set("pingable", 'Y') elm.set("pingtime", str(time.time())) else: elm.set("pingable", 'N') + container.append(elm) - fout = open(clientdatapath, 'w') - fout.write(lxml.etree.tostring(clientElement.getroot(), + fout = open(pingdatapath, 'w') + fout.write(lxml.etree.tostring(container, encoding='UTF-8', - xml_declaration=True)) + xml_declaration=True, + pretty_print=True)) fout.close() |