Module: check_mk
Branch: master
Commit: 7f3eb0049ac507724995ea336a396582d543a45c
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7f3eb0049ac507…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Dec 4 13:04:24 2014 +0100
#1641 FIX Quicksearch: Now able to search for services with backslashes in names
---
.werks/1641 | 9 +++++++++
ChangeLog | 1 +
web/htdocs/sidebar.py | 48 ++++++++++++++++++++++++++++++++----------------
3 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/.werks/1641 b/.werks/1641
new file mode 100644
index 0000000..5849b58
--- /dev/null
+++ b/.werks/1641
@@ -0,0 +1,9 @@
+Title: Quicksearch: Now able to search for services with backslashes in names
+Level: 1
+Component: multisite
+Compatible: compat
+Version: 1.2.5i7
+Date: 1417694635
+Class: fix
+
+
diff --git a/ChangeLog b/ChangeLog
index ae862ee..5a95559 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -137,6 +137,7 @@
* 1614 FIX: Fixed wrong URL in webapi.py documentation
* 1619 FIX: Renamed "Hostgroups" and "Servicegroups" views to
"Host Groups" and "Service Groups"
* 1638 FIX: Fixed styling small styling problems in wiki snapin
+ * 1641 FIX: Quicksearch: Now able to search for services with backslashes in names
WATO:
* 1170 Added buttons to move rules to top/bottom of the list to ruleset edit dialog
diff --git a/web/htdocs/sidebar.py b/web/htdocs/sidebar.py
index faf8b34..97aa15a 100644
--- a/web/htdocs/sidebar.py
+++ b/web/htdocs/sidebar.py
@@ -703,7 +703,17 @@ def parse_search_query(s):
if found_filters:
return found_filters
else:
- return [("hosts", s.replace('*', '.*'))]
+ return [("hosts", to_regex(s))]
+
+# Ensures the provided search string is a regex, does some basic conversion
+# and then tries to verify it is a regex
+def to_regex(s):
+ s = s.replace('*', '.*')
+ try:
+ re.compile(s)
+ except re.error:
+ raise MKGeneralException(_('You search statement is not valid. You need to
provide a regular expression (regex). For example you need to e use
<tt>\\\\</tt> instead of <tt>\\</tt> if you like to search for a
single backslash.'))
+ return s
def is_ipaddress(s):
try:
@@ -758,45 +768,50 @@ def search_url_tmpl(used_filters, row, exact = True):
def find_tmpl():
if exact: # Get the match template
if plugin.get("match_url_tmpl_func"):
- return plugin['match_url_tmpl_func'](used_filters, row_data)
+ return False, plugin['match_url_tmpl_func'](used_filters,
row_data)
if plugin.get("match_url_tmpl"):
- return plugin.get("match_url_tmpl")
+ return False, plugin.get("match_url_tmpl")
# Default match templates
ty = plugin.get("dftl_url_tmpl", plugin.get("id"))
if ty == 'hosts':
- return
'view.py?view_name=host&host=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=host&host=%(name)s&site=%(site)s'
elif ty == 'hostgroups':
- return
'view.py?view_name=hostgroup&hostgroup=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=hostgroup&hostgroup=%(name)s&site=%(site)s'
elif ty == 'servicegroups':
- return
'view.py?view_name=servicegroup&servicegroup=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=servicegroup&servicegroup=%(name)s&site=%(site)s'
elif ty == 'services':
- return
'view.py?view_name=allservices&service_regex=%(name)s&site=%(site)s'
+ return True,
'view.py?view_name=allservices&service_regex=%(name)s&site=%(site)s'
else: # Get the search template
if plugin.get("search_url_tmpl_func"):
- return plugin['search_url_tmpl_func'](used_filters, row_data)
+ return False, plugin['search_url_tmpl_func'](used_filters,
row_data)
if plugin.get("search_url_tmpl"):
- return plugin.get("search_url_tmpl")
+ return False, plugin.get("search_url_tmpl")
# Default search templates
ty = plugin.get("dftl_url_tmpl", plugin.get("id"))
if ty == 'hosts':
- return
'view.py?view_name=searchhost&host_regex=%(name)s&filled_in=filter'
+ return False,
'view.py?view_name=searchhost&host_regex=%(name)s&filled_in=filter'
elif ty == 'hostgroups':
- return
'view.py?view_name=hostgroups&hostgroup_regex=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=hostgroups&hostgroup_regex=%(name)s&site=%(site)s'
elif ty == 'servicegroups':
- return
'view.py?view_name=svcgroups&servicegroup_name=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=svcgroups&servicegroup_name=%(name)s&site=%(site)s'
elif ty == 'services':
- return
'view.py?view_name=allservices&service_regex=%(name)s&site=%(site)s'
+ return False,
'view.py?view_name=allservices&service_regex=%(name)s&site=%(site)s'
# Search the template
- url_tmpl = find_tmpl()
+ escape_regex, url_tmpl = find_tmpl()
# Some templates with single filters contain %(name)s, %(search)s, %(site)
if len(used_filters) == 1:
if exact:
site = row_data.get("site")
name = row_data.get(get_row_name(row))
+ # In case of an exact match, not the original search statement is used,
+ # instead the name of the row provided by livestatus is used. This needs
+ # to be escaped as it is no regex
+ if escape_regex:
+ name = name.replace('\\', '\\\\')
else:
site = ""
name = used_filters[0][1]
@@ -914,8 +929,9 @@ def format_result(row, render_options):
if name_append:
name = "%s %s" % (name, name_append)
+ escaped_name = name.replace('\\', '\\\\')
html.write('<a id="result_%s" class="%s"
href="%s" onClick="mkSearchClose()" target="main">%s'
%
- (name, css, url, name))
+ (escaped_name, css, url, name))
html.write('</a>\n')
@@ -964,7 +980,7 @@ def process_search(q):
data = search_livestatus(used_filters)
if len(used_filters) == 1 and used_filters[0][0] == "hosts" and not data:
# When asking for hosts and no host found, try searching services instead
- data = search_livestatus( [("services", used_filters[0][1])] )
+ data = search_livestatus([("services", used_filters[0][1])])
return data, [("services", used_filters[0][1])]
return data, used_filters