},
pluginInstances: function(hostInstance, pluginName) {
- return Object.keys((rrdtree[hostInstance] || {})[pluginName] || {}).sort();
+ return Object.keys((rrdtree[hostInstance] || {})[pluginName] || {}).sort(function(a, b) {
+ var x = a.match(/^(\d+)\b/),
+ y = b.match(/^(\d+)\b/);
+
+ if (!x != !y)
+ return !x - !y;
+ else if (x && y && x[0] != y[0])
+ return +x[0] - +y[0];
+ else
+ return a > b;
+ });
},
dataTypes: function(hostInstance, pluginName, pluginInstance) {
return (graphdefs[pluginName] != null);
},
+ hasInstanceDetails: function(hostInstance, pluginName, pluginInstance) {
+ var def = graphdefs[pluginName];
+
+ if (!def || typeof(def.rrdargs) != 'function')
+ return false;
+
+ var optlist = this._forcelol(def.rrdargs(this, hostInstance, pluginName, pluginInstance, null, false));
+
+ for (var i = 0; i < optlist.length; i++)
+ if (optlist[i].detail)
+ return true;
+
+ return false;
+ },
+
_mkpath: function(host, plugin, plugin_instance, dtype, data_instance) {
var path = host + '/' + plugin;
return L.isObject(list[0]) ? list : [ list ];
},
- _rrdtool: function(def, rrd, timespan, width, height) {
+ _rrdtool: function(def, rrd, timespan, width, height, cache) {
var cmdline = [
'graph', '-', '-a', 'PNG',
'-s', 'NOW-%s'.format(timespan || this.opts.timespan),
cmdline.push(opt);
}
+ if (L.isObject(cache)) {
+ var key = sfh(cmdline.join('\0'));
+
+ if (!cache.hasOwnProperty(key))
+ cache[key] = fs.exec_direct('/usr/bin/rrdtool', cmdline, 'blob', true);
+
+ return cache[key];
+ }
+
return fs.exec_direct('/usr/bin/rrdtool', cmdline, 'blob', true);
},
return defs;
},
- render: function(plugin, plugin_instance, is_index, hostname, timespan, width, height) {
+ render: function(plugin, plugin_instance, is_index, hostname, timespan, width, height, cache) {
var pngs = [];
/* check for a whole graph handler */
/* render all diagrams */
for (var j = 0; j < diagrams.length; j++) {
/* exec */
- _images[i][j] = this._rrdtool(diagrams[j], null, timespan, width, height);
+ _images[i][j] = this._rrdtool(diagrams[j], null, timespan, width, height, cache);
}
}
}
updatePluginTab: function(host, span, time, ev) {
var container = ev.target,
+ width = Math.max(200, container.offsetWidth - 100),
plugin = ev.detail.tab,
- plugin_instances = rrdtool.pluginInstances(host.value, plugin);
+ render_instances = [],
+ plugin_instances = rrdtool.pluginInstances(host.value, plugin),
+ cache = {};
activePlugin = plugin;
])
]);
- Promise.all(plugin_instances.map(function(instance) {
- return rrdtool.render(plugin, instance, false, host.value, span.value, Math.max(200, container.offsetWidth - 100));
+ for (var i = 0; i < plugin_instances.length; i++)
+ if (rrdtool.hasInstanceDetails(host.value, plugin, plugin_instances[i]))
+ render_instances.push(plugin_instances[i]);
+
+ if (render_instances.length == 0 || render_instances.length > 1)
+ render_instances.unshift('-');
+
+ Promise.all(render_instances.map(function(instance) {
+ if (instance == '-') {
+ var tasks = [];
+
+ for (var i = 0; i < plugin_instances.length; i++)
+ tasks.push(rrdtool.render(plugin, plugin_instances[i], true, host.value, span.value, width, null, cache));
+
+ return Promise.all(tasks).then(function(blobs) {
+ return Array.prototype.concat.apply([], blobs);
+ });
+ }
+ else {
+ return rrdtool.render(plugin, instance, false, host.value, span.value, width, null, cache);
+ }
})).then(function(blobs) {
var multiple = blobs.length > 1;
L.dom.content(container, E('div', {}, blobs.map(function(blobs, i) {
- var plugin_instance = plugin_instances[i];
+ var plugin_instance = i ? plugin_instances[i-1] : plugin_instances.join('|'),
+ title = '%s: %s'.format(rrdtool.pluginTitle(plugin), i ? plugin_instance : _('Overview'));
return E('div', {
'class': 'center',
'data-tab': multiple ? i : null,
- 'data-tab-title': multiple ? '%s: %s'.format(rrdtool.pluginTitle(plugin), plugin_instances[i]) : null,
+ 'data-tab-title': multiple ? title : null,
'data-plugin': plugin,
- 'data-plugin-instance': plugin_instances[i],
+ 'data-plugin-instance': plugin_instance,
+ 'data-is-index': i ? null : true,
'cbi-tab-active': function(ev) { activeInstance = ev.target.getAttribute('data-plugin-instance') }
}, blobs.map(function(blob) {
return E('img', {
if (multiple)
ui.tabs.initTabGroup(container.lastElementChild.childNodes);
else
- activeInstance = plugin_instances[0];
+ activeInstance = plugin_instances.join('|');
});
},
},
refreshGraphs: function(host, span, time, container) {
- var div = document.querySelector('[data-plugin="%s"][data-plugin-instance="%s"]'.format(activePlugin, activeInstance || ''));
+ var div = document.querySelector('[data-plugin="%s"][data-plugin-instance="%s"]'.format(activePlugin, activeInstance || '')),
+ width = Math.max(200, container.offsetWidth - 100),
+ render_instances = activeInstance.split(/\|/);
- return rrdtool.render(activePlugin, activeInstance || '', false, host.value, span.value, Math.max(200, container.offsetWidth - 100)).then(function(blobs) {
+ return Promise.all(render_instances.map(function(render_instance) {
+ return rrdtool.render(activePlugin, render_instance || '', div.hasAttribute('data-is-index'), host.value, span.value, width);
+ })).then(function(blobs) {
+ return Array.prototype.concat.apply([], blobs);
+ }).then(function(blobs) {
return Promise.all(blobs.map(function(blob) {
return new Promise(function(resolveFn, rejectFn) {
var img = E('img', { 'src': URL.createObjectURL(new Blob([blob], { type: 'image/png' })) });