From a3ed36842d1e4762f81d8ad9c10bd36dc73a26c3 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 9 Nov 2012 15:00:17 +0100 Subject: 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. --- schemas/clients.xsd | 2 -- schemas/pingdata.xsd | 28 ++++++++++++++++++++++++++++ src/lib/Server/Lint/Validate.py | 4 +++- src/lib/Server/Plugins/DBStats.py | 2 +- src/lib/Server/Plugins/Metadata.py | 12 +++++++++--- src/sbin/bcfg2-ping-sweep | 12 ++++++++---- 6 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 schemas/pingdata.xsd 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 @@ - - 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 @@ + + + + + pingdata schema for bcfg2 + Alexander Sulfrian + + + + + + + + + + + + + + + + + + + + + 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() -- cgit v1.2.3-1-g7c22