summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2012-11-09 15:00:17 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-03-06 04:52:35 +0100
commita3ed36842d1e4762f81d8ad9c10bd36dc73a26c3 (patch)
tree9e8c5d9a27e58e906193c955865294ef620421c0
parent7c51b8e02cc221ed3d9d9f2f7da4ad03f27d2046 (diff)
downloadbcfg2-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.xsd2
-rw-r--r--schemas/pingdata.xsd28
-rw-r--r--src/lib/Server/Lint/Validate.py4
-rw-r--r--src/lib/Server/Plugins/DBStats.py2
-rw-r--r--src/lib/Server/Plugins/Metadata.py12
-rwxr-xr-xsrc/sbin/bcfg2-ping-sweep12
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()