Blame SOURCES/bz1235022-01-add-nagios-support-to-pcs-resource-list-and-web-UI.patch

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