From a97e8d02a5cb68525e9cd2738651a3906c9333eb Mon Sep 17 00:00:00 2001 From: Joey Hagedorn Date: Tue, 10 Jan 2006 20:06:04 +0000 Subject: reverted to 1655 git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1662 ce84e21b-d406-0410-9b95-82705330c041 --- src/sbin/GenerateHostInfo | 65 ++++++++++++++++++++++++++--------------------- src/sbin/StatReports | 33 ++++++++++++++++-------- 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" % (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\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: -- cgit v1.2.3-1-g7c22