def auth_nodes(nodes): if "-u" in utils.pcs_options: username = utils.pcs_options["-u"] else: username = None if "-p" in utils.pcs_options: password = utils.pcs_options["-p"] else: password = None for node in nodes: status = utils.checkStatus(node) if status[0] == 0: print node + ": Already authorized" elif status[0] == 3: if username == None: username = raw_input("Username: "******"Password: "******"%s: Authorized" % (node) else: print "Unable to communicate with %s" % (node) exit(1)
def cluster_node(argv): if len(argv) != 2: usage.cluster() sys.exit(1) if argv[0] == "add": add_node = True elif argv[0] == "remove": add_node = False else: usage.cluster() sys.exit(1) node = argv[1] status, output = utils.checkStatus(node) if status == 2: print "Error: pcsd is not running on %s" % node sys.exit(1) elif status == 3: print "Error: %s is not yet authenticated (try pcs cluster auth %s)" % ( node, node) sys.exit(1) if add_node == True: corosync_conf = None for my_node in utils.getNodesFromCorosyncConf(): retval, output = utils.addLocalNode(my_node, node) if retval != 0: print "Error: unable to add %s on %s - %s" % (node, my_node, output.strip()) else: print "%s: Corosync updated" % my_node corosync_conf = output if corosync_conf != None: utils.setCorosyncConfig(node, corosync_conf) utils.startCluster(node) else: print "Error: Unable to update any nodes" sys.exit(1) else: nodesRemoved = False output, retval = utils.run(["crm_node", "--force", "-R", node]) for my_node in utils.getNodesFromCorosyncConf(): retval, output = utils.removeLocalNode(my_node, node) if retval != 0: print "Error: unable to remove %s on %s - %s" % ( node, my_node, output.strip()) else: if output[0] == 0: print "%s: Corosync updated" % my_node nodesRemoved = True else: print "%s: Error executing command occured: %s" % ( my_node, "".join(output[1])) if nodesRemoved == False: print "Error: Unable to update any nodes" sys.exit(1)
def config_restore_remote(infile_name, infile_obj): extracted = { "version.txt": "", "corosync.conf": "", "cluster.conf": "", } try: tarball = tarfile.open(infile_name, "r|*", infile_obj) while True: tar_member_info = tarball.next() if tar_member_info is None: break if tar_member_info.name in extracted: tar_member = tarball.extractfile(tar_member_info) extracted[tar_member_info.name] = tar_member.read() tar_member.close() tarball.close() except (tarfile.TarError, EnvironmentError) as e: utils.err("unable to read the tarball: %s" % e) config_backup_check_version(extracted["version.txt"]) node_list = utils.getNodesFromCorosyncConf( extracted["cluster.conf" if utils.is_rhel6() else "corosync.conf"] ) if not node_list: utils.err("no nodes found in the tarball") for node in node_list: try: retval, output = utils.checkStatus(node) if retval != 0: utils.err("unable to determine status of the node %s" % node) status = json.loads(output) if status["corosync"] or status["pacemaker"] or status["cman"]: utils.err( "Cluster is currently running on node %s. You need to stop " "the cluster in order to restore the configuration." % node ) except (ValueError, NameError): utils.err("unable to determine status of the node %s" % node) if infile_obj: infile_obj.seek(0) tarball_data = infile_obj.read() else: with open(infile_name, "r") as tarball: tarball_data = tarball.read() error_list = [] for node in node_list: retval, error = utils.restoreConfig(node, tarball_data) if retval != 0: error_list.append(error) if error_list: utils.err("unable to restore all nodes\n" + "\n".join(error_list))
def check_nodes(nodes): for node in nodes: status = utils.checkStatus(node) if status[0] == 0: print node + ": Online" elif status[0] == 3: print node + ": Unable to authenticate" else: print node + ": Offline"
def config_restore_remote(infile_name, infile_obj): extracted = { "version.txt": "", "corosync.conf": "", "cluster.conf": "", } try: tarball = tarfile.open(infile_name, "r|*", infile_obj) while True: tar_member_info = tarball.next() if tar_member_info is None: break if tar_member_info.name in extracted: tar_member = tarball.extractfile(tar_member_info) extracted[tar_member_info.name] = tar_member.read() tar_member.close() tarball.close() except (tarfile.TarError, EnvironmentError) as e: utils.err("unable to read the tarball: %s" % e) config_backup_check_version(extracted["version.txt"]) node_list = utils.getNodesFromCorosyncConf( extracted["cluster.conf" if utils.is_rhel6() else "corosync.conf"]) if not node_list: utils.err("no nodes found in the tarball") for node in node_list: try: retval, output = utils.checkStatus(node) if retval != 0: utils.err("unable to determine status of the node %s" % node) status = json.loads(output) if status["corosync"] or status["pacemaker"] or status["cman"]: utils.err( "Cluster is currently running on node %s. You need to stop " "the cluster in order to restore the configuration." % node) except (ValueError, NameError): utils.err("unable to determine status of the node %s" % node) if infile_obj: infile_obj.seek(0) tarball_data = infile_obj.read() else: with open(infile_name, "r") as tarball: tarball_data = tarball.read() error_list = [] for node in node_list: retval, error = utils.restoreConfig(node, tarball_data) if retval != 0: error_list.append(error) if error_list: utils.err("unable to restore all nodes\n" + "\n".join(error_list))
def cluster_node(argv): if len(argv) != 2: usage.cluster(); sys.exit(1) if argv[0] == "add": add_node = True elif argv[0] == "remove": add_node = False else: usage.cluster(); sys.exit(1) node = argv[1] status,output = utils.checkStatus(node) if status == 2: print "Error: pcsd is not running on %s" % node sys.exit(1) elif status == 3: print "Error: %s is not yet authenticated (try pcs cluster auth %s)" % (node, node) sys.exit(1) if add_node == True: corosync_conf = None for my_node in utils.getNodesFromCorosyncConf(): retval, output = utils.addLocalNode(my_node,node) if retval != 0: print "Error: unable to add %s on %s - %s" % (node,my_node,output.strip()) else: print "%s: Corosync updated" % my_node corosync_conf = output if corosync_conf != None: utils.setCorosyncConfig(node, corosync_conf) utils.startCluster(node) else: print "Error: Unable to update any nodes" sys.exit(1) else: nodesRemoved = False output, retval = utils.run(["crm_node", "--force","-R", node]) for my_node in utils.getNodesFromCorosyncConf(): retval, output = utils.removeLocalNode(my_node,node) if retval != 0: print "Error: unable to remove %s on %s - %s" % (node,my_node,output.strip()) else: if output[0] == 0: print "%s: Corosync updated" % my_node nodesRemoved = True else: print "%s: Error executing command occured: %s" % (my_node, "".join(output[1])) if nodesRemoved == False: print "Error: Unable to update any nodes" sys.exit(1)
def auth_nodes(nodes): for node in nodes: status = utils.checkStatus(node) if status[0] == 0: print node + ": Already authorized" elif status[0] == 3: utils.updateToken(node) print "%s: Authorized" % (node) else: print "Unable to communicate with %s" % (node) exit(1)
def config_restore_remote(infile_name, infile_obj): extracted = { "version.txt": "", "corosync.conf": "", "cluster.conf": "", } try: tarball = tarfile.open(infile_name, "r|*", infile_obj) while True: # next(tarball) does not work in python2.6 tar_member_info = tarball.next() if tar_member_info is None: break if tar_member_info.name in extracted: tar_member = tarball.extractfile(tar_member_info) extracted[tar_member_info.name] = tar_member.read() tar_member.close() tarball.close() except (tarfile.TarError, EnvironmentError) as e: utils.err("unable to read the tarball: %s" % e) config_backup_check_version(extracted["version.txt"]) node_list = utils.getNodesFromCorosyncConf( extracted["cluster.conf" if utils.is_rhel6() else "corosync.conf"].decode("utf-8") ) if not node_list: utils.err("no nodes found in the tarball") err_msgs = [] for node in node_list: try: retval, output = utils.checkStatus(node) if retval != 0: err_msgs.append(output) continue status = json.loads(output) if status["corosync"] or status["pacemaker"] or status["cman"]: err_msgs.append( "Cluster is currently running on node %s. You need to stop " "the cluster in order to restore the configuration." % node ) continue except (ValueError, NameError): err_msgs.append("unable to determine status of the node %s" % node) if err_msgs: for msg in err_msgs: utils.err(msg, False) sys.exit(1) # Temporarily disable config files syncing thread in pcsd so it will not # rewrite restored files. 10 minutes should be enough time to restore. # If node returns HTTP 404 it does not support config syncing at all. for node in node_list: retval, output = utils.pauseConfigSyncing(node, 10 * 60) if not (retval == 0 or output.endswith("(HTTP error: 404)")): utils.err(output) if infile_obj: infile_obj.seek(0) tarball_data = infile_obj.read() else: with open(infile_name, "rb") as tarball: tarball_data = tarball.read() error_list = [] for node in node_list: retval, error = utils.restoreConfig(node, tarball_data) if retval != 0: error_list.append(error) if error_list: utils.err("unable to restore all nodes\n" + "\n".join(error_list))
def config_restore_remote(infile_name, infile_obj): extracted = { "version.txt": "", "corosync.conf": "", "cluster.conf": "", } try: tarball = tarfile.open(infile_name, "r|*", infile_obj) while True: tar_member_info = next(tarball) if tar_member_info is None: break if tar_member_info.name in extracted: tar_member = tarball.extractfile(tar_member_info) extracted[tar_member_info.name] = tar_member.read() tar_member.close() tarball.close() except (tarfile.TarError, EnvironmentError) as e: utils.err("unable to read the tarball: %s" % e) config_backup_check_version(extracted["version.txt"]) node_list = utils.getNodesFromCorosyncConf( extracted["cluster.conf" if utils.is_rhel6() else "corosync.conf"]) if not node_list: utils.err("no nodes found in the tarball") err_msgs = [] for node in node_list: try: retval, output = utils.checkStatus(node) if retval != 0: err_msgs.append(output) continue status = json.loads(output) if status["corosync"] or status["pacemaker"] or status["cman"]: err_msgs.append( "Cluster is currently running on node %s. You need to stop " "the cluster in order to restore the configuration." % node) continue except (ValueError, NameError): err_msgs.append("unable to determine status of the node %s" % node) if err_msgs: for msg in err_msgs: utils.err(msg, False) sys.exit(1) # Temporarily disable config files syncing thread in pcsd so it will not # rewrite restored files. 10 minutes should be enough time to restore. # If node returns HTTP 404 it does not support config syncing at all. for node in node_list: retval, output = utils.pauseConfigSyncing(node, 10 * 60) if not (retval == 0 or output.endswith("(HTTP error: 404)")): utils.err(output) if infile_obj: infile_obj.seek(0) tarball_data = infile_obj.read() else: with open(infile_name, "r") as tarball: tarball_data = tarball.read() error_list = [] for node in node_list: retval, error = utils.restoreConfig(node, tarball_data) if retval != 0: error_list.append(error) if error_list: utils.err("unable to restore all nodes\n" + "\n".join(error_list))