|
|
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 |
|