Hi, Looks ok to me, so long as it does what you want it to do,
Steve. On Thu, 2013-01-31 at 09:41 -0500, sbrad...@redhat.com wrote: > From: Shane Bradley <sbrad...@redhat.com> > > The status of the cluster will be captured and written to the file with > respect > to version: cman_tool nodes, corosync-quorumtool -l. Added two new > configuration > variables to the hostinformation.txt for the clusternode name and id. > > Signed-off-by: Shane Bradley <sbrad...@redhat.com> > --- > gfs2/scripts/gfs2_lockcapture | 102 > +++++++++++++++++++++++++++++++----------- > 1 file changed, 76 insertions(+), 26 deletions(-) > > diff --git a/gfs2/scripts/gfs2_lockcapture b/gfs2/scripts/gfs2_lockcapture > index 2b3421c..6a63fc8 100644 > --- a/gfs2/scripts/gfs2_lockcapture > +++ b/gfs2/scripts/gfs2_lockcapture > @@ -45,12 +45,15 @@ class ClusterNode: > """ > This class represents a cluster node that is a current memeber in a > cluster. > """ > - def __init__(self, clusternodeName, clusterName, > mapOfMountedFilesystemLabels): > + def __init__(self, clusternodeName, clusternodeID, clusterName, > mapOfMountedFilesystemLabels): > """ > @param clusternodeName: The name of the cluster node. > @type clusternodeName: String > @param clusterName: The name of the cluster that this cluster node > is a > member of. > + @param clusternodeID: The id of the cluster node. > + @type clusternodeID: Int > + @param clusterName: The name of the cluster that this cluster node > is a > @type clusterName: String > @param mapOfMountedFilesystemLabels: A map of filesystem labels(key) > for > a mounted filesystem. The value is the line for the matching mounted > @@ -58,6 +61,7 @@ class ClusterNode: > @type mapOfMountedFilesystemLabels: Dict > """ > self.__clusternodeName = clusternodeName > + self.__clusternodeID = clusternodeID > self.__clusterName = clusterName > self.__mapOfMountedFilesystemLabels = mapOfMountedFilesystemLabels > > @@ -69,7 +73,7 @@ class ClusterNode: > @rtype: String > """ > rString = "" > - rString += "%s:%s" %(self.getClusterName(), > self.getClusterNodeName()) > + rString += "%s:%s(id:%d)" %(self.getClusterName(), > self.getClusterNodeName(), self.getClusterNodeID()) > fsLabels = self.__mapOfMountedFilesystemLabels.keys() > fsLabels.sort() > for fsLabel in fsLabels: > @@ -85,6 +89,14 @@ class ClusterNode: > """ > return self.__clusternodeName > > + def getClusterNodeID(self): > + """ > + Returns the id of the cluster node. > + @return: Returns the id of the cluster node. > + @rtype: String > + """ > + return self.__clusternodeID > + > def getClusterName(self): > """ > Returns the name of cluster that this cluster node is a member of. > @@ -539,6 +551,7 @@ def getClusterNode(listOfGFS2Names): > # in the output, else return None. > clusterName = "" > clusternodeName = "" > + clusternodeID = "" > if (runCommand("which", ["cman_tool"])): > stdout = runCommandOutput("cman_tool", ["status"]) > if (not stdout == None): > @@ -550,6 +563,8 @@ def getClusterNode(listOfGFS2Names): > clusterName = line.split("Cluster > Name:")[1].strip().rstrip() > if (line.startswith("Node name: ")): > clusternodeName = line.split("Node > name:")[1].strip().rstrip() > + if (line.startswith("Node ID: ")): > + clusternodeID = line.split("Node ID: > ")[1].strip().rstrip() > elif (runCommand("which", ["corosync-cmapctl"])): > # Another way to get the local cluster node is: $ crm_node -i; > crm_node -l > # Get the name of the cluster. > @@ -559,14 +574,14 @@ def getClusterNode(listOfGFS2Names): > if (len(stdoutSplit) == 2): > clusterName = stdoutSplit[1].strip().rstrip() > # Get the id of the local cluster node so we can get the clusternode > name > - thisNodeID = "" > + clusternodeID = "" > stdout = runCommandOutput("corosync-cmapctl", ["-g", > "runtime.votequorum.this_node_id"]) > if (not stdout == None): > stdoutSplit = stdout.split("=") > if (len(stdoutSplit) == 2): > - thisNodeID = stdoutSplit[1].strip().rstrip() > + clusternodeID = stdoutSplit[1].strip().rstrip() > # Now that we the nodeid then we can get the clusternode name. > - if (len(thisNodeID) > 0): > + if (len(clusternodeID) > 0): > stdout = runCommandOutput("corosync-quorumtool", ["-l"]) > if (not stdout == None): > for line in stdout.split("\n"): > @@ -588,7 +603,15 @@ def getClusterNode(listOfGFS2Names): > break > if ((not foundMatch) and > (mapOfMountedFilesystemLabels.has_key(label))): > del(mapOfMountedFilesystemLabels[label]) > - return ClusterNode(clusternodeName, clusterName, > mapOfMountedFilesystemLabels) > + # Cast the node id to an int, and default is 0 if node is not found > or > + # not castable. > + clusternodeIDInt = 0 > + if (clusternodeID.isalnum()): > + try: > + clusternodeIDInt = int(clusternodeID) > + except(ValueError): > + pass > + return ClusterNode(clusternodeName, clusternodeIDInt, clusterName, > mapOfMountedFilesystemLabels) > else: > return None > > @@ -701,6 +724,28 @@ def gatherGeneralInformation(pathToDSTDir): > message = "There was an error the command output for %s to the file > %s." %(command, pathToCommandOutput) > logging.getLogger(MAIN_LOGGER_NAME).error(message) > > + # Write the status of all the nodes in the cluster out. > + if (runCommand("which", ["cman_tool"])): > + command = "cman_tool" > + pathToCommandOutput = os.path.join(pathToDSTDir, "cman_tool_status") > + try: > + fout = open(pathToCommandOutput, "w") > + runCommand(command, ["status"], standardOut=fout) > + fout.close() > + except IOError: > + message = "There was an error the command output for %s to the > file %s." %(command, pathToCommandOutput) > + logging.getLogger(MAIN_LOGGER_NAME).error(message) > + elif (runCommand("which", ["corosync-cmapctl"])): > + command = "corosync-quorumtool" > + pathToCommandOutput = os.path.join(pathToDSTDir, > "corosync-quorumtool_l") > + try: > + fout = open(pathToCommandOutput, "w") > + runCommand(command, ["-l"], standardOut=fout) > + fout.close() > + except IOError: > + message = "There was an error the command output for %s to the > file %s." %(command, pathToCommandOutput) > + logging.getLogger(MAIN_LOGGER_NAME).error(message) > + > > def isProcPidStackEnabled(pathToPidData): > """ > @@ -1067,26 +1112,6 @@ if __name__ == "__main__": > # script running. > writeToFile(PATH_TO_PID_FILENAME, str(os.getpid()), > createFile=True) > # > ####################################################################### > - # Verify they want to continue because this script will trigger > sysrq events. > - # > ####################################################################### > - if (not cmdLineOpts.disableQuestions): > - valid = {"yes":True, "y":True, "no":False, "n":False} > - question = "This script will trigger a sysrq -t event or collect > the data for each pid directory located in /proc for each run. Are you sure > you want to continue?" > - prompt = " [y/n] " > - while True: > - sys.stdout.write(question + prompt) > - choice = raw_input().lower() > - if (choice in valid): > - if (valid.get(choice)): > - # If yes, or y then exit loop and continue. > - break > - else: > - message = "The script will not continue since you > chose not to continue." > - logging.getLogger(MAIN_LOGGER_NAME).error(message) > - exitScript(removePidFile=True, errorCode=1) > - else: > - sys.stdout.write("Please respond with '(y)es' or > '(n)o'.\n") > - # > ####################################################################### > # Get the clusternode name and verify that mounted GFS2 filesystems > were > # found. > # > ####################################################################### > @@ -1110,6 +1135,26 @@ if __name__ == "__main__": > print clusternode > exitScript() > # > ####################################################################### > + # Verify they want to continue because this script will trigger > sysrq events. > + # > ####################################################################### > + if (not cmdLineOpts.disableQuestions): > + valid = {"yes":True, "y":True, "no":False, "n":False} > + question = "This script will trigger a sysrq -t event or collect > the data for each pid directory located in /proc for each run. Are you sure > you want to continue?" > + prompt = " [y/n] " > + while True: > + sys.stdout.write(question + prompt) > + choice = raw_input().lower() > + if (choice in valid): > + if (valid.get(choice)): > + # If yes, or y then exit loop and continue. > + break > + else: > + message = "The script will not continue since you > chose not to continue." > + logging.getLogger(MAIN_LOGGER_NAME).error(message) > + exitScript(removePidFile=True, errorCode=1) > + else: > + sys.stdout.write("Please respond with '(y)es' or > '(n)o'.\n") > + # > ####################################################################### > # Create the output directory to verify it can be created before > # proceeding unless it is already created from a previous run data > needs > # to be analyzed. Probably could add more debugging on if file or > dir. > @@ -1178,6 +1223,11 @@ if __name__ == "__main__": > message = "Pass (%d/%d): Gathering general information about the > host." %(i, cmdLineOpts.numberOfRuns) > logging.getLogger(MAIN_LOGGER_NAME).debug(message) > gatherGeneralInformation(pathToOutputRunDir) > + # Write the clusternode name and id to the general information > file. > + writeToFile(os.path.join(pathToOutputRunDir, > "hostinformation.txt"), > + "NODE_NAME=%s\nNODE_ID=%d" > %(clusternode.getClusterNodeName(), clusternode.getClusterNodeID()), > + appendToFile=True, createFile=True) > + > # Going to sleep for 2 seconds, so that TIMESTAMP should be in > the > # past in the logs so that capturing sysrq data will be > guaranteed. > time.sleep(2)