Module: check_mk
Branch: master
Commit: a72c52f5c7ee044d669a6845bdea751b1a33908a
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=a72c52f5c7ee04…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Aug 24 13:16:20 2011 +0200
First step for removing the complete page reload; Using div content replacement instead
---
web/htdocs/js/check_mk.js | 86 +++++++++++++++++++++++++++++++++++++++--
web/htdocs/views.py | 45 +++++++++++++++++----
web/plugins/icons/builtin.py | 3 +-
3 files changed, 118 insertions(+), 16 deletions(-)
diff --git a/web/htdocs/js/check_mk.js b/web/htdocs/js/check_mk.js
index 66ef51d..393479f 100644
--- a/web/htdocs/js/check_mk.js
+++ b/web/htdocs/js/check_mk.js
@@ -151,6 +151,49 @@ function pageWidth() {
return h;
}
+/**
+ * Function gets the value of the given url parameter
+ */
+function getUrlParam(name) {
+ var name = name.replace('[', '\\[').replace(']', '\\]');
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
+ var results = regex.exec(window.location);
+ if(results === null)
+ return '';
+ else
+ return results[1];
+}
+
+/**
+ * Function creates a new cleaned up URL
+ * - Can add/overwrite parameters
+ * - Removes _* parameters
+ */
+function makeuri(addvars) {
+ var tmp = window.location.href.split('?');
+ var base = tmp[0];
+ tmp = tmp[1].split('#');
+ tmp = tmp[0].split('&');
+ var len = tmp.length;
+ var params = [];
+ var pair = null;
+
+ // Skip unwanted parmas
+ for(var i = 0; i < tmp.length; i++) {
+ pair = tmp[i].split('=');
+ if(pair[0][0] == '_')
+ continue;
+ params.push(tmp[i]);
+ }
+
+ // Add new params
+ for (var key in addvars) {
+ params.push(key + '=' + addvars[key]);
+ }
+
+ return base + '?' + params.join('&')
+}
+
// ----------------------------------------------------------------------------
// GUI styling
// ----------------------------------------------------------------------------
@@ -557,15 +600,48 @@ function setReload(secs, url) {
if (secs !== 0) {
gReloadTime = secs;
- gReloadTimer = setTimeout("handleReload('" + url + "')", Math.ceil(parseFloat(secs) * 1000));
+ startReloadTimer(url);
}
}
+function startReloadTimer(url) {
+ gReloadTimer = setTimeout("handleReload('" + url + "')", Math.ceil(parseFloat(gReloadTime) * 1000));
+}
+
+function handleContentReload(_unused, code) {
+ var o = document.getElementById('data_container');
+ o.innerHTML = code;
+ o = null;
+ startReloadTimer('');
+}
+
function handleReload(url) {
- if (url === '')
- window.location.reload(false);
- else
- window.location.href = url;
+ // FiXME: Nicht mehr die ganze Seite neu laden, wenn es ein DIV "data_container" gibt.
+ // In dem Fall wird die aktuelle URL aus "window.location.href" geholt, für den Refresh
+ // modifiziert, der Inhalt neu geholt und in das DIV geschrieben.
+ if(!document.getElementById('data_container') || url !== '') {
+ if (url === '')
+ window.location.reload(false);
+ else
+ window.location.href = url;
+ } else {
+ // Enforce specific display_options to get only the content data
+ var display_options = getUrlParam('display_options');
+ var opts = [ 'h', 't', 'b', 'f', 'c', 'o', 'd', 'e', 'r' ];
+ for(var i = 0; i < opts.length; i++) {
+ if(display_options.indexOf(opts[i].toUpperCase()) > -1)
+ display_options = display_options.replace(opts[i].toUpperCase(), opts[i]);
+ else
+ display_options += opts[i];
+ }
+ opts = null;
+
+ var url = makeuri({'_display_options': display_options,
+ 'display_options': getUrlParam('display_options')});
+ display_options = null;
+ get_url(url, handleContentReload, '');
+ url = null;
+ }
}
// --------------------------------------------------------------------------
diff --git a/web/htdocs/views.py b/web/htdocs/views.py
index 8d27ef4..9ed0689 100644
--- a/web/htdocs/views.py
+++ b/web/htdocs/views.py
@@ -1070,12 +1070,31 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
# If all display_options are upper case assume all not given values default
# to lower-case. Vice versa when all display_options are lower case.
# When the display_options are mixed case assume all unset options to be enabled
- do_defaults = display_options.isupper() and all_display_options.lower() or all_display_options
- for c in do_defaults:
- if c.lower() not in display_options.lower():
- display_options += c
+ def apply_display_option_defaults(opts):
+ do_defaults = opts.isupper() and all_display_options.lower() or all_display_options
+ for c in do_defaults:
+ if c.lower() not in opts.lower():
+ opts += c
+ return opts
+
+ display_options = apply_display_option_defaults(display_options)
+ # Add the display_options to the html object for later linking etc.
html.display_options = display_options
+ # This is needed for letting only the data table reload. The problem is that
+ # the data table is re-fetched via javascript call using special display_options
+ # but these special display_options must not be used in links etc. So we use
+ # a special var _display_options for defining the display_options for rendering
+ # the data table to be reloaded. The contents of "display_options" are used for
+ # linking to other views.
+ if html.has_var('_display_options'):
+ display_options = html.var("_display_options", "")
+ display_options = apply_display_option_defaults(display_options)
+
+ # Below we have the following display_options vars:
+ # htmk.display_options - Use this when rendering the current view
+ # html.var("display_options") - Use this for linking to other views
+
# If display option 'M' is set, then all links are targetet to the 'main'
# frame. Also the display options are removed since the view in the main
# frame should be displayed in standard mode.
@@ -1208,7 +1227,7 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
# Show heading (change between "preview" mode and full page mode)
if show_heading:
# Show/Hide the header with page title, MK logo, etc.
- if 'H' in display_options:
+ if 'H' in display_options:
html.body_start(view_title(view))
if 'T' in display_options:
html.top_heading(view_title(view))
@@ -1219,10 +1238,10 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
show_context_links(view, hide_filters)
need_navi = show_buttons and (
- 'D' in display_options or
- 'F' in display_options or
- 'C' in display_options or
- 'O' in display_options or
+ 'D' in display_options or
+ 'F' in display_options or
+ 'C' in display_options or
+ 'O' in display_options or
'E' in display_options)
if need_navi:
html.write("<table class=navi><tr>\n")
@@ -1318,6 +1337,9 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
# Ende des Bereichs mit den Tabs
html.write("</table>\n") # class=navi
+ # The refreshing content container
+ if 'R' in display_options:
+ html.write("<div id=data_container>\n")
if not has_done_actions:
# Limit exceeded? Show warning
@@ -1335,6 +1357,10 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
for sitename, info in html.live.deadsites.items():
html.show_error("<b>%s - Livestatus error</b><br>%s" % (info["site"]["alias"], info["exception"]))
+ # FIXME: Sauberer wäre noch die Status Icons hier mit aufzunehmen
+ if 'R' in display_options:
+ html.write("</div>\n")
+
if show_footer:
pid = os.getpid()
if html.live.successfully_persisted():
@@ -1345,6 +1371,7 @@ def show_view(view, show_heading = False, show_buttons = True, show_footer = Tru
html.bottom_focuscode()
if 'Z' in display_options:
html.bottom_footer()
+
if 'H' in display_options:
html.body_end()
diff --git a/web/plugins/icons/builtin.py b/web/plugins/icons/builtin.py
index 37e0138..841487c 100644
--- a/web/plugins/icons/builtin.py
+++ b/web/plugins/icons/builtin.py
@@ -452,8 +452,7 @@ multisite_icons.append({
def paint_wato(what, row, tags, custom_vars):
# Reschedule button
- if 'C' in html.display_options \
- and row[what + "_active_checks_enabled"] == 1 \
+ if row[what + "_active_checks_enabled"] == 1 \
and config.may('action.reschedule'):
name2 = ''
if what == 'service':
Module: check_mk
Branch: master
Commit: b50896f67f73264e924fbedb1997061504a29215
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b50896f67f7326…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Aug 25 09:28:13 2011 +0200
Updated bug entries
---
.bugs/194 | 15 +++++++++++++++
.bugs/195 | 23 +++++++++++++++++++++++
2 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/.bugs/194 b/.bugs/194
new file mode 100644
index 0000000..3c98f41
--- /dev/null
+++ b/.bugs/194
@@ -0,0 +1,15 @@
+Title: WATO Folder/File Titel ändern wirkt erst nach weiterem Reload
+Component: wato
+Benefit: 3
+State: open
+Cost: 3
+Date: 2011-08-25 09:21:20
+Class: nastiness
+
+Wenn man momentan den Titel eines Folders oder eines Files im WATO ändert
+und das Formular abschickt, ändert sich der Titel bei der Folgeseite nicht.
+
+Das liegt vermutlich daran, dass der Titel gemalt wird, bevor das Formular
+überhaupt verarbeitet wird.
+
+Ist kein KO, aber mindestens mal nicht schön.
diff --git a/.bugs/195 b/.bugs/195
new file mode 100644
index 0000000..c1a229b
--- /dev/null
+++ b/.bugs/195
@@ -0,0 +1,23 @@
+Title: WATO Folder/File Titel Änderungen wirken in Status GUI erst nach Apache reload
+Component: wato
+Benefit: 3
+State: open
+Cost: 3
+Date: 2011-08-25 09:23:27
+Class: bug
+
+Das ist aus Sicht des Nutzers ein echter Fehler. Die Ursache hierfür habe
+ich schon ausgemacht.
+
+Das Problem ist, dass der Filter FilterWatoFile für das malen des Titels
+zuständig ist. Der Filter wird einmal pro Apache Prozess instanziiert.
+Beim init des Threads werden die WATO Infos geladen und nie wieder verändert.
+
+Auf die Methode heading_info() wird bei jedem Seitenaufruf zugegriffen um
+den Titel heraus zu holen.
+
+Als kurzfristigen Workaround werden die Infos nun bei jedem Malen des Titels
+geholt. Das ist nicht optimal.
+
+Wir brauchen einen Indikator, dass sich WATO Infos geändert haben und müssen
+dann die gecachten Infos in allen Threads erneuern.
Module: check_mk
Branch: master
Commit: 1baa873feb3dd519f10a38864e13378c0d877789
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=1baa873feb3dd5…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Wed Aug 24 22:44:27 2011 +0200
Updated bug entries
---
.bugs/128 | 40 +++++++++++++++++++++++++++++++++++++---
1 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/.bugs/128 b/.bugs/128
index 9ee272f..e0f9ef0 100644
--- a/.bugs/128
+++ b/.bugs/128
@@ -1,11 +1,45 @@
Title: df trends: Peak values after changing the trend_range
Component: checks
-Benefit: 1
State: open
-Cost: 2
-Date: 2011-02-10 09:45:24
Class: bug
+Date: 2011-02-10 09:45:24
+Benefit: 1
+Cost: 2
+Fun: 0
After changing the trend_range to a larger time the check reports a peak
value which is wrong. It might be needed to detect such a change and reset
the values.
+
+I've investigated this. The current behaviour is correct.
+In our demo server there was a filesystem with a trend
+of aprox. 800 MB/24h. This was nicely visible in the trend
+graph, with a light descending slope. I now increased the
+trend range to 48h. Now the trend value "jumped" to aprox
+1600 MB/48h. This is - however - the same value as 800 MB/24.
+What's not nice about this is that in the graph it looks like
+a jump.
+
+A possible solution would be to normalize the graph to
+MB/day, even if the trend range is for example one week.
+
+==> RESOLUTION:
+
+I think we'll make it like this:
+
+df.include: the performance data growth and trend will both
+be normalized to MB/24h - regardless of the trend_range
+parameter.
+
+PNP template: the graphs will be updated. The growth graph
+will be scaled to MB per *minute*. When painting the avg, last
+and max we can also print MB / 24h sec as an additional information.
+This information is only relevant to the user - however - if the
+growth is very static.
+
+In the migration notes we have to describe this. The performance
+data will be inconsistent if the user has used an other trend
+range than 24h.
+
+We will do this after 1.1.11i3 is out.
+