summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sbin/GenerateHostInfo65
-rw-r--r--src/sbin/StatReports33
2 files changed, 58 insertions, 40 deletions
diff --git a/src/sbin/GenerateHostInfo b/src/sbin/GenerateHostInfo
index 4b34ade89..04d257e8a 100644
--- a/src/sbin/GenerateHostInfo
+++ b/src/sbin/GenerateHostInfo
@@ -6,24 +6,42 @@
__revision__ = '$Revision$'
from ConfigParser import ConfigParser
-from lxml.etree import Element, SubElement, parse, dump, tostring
+from lxml.etree import Element, SubElement, parse
from os import fork, execl, dup2, wait
import sys
+def pretty_print(element, level=0):
+ '''Produce a pretty-printed text representation of element'''
+ if element.text:
+ fmt = "%s<%%s %%s>%%s</%%s>" % (level*" ")
+ data = (element.tag, (" ".join(["%s='%s'" % keyval for keyval in element.attrib.iteritems()])),
+ element.text, element.tag)
+ children = element.getchildren()
+ if children:
+ fmt = "%s<%%s %%s>\n" % (level*" ",) + (len(children) * "%s") + "%s</%%s>\n" % (level*" ")
+ data = (element.tag, ) + (" ".join(["%s='%s'" % (key, element.attrib[key]) for key in element.attrib]),)
+ data += tuple([pretty_print(entry, level+2) for entry in children]) + (element.tag, )
+ else:
+ fmt = "%s<%%s %%s/>\n" % (level * " ")
+ data = (element.tag, " ".join(["%s='%s'" % (key, element.attrib[key]) for key in element.attrib]))
+ return fmt % data
+
+
if __name__ == '__main__':
c = ConfigParser()
c.read(['/etc/bcfg2.conf'])
configpath = "%s/etc/report-configuration.xml" % c.get('server', 'repository')
- clientdatapath = "%s/Metadata/clients.xml" % c.get('server', 'repository')
+ hostinfopath = "%s/etc/hostinfo.xml" % c.get('server', 'repository')
+ metadatapath = "%s/etc/metadata.xml" % c.get('server', 'repository')
sendmailpath = c.get('statistics','sendmailpath')
- clientElement = parse(clientdatapath)
- hostlist = [client.get('name') for client in clientElement.findall("Client")]
+ metaElement = parse(metadatapath)
+ hostlist = [client.get('name') for client in metaElement.findall("Client")]
+ HostInfo = Element("HostInformation")
pids = {}
fullnames = {}
null = open('/dev/null', 'w+')
-
while hostlist or pids:
if hostlist and len(pids.keys()) < 15:
host = hostlist.pop()
@@ -39,31 +57,20 @@ if __name__ == '__main__':
else:
try:
(cpid, status) = wait()
- except OSError:
- continue
-
- chost = pids[cpid]
- del pids[cpid]
- if status == 0:
- #if '-v' in sys.argv:
- print "Alive: %s (fullname: %s):"%(chost,fullnames[chost])
- #SubElement(HostInfo, "HostInfo", name=chost, fqdn=chost, pingable='Y')
- clientElement.xpath("//Client[@name='%s']"%(fullnames[chost]))[0].set("pingable",'Y')
- #also set pingtime, if you can get it
- else:
- if chost.count('.') > 0:
- fullnames[chost.split('.')[0]] = chost
- hostlist.append(chost.split('.')[0])
+ chost = pids[cpid]
+ del pids[cpid]
+ if status == 0:
+ SubElement(HostInfo, "HostInfo", name=chost, fqdn=chost, pingable='Y')
else:
- print "Dead: %s (fullname: %s):"%(chost,fullnames[chost])
-
- #SubElement(HostInfo, "HostInfo", name=fullnames[chost], fqdn=fullnames[chost], pingable='N')
- clientElement.xpath("//Client[@name='%s']"%(fullnames[chost]))[0].set("pingable",'N')
- #also set pingtime if you can get it
-
- dump(clientElement.getroot())
+ if chost.count('.') > 0:
+ fullnames[chost.split('.')[0]] = chost
+ hostlist.append(chost.split('.')[0])
+ else:
+ SubElement(HostInfo, "HostInfo", name=fullnames[chost], fqdn=fullnames[chost], pingable='N')
+ except:
+ pass
- fout = open(clientdatapath, 'w')
- fout.write(tostring(clientElement.getroot()))
+ fout = open(hostinfopath, 'w')
+ fout.write(pretty_print(HostInfo))
fout.close()
diff --git a/src/sbin/StatReports b/src/sbin/StatReports
index cb74eb4bb..ef6a8df66 100644
--- a/src/sbin/StatReports
+++ b/src/sbin/StatReports
@@ -30,7 +30,8 @@ def generatereport(rspec, nrpt):
pattern = re.compile( '|'.join([item.get("name") for item in reportspec.findall('Machine')]))
for node in nodereprt.findall('Node'):
- if not (node.findall("Statistics") and pattern.match(node.get('name'))):
+ if not (node.findall("HostInfo") and node.findall("Statistics") and
+ node.find("HostInfo").get("fqdn") and pattern.match(node.get('name'))):
# don't know enough about node
nodereprt.remove(node)
continue
@@ -150,7 +151,8 @@ if __name__ == '__main__':
c.read(['/etc/bcfg2.conf'])
configpath = "%s/etc/report-configuration.xml" % c.get('server', 'repository')
statpath = "%s/etc/statistics.xml" % c.get('server', 'repository')
- clientsdatapath = "%s/Metadata/clients.xml" % c.get('server', 'repository')
+ hostinfopath = "%s/etc/hostinfo.xml" % c.get('server', 'repository')
+ metadatapath = "%s/etc/metadata.xml" % c.get('server', 'repository')
transformpath = "/usr/share/bcfg2/xsl-transforms/"
#websrcspath = "/usr/share/bcfg2/web-rprt-srcs/"
@@ -171,12 +173,12 @@ if __name__ == '__main__':
#See if hostinfo.xml exists, and is less than 23.5 hours old
- #try:
- #hostinstat = os.stat(hostinfopath)
- #if (time() - hostinstat[9])/(60*60) > 23.5:
- os.system('GenerateHostInfo')#Generate HostInfo needs to be in path
- #except OSError:
- # os.system('GenerateHostInfo')#Generate HostInfo needs to be in path
+ try:
+ hostinstat = os.stat(hostinfopath)
+ if (time() - hostinstat[9])/(60*60) > 23.5:
+ os.system('GenerateHostInfo')#Generate HostInfo needs to be in path
+ except OSError:
+ os.system('GenerateHostInfo')#Generate HostInfo needs to be in path
'''Reads Data & Config files'''
@@ -191,10 +193,16 @@ if __name__ == '__main__':
print("StatReports: Failed to parse %s"%(configpath))
raise SystemExit, 1
try:
- clientsdata = XML(open(clientsdatapath).read())
+ metadata = XML(open(metadatapath).read())
except (IOError, XMLSyntaxError):
- print("StatReports: Failed to parse %s"%(clientsdatapath))
+ print("StatReports: Failed to parse %s"%(metadatapath))
raise SystemExit, 1
+ try:
+ hostinfodata = XML(open(hostinfopath).read())
+ except (IOError, XMLSyntaxError):
+ print("StatReports: Failed to parse %s. Is GenerateHostInfo in your path?"%(hostinfopath))
+ raise SystemExit, 1
+
#Merge data from three sources
nodereport = Element("Report", attrib={"time" : asctime()})
@@ -202,9 +210,12 @@ if __name__ == '__main__':
#should all of the other info in Metadata be appended?
#What about all of the package stuff for other types of reports?
- for client in clientsdata.findall("Client"):
+ for client in metadata.findall("Client"):
nodel = Element("Node", attrib={"name" : client.get("name")})
nodel.append(client)
+ for hostinfo in hostinfodata.findall("HostInfo"):
+ if hostinfo.get("name") == client.get("name"):
+ nodel.append(hostinfo)
for nod in statsdata.findall("Node"):
if client.get('name').find(nod.get('name')) == 0: