Module: check_mk
Branch: master
Commit: 2567a846399bf86d58a5f1d243e20518198ef7ef
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2567a846399bf8…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Tue Oct 15 10:23:32 2013 +0200
FIX: Fixed searching hosts by aliases/adresses
---
ChangeLog | 1 +
web/htdocs/sidebar.py | 77 +++++++++++++++++++++++++++++------------
web/plugins/sidebar/search.py | 8 +++++
3 files changed, 64 insertions(+), 22 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 1ebc0c5..6bb2b3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
are omitted, since they do not really matter and make the
results less useful when using CMC.
* FIX: Fixed encoding problem in webservice column output
+ * FIX: Fixed searching hosts by aliases/adresses
Checks & Agents:
* diskstat: removed (ever incorrect) latency computation for Linux
diff --git a/web/htdocs/sidebar.py b/web/htdocs/sidebar.py
index e134dc9..8e9c1aa 100644
--- a/web/htdocs/sidebar.py
+++ b/web/htdocs/sidebar.py
@@ -653,20 +653,23 @@ def search_livestatus(ty, q):
except:
limit = 80
- filt = []
- for plugin in search_plugins:
- if plugin['type'] == ty and 'filter_func' in plugin:
- f = plugin['filter_func'](q)
- if f:
- filt.append(f)
- if filt:
- filt.append('Or: %d\n' % (len(filt)))
-
+ # We need to know which plugin lead to finding a particular host, so it
+ # is neccessary to make one query for each plugin - sorry. For example
+ # for the case, that a host can be found via alias or name.
+ data = []
column = ty == 'service' and 'description' or 'name'
- lq = "GET %ss\nCache: reload\nColumns: %s\n%sLimit: %d\n" % \
- (ty, column, ''.join(filt), limit)
html.live.set_prepend_site(True)
- data = html.live.query(lq)
+ for plugin in search_plugins:
+ if plugin['type'] != ty or 'filter_func' not in plugin:
+ continue
+
+ f = plugin['filter_func'](q)
+ if f:
+ lq = "GET %ss\nCache: reload\nColumns: %s\n%sLimit: %d\n" % \
+ (ty, column, f, limit)
+ data += [ [ plugin['id'] ] + row for row in html.live.query(lq) ]
+ if len(data) >= limit:
+ break
html.live.set_prepend_site(False)
# Some special plugins fetch host data, but do own livestatus
@@ -683,7 +686,7 @@ def search_livestatus(ty, q):
def sort_data(data):
sorted_data = set([])
for entry in data:
- entry = ('', entry[1])
+ entry = (entry[0], '', entry[2])
if entry not in sorted_data:
sorted_data.add(entry)
sorted_data = list(sorted_data)
@@ -704,17 +707,17 @@ def render_search_results(ty, objects):
display_site = False
for obj in objects:
if only_site is None:
- only_site = obj[0]
- elif only_site != obj[0]:
+ only_site = obj[1]
+ elif only_site != obj[1]:
display_site = True
break
for obj in objects:
- if len(obj) == 2:
- site, name = obj
+ if len(obj) == 3:
+ plugin, site, name = obj
url = url_tmpl % {'name': name, 'site': site}
else:
- site, name, url = obj
+ plugin, site, name, url = obj
html.write('<a id="result_%s" class="%s"
href="%s" onClick="mkSearchClose()" target="main">%s'
%
(name, ty, url, name))
if display_site:
@@ -747,6 +750,11 @@ def ajax_search():
except Exception, e:
html.write(repr(e))
+def get_search_plugin(plugin_id):
+ for plugin in search_plugins:
+ if plugin['id'] == plugin_id:
+ return plugin
+
def search_open():
q = html.var('q').strip()
if not q:
@@ -756,13 +764,38 @@ def search_open():
if ty is None:
return
+ cleaned_search_string = parse_search_query(q)[1]
+
if len(data) == 1:
- if len(data[0]) == 2:
- url = search_url_tmpl(ty) % {'name': html.urlencode(data[0][1]),
'site': data[0][0]}
+ if len(data[0]) == 3:
+ # Check wether or not the plugin which found the first match registered
+ # an own url template, use this if provided.
+ plugin = get_search_plugin(data[0][0])
+ if 'url_tmpl' in plugin:
+ url_tmpl = plugin['url_tmpl']
+ else:
+ url_tmpl = search_url_tmpl(ty)
+ url = url_tmpl % {
+ 'name' : html.urlencode(data[0][2]),
+ 'search' : html.urlencode(cleaned_search_string),
+ 'site' : data[0][1],
+ }
else:
- url = data[0][2]
+ url = data[0][3]
else:
- url = search_url_tmpl(ty, exact = False) % {'name':
html.urlencode(parse_search_query(q)[1]), 'site': ''}
+ # Check wether or not the plugin which found the first match registered
+ # an own url template, use this if provided.
+ url_tmpl = search_url_tmpl(ty, exact = False)
+ if data:
+ plugin = get_search_plugin(data[0][0])
+ if 'url_tmpl' in plugin:
+ url_tmpl = plugin['url_tmpl']
+
+ url = url_tmpl % {
+ 'name' : html.urlencode(cleaned_search_string),
+ 'search' : html.urlencode(cleaned_search_string),
+ 'site' : '',
+ }
html.set_http_header('Location', url)
from mod_python import apache
diff --git a/web/plugins/sidebar/search.py b/web/plugins/sidebar/search.py
index 3add208..a574b9d 100644
--- a/web/plugins/sidebar/search.py
+++ b/web/plugins/sidebar/search.py
@@ -111,21 +111,25 @@ def search_filter_name(q, column = 'name'):
return 'Filter: %s ~~ %s\n' % (column, q)
search_plugins.append({
+ 'id' : 'name',
'type' : 'host',
'filter_func' : search_filter_name,
})
search_plugins.append({
+ 'id' : 'name',
'type' : 'service',
'filter_func' : lambda q: search_filter_name(q, 'description'),
})
search_plugins.append({
+ 'id' : 'name',
'type' : 'hostgroup',
'filter_func' : search_filter_name,
})
search_plugins.append({
+ 'id' : 'name',
'type' : 'servicegroup',
'filter_func' : search_filter_name,
})
@@ -135,14 +139,18 @@ def search_filter_ipaddress(q):
return 'Filter: address ~~ %s\n' % q
search_plugins.append({
+ 'id' : 'address',
'type' : 'host',
'filter_func' : search_filter_ipaddress,
+ 'url_tmpl' :
'view.py?view_name=searchhost&host_address=%(search)s&filled_in=filter'
})
def search_filter_alias(q):
return 'Filter: alias ~~ %s\n' % q
search_plugins.append({
+ 'id' : 'alias',
'type' : 'host',
'filter_func' : search_filter_alias,
+ 'url_tmpl' :
'view.py?view_name=searchhost&hostalias=%(search)s&filled_in=filter'
})