def node_pacemaker_status(): try: print( json.dumps(lib_pacemaker.get_local_node_status( utils.cmd_runner()))) except LibraryError as e: utils.process_library_reports(e.args)
def get_fence_agent_info(argv): if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") runner = utils.cmd_runner() try: metadata_dom = lib_ra.get_fence_agent_metadata( runner, agent.split("stonith:", 1)[1] ) metadata = lib_ra.get_agent_desc(metadata_dom) metadata["name"] = agent metadata["parameters"] = lib_ra.get_fence_agent_parameters( runner, metadata_dom ) print(json.dumps(metadata)) except lib_ra.ResourceAgentLibError as e: utils.process_library_reports( [lib_ra.resource_agent_lib_error_to_report_item(e)] ) except LibraryError as e: utils.process_library_reports(e.args)
def get_fence_agent_info(lib, argv, modifiers): """ Options: no options """ del lib modifiers.ensure_only_supported() if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") runner = utils.cmd_runner() try: metadata = lib_ra.StonithAgent(runner, agent[len("stonith:"):]) info = metadata.get_full_info() info["name"] = "stonith:{0}".format(info["name"]) print(json.dumps(info)) except lib_ra.ResourceAgentError as e: utils.process_library_reports( [lib_ra.resource_agent_error_to_report_item(e)]) except LibraryError as e: utils.process_library_reports(e.args)
def stonith_cmd(argv): if len(argv) < 1: sub_cmd, argv_next = "show", [] else: sub_cmd, argv_next = argv[0], argv[1:] lib = utils.get_library_wrapper() modifiers = utils.get_modifiers() try: if sub_cmd == "help": usage.stonith([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "list": stonith_list_available(lib, argv_next, modifiers) elif sub_cmd == "describe": stonith_list_options(lib, argv_next, modifiers) elif sub_cmd == "create": stonith_create(lib, argv_next, modifiers) elif sub_cmd == "update": if len(argv_next) > 1: stn_id = argv_next.pop(0) resource.resource_update(stn_id, argv_next) else: raise CmdLineInputError() elif sub_cmd == "delete": if len(argv_next) == 1: stn_id = argv_next.pop(0) resource.resource_remove(stn_id) else: raise CmdLineInputError() elif sub_cmd == "show": resource.resource_show(argv_next, True) levels = stonith_level_config_to_str( lib.fencing_topology.get_config()) if levels: print("\n".join(indent(levels, 1))) elif sub_cmd == "level": stonith_level_cmd(lib, argv_next, modifiers) elif sub_cmd == "fence": stonith_fence(argv_next) elif sub_cmd == "cleanup": resource.resource_cleanup(argv_next) elif sub_cmd == "refresh": resource.resource_refresh(argv_next) elif sub_cmd == "confirm": stonith_confirm(argv_next) elif sub_cmd == "get_fence_agent_info": get_fence_agent_info(argv_next) elif sub_cmd == "sbd": sbd_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": resource.resource_enable_cmd(lib, argv_next, modifiers) elif sub_cmd == "disable": resource.resource_disable_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "stonith", sub_cmd)
def acl_cmd(lib, argv, modifiers): if len(argv) < 1: sub_cmd, argv_next = "show", [] else: sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.acl(argv_next) elif sub_cmd == "show": show_acl_config(lib, argv_next, modifiers) elif sub_cmd == "enable": acl_enable(argv_next) elif sub_cmd == "disable": acl_disable(argv_next) elif sub_cmd == "role": acl_role(lib, argv_next, modifiers) elif sub_cmd in ["target", "user"]: acl_user(lib, argv_next, modifiers) elif sub_cmd == "group": acl_group(lib, argv_next, modifiers) elif sub_cmd == "permission": acl_permission(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "acl", sub_cmd)
def booth_cmd(lib, argv, modifiers): """ routes booth command """ if len(argv) < 1: usage.booth() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.booth(argv) elif sub_cmd == "config": command.config_show(lib, argv_next, modifiers) elif sub_cmd == "setup": command.config_setup(lib, argv_next, modifiers) elif sub_cmd == "destroy": command.config_destroy(lib, argv_next, modifiers) elif sub_cmd == "ticket": if len(argv_next) < 1: raise CmdLineInputError() if argv_next[0] == "add": command.config_ticket_add(lib, argv_next[1:], modifiers) elif argv_next[0] == "remove": command.config_ticket_remove(lib, argv_next[1:], modifiers) elif argv_next[0] == "grant": command.ticket_grant(lib, argv_next[1:], modifiers) elif argv_next[0] == "revoke": command.ticket_revoke(lib, argv_next[1:], modifiers) else: raise CmdLineInputError() elif sub_cmd == "create": command.get_create_in_cluster(resource_create, resource_remove)(lib, argv_next, modifiers) elif sub_cmd == "remove": command.get_remove_from_cluster(resource_remove)(lib, argv_next, modifiers) elif sub_cmd == "restart": command.get_restart(resource_restart)(lib, argv_next, modifiers) elif sub_cmd == "sync": command.sync(lib, argv_next, modifiers) elif sub_cmd == "pull": command.pull(lib, argv_next, modifiers) elif sub_cmd == "enable": command.enable(lib, argv_next, modifiers) elif sub_cmd == "disable": command.disable(lib, argv_next, modifiers) elif sub_cmd == "start": command.start(lib, argv_next, modifiers) elif sub_cmd == "stop": command.stop(lib, argv_next, modifiers) elif sub_cmd == "status": command.status(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "booth", sub_cmd)
def qdevice_cmd(lib, argv, modifiers): if len(argv) < 1: usage.qdevice() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.qdevice(argv) elif sub_cmd == "setup": qdevice_setup_cmd(lib, argv_next, modifiers) elif sub_cmd == "destroy": qdevice_destroy_cmd(lib, argv_next, modifiers) elif sub_cmd == "start": qdevice_start_cmd(lib, argv_next, modifiers) elif sub_cmd == "stop": qdevice_stop_cmd(lib, argv_next, modifiers) elif sub_cmd == "kill": qdevice_kill_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": qdevice_enable_cmd(lib, argv_next, modifiers) elif sub_cmd == "disable": qdevice_disable_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "qdevice", sub_cmd)
def config_show(lib, argv, modifiers): """ Options: * -f - CIB file, when getting cluster name on remote node (corosync.conf doesn't exist) * --corosync_conf - corosync.conf file """ modifiers.ensure_only_supported("-f", "--corosync_conf") if argv: raise CmdLineInputError() print("Cluster Name: %s" % utils.getClusterName()) status.nodes_status(lib, ["config"], modifiers.get_subset("-f")) print() print("\n".join(_config_show_cib_lines(lib))) if (utils.hasCorosyncConf() and not modifiers.is_specified("-f") and not modifiers.is_specified("--corosync_conf")): cluster.cluster_uidgid(lib, [], modifiers.get_subset(), silent_list=True) if (modifiers.is_specified("--corosync_conf") or utils.hasCorosyncConf()): print() print("Quorum:") try: config = lib_quorum.get_config(utils.get_lib_env()) print("\n".join(indent(quorum.quorum_config_to_str(config)))) except LibraryError as e: utils.process_library_reports(e.args)
def node_standby(argv, standby=True): if (len(argv) > 1) or (len(argv) > 0 and "--all" in utils.pcs_options): usage.node(["standby" if standby else "unstandby"]) sys.exit(1) all_nodes = "--all" in utils.pcs_options node_list = [argv[0]] if argv else [] wait = False timeout = None if "--wait" in utils.pcs_options: wait = True timeout = utils.pcs_options["--wait"] try: if wait: lib_pacemaker.ensure_resource_wait_support(utils.cmd_runner()) valid_timeout = get_valid_timeout_seconds(timeout) if standby: lib_pacemaker.nodes_standby(utils.cmd_runner(), node_list, all_nodes) else: lib_pacemaker.nodes_unstandby(utils.cmd_runner(), node_list, all_nodes) if wait: lib_pacemaker.wait_for_resources(utils.cmd_runner(), valid_timeout) except LibraryError as e: utils.process_library_reports(e.args)
def node_cmd(lib, argv, modifiers): if len(argv) < 1: usage.node() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.node(argv) elif sub_cmd == "maintenance": node_maintenance_cmd(lib, argv_next, modifiers, True) elif sub_cmd == "unmaintenance": node_maintenance_cmd(lib, argv_next, modifiers, False) elif sub_cmd == "standby": node_standby_cmd(lib, argv_next, modifiers, True) elif sub_cmd == "unstandby": node_standby_cmd(lib, argv_next, modifiers, False) elif sub_cmd == "attribute": node_attribute_cmd(lib, argv_next, modifiers) elif sub_cmd == "utilization": node_utilization_cmd(lib, argv_next, modifiers) # pcs-to-pcsd use only elif sub_cmd == "pacemaker-status": node_pacemaker_status(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "node", sub_cmd)
def config_show(argv): print("Cluster Name: %s" % utils.getClusterName()) status.nodes_status(["config"]) print() config_show_cib() if ( utils.hasCorosyncConf() and ( utils.is_rhel6() or (not utils.usefile and "--corosync_conf" not in utils.pcs_options) ) ): # with corosync 1 and cman, uid gid is part of cluster.conf file # with corosync 2, uid gid is in a separate directory cluster.cluster_uidgid([], True) if ( "--corosync_conf" in utils.pcs_options or (not utils.is_rhel6() and utils.hasCorosyncConf()) ): print() print("Quorum:") try: config = lib_quorum.get_config(utils.get_lib_env()) print("\n".join(indent(quorum.quorum_config_to_str(config)))) except LibraryError as e: utils.process_library_reports(e.args)
def alert_cmd(*args): argv = args[1] if not argv: sub_cmd = "config" else: sub_cmd = argv.pop(0) try: if sub_cmd == "help": usage.alert(argv) elif sub_cmd == "create": alert_add(*args) elif sub_cmd == "update": alert_update(*args) elif sub_cmd == "remove": alert_remove(*args) elif sub_cmd == "config" or sub_cmd == "show": print_alert_config(*args) elif sub_cmd == "recipient": recipient_cmd(*args) elif sub_cmd == "get_all_alerts": print_alerts_in_json(*args) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "alert", sub_cmd)
def get_fence_agent_info(lib, argv, modifiers): """ Options: no options """ del lib modifiers.ensure_only_supported() if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") runner = utils.cmd_runner() try: metadata = lib_ra.StonithAgent(runner, agent[len("stonith:"):]) info = metadata.get_full_info() info["name"] = "stonith:{0}".format(info["name"]) print(json.dumps(info)) except lib_ra.ResourceAgentError as e: utils.process_library_reports( [lib_ra.resource_agent_error_to_report_item(e)] ) except LibraryError as e: utils.process_library_reports(e.args)
def acl_cmd(lib, argv, modifiers): if len(argv) < 1: sub_cmd, argv_next = "show", [] else: sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.acl(argv_next) elif sub_cmd == "show": show_acl_config(lib, argv_next, modifiers) elif sub_cmd == "enable": acl_enable(argv_next) elif sub_cmd == "disable": acl_disable(argv_next) elif sub_cmd == "role": acl_role(lib, argv_next, modifiers) elif sub_cmd in ["target", "user"]: acl_user(lib, argv_next, modifiers) elif sub_cmd == "group": acl_group(lib, argv_next, modifiers) elif sub_cmd == "permission": acl_permission(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "acl", sub_cmd)
def quorum_cmd(lib, argv, modifiers): if not argv: sub_cmd, argv_next = "config", [] else: sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.quorum([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "config": quorum_config_cmd(lib, argv_next, modifiers) elif sub_cmd == "expected-votes": quorum_expected_votes_cmd(lib, argv_next, modifiers) elif sub_cmd == "status": quorum_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "device": quorum_device_cmd(lib, argv_next, modifiers) elif sub_cmd == "unblock": # TODO switch to new architecture quorum_unblock_cmd(lib, argv_next, modifiers) elif sub_cmd == "update": quorum_update_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "quorum", sub_cmd)
def node_cmd(lib, argv, modifiers): if not argv: usage.node() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.node([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "maintenance": node_maintenance_cmd(lib, argv_next, modifiers, True) elif sub_cmd == "unmaintenance": node_maintenance_cmd(lib, argv_next, modifiers, False) elif sub_cmd == "standby": node_standby_cmd(lib, argv_next, modifiers, True) elif sub_cmd == "unstandby": node_standby_cmd(lib, argv_next, modifiers, False) elif sub_cmd == "attribute": node_attribute_cmd(lib, argv_next, modifiers) elif sub_cmd == "utilization": node_utilization_cmd(lib, argv_next, modifiers) # pcs-to-pcsd use only elif sub_cmd == "pacemaker-status": node_pacemaker_status(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "node", sub_cmd)
def quorum_cmd(lib, argv, modificators): if len(argv) < 1: sub_cmd, argv_next = "config", [] else: sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.quorum(argv) elif sub_cmd == "config": quorum_config_cmd(lib, argv_next, modificators) elif sub_cmd == "expected-votes": quorum_expected_votes_cmd(lib, argv_next, modificators) elif sub_cmd == "status": quorum_status_cmd(lib, argv_next, modificators) elif sub_cmd == "device": quorum_device_cmd(lib, argv_next, modificators) elif sub_cmd == "unblock": # TODO switch to new architecture quorum_unblock_cmd(argv_next) elif sub_cmd == "update": quorum_update_cmd(lib, argv_next, modificators) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "quorum", sub_cmd)
def alert_cmd(*args): argv = args[1] if not argv: sub_cmd = "config" else: sub_cmd = argv.pop(0) try: if sub_cmd == "help": usage.alert(argv) elif sub_cmd == "create": alert_add(*args) elif sub_cmd == "update": alert_update(*args) elif sub_cmd == "remove": alert_remove(*args) elif sub_cmd == "config" or sub_cmd == "show": print_alert_config(*args) elif sub_cmd == "recipient": recipient_cmd(*args) elif sub_cmd == "get_all_alerts": print_alerts_in_json(*args) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "alert", sub_cmd)
def status_cmd(lib, argv, modifiers): if len(argv) < 1: full_status() sys.exit(0) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.status(argv_next) elif sub_cmd == "booth": booth_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "corosync": corosync_status() elif sub_cmd == "cluster": cluster_status(argv_next) elif sub_cmd == "groups": resource.resource_group_list(argv_next) elif sub_cmd == "nodes": nodes_status(argv_next) elif sub_cmd == "pcsd": cluster_pcsd_status(argv_next) elif sub_cmd == "qdevice": qdevice_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "quorum": quorum_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "resources": resource.resource_show(argv_next) elif sub_cmd == "xml": xml_status() else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "status", sub_cmd)
def node_pacemaker_status(): try: print(json.dumps( lib_pacemaker.get_local_node_status(utils.cmd_runner()) )) except LibraryError as e: utils.process_library_reports(e.args)
def node_standby(argv, standby=True): if (len(argv) > 1) or (len(argv) > 0 and "--all" in utils.pcs_options): usage.node(["standby" if standby else "unstandby"]) sys.exit(1) all_nodes = "--all" in utils.pcs_options node_list = [argv[0]] if argv else [] wait = False timeout = None if "--wait" in utils.pcs_options: wait = True timeout = utils.pcs_options["--wait"] try: if wait: lib_pacemaker.ensure_resource_wait_support(utils.cmd_runner()) valid_timeout = get_valid_timeout_seconds(timeout) if standby: lib_pacemaker.nodes_standby( utils.cmd_runner(), node_list, all_nodes ) else: lib_pacemaker.nodes_unstandby( utils.cmd_runner(), node_list, all_nodes ) if wait: lib_pacemaker.wait_for_resources(utils.cmd_runner(), valid_timeout) except LibraryError as e: utils.process_library_reports(e.args)
def config_show(argv): print("Cluster Name: %s" % utils.getClusterName()) status.nodes_status(["config"]) print() config_show_cib() if ( utils.hasCorosyncConf() and ( utils.is_rhel6() or (not utils.usefile and "--corosync_conf" not in utils.pcs_options) ) ): # with corosync 1 and cman, uid gid is part of cluster.conf file # with corosync 2, uid gid is in a separate directory cluster.cluster_uidgid([], True) if ( "--corosync_conf" in utils.pcs_options or (not utils.is_rhel6() and utils.hasCorosyncConf()) ): print() print("Quorum:") try: config = lib_quorum.get_config(utils.get_lib_env()) print("\n".join(indent(quorum.quorum_config_to_str(config)))) except LibraryError as e: utils.process_library_reports(e.args)
def quorum_unblock_cmd(lib, argv, modifiers): """ Options: * --force - no error when removing non existing property and no warning about this action """ modifiers.ensure_only_supported("--force") if argv: raise CmdLineInputError() output, retval = utils.run( ["corosync-cmapctl", "-g", "runtime.votequorum.wait_for_all_status"] ) if retval != 0: utils.err("unable to check quorum status") if output.split("=")[-1].strip() != "1": utils.err("cluster is not waiting for nodes to establish quorum") all_nodes, report_list = get_existing_nodes_names( utils.get_corosync_conf_facade() ) if report_list: utils.process_library_reports(report_list) unjoined_nodes = set(all_nodes) - set(utils.getCorosyncActiveNodes()) if not unjoined_nodes: utils.err("no unjoined nodes found") if not modifiers.get("--force"): answer = utils.get_terminal_input( ( "WARNING: If node(s) {nodes} are not powered off or they do" + " have access to shared resources, data corruption and/or" + " cluster failure may occur. Are you sure you want to" + " continue? [y/N] " ).format(nodes=", ".join(unjoined_nodes)) ) if answer.lower() not in ["y", "yes"]: print("Canceled") return for node in unjoined_nodes: # pass --force so no warning will be displayed stonith.stonith_confirm( lib, [node], parse_args.InputModifiers({"--force": ""}) ) output, retval = utils.run( ["corosync-cmapctl", "-s", "quorum.cancel_wait_for_all", "u8", "1"] ) if retval != 0: utils.err("unable to cancel waiting for nodes") print("Quorum unblocked") startup_fencing = utils.get_set_properties().get("startup-fencing", "") utils.set_cib_property( "startup-fencing", "false" if startup_fencing.lower() != "false" else "true" ) utils.set_cib_property("startup-fencing", startup_fencing) print("Waiting for nodes canceled")
def stonith_cmd(argv): if len(argv) < 1: sub_cmd, argv_next = "show", [] else: sub_cmd, argv_next = argv[0], argv[1:] lib = utils.get_library_wrapper() modifiers = utils.get_modificators() try: if sub_cmd == "help": usage.stonith(argv) elif sub_cmd == "list": stonith_list_available(lib, argv_next, modifiers) elif sub_cmd == "describe": stonith_list_options(lib, argv_next, modifiers) elif sub_cmd == "create": stonith_create(lib, argv_next, modifiers) elif sub_cmd == "update": if len(argv_next) > 1: stn_id = argv_next.pop(0) resource.resource_update(stn_id, argv_next) else: raise CmdLineInputError() elif sub_cmd == "delete": if len(argv_next) == 1: stn_id = argv_next.pop(0) resource.resource_remove(stn_id) else: raise CmdLineInputError() elif sub_cmd == "show": resource.resource_show(argv_next, True) levels = stonith_level_config_to_str( lib.fencing_topology.get_config() ) if levels: print("\n".join(indent(levels, 1))) elif sub_cmd == "level": stonith_level_cmd(lib, argv_next, modifiers) elif sub_cmd == "fence": stonith_fence(argv_next) elif sub_cmd == "cleanup": resource.resource_cleanup(argv_next) elif sub_cmd == "confirm": stonith_confirm(argv_next) elif sub_cmd == "get_fence_agent_info": get_fence_agent_info(argv_next) elif sub_cmd == "sbd": sbd_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": resource.resource_enable(argv_next) elif sub_cmd == "disable": resource.resource_disable(argv_next) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "stonith", sub_cmd)
def quorum_unblock_cmd(lib, argv, modifiers): """ Options: * --force - no error when removing non existing property and no warning about this action """ modifiers.ensure_only_supported("--force") if argv: raise CmdLineInputError() output, retval = utils.run( ["corosync-cmapctl", "-g", "runtime.votequorum.wait_for_all_status"] ) if retval != 0: utils.err("unable to check quorum status") if output.split("=")[-1].strip() != "1": utils.err("cluster is not waiting for nodes to establish quorum") all_nodes, report_list = get_existing_nodes_names( utils.get_corosync_conf_facade() ) if report_list: utils.process_library_reports(report_list) unjoined_nodes = set(all_nodes) - set(utils.getCorosyncActiveNodes()) if not unjoined_nodes: utils.err("no unjoined nodes found") if modifiers.get("--force"): answer = utils.get_terminal_input( ( "WARNING: If node(s) {nodes} are not powered off or they do" + " have access to shared resources, data corruption and/or" + " cluster failure may occur. Are you sure you want to" + " continue? [y/N] " ).format(nodes=", ".join(unjoined_nodes)) ) if answer.lower() not in ["y", "yes"]: print("Canceled") return for node in unjoined_nodes: # pass --force so no warning will be displayed stonith.stonith_confirm( lib, [node], parse_args.InputModifiers({"--force": ""}) ) output, retval = utils.run( ["corosync-cmapctl", "-s", "quorum.cancel_wait_for_all", "u8", "1"] ) if retval != 0: utils.err("unable to cancel waiting for nodes") print("Quorum unblocked") startup_fencing = utils.get_set_properties().get("startup-fencing", "") utils.set_cib_property( "startup-fencing", "false" if startup_fencing.lower() != "false" else "true" ) utils.set_cib_property("startup-fencing", startup_fencing) print("Waiting for nodes canceled")
def booth_cmd(lib, argv, modifiers): """ routes booth command """ if len(argv) < 1: usage.booth() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.booth(argv) elif sub_cmd == "config": command.config_show(lib, argv_next, modifiers) elif sub_cmd == "setup": command.config_setup(lib, argv_next, modifiers) elif sub_cmd == "destroy": command.config_destroy(lib, argv_next, modifiers) elif sub_cmd == "ticket": if len(argv_next) < 1: raise CmdLineInputError() if argv_next[0] == "add": command.config_ticket_add(lib, argv_next[1:], modifiers) elif argv_next[0] == "remove": command.config_ticket_remove(lib, argv_next[1:], modifiers) elif argv_next[0] == "grant": command.ticket_grant(lib, argv_next[1:], modifiers) elif argv_next[0] == "revoke": command.ticket_revoke(lib, argv_next[1:], modifiers) else: raise CmdLineInputError() elif sub_cmd == "create": command.get_create_in_cluster(resource_create)( lib, argv_next, modifiers ) elif sub_cmd == "remove": command.get_remove_from_cluster(resource_remove)( lib, argv_next, modifiers ) elif sub_cmd == "sync": command.sync(lib, argv_next, modifiers) elif sub_cmd == "pull": command.pull(lib, argv_next, modifiers) elif sub_cmd == "enable": command.enable(lib, argv_next, modifiers) elif sub_cmd == "disable": command.disable(lib, argv_next, modifiers) elif sub_cmd == "start": command.start(lib, argv_next, modifiers) elif sub_cmd == "stop": command.stop(lib, argv_next, modifiers) elif sub_cmd == "status": command.status(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "booth", sub_cmd)
def stonith_cmd(lib, argv, modifiers): if argv: sub_cmd, argv_next = argv[0], argv[1:] else: sub_cmd, argv_next = "status", [] try: if sub_cmd == "help": usage.stonith([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "list": stonith_list_available(lib, argv_next, modifiers) elif sub_cmd == "describe": stonith_list_options(lib, argv_next, modifiers) elif sub_cmd == "create": stonith_create(lib, argv_next, modifiers) elif sub_cmd == "update": resource.resource_update(lib, argv_next, modifiers) elif sub_cmd in {"delete", "remove"}: resource.resource_remove_cmd(lib, argv_next, modifiers) # TODO remove, deprecated command # replaced with 'stonith status' and 'stonith config' elif sub_cmd == "show": resource.resource_show(lib, argv_next, modifiers, stonith=True) print_stonith_levels(lib) elif sub_cmd == "status": resource.resource_status(lib, argv_next, modifiers, stonith=True) print_stonith_levels(lib) elif sub_cmd == "config": resource.resource_config(lib, argv_next, modifiers, stonith=True) print_stonith_levels(lib) elif sub_cmd == "level": stonith_level_cmd(lib, argv_next, modifiers) elif sub_cmd == "fence": stonith_fence(lib, argv_next, modifiers) elif sub_cmd == "cleanup": resource.resource_cleanup(lib, argv_next, modifiers) elif sub_cmd == "refresh": resource.resource_refresh(lib, argv_next, modifiers) elif sub_cmd == "confirm": stonith_confirm(lib, argv_next, modifiers) elif sub_cmd == "get_fence_agent_info": get_fence_agent_info(lib, argv_next, modifiers) elif sub_cmd == "sbd": sbd_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": resource.resource_enable_cmd(lib, argv_next, modifiers) elif sub_cmd == "disable": resource.resource_disable_cmd(lib, argv_next, modifiers) elif sub_cmd == "history": stonith_history_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "stonith", sub_cmd)
def stonith_cmd(argv): lib = utils.get_library_wrapper() modifiers = utils.get_modificators() if len(argv) == 0: argv = ["show"] sub_cmd = argv.pop(0) try: if (sub_cmd == "help"): usage.stonith(argv) elif (sub_cmd == "list"): stonith_list_available(argv) elif (sub_cmd == "describe"): if len(argv) == 1: stonith_list_options(argv[0]) else: raise CmdLineInputError() elif (sub_cmd == "create"): stonith_create(argv) elif (sub_cmd == "update"): if len(argv) > 1: stn_id = argv.pop(0) resource.resource_update(stn_id,argv) else: raise CmdLineInputError() elif (sub_cmd == "delete"): if len(argv) == 1: stn_id = argv.pop(0) resource.resource_remove(stn_id) else: raise CmdLineInputError() elif (sub_cmd == "show"): resource.resource_show(argv, True) stonith_level([]) elif (sub_cmd == "level"): stonith_level(argv) elif (sub_cmd == "fence"): stonith_fence(argv) elif (sub_cmd == "cleanup"): resource.resource_cleanup(argv) elif (sub_cmd == "confirm"): stonith_confirm(argv) elif (sub_cmd == "get_fence_agent_info"): get_fence_agent_info(argv) elif (sub_cmd == "sbd"): sbd_cmd(lib, argv, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "stonith", sub_cmd)
def stonith_cmd(argv): if len(argv) == 0: argv = ["show"] sub_cmd = argv.pop(0) if (sub_cmd == "help"): usage.stonith(argv) elif (sub_cmd == "list"): stonith_list_available(argv) elif (sub_cmd == "describe"): if len(argv) == 1: stonith_list_options(argv[0]) else: usage.stonith() sys.exit(1) elif (sub_cmd == "create"): stonith_create(argv) elif (sub_cmd == "update"): if len(argv) > 1: stn_id = argv.pop(0) resource.resource_update(stn_id,argv) else: usage.stonith(["update"]) sys.exit(1) elif (sub_cmd == "delete"): if len(argv) == 1: stn_id = argv.pop(0) resource.resource_remove(stn_id) else: usage.stonith(["delete"]) sys.exit(1) elif (sub_cmd == "show"): resource.resource_show(argv, True) stonith_level([]) elif (sub_cmd == "level"): stonith_level(argv) elif (sub_cmd == "fence"): stonith_fence(argv) elif (sub_cmd == "cleanup"): try: resource.resource_cleanup(argv) except utils.CmdLineInputError as e: exit_on_cmdline_input_errror('cleanup') except LibraryError as e: utils.process_library_reports(e.args) elif (sub_cmd == "confirm"): stonith_confirm(argv) elif (sub_cmd == "get_fence_agent_info"): get_fence_agent_info(argv) else: usage.stonith() sys.exit(1)
def stonith_list_options(stonith_agent): runner = utils.cmd_runner() try: metadata = lib_ra.get_fence_agent_metadata(runner, stonith_agent) desc = lib_ra.get_agent_desc(metadata) params = lib_ra.get_fence_agent_parameters(runner, metadata) resource.resource_print_options(stonith_agent, desc, params) except lib_ra.ResourceAgentLibError as e: utils.process_library_reports( [lib_ra.resource_agent_lib_error_to_report_item(e)] ) except LibraryError as e: utils.process_library_reports(e.args)
def stonith_cmd(argv): if len(argv) < 1: sub_cmd, argv_next = "show", [] else: sub_cmd, argv_next = argv[0], argv[1:] lib = utils.get_library_wrapper() modifiers = utils.get_modificators() try: if sub_cmd == "help": usage.stonith(argv) elif sub_cmd == "list": stonith_list_available(lib, argv_next, modifiers) elif sub_cmd == "describe": stonith_list_options(lib, argv_next, modifiers) elif sub_cmd == "create": stonith_create(argv_next) elif sub_cmd == "update": if len(argv_next) > 1: stn_id = argv_next.pop(0) resource.resource_update(stn_id, argv_next) else: raise CmdLineInputError() elif sub_cmd == "delete": if len(argv_next) == 1: stn_id = argv_next.pop(0) resource.resource_remove(stn_id) else: raise CmdLineInputError() elif sub_cmd == "show": resource.resource_show(argv_next, True) stonith_level([]) elif sub_cmd == "level": stonith_level(argv_next) elif sub_cmd == "fence": stonith_fence(argv_next) elif sub_cmd == "cleanup": resource.resource_cleanup(argv_next) elif sub_cmd == "confirm": stonith_confirm(argv_next) elif sub_cmd == "get_fence_agent_info": get_fence_agent_info(argv_next) elif sub_cmd == "sbd": sbd_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "stonith", sub_cmd)
def config_show(argv): print("Cluster Name: %s" % utils.getClusterName()) status.nodes_status(["config"]) print() config_show_cib() cluster.cluster_uidgid([], True) if "--corosync_conf" in utils.pcs_options or not utils.is_rhel6(): print() print("Quorum:") try: config = lib_quorum.get_config(utils.get_lib_env()) print("\n".join(indent(quorum.quorum_config_to_str(config)))) except LibraryError as e: utils.process_library_reports(e.args)
def client_cmd(lib, argv, modifiers): if not argv: utils.exit_on_cmdline_input_errror(None, "client", "") sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "local-auth": local_auth_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "client", sub_cmd)
def stonith_list_available(argv): if len(argv) != 0: filter_string = argv[0] else: filter_string = "" bad_fence_devices = ["kdump_send", "legacy", "na", "nss_wrapper", "pcmk", "vmware_helper", "ack_manual", "virtd", "sanlockd", "check", "tool", "node"] fence_devices = sorted(glob.glob(utils.fence_bin + "fence_*")) for bfd in bad_fence_devices: try: fence_devices.remove(utils.fence_bin + "fence_"+bfd) except ValueError: continue if not fence_devices: utils.err( "No stonith agents available. Do you have fence agents installed?" ) fence_devices_filtered = [fd for fd in fence_devices if filter_string in fd] if not fence_devices_filtered: utils.err("No stonith agents matching the filter.") for fd in fence_devices_filtered: sd = "" agent_name = os.path.basename(fd) if "--nodesc" not in utils.pcs_options: try: metadata = lib_ra.get_fence_agent_metadata( utils.cmd_runner(), agent_name ) shortdesc = lib_ra.get_agent_desc(metadata)["shortdesc"] if shortdesc: sd = " - " + resource.format_desc( len(agent_name) + 3, shortdesc ) except lib_ra.ResourceAgentLibError as e: utils.process_library_reports([ lib_ra.resource_agent_lib_error_to_report_item( e, ReportItemSeverity.WARNING ) ]) except LibraryError as e: utils.err( e.args[-1].message, False ) continue print(agent_name + sd)
def stonith_list_options(stonith_agent): runner = utils.cmd_runner() try: metadata = lib_ra.get_fence_agent_metadata(runner, stonith_agent) desc = lib_ra.get_agent_desc(metadata) params = lib_ra.get_fence_agent_parameters(runner, metadata) # Fence agents just list the actions, usually without any attributes. # We could print them but it wouldn't add any usefull information. resource.resource_print_options(stonith_agent, desc, params, actions=[]) except lib_ra.ResourceAgentLibError as e: utils.process_library_reports( [lib_ra.resource_agent_lib_error_to_report_item(e)] ) except LibraryError as e: utils.process_library_reports(e.args)
def status_cmd(argv): if len(argv) == 0: full_status() sys.exit(0) sub_cmd = argv.pop(0) if (sub_cmd == "help"): usage.status(argv) elif (sub_cmd == "resources"): resource.resource_show(argv) elif (sub_cmd == "groups"): resource.resource_group_list(argv) elif (sub_cmd == "cluster"): cluster_status(argv) elif (sub_cmd == "nodes"): nodes_status(argv) elif (sub_cmd == "pcsd"): cluster_pcsd_status(argv) elif (sub_cmd == "xml"): xml_status() elif (sub_cmd == "corosync"): corosync_status() elif sub_cmd == "qdevice": try: qdevice_status_cmd( utils.get_library_wrapper(), argv, utils.get_modificators() ) except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "status", sub_cmd) elif sub_cmd == "quorum": try: quorum_status_cmd( utils.get_library_wrapper(), argv, utils.get_modificators() ) except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "status", sub_cmd) else: usage.status() sys.exit(1)
def qdevice_net_client_cmd(lib, argv, modifiers): if len(argv) < 1: utils.err("invalid command") sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "setup": qdevice_net_client_setup_cmd(lib, argv_next, modifiers) elif sub_cmd == "import-certificate": qdevice_net_client_import_certificate_cmd(lib, argv_next, modifiers) elif sub_cmd == "destroy": qdevice_net_client_destroy(lib, argv_next, modifiers) else: raise CmdLineInputError("invalid command") except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.err(e.message)
def _router(lib, argv, modifiers): if argv: sub_cmd, *argv_next = argv else: if default_cmd is None: raise CmdLineInputError() sub_cmd, argv_next = default_cmd, [] try: if sub_cmd not in cmd_map: sub_cmd = "" raise CmdLineInputError() return cmd_map[sub_cmd](lib, argv_next, modifiers) except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror( e, usage_sub_cmd[0], " ".join(usage_sub_cmd[1:] + [sub_cmd]))
def config_cmd(lib, argv, modifiers): if len(argv) == 0: config_show(lib, argv, modifiers) return try: sub_cmd = argv.pop(0) if sub_cmd == "help": usage.config(argv) elif sub_cmd == "show": config_show(lib, argv, modifiers) elif sub_cmd == "backup": config_backup(lib, argv, modifiers) elif sub_cmd == "restore": config_restore(lib, argv, modifiers) elif sub_cmd == "checkpoint": if not argv: config_checkpoint_list(lib, argv, modifiers) elif argv[0] == "view": config_checkpoint_view(lib, argv[1:], modifiers) elif argv[0] == "restore": config_checkpoint_restore(lib, argv[1:], modifiers) else: raise CmdLineInputError() elif sub_cmd == "import-cman": config_import_cman(lib, argv, modifiers) elif sub_cmd == "export": if not argv: raise CmdLineInputError() elif argv[0] == "pcs-commands": config_export_pcs_commands(lib, argv[1:], modifiers) elif argv[0] == "pcs-commands-verbose": config_export_pcs_commands(lib, argv[1:], modifiers, verbose=True) else: raise CmdLineInputError() else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "config", sub_cmd)
def qdevice_net_client_cmd(lib, argv, modifiers): if len(argv) < 1: utils.err("invalid command") sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "setup": qdevice_net_client_setup_cmd(lib, argv_next, modifiers) elif sub_cmd == "import-certificate": qdevice_net_client_import_certificate_cmd(lib, argv_next, modifiers) elif sub_cmd == "destroy": qdevice_net_client_destroy(lib, argv_next, modifiers) else: raise CmdLineInputError("invalid command") except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.err(e.message)
def host_cmd(lib, argv, modifiers): if len(argv) < 1: utils.exit_on_cmdline_input_errror(None, "host", "") else: sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.host([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "auth": auth_cmd(lib, argv_next, modifiers) elif sub_cmd == "deauth": deauth_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "host", sub_cmd)
def acl_permission(argv): if len(argv) < 1: usage.acl(["permission"]) sys.exit(1) command = argv.pop(0) if command == "add": try: run_permission_add(argv) except utils.CmdLineInputError as e: exit_on_cmdline_input_errror('permission add') except LibraryError as e: utils.process_library_reports(e.args) elif command == "delete": run_permission_delete(argv) else: usage.acl(["permission"]) sys.exit(1)
def cluster_pcsd_status(lib, argv, modifiers, dont_exit=False): """ Options: * --request-timeout - HTTP timeout for node authorization check """ del lib modifiers.ensure_only_supported("--request-timeout") bad_nodes = False if not argv: nodes, report_list = get_existing_nodes_names( utils.get_corosync_conf_facade()) if not nodes and not dont_exit: report_list.append(reports.corosync_config_no_nodes_defined()) if report_list: utils.process_library_reports(report_list) bad_nodes = check_nodes(nodes, " ") else: bad_nodes = check_nodes(argv, " ") if bad_nodes and not dont_exit: sys.exit(2)
def get_fence_agent_info(argv): # This is used only by pcsd, will be removed in new architecture if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") runner = utils.cmd_runner() try: metadata = lib_ra.StonithAgent(runner, agent[len("stonith:"):]) info = metadata.get_full_info() info["name"] = "stonith:{0}".format(info["name"]) print(json.dumps(info)) except lib_ra.ResourceAgentError as e: utils.process_library_reports( [lib_ra.resource_agent_error_to_report_item(e)]) except LibraryError as e: utils.process_library_reports(e.args)
def pcsd_cmd(lib, argv, modifiers): if len(argv) < 1: usage.pcsd() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.pcsd(argv_next) elif sub_cmd == "deauth": pcsd_deauth(lib, argv_next, modifiers) elif sub_cmd == "certkey": pcsd_certkey(lib, argv_next, modifiers) elif sub_cmd == "sync-certificates": pcsd_sync_certs(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "pcsd", sub_cmd)
def get_fence_agent_info(argv): if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") try: metadata_dom = lib_ra.get_fence_agent_metadata( agent.split("stonith:", 1)[1] ) metadata = lib_ra.get_agent_desc(metadata_dom) metadata["name"] = agent metadata["parameters"] = lib_ra.get_fence_agent_parameters( metadata_dom ) print(json.dumps(metadata)) except lib_ra.LibraryError as e: utils.process_library_reports(e.args)
def property_cmd(lib, argv, modifiers): if not argv: argv = ["list"] try: sub_cmd = argv.pop(0) if sub_cmd == "help": usage.property(argv) elif sub_cmd == "set": set_property(lib, argv, modifiers) elif sub_cmd == "unset": unset_property(lib, argv, modifiers) elif sub_cmd in ("list", "show"): list_property(lib, argv, modifiers) elif sub_cmd == "get_cluster_properties_definition": print_cluster_properties_definition(lib, argv, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "property", sub_cmd)
def stonith_create(argv): if len(argv) < 2: usage.stonith(["create"]) sys.exit(1) stonith_id = argv.pop(0) stonith_type = argv.pop(0) st_values, op_values, meta_values = resource.parse_resource_options( argv, with_clone=False ) try: metadata = lib_ra.StonithAgent( utils.cmd_runner(), stonith_type ) if metadata.get_provides_unfencing(): meta_values = [ meta for meta in meta_values if not meta.startswith("provides=") ] meta_values.append("provides=unfencing") except lib_ra.ResourceAgentError as e: forced = utils.get_modificators().get("force", False) if forced: severity = ReportItemSeverity.WARNING else: severity = ReportItemSeverity.ERROR utils.process_library_reports([ lib_ra.resource_agent_error_to_report_item( e, severity, not forced ) ]) except LibraryError as e: utils.process_library_reports(e.args) resource.resource_create( stonith_id, "stonith:" + stonith_type, st_values, op_values, meta_values, group=utils.pcs_options.get("--group", None) )
def get_fence_agent_info(argv): # This is used only by pcsd, will be removed in new architecture if len(argv) != 1: utils.err("One parameter expected") agent = argv[0] if not agent.startswith("stonith:"): utils.err("Invalid fence agent name") runner = utils.cmd_runner() try: metadata = lib_ra.StonithAgent(runner, agent[len("stonith:"):]) info = metadata.get_full_info() info["name"] = "stonith:{0}".format(info["name"]) print(json.dumps(info)) except lib_ra.ResourceAgentError as e: utils.process_library_reports( [lib_ra.resource_agent_error_to_report_item(e)] ) except LibraryError as e: utils.process_library_reports(e.args)
def quorum_cmd(lib, argv, modificators): if len(argv) < 1: usage.quorum() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.quorum(argv) elif sub_cmd == "config": quorum_config_cmd(lib, argv_next, modificators) elif sub_cmd == "device": quorum_device_cmd(lib, argv_next, modificators) elif sub_cmd == "unblock": cluster_quorum_unblock(argv_next) elif sub_cmd == "update": quorum_update_cmd(lib, argv_next, modificators) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "quorum", sub_cmd)
def qdevice_cmd(lib, argv, modifiers): # pylint: disable=too-many-branches if not argv: usage.qdevice() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.qdevice([" ".join(argv_next)] if argv_next else []) elif sub_cmd == "status": qdevice_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "setup": qdevice_setup_cmd(lib, argv_next, modifiers) elif sub_cmd == "destroy": qdevice_destroy_cmd(lib, argv_next, modifiers) elif sub_cmd == "start": qdevice_start_cmd(lib, argv_next, modifiers) elif sub_cmd == "stop": qdevice_stop_cmd(lib, argv_next, modifiers) elif sub_cmd == "kill": qdevice_kill_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": qdevice_enable_cmd(lib, argv_next, modifiers) elif sub_cmd == "disable": qdevice_disable_cmd(lib, argv_next, modifiers) # following commands are internal use only, called from pcsd elif sub_cmd == "sign-net-cert-request": qdevice_sign_net_cert_request_cmd(lib, argv_next, modifiers) elif sub_cmd == "net-client": qdevice_net_client_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "qdevice", sub_cmd)
def cluster_verify(argv): if len(argv) > 1: usage.cluster("verify") raise SystemExit(1) if argv: filename = argv[0] if not utils.usefile: #We must operate on given cib everywhere. utils.usefile = True utils.filename = filename elif os.path.abspath(filename) == os.path.abspath(utils.filename): warn("File '{0}' specified twice".format( os.path.abspath(filename))) else: raise error( "Ambiguous cib filename specification: '{0}' vs -f '{1}'". format(filename, utils.filename)) lib = utils.get_library_wrapper() try: lib.cluster.verify(verbose="-V" in utils.pcs_options) except LibraryError as e: utils.process_library_reports(e.args)
def acl_role(argv): if len(argv) < 2: usage.acl(["role"]) sys.exit(1) command = argv.pop(0) if command == "create": try: run_create_role(argv) except utils.CmdLineInputError as e: exit_on_cmdline_input_errror('role create') except LibraryError as e: utils.process_library_reports(e.args) elif command == "delete": run_role_delete(argv) elif command == "assign": run_role_assign(argv) elif command == "unassign": run_role_unassign(argv) else: usage.acl(["role"]) sys.exit(1)
def qdevice_cmd(lib, argv, modifiers): if len(argv) < 1: usage.qdevice() sys.exit(1) sub_cmd, argv_next = argv[0], argv[1:] try: if sub_cmd == "help": usage.qdevice(argv) elif sub_cmd == "status": qdevice_status_cmd(lib, argv_next, modifiers) elif sub_cmd == "setup": qdevice_setup_cmd(lib, argv_next, modifiers) elif sub_cmd == "destroy": qdevice_destroy_cmd(lib, argv_next, modifiers) elif sub_cmd == "start": qdevice_start_cmd(lib, argv_next, modifiers) elif sub_cmd == "stop": qdevice_stop_cmd(lib, argv_next, modifiers) elif sub_cmd == "kill": qdevice_kill_cmd(lib, argv_next, modifiers) elif sub_cmd == "enable": qdevice_enable_cmd(lib, argv_next, modifiers) elif sub_cmd == "disable": qdevice_disable_cmd(lib, argv_next, modifiers) # following commands are internal use only, called from pcsd elif sub_cmd == "sign-net-cert-request": qdevice_sign_net_cert_request_cmd(lib, argv_next, modifiers) elif sub_cmd == "net-client": qdevice_net_client_cmd(lib, argv_next, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "qdevice", sub_cmd)
def config_show(lib, argv, modifiers): """ Options: * -f - CIB file, when getting cluster name on remote node (corosync.conf doesn't exist) * --corosync_conf - corosync.conf file """ modifiers.ensure_only_supported("-f", "--corosync_conf") if argv: raise CmdLineInputError() print("Cluster Name: %s" % utils.getClusterName()) status.nodes_status(lib, ["config"], modifiers.get_subset("-f")) print() print("\n".join(_config_show_cib_lines(lib))) if ( utils.hasCorosyncConf() and not modifiers.is_specified("-f") and not modifiers.is_specified("--corosync_conf") ): cluster.cluster_uidgid( lib, [], modifiers.get_subset(), silent_list=True ) if ( modifiers.is_specified("--corosync_conf") or utils.hasCorosyncConf() ): print() print("Quorum:") try: config = lib_quorum.get_config(utils.get_lib_env()) print("\n".join(indent(quorum.quorum_config_to_str(config)))) except LibraryError as e: utils.process_library_reports(e.args)
def constraint_cmd(lib, argv, modifiers): if not argv: argv = ["list"] sub_cmd = argv.pop(0) try: if sub_cmd == "help": usage.constraint(argv) elif sub_cmd == "location": try: if not argv: sub_cmd2 = "show" else: sub_cmd2 = argv.pop(0) if sub_cmd2 == "add": location_add(lib, argv, modifiers) elif sub_cmd2 in ["remove", "delete"]: location_remove(lib, argv, modifiers) elif sub_cmd2 == "show": location_show(lib, argv, modifiers) elif len(argv) >= 2: if argv[0] == "rule": location_rule(lib, [sub_cmd2] + argv, modifiers) else: location_prefer(lib, [sub_cmd2] + argv, modifiers) else: raise CmdLineInputError() except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "constraint", f"location {sub_cmd2}") elif sub_cmd == "order": if not argv: sub_cmd2 = "show" else: sub_cmd2 = argv.pop(0) try: if sub_cmd2 == "set": order_command.create_with_set(lib, argv, modifiers) elif sub_cmd2 in ["remove", "delete"]: order_rm(lib, argv, modifiers) elif sub_cmd2 == "show": order_command.show(lib, argv, modifiers) else: order_start(lib, [sub_cmd2] + argv, modifiers) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "constraint", f"order {sub_cmd2}") elif sub_cmd == "ticket": usage_name = "ticket" try: command_map = { "set": ticket_command.create_with_set, "add": ticket_command.add, "delete": ticket_command.remove, "remove": ticket_command.remove, "show": ticket_command.show, } sub_command = argv[0] if argv else "show" if sub_command not in command_map: raise CmdLineInputError() usage_name = "ticket " + sub_command command_map[sub_command](lib, argv[1:], modifiers) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "constraint", usage_name) elif sub_cmd == "colocation": if not argv: sub_cmd2 = "show" else: sub_cmd2 = argv.pop(0) try: if sub_cmd2 == "add": colocation_add(lib, argv, modifiers) elif sub_cmd2 in ["remove", "delete"]: colocation_rm(lib, argv, modifiers) elif sub_cmd2 == "set": colocation_command.create_with_set(lib, argv, modifiers) elif sub_cmd2 == "show": colocation_command.show(lib, argv, modifiers) else: raise CmdLineInputError() except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "constraint", f"colocation {sub_cmd2}") elif sub_cmd in ["remove", "delete"]: constraint_rm(lib, argv, modifiers) elif sub_cmd in ("show", "list"): # all these commands accept -f and --full therefore there is no # need to change something here location_show(lib, argv, modifiers) order_command.show(lib, argv, modifiers) colocation_command.show(lib, argv, modifiers) ticket_command.show(lib, argv, modifiers) elif sub_cmd == "ref": constraint_ref(lib, argv, modifiers) elif sub_cmd == "rule": constraint_rule(lib, argv, modifiers) else: raise CmdLineInputError() except LibraryError as e: utils.process_library_reports(e.args) except CmdLineInputError as e: utils.exit_on_cmdline_input_errror(e, "constraint", sub_cmd)
def main(argv=None): # pylint: disable=too-many-locals, too-many-branches, too-many-statements, global-statement if completion.has_applicable_environment(os.environ): print(completion.make_suggestions( os.environ, usage.generate_completion_tree_from_usage() )) sys.exit() argv = argv if argv else sys.argv[1:] utils.subprocess_setup() global filename, usefile utils.pcs_options = {} # we want to support optional arguments for --wait, so if an argument # is specified with --wait (ie. --wait=30) then we use them waitsecs = None new_argv = [] for arg in argv: if arg.startswith("--wait="): tempsecs = arg.replace("--wait=", "") if tempsecs: waitsecs = tempsecs arg = "--wait" new_argv.append(arg) argv = new_argv try: pcs_options, dummy_argv = getopt.gnu_getopt( parse_args.filter_out_non_option_negative_numbers(argv), parse_args.PCS_SHORT_OPTIONS, parse_args.PCS_LONG_OPTIONS, ) except getopt.GetoptError as err: print(err) usage.main() sys.exit(1) argv = parse_args.filter_out_options(argv) full = False for option, dummy_value in pcs_options: if option == "--full": full = True break for opt, val in pcs_options: if not opt in utils.pcs_options: utils.pcs_options[opt] = val else: # If any options are a list then they've been entered twice which # isn't valid utils.err("%s can only be used once" % opt) if opt in ("-h", "--help"): if not argv: usage.main() sys.exit() else: argv = [argv[0], "help"] + argv[1:] elif opt == "-f": usefile = True filename = val utils.usefile = usefile utils.filename = filename elif opt == "--corosync_conf": settings.corosync_conf_file = val elif opt == "--version": print(settings.pcs_version) if full: print(" ".join( sorted([ feat["id"] for feat in capabilities.get_pcs_capabilities() ]) )) sys.exit() elif opt == "--fullhelp": usage.full_usage() sys.exit() elif opt == "--wait": utils.pcs_options[opt] = waitsecs elif opt == "--request-timeout": request_timeout_valid = False try: timeout = int(val) if timeout > 0: utils.pcs_options[opt] = timeout request_timeout_valid = True except ValueError: pass if not request_timeout_valid: utils.err( ( "'{0}' is not a valid --request-timeout value, use " "a positive integer" ).format(val) ) logger = logging.getLogger("pcs") logger.propagate = 0 logger.handlers = [] if (os.getuid() != 0) and (argv and argv[0] != "help") and not usefile: non_root_run(argv) cmd_map = { "resource": resource.resource_cmd, "cluster": cluster.cluster_cmd, "stonith": stonith.stonith_cmd, "property": prop.property_cmd, "constraint": constraint.constraint_cmd, "acl": acl.acl_cmd, "status": status.status_cmd, "config": config.config_cmd, "pcsd": pcsd.pcsd_cmd, "node": node.node_cmd, "quorum": quorum.quorum_cmd, "qdevice": qdevice.qdevice_cmd, "alert": alert.alert_cmd, "booth": booth.booth_cmd, "host": host.host_cmd, "client": client.client_cmd, "help": lambda lib, argv, modifiers: usage.main(), } try: routing.create_router(cmd_map, [])( utils.get_library_wrapper(), argv, utils.get_input_modifiers() ) except LibraryError as e: utils.process_library_reports(e.args) except errors.CmdLineInputError: if argv and argv[0] in cmd_map: usage.show(argv[0], []) else: usage.main() sys.exit(1)
def main(argv=None): # pylint: disable=too-many-locals, too-many-branches, too-many-statements, global-statement if completion.has_applicable_environment(os.environ): print( completion.make_suggestions( os.environ, usage.generate_completion_tree_from_usage())) sys.exit() argv = argv if argv else sys.argv[1:] utils.subprocess_setup() global filename, usefile utils.pcs_options = {} # we want to support optional arguments for --wait, so if an argument # is specified with --wait (ie. --wait=30) then we use them waitsecs = None new_argv = [] for arg in argv: if arg.startswith("--wait="): tempsecs = arg.replace("--wait=", "") if tempsecs: waitsecs = tempsecs arg = "--wait" new_argv.append(arg) argv = new_argv try: pcs_options, dummy_argv = getopt.gnu_getopt( parse_args.filter_out_non_option_negative_numbers(argv), parse_args.PCS_SHORT_OPTIONS, parse_args.PCS_LONG_OPTIONS, ) except getopt.GetoptError as err: print(err) usage.main() sys.exit(1) argv = parse_args.filter_out_options(argv) full = False for option, dummy_value in pcs_options: if option == "--full": full = True break for opt, val in pcs_options: if not opt in utils.pcs_options: utils.pcs_options[opt] = val else: # If any options are a list then they've been entered twice which # isn't valid utils.err("%s can only be used once" % opt) if opt in ("-h", "--help"): if not argv: usage.main() sys.exit() else: argv = [argv[0], "help"] + argv[1:] elif opt == "-f": usefile = True filename = val utils.usefile = usefile utils.filename = filename elif opt == "--corosync_conf": settings.corosync_conf_file = val elif opt == "--version": print(settings.pcs_version) if full: print(" ".join( sorted([ feat["id"] for feat in capabilities.get_pcs_capabilities() ]))) sys.exit() elif opt == "--fullhelp": usage.full_usage() sys.exit() elif opt == "--wait": utils.pcs_options[opt] = waitsecs elif opt == "--request-timeout": request_timeout_valid = False try: timeout = int(val) if timeout > 0: utils.pcs_options[opt] = timeout request_timeout_valid = True except ValueError: pass if not request_timeout_valid: utils.err(("'{0}' is not a valid --request-timeout value, use " "a positive integer").format(val)) logger = logging.getLogger("pcs") logger.propagate = 0 logger.handlers = [] if (os.getuid() != 0) and (argv and argv[0] != "help") and not usefile: non_root_run(argv) cmd_map = { "resource": resource.resource_cmd, "cluster": cluster.cluster_cmd, "stonith": stonith.stonith_cmd, "property": prop.property_cmd, "constraint": constraint.constraint_cmd, "acl": acl.acl_cmd, "status": status.status_cmd, "config": config.config_cmd, "pcsd": pcsd.pcsd_cmd, "node": node.node_cmd, "quorum": quorum.quorum_cmd, "qdevice": qdevice.qdevice_cmd, "alert": alert.alert_cmd, "booth": booth.booth_cmd, "host": host.host_cmd, "client": client.client_cmd, "help": lambda lib, argv, modifiers: usage.main(), } try: routing.create_router(cmd_map, [])(utils.get_library_wrapper(), argv, utils.get_input_modifiers()) except LibraryError as e: utils.process_library_reports(e.args) except errors.CmdLineInputError: if argv and argv[0] in cmd_map: usage.show(argv[0], []) else: usage.main() sys.exit(1)