From 082be752ee38c8d1314c2130a029e60648f7896b Mon Sep 17 00:00:00 2001 From: Tomas Jelinek Date: Tue, 11 Aug 2015 16:34:02 +0200 Subject: [PATCH] add nagios support to 'pcs resource list' and web UI --- pcs/resource.py | 58 ++++++++++++++++++++++++++++++++++++++++++-------------- pcsd/remote.rb | 4 ++++ pcsd/resource.rb | 23 ++++++++++++++++++---- pcsd/settings.rb | 1 + 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/pcs/resource.py b/pcs/resource.py index f7d8821..8e05aeb 100644 --- a/pcs/resource.py +++ b/pcs/resource.py @@ -198,13 +198,28 @@ def parse_resource_options(argv, with_clone=False): # List available resources # TODO make location more easily configurable def resource_list_available(argv): + def get_name_and_desc(full_res_name, metadata): + sd = "" + try: + dom = parseString(metadata) + shortdesc = dom.documentElement.getElementsByTagName("shortdesc") + if len(shortdesc) > 0: + sd = " - " + format_desc( + len(full_res_name + " - "), + shortdesc[0].firstChild.nodeValue.strip().replace("\n", " ") + ) + except xml.parsers.expat.ExpatError: + sd = "" + finally: + return full_res_name + sd + "\n" + ret = "" if len(argv) != 0: filter_string = argv[0] else: filter_string = "" -# ocf agents + # ocf agents os.environ['OCF_ROOT'] = "/usr/lib/ocf/" providers = sorted(os.listdir("/usr/lib/ocf/resource.d")) for provider in providers: @@ -223,32 +238,47 @@ def resource_list_available(argv): metadata = utils.get_metadata("/usr/lib/ocf/resource.d/" + provider + "/" + resource) if metadata == False: continue - sd = "" - try: - dom = parseString(metadata) - shortdesc = dom.documentElement.getElementsByTagName("shortdesc") - if len(shortdesc) > 0: - sd = " - " + format_desc(full_res_name.__len__() + 3, shortdesc[0].firstChild.nodeValue.strip().replace("\n", " ")) - except xml.parsers.expat.ExpatError: - sd = "" - finally: - ret += full_res_name + sd + "\n" -# lsb agents + ret += get_name_and_desc( + "ocf:" + provider + ":" + resource, + metadata + ) + + # lsb agents lsb_dir = "/etc/init.d/" agents = sorted(os.listdir(lsb_dir)) for agent in agents: if os.access(lsb_dir + agent, os.X_OK): ret += "lsb:" + agent + "\n" -# systemd agents + + # systemd agents if utils.is_systemctl(): agents, retval = utils.run(["systemctl", "list-unit-files", "--full"]) agents = agents.split("\n") - for agent in agents: match = re.search(r'^([\S]*)\.service',agent) if match: ret += "systemd:" + match.group(1) + "\n" + # nagios metadata + nagios_metadata_path = "/usr/share/pacemaker/nagios/plugins-metadata" + for metadata_file in sorted(os.listdir(nagios_metadata_path)): + if metadata_file.startswith("."): + continue + full_res_name = "nagios:" + metadata_file + if full_res_name.lower().endswith(".xml"): + full_res_name = full_res_name[:-len(".xml")] + if "--nodesc" in utils.pcs_options: + ret += full_res_name + "\n" + continue + try: + ret += get_name_and_desc( + full_res_name, + open(os.path.join(nagios_metadata_path, metadata_file), "r").read() + ) + except EnvironmentError as e: + pass + + # output if not ret: utils.err( "No resource agents available. " diff --git a/pcsd/remote.rb b/pcsd/remote.rb index 5b7c753..cb5b176 100644 --- a/pcsd/remote.rb +++ b/pcsd/remote.rb @@ -1373,6 +1373,8 @@ def resource_form(params, request, session) @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(HEARTBEAT_AGENTS_DIR + @cur_resource.type) elsif @cur_resource.provider == 'pacemaker' @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(PACEMAKER_AGENTS_DIR + @cur_resource.type) + elsif @cur_resource._class == 'nagios' + @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(NAGIOS_METADATA_DIR + @cur_resource.type + '.xml') end @existing_resource = true if @resource @@ -1546,6 +1548,8 @@ def resource_metadata(params, request, session) @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(HEARTBEAT_AGENTS_DIR + resource_name) elsif class_provider == "ocf:pacemaker" @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(PACEMAKER_AGENTS_DIR + resource_name) + elsif class_provider == 'nagios' + @resource.required_options, @resource.optional_options, @resource.info = getResourceMetadata(NAGIOS_METADATA_DIR + resource_name + '.xml') end @new_resource = params[:new] @resources, @groups = getResourcesGroups(session) diff --git a/pcsd/resource.rb b/pcsd/resource.rb index f375bae..c6b513b 100644 --- a/pcsd/resource.rb +++ b/pcsd/resource.rb @@ -303,13 +303,28 @@ def getColocationConstraints(session, resource_id) end def getResourceMetadata(resourcepath) - ENV['OCF_ROOT'] = OCF_ROOT - metadata = `#{resourcepath} meta-data` - doc = REXML::Document.new(metadata) options_required = {} options_optional = {} long_desc = "" short_desc = "" + + if resourcepath.end_with?('.xml') + begin + metadata = IO.read(resourcepath) + rescue + metadata = "" + end + else + ENV['OCF_ROOT'] = OCF_ROOT + metadata = `#{resourcepath} meta-data` + end + + begin + doc = REXML::Document.new(metadata) + rescue REXML::ParseException + return [options_required, options_optional, [short_desc, long_desc]] + end + doc.elements.each('resource-agent/longdesc') {|ld| long_desc = ld.text ? ld.text.strip : ld.text } @@ -345,7 +360,7 @@ def getResourceMetadata(resourcepath) options_optional[param.attributes["name"]] = temp_array end } - [options_required, options_optional, [short_desc,long_desc]] + [options_required, options_optional, [short_desc, long_desc]] end def getResourceAgents(session, resource_agent=nil) diff --git a/pcsd/settings.rb b/pcsd/settings.rb index 0cd3109..4cea800 100644 --- a/pcsd/settings.rb +++ b/pcsd/settings.rb @@ -8,6 +8,7 @@ COOKIE_FILE = PCSD_VAR_LOCATION + 'pcsd.cookiesecret' OCF_ROOT = "/usr/lib/ocf" HEARTBEAT_AGENTS_DIR = "/usr/lib/ocf/resource.d/heartbeat/" PACEMAKER_AGENTS_DIR = "/usr/lib/ocf/resource.d/pacemaker/" +NAGIOS_METADATA_DIR = '/usr/share/pacemaker/nagios/plugins-metadata/' PENGINE = "/usr/libexec/pacemaker/pengine" CRM_MON = "/usr/sbin/crm_mon" CRM_NODE = "/usr/sbin/crm_node" -- 1.9.1