def serviceUnitHandler(elem, resolver, context): """Custom representation of a service unit""" name = elem.attrib.get("listkey", formatTag(elem.tag)) w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + name, fore=SuNameColor, size=SuNameSize) resolver.add(w) try: w = xmlterm.FancyText( resolver.parentWin, (" " * resolver.depth) + " Admin: %s Operational: %s %s " % (elem.find("adminState").text, "OK" if elem.find("operState").text == "1" else "FAULTED", elem.find("haState").text)) resolver.add(w) w = xmlterm.FancyText( resolver.parentWin, (" " * resolver.depth) + " Active Work: %s Standby Work: %s" % (elem.find("numActiveServiceInstances").find("current").text, elem.find("numStandbyServiceInstances").find("current").text)) resolver.add(w) w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + " On Node: %s In Service Group: %s" % (elem.find("node").text.split("/")[-1], elem.find("serviceGroup").text.split("/")[-1])) resolver.add(w) except AttributeError, e: # object could have no children because recursion depth exceeded pass
def epochTimeHandler(elem, resolver, context): """Convert an xml leaf containing seconds since the epoch into a user readable date panel""" seconds = int(elem.text) s = time.strftime('%Y-%b-%d %H:%M:%S', time.localtime(seconds)) w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + formatTag(elem.tag) + ": " + s) resolver.add(w)
def elapsedSecondsHandler(elem, resolver, context): """Convert an xml leaf containing seconds to a user readable version of elapsed time""" if elem.text is None: s = ": unspecified" else: seconds = int(elem.text) days, rest = divmod(seconds, 60 * 60 * 24) hours, rest = divmod(rest, 60 * 60) minutes, seconds = divmod(rest, 60) s = ": %d days %d hours %d minutes and %d seconds" % (days, hours, minutes, seconds) w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + formatTag(elem.tag) + s) resolver.add(w)
def epochMsTimeHandler(elem, resolver, context): """Convert an xml leaf containing milli-seconds since the epoch into a user readable date panel""" try: mseconds = int(elem.text) s = time.strftime('%Y-%b-%d %H:%M:%S', time.localtime(mseconds / 1000)) except TypeError: if elem.text is None: s = 'unspecified' else: # garbage in the field assert (0) s = "!error bad numeric field: ", str(elem.text) w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + formatTag(elem.tag) + ": " + s) resolver.add(w)
def serviceUnitListHandler(elem, resolver, context): """Create a graphical representation of the XML 'text' tag""" if elem.attrib.has_key("listkey"): # Its an instance of the list serviceUnitHandler(elem, resolver, context) return path = elem.attrib.get("path", None) if path == "/SAFplusAmf/ServiceUnit" or len( elem ) > 0: # serviceunit tag can be a list, a list entry, or a su ref. SU ref has no children resolver.add( xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + "ServiceUnit", fore=SuListColor, size=SuListSize)) resolver.depth += 1 for su in elem: serviceUnitHandler(su, resolver, context) resolver.depth -= 1 else: # Could be ServiceUnit has no children because recursion depth exceeded w = xmlterm.FancyText(resolver.parentWin, (" " * resolver.depth) + formatTag(elem.tag)) # so normal display resolver.add(w) if elem.text: # There should not be any text in the service unit list but display it if there is size = elem.attrib.get("size", None) if size: size = int(size) fore = elem.attrib.get("fore", None) if fore: fore = color.rgb(fore) # [ int(x) for x in fore.split(",")] back = elem.attrib.get("back", None) if back: back = color.rgb(back) # [ int(x) for x in back.split(",")] w = xmlterm.FancyText(resolver.parentWin, elem.text, fore=fore, back=back, size=size) resolver.add(w)
def topHandler(elem, resolver, context): """Make this XML node invisible -- skip down to the children""" childReorg(elem, context.path) for child in elem: fullpath = child.attrib.get("path", None) if fullpath: # print out the full path with a : if it is placed into the child's attribute list. This only happens for top level nodes so the user can see where they were found resolver.add( xmlterm.FancyText(resolver.parentWin, fullpath + ":", fore=FullPathColor)) resolver.depth += 1 resolver.resolve(child, context) if fullpath: resolver.depth -= 1 if child.tail and child.tail.strip(): w = xmlterm.FancyTextChunked(resolver.parentWin, (" " * resolver.depth) + child.tail, chunkSize=2048) resolver.add(w)
def historyHandler(elem, resolver, context): """Create a plot for the historical statistics XML nodes""" if elem.text: data = [float(x) for x in elem.text.split(",")] title = elem.attrib.get("title", formatTag(elem.tag)) xlabel = elem.attrib.get("xlabel", "time") ylabel = elem.attrib.get( "ylabel", "") # TODO: grab the parent's tag as the ylabel? plotAttrib = {"title": title, "xlabel": xlabel, "ylabel": ylabel} if len( resolver.windows ) > 1: # If there is lots of other data in this command, show a small graph plotAttrib["size"] = "(200,100)" plot = ET.Element("plot", plotAttrib) series = ET.Element("series", {"label": ""}, text=elem.text) series.text = elem.text plot.append(series) resolver.add(xmlterm.FancyText(resolver.parentWin, formatTag(elem.tag))) w = xmlterm.PlotPanel(resolver.parentWin, plot) resolver.add(w) else: resolver.defaultHandler(elem, resolver, context)
def dumpNoTagHandler(elem, resolver, context): """""" resolver.add(xmlterm.FancyText(resolver.parentWin, elem.text))