def main(argv=None): __version__ = '1.0.1' ## parse the command line usage = "%prog systemScan [-h] [-d] [-m module name] [-f config file] [-p]" #version = "%prog 1.0.1" parser = OptionParser(usage=usage, version="%prog " + __version__) parser.add_option ("-d", "--debug", dest="debugMode", \ help="Enable debug mode", default=1) parser.add_option ("-m", "--module", dest="module", \ help="Name of Python module containing attribute " +\ "classes to load. The default file is pt_proc.", \ default="pt_proc") parser.add_option ("-f", "--configfile", dest="configFile", \ help="Name of configuration file containing machine " +\ "configuration data. The default file for PTdf is ./iMDL.cfg."\ " The default for PERI xml is ./PERIiMDL.cfg. Look in "\ "the perftrack/share directory for example files.", \ default="iMDL.cfg") parser.add_option ("-o", "--outfile", dest="outputFile", \ help="Name of output file. Default name is " +\ "systemScan.ptdf (or systemScan.xml if PERI output is "\ " selected).", default="systemScan.ptdf") parser.add_option ("-p", "--peri", dest="PERIxml", action="store_true",\ help="Change output format to PERI xml. Default is PTdf."\ ,default=False) (options, args) = parser.parse_args() _debug = options.debugMode attrModule = options.module configFileName = options.configFile if options.PERIxml: outputFormat = "PERIxml" outputFileName = options.outputFile.replace(".ptdf", ".xml") if options.configFile == "iMDL.cfg": configFileName = "PERIiMDL.cfg" from PERIxml import PERIxml else: outputFormat = "PTdf" outputFileName = options.outputFile ## unknown string unknownStr = "Unknown" dqStr = '"' sqStr = "'" # Create Logging object logObj = gmLogger.gmlog() logObj.gmLogWrite(2, "Host System Method Version: " + __version__) # Load the user specified attribute module logObj.gmLogWrite(0, "Loading Atribute Module Name: " + attrModule) moduleObj = _get_mod(attrModule) logObj.gmLogWrite(0,"Loaded Atribute Module Name: " + attrModule + \ " " + moduleObj.__version__) # Create the MDL objects m_mdl = iMDL.imdl(configFileName, outputFormat) if outputFormat == "PTdf": ptdf_mdl = ptdf.PerfTrackDataFormat() elif outputFormat == "PERIxml": peri = PERIxml() # Get all the class definitions in the user specified module # We only want the class definitions that are a child # of superclass baseAttrib. Create a dictionary of class instances # indexed by resource type # that we know are attribute gathering functions. attribFuncsByType = {} for key in moduleObj.__dict__: # Dont look at special attributes or attributes that are not class objects if key[0:2] != "__" and type( moduleObj.__dict__[key]) == types.ClassType: # Dont get the super class if key != "baseAttrib": # Only get class objects that are children of the super class if issubclass(moduleObj.__dict__[key], \ moduleObj.gm_hs_tools.baseAttrib): logObj.gmLogWrite(0, "Found Attribute Object: " + key) if moduleObj.__dict__[key]().attribFuncReq(): continue # the function does not work on this system, so ignore # get the resource type the function gathers data for restype = \ m_mdl.getResourceTypeFor(key,"") #TODO 2nd arg is supposed restype = PTcommon.cws(restype) #to be attribute Name, but it's not used in the function, # so it doesn't matter # if you don't get type from MDL, ask the object if restype == unknownStr: restype = moduleObj.__dict__[key]( ).attribDefaultResourceType() restype = restype.strip("'") logObj.gmLogWrite(0,"Resource Type determined by object " + \ restype) else: logObj.gmLogWrite( 0, "Resource Type determined by iMDL " + restype) restype = PTcommon.cws(restype) #TODO get restype from the MDL if restype.upper() in attribFuncsByType.keys(): attribFuncsByType[restype.upper()].append((key, \ moduleObj.__dict__[key]())) else: attribFuncsByType[restype.upper()] = [ (key, moduleObj.__dict__[key]()) ] #print attribFuncsByType resources = m_mdl.getResources() if resources == unknownStr: print "No resource names were found for this system. Perhaps you forgot to specify a configuration file with the -f option?" sys.exit() for resName, resType in resources: logObj.gmLogWrite(0, "Working on resource " + resName) attribFuncs = [] try: attribFuncs = attribFuncsByType[resType.upper()] except: logObj.gmLogWrite( 0, "There are no attribute functions for " + resName) pass resourceTypeHierarchy = \ m_mdl.getResourceTypeHierarchyFor(resType.strip("'")) if resourceTypeHierarchy != unknownStr: ## Populate the hierarchy with real resource names. ## At this point, the only resource name we know is ## the resource name of the leaf node. ## We must ask the iMDL for all the parent names. ## The MDL also has the ability to override what we think ## the leaf node name is now. ## create the parent names one at a time ## from the type hierarchy resourceNameHierarchy = "" for key1 in resourceTypeHierarchy.split("/"): if len(key1) > 0: tmpResourceName = \ m_mdl.getResourceNameFor(str(key1)).strip("'") resourceNameHierarchy = resourceNameHierarchy + "/" + \ tmpResourceName resourceNameHierarchy = resourceNameHierarchy + "/" + resName.strip( "'") resourceNameHierarchy = PTcommon.cws(resourceNameHierarchy) logObj.gmLogWrite(0, "Resource Name Hierarchy has been " + \ "constructed: " + resourceNameHierarchy) #print "Resource Name Hierarchy has been constructed: " + \ #resourceNameHierarchy logObj.gmLogWrite(0,"iMDL determined Resource Type: " + resType + \ " Hierarchy is " + resourceTypeHierarchy) resourceTypeHierarchy = resourceTypeHierarchy + "/" + resType.strip( "'") #print "Resource Type Hierarchy has been constructed: " + \ #resourceTypeHierarchy if outputFormat == "PTdf": ptdf_mdl[resourceNameHierarchy.split('/') [1:]] = resourceTypeHierarchy.split("/")[1:] elif outputFormat == "PERIxml": peri.createPERIelement(resourceNameHierarchy, resourceTypeHierarchy) for fname, instance in attribFuncs: attributeName = m_mdl.getAttribNameFor(fname) #print attributeName if attributeName == unknownStr: attributeName = instance.attribDefaultName() logObj.gmLogWrite(0,"Attribute Name determined by object. " +\ attributeName) else: logObj.gmLogWrite(0,"Attribute Name determined by iMDL. " + \ attributeName) attributeName = PTcommon.cws(attributeName) # check if there's a resource name override in the config file # for this attribute function tmpResourceName = m_mdl.getOverrideResourceNameHierarchyFor(key) if tmpResourceName == unknownStr: tmpResourceName = resourceNameHierarchy else: tmpResourceName = PTcommon.cws(tmpResourceName) #print "final resourcename is %s" % tmpResourceName # Get the attribute value this object returns. Finally!! ## This is the call to run the data collection method attributeValue = instance.attribFunc(resName) if not isinstance(attributeValue, list): attributeValue = PTcommon.cws(str(attributeValue)) else: """ future work: support multi-item return (i.e. list, tuples,) """ #print "attributeValue is %s" % (attributeValue) if outputFormat == "PTdf": # Convert to something the ptdf object can use. #print "resourceTypeHierarchy: %s" % resourceTypeHierarchy tmpType = resourceTypeHierarchy.strip("'") tmpTypeList = tmpType.split("/") tmpTypeList.remove('') #print "Type List: " + str(tmpTypeList) #print "resourceNameHierarchy: %s" % resourceNameHierarchy tmpName = resourceNameHierarchy.strip("'") tmpNameList = tmpName.split("/") try: #list.index() throws exception if not found ind = tmpNameList.index('') del tmpNameList[ind] except ValueError: "" if tmpNameList[0] == dqStr: #print "!!! found a multi word rnh !!!" tmpNameList[1] = dqStr + tmpNameList[1] #print tmpNameList[0] + " --- " + tmpNameList[1] del tmpNameList[0] #print "Name List: " + str(tmpNameList) ## create the PTDF ## Create the Resource Type and Name ptdf_mdl[tmpNameList] = tmpTypeList #print "ptdf_mdl" + str(tmpNameList) + " = " + str(tmpTypeList) ## Add the attribute name and value ptdf_mdl[tmpNameList][attributeName.strip("'")] = \ repr(attributeValue).strip("'") #print "ptdf_mdl" + str(tmpNameList) + "[" + \ elif outputFormat == "PERIxml": peri.addAttribute(resourceNameHierarchy, resourceTypeHierarchy, attributeName.strip("'").strip('"'), attributeValue.strip("'").strip('"')) # Write the PTDF file if outputFormat == "PTdf": oFile = open(outputFileName, "w") oFile.writelines(ptdf_mdl) oFile.close() elif outputFormat == "PERIxml": peri.writeData(outputFileName) logObj.gmLogWrite(3, "Host System Method")
#!/usr/bin/env python ## filename: pt_proc.py import gm_hs_tools import os, sys import gmLogger from PTcommon import my_exec2 __version__ = '1.0.1' logObj = gmLogger.gmlog() # Base Super Class #class baseAttrib: # def attribFuncReq(self): # # This function must be implemented by the child class # # if not everything should break. # none #Requirements function implemented by child class # # def attribFunc(self): # # This function must be implemented by the child class # # if not everything should break. # none #Attribute function implemented by child class # # def attribDefaultName(self): # # So, we are assuming that an attribute class # # will know the atribute name that it # # is retrieving the attribute for. This can be # # over-ridden by the loacl database (Config file) # # or a call to the PTDB. # # If the child class does not implement we return # # an 'unknown' value.
def main (argv=None): __version__ = '1.0.1' ## parse the command line usage = "%prog systemScan [-h] [-d] [-m module name] [-f config file] [-p]" #version = "%prog 1.0.1" parser = OptionParser(usage=usage, version="%prog " + __version__) parser.add_option ("-d", "--debug", dest="debugMode", \ help="Enable debug mode", default=1) parser.add_option ("-m", "--module", dest="module", \ help="Name of Python module containing attribute " +\ "classes to load. The default file is pt_proc.", \ default="pt_proc") parser.add_option ("-f", "--configfile", dest="configFile", \ help="Name of configuration file containing machine " +\ "configuration data. The default file for PTdf is ./iMDL.cfg."\ " The default for PERI xml is ./PERIiMDL.cfg. Look in "\ "the perftrack/share directory for example files.", \ default="iMDL.cfg") parser.add_option ("-o", "--outfile", dest="outputFile", \ help="Name of output file. Default name is " +\ "systemScan.ptdf (or systemScan.xml if PERI output is "\ " selected).", default="systemScan.ptdf") parser.add_option ("-p", "--peri", dest="PERIxml", action="store_true",\ help="Change output format to PERI xml. Default is PTdf."\ ,default=False) (options, args) = parser.parse_args() _debug = options.debugMode attrModule = options.module configFileName = options.configFile if options.PERIxml: outputFormat = "PERIxml" outputFileName = options.outputFile.replace(".ptdf",".xml") if options.configFile == "iMDL.cfg": configFileName = "PERIiMDL.cfg" from PERIxml import PERIxml else: outputFormat = "PTdf" outputFileName = options.outputFile ## unknown string unknownStr = "Unknown" dqStr = '"' sqStr = "'" # Create Logging object logObj = gmLogger.gmlog() logObj.gmLogWrite(2,"Host System Method Version: " + __version__) # Load the user specified attribute module logObj.gmLogWrite(0,"Loading Atribute Module Name: " + attrModule) moduleObj = _get_mod(attrModule) logObj.gmLogWrite(0,"Loaded Atribute Module Name: " + attrModule + \ " " + moduleObj.__version__) # Create the MDL objects m_mdl = iMDL.imdl(configFileName, outputFormat) if outputFormat == "PTdf": ptdf_mdl = ptdf.PerfTrackDataFormat() elif outputFormat == "PERIxml": peri = PERIxml() # Get all the class definitions in the user specified module # We only want the class definitions that are a child # of superclass baseAttrib. Create a dictionary of class instances # indexed by resource type # that we know are attribute gathering functions. attribFuncsByType = {} for key in moduleObj.__dict__: # Dont look at special attributes or attributes that are not class objects if key[0:2] != "__" and type(moduleObj.__dict__[key]) == types.ClassType: # Dont get the super class if key != "baseAttrib": # Only get class objects that are children of the super class if issubclass(moduleObj.__dict__[key], \ moduleObj.gm_hs_tools.baseAttrib): logObj.gmLogWrite(0,"Found Attribute Object: " + key) if moduleObj.__dict__[key]().attribFuncReq(): continue # the function does not work on this system, so ignore # get the resource type the function gathers data for restype = \ m_mdl.getResourceTypeFor(key,"") #TODO 2nd arg is supposed restype = PTcommon.cws(restype) #to be attribute Name, but it's not used in the function, # so it doesn't matter # if you don't get type from MDL, ask the object if restype == unknownStr: restype = moduleObj.__dict__[key]().attribDefaultResourceType() restype = restype.strip("'") logObj.gmLogWrite(0,"Resource Type determined by object " + \ restype) else: logObj.gmLogWrite(0,"Resource Type determined by iMDL " + restype) restype = PTcommon.cws(restype) #TODO get restype from the MDL if restype.upper() in attribFuncsByType.keys(): attribFuncsByType[restype.upper()].append((key, \ moduleObj.__dict__[key]())) else: attribFuncsByType[restype.upper()] = [(key,moduleObj.__dict__[key]())] #print attribFuncsByType resources = m_mdl.getResources() if resources == unknownStr: print "No resource names were found for this system. Perhaps you forgot to specify a configuration file with the -f option?" sys.exit() for resName,resType in resources: logObj.gmLogWrite(0,"Working on resource " + resName) attribFuncs = [] try: attribFuncs = attribFuncsByType[resType.upper()] except: logObj.gmLogWrite(0,"There are no attribute functions for " + resName) pass resourceTypeHierarchy = \ m_mdl.getResourceTypeHierarchyFor(resType.strip("'")) if resourceTypeHierarchy != unknownStr: ## Populate the hierarchy with real resource names. ## At this point, the only resource name we know is ## the resource name of the leaf node. ## We must ask the iMDL for all the parent names. ## The MDL also has the ability to override what we think ## the leaf node name is now. ## create the parent names one at a time ## from the type hierarchy resourceNameHierarchy = "" for key1 in resourceTypeHierarchy.split("/"): if len(key1) > 0: tmpResourceName = \ m_mdl.getResourceNameFor(str(key1)).strip("'") resourceNameHierarchy = resourceNameHierarchy + "/" + \ tmpResourceName resourceNameHierarchy = resourceNameHierarchy + "/" + resName.strip("'") resourceNameHierarchy = PTcommon.cws(resourceNameHierarchy) logObj.gmLogWrite(0, "Resource Name Hierarchy has been " + \ "constructed: " + resourceNameHierarchy) #print "Resource Name Hierarchy has been constructed: " + \ #resourceNameHierarchy logObj.gmLogWrite(0,"iMDL determined Resource Type: " + resType + \ " Hierarchy is " + resourceTypeHierarchy) resourceTypeHierarchy = resourceTypeHierarchy + "/" + resType.strip("'") #print "Resource Type Hierarchy has been constructed: " + \ #resourceTypeHierarchy if outputFormat == "PTdf": ptdf_mdl[resourceNameHierarchy.split('/')[1:]] = resourceTypeHierarchy.split("/")[1:] elif outputFormat == "PERIxml": peri.createPERIelement(resourceNameHierarchy, resourceTypeHierarchy) for fname,instance in attribFuncs: attributeName = m_mdl.getAttribNameFor(fname) #print attributeName if attributeName == unknownStr: attributeName = instance.attribDefaultName() logObj.gmLogWrite(0,"Attribute Name determined by object. " +\ attributeName) else: logObj.gmLogWrite(0,"Attribute Name determined by iMDL. " + \ attributeName) attributeName = PTcommon.cws(attributeName) # check if there's a resource name override in the config file # for this attribute function tmpResourceName = m_mdl.getOverrideResourceNameHierarchyFor(key) if tmpResourceName == unknownStr: tmpResourceName = resourceNameHierarchy else: tmpResourceName = PTcommon.cws(tmpResourceName) #print "final resourcename is %s" % tmpResourceName # Get the attribute value this object returns. Finally!! ## This is the call to run the data collection method attributeValue = instance.attribFunc(resName) if not isinstance(attributeValue, list): attributeValue = PTcommon.cws(str(attributeValue)) else: """ future work: support multi-item return (i.e. list, tuples,) """ #print "attributeValue is %s" % (attributeValue) if outputFormat == "PTdf": # Convert to something the ptdf object can use. #print "resourceTypeHierarchy: %s" % resourceTypeHierarchy tmpType = resourceTypeHierarchy.strip("'") tmpTypeList = tmpType.split("/") tmpTypeList.remove('') #print "Type List: " + str(tmpTypeList) #print "resourceNameHierarchy: %s" % resourceNameHierarchy tmpName = resourceNameHierarchy.strip("'") tmpNameList = tmpName.split("/") try: #list.index() throws exception if not found ind = tmpNameList.index('') del tmpNameList[ind] except ValueError: "" if tmpNameList[0] == dqStr: #print "!!! found a multi word rnh !!!" tmpNameList[1] = dqStr + tmpNameList[1] #print tmpNameList[0] + " --- " + tmpNameList[1] del tmpNameList[0] #print "Name List: " + str(tmpNameList) ## create the PTDF ## Create the Resource Type and Name ptdf_mdl[tmpNameList] = tmpTypeList #print "ptdf_mdl" + str(tmpNameList) + " = " + str(tmpTypeList) ## Add the attribute name and value ptdf_mdl[tmpNameList][attributeName.strip("'")] = \ repr(attributeValue).strip("'") #print "ptdf_mdl" + str(tmpNameList) + "[" + \ elif outputFormat == "PERIxml": peri.addAttribute(resourceNameHierarchy, resourceTypeHierarchy, attributeName.strip("'").strip('"'), attributeValue.strip("'").strip('"')) # Write the PTDF file if outputFormat == "PTdf": oFile = open(outputFileName, "w") oFile.writelines(ptdf_mdl) oFile.close() elif outputFormat == "PERIxml": peri.writeData(outputFileName) logObj.gmLogWrite(3,"Host System Method")