luci-app-statistics: convert collectd configuration to client side views
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
2df2958fd6
commit
e7d22dce50
100 changed files with 21364 additions and 12615 deletions
|
@ -0,0 +1,160 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require ui';
|
||||
'require uci';
|
||||
'require form';
|
||||
|
||||
return L.view.extend({
|
||||
load: function() {
|
||||
return Promise.all([
|
||||
fs.list('/usr/lib/collectd'),
|
||||
fs.list('/usr/share/luci/statistics/plugins')
|
||||
]).then(function(data) {
|
||||
var installed = data[0],
|
||||
plugins = data[1],
|
||||
tasks = [];
|
||||
|
||||
for (var i = 0; i < plugins.length; i++) {
|
||||
tasks.push(fs.read_direct('/usr/share/luci/statistics/plugins/' + plugins[i].name, 'json').then(L.bind(function(name, spec) {
|
||||
return L.resolveDefault(L.require('view.statistics.plugins.' + name)).then(function(form) {
|
||||
return {
|
||||
name: name,
|
||||
spec: spec,
|
||||
form: form,
|
||||
installed: installed.filter(function(e) { return e.name == name + '.so' }).length > 0
|
||||
};
|
||||
});
|
||||
}, this, plugins[i].name.replace(/\.json$/, ''))));
|
||||
}
|
||||
|
||||
return Promise.all(tasks);
|
||||
});
|
||||
},
|
||||
|
||||
render: function(plugins) {
|
||||
var m, s, o;
|
||||
|
||||
for (var i = 0; i < plugins.length; i++)
|
||||
plugins[plugins[i].name] = plugins[i];
|
||||
|
||||
m = new form.Map('luci_statistics', _('Collectd Settings'));
|
||||
m.tabbed = true;
|
||||
|
||||
s = m.section(form.NamedSection, 'collectd', 'statistics', _('Collectd Settings'));
|
||||
|
||||
o = s.option(form.Value, 'Hostname', _('Hostname'));
|
||||
o.load = function() {
|
||||
return fs.trimmed('/proc/sys/kernel/hostname').then(L.bind(function(name) {
|
||||
this.placeholder = name;
|
||||
return uci.get('collectd', 'statistics', 'hostname');
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.Value, 'BaseDir', _('Base Directory'));
|
||||
o.default = '/var/run/collectd';
|
||||
|
||||
o = s.option(form.Value, 'Include', _('Directory for sub-configurations'));
|
||||
o.default = '/etc/collectd/conf.d/*.conf';
|
||||
|
||||
o = s.option(form.Value, 'PluginDir', _('Directory for collectd plugins'));
|
||||
o.default = '/usr/lib/collectd/';
|
||||
|
||||
o = s.option(form.Value, 'PIDFile', _('Used PID file'));
|
||||
o.default = '/var/run/collectd.pid';
|
||||
|
||||
o = s.option(form.Value, 'TypesDB', _('Datasets definition file'));
|
||||
o.default = '/etc/collectd/types.db';
|
||||
|
||||
o = s.option(form.Value, 'Interval', _('Data collection interval'), _('Seconds'));
|
||||
o.default = '60';
|
||||
|
||||
o = s.option(form.Value, 'ReadThreads', _('Number of threads for data collection'));
|
||||
o.default = '5';
|
||||
|
||||
o = s.option(form.Flag, 'FQDNLookup', _('Try to lookup fully qualified hostname'));
|
||||
o.default = o.disabled;
|
||||
o.optional = true;
|
||||
o.depends('Hostname', '');
|
||||
|
||||
var groupNames = [
|
||||
'general', _('General plugins'),
|
||||
'network', _('Network plugins'),
|
||||
'output', _('Output plugins')
|
||||
];
|
||||
|
||||
for (var i = 0; i < groupNames.length; i += 2) {
|
||||
s = m.section(form.GridSection, 'statistics_' + groupNames[i], groupNames[i + 1]);
|
||||
|
||||
s.cfgsections = L.bind(function(category) {
|
||||
return this.map.data.sections('luci_statistics', 'statistics')
|
||||
.map(function(s) { return s['.name'] })
|
||||
.filter(function(section_id) {
|
||||
var name = section_id.replace(/^collectd_/, ''),
|
||||
plugin = plugins[name];
|
||||
|
||||
return (section_id.indexOf('collectd_') == 0 && plugin != null &&
|
||||
plugin.installed && plugin.spec.category == category);
|
||||
});
|
||||
}, s, groupNames[i]);
|
||||
|
||||
s.sectiontitle = function(section_id) {
|
||||
var name = section_id.replace(/^collectd_/, ''),
|
||||
plugin = plugins[name];
|
||||
|
||||
return plugin ? plugin.spec.title : name
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enabled'));
|
||||
o.editable = true;
|
||||
o.modalonly = false;
|
||||
|
||||
o = s.option(form.DummyValue, '_dummy', _('Status'));
|
||||
o.width = '50%';
|
||||
o.modalonly = false;
|
||||
o.textvalue = function(section_id) {
|
||||
var name = section_id.replace(/^collectd_/, ''),
|
||||
section = uci.get('luci_statistics', section_id),
|
||||
plugin = plugins[name];
|
||||
|
||||
if (section.enable != '1')
|
||||
return E('em', {}, [_('Plugin is disabled')]);
|
||||
|
||||
var summary = plugin ? plugin.form.configSummary(section) : null;
|
||||
return summary || E('em', _('none'));
|
||||
};
|
||||
|
||||
s.modaltitle = function(section_id) {
|
||||
var name = section_id.replace(/^collectd_/, ''),
|
||||
plugin = plugins[name];
|
||||
|
||||
return plugin ? plugin.form.title : null;
|
||||
};
|
||||
|
||||
s.addModalOptions = function(s) {
|
||||
var name = s.section.replace(/^collectd_/, ''),
|
||||
plugin = plugins[name];
|
||||
|
||||
if (!plugin)
|
||||
return;
|
||||
|
||||
s.description = plugin.form.description;
|
||||
|
||||
plugin.form.addFormOptions(s);
|
||||
};
|
||||
|
||||
s.renderRowActions = function(section_id) {
|
||||
var name = section_id.replace(/^collectd_/, ''),
|
||||
plugin = plugins[name];
|
||||
|
||||
var trEl = this.super('renderRowActions', [ section_id, _('Configure…') ]);
|
||||
|
||||
if (!plugin || !plugin.form.addFormOptions)
|
||||
L.dom.content(trEl, null);
|
||||
|
||||
return trEl;
|
||||
};
|
||||
}
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,33 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('APCUPS Plugin Configuration'),
|
||||
description: _('The APCUPS plugin collects statistics about the APC UPS.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Host', _('Monitor host'));
|
||||
o.default = 'localhost';
|
||||
o.datatype = 'host';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'Port', _('Port for apcupsd communication'));
|
||||
o.default = '3551';
|
||||
o.datatype = 'port';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var hosts = L.toArray(section.Host);
|
||||
if (hosts.length)
|
||||
return N_(hosts.length,
|
||||
'Monitoring APC UPS at host %s, port %d',
|
||||
'Monitoring APC UPS at hosts %s, port %d'
|
||||
).format(hosts.join(', '), section.Port || 3551);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Conntrack Plugin Configuration'),
|
||||
description: _('The conntrack plugin collects statistics about the number of tracked connections.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Conntrack monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('CPU Context Switches Plugin Configuration'),
|
||||
description: _('This plugin collects statistics about the processor context switches.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Context switch monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,33 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('CPU Plugin Configuration'),
|
||||
description: _('The cpu plugin collects basic statistics about the processor usage.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Flag, 'ReportByCpu', _('Report by CPU'),
|
||||
_('By setting this, CPU is not aggregate of all processors on the system'));
|
||||
o.default = '1';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'ReportByState', _('Report by state'),
|
||||
_('When set to true, reports per-state metric (system, user, idle)'));
|
||||
o.default = '1';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'ValuesPercentage', _('Report in percent'),
|
||||
_('When set to true, we request percentage values'));
|
||||
o.default = '0';
|
||||
o.depends({ 'enable': '1', 'ReportByCpu': '1', 'ReportByState': '1' });
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('CPU monitoring is enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,26 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('CPU Frequency Plugin Configuration'),
|
||||
description: _('This plugin collects statistics about the processor frequency scaling.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Flag, 'ExtraItems', _('Extra items'),
|
||||
_('More details about frequency usage and transitions'));
|
||||
o.default = '0';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return (section.ExtraItems == '1')
|
||||
? _('Detailled CPU frequency monitoring enabled')
|
||||
: _('Simple CPU frequency monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,27 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('CSV Plugin Configuration'),
|
||||
description: _('The csv plugin stores collected data in csv file format for further processing by external programs.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'DataDir', _('Storage directory for the csv files'));
|
||||
o.default = '127.0.0.1';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'StoreRates', _('Store data values as rates instead of absolute values'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
if (section.DataDir)
|
||||
return _('Storing CSV data in %s').format(section.DataDir);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,32 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('cUrl Plugin Configuration'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o, ss;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.SectionValue, '__pages', form.TableSection, 'collectd_curl_page');
|
||||
o.title = _('Fetch pages');
|
||||
o.depends('enable', '1');
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
|
||||
o = ss.option(form.Flag, 'enable', _('Enable'));
|
||||
o.default = '1';
|
||||
|
||||
o = ss.option(form.Value, 'name', _('Name'));
|
||||
|
||||
o = ss.option(form.Value, 'url', _('URL'));
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('cURL plugin enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,110 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('DF Plugin Configuration'),
|
||||
description: _('The df plugin collects statistics about the disk space usage on different devices, mount points or filesystem types.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Devices', _('Monitor devices'));
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return fs.lines('/proc/partitions').then(L.bind(function(lines) {
|
||||
var parts = [];
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var line = L.toArray(lines[i]);
|
||||
if (!isNaN(line[0]))
|
||||
parts.push('/dev/' + line[3]);
|
||||
}
|
||||
|
||||
parts.sort();
|
||||
|
||||
for (var i = 0; i < parts.length; i++)
|
||||
this.value(parts[i]);
|
||||
|
||||
return this.super('load', [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.DynamicList, 'MountPoints', _('Monitor mount points'));
|
||||
o.default = '/overlay';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return fs.lines('/proc/mounts').then(L.bind(function(lines) {
|
||||
var mounts = {};
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var line = L.toArray(lines[i]);
|
||||
mounts[line[1]] = true;
|
||||
}
|
||||
|
||||
mounts = Object.keys(mounts).sort();
|
||||
|
||||
for (var i = 0; i < mounts.length; i++)
|
||||
this.value(mounts[i]);
|
||||
|
||||
return this.super('load', [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.DynamicList, 'FSTypes', _('Monitor filesystem types'));
|
||||
o.default = 'tmpfs';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return Promise.all([
|
||||
fs.lines('/etc/filesystems'),
|
||||
fs.lines('/proc/filesystems')
|
||||
]).then(L.bind(function(lines) {
|
||||
var fslines = lines[0].concat(lines[1]),
|
||||
fstypes = {};
|
||||
|
||||
for (var i = 0; i < fslines.length; i++) {
|
||||
var line = L.toArray(fslines[i]);
|
||||
|
||||
if (line.length == 2 && line[0] == 'nodev')
|
||||
continue;
|
||||
|
||||
fstypes[line.pop()] = true;
|
||||
}
|
||||
|
||||
fstypes = Object.keys(fstypes).sort();
|
||||
|
||||
for (var i = 0; i < fstypes.length; i++)
|
||||
this.value(fstypes[i]);
|
||||
|
||||
return this.super('load', [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var devs = L.toArray(section.Devices),
|
||||
mounts = L.toArray(section.MountPoints),
|
||||
fstypes = L.toArray(section.FSTypes),
|
||||
count = devs.length + mounts.length + count.length,
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (count == 0)
|
||||
return _('Monitoring all partitions');
|
||||
else
|
||||
return (invert ? _('Monitoring all except %s, %s, %s') : _('Monitoring %s, %s, %s')).format(
|
||||
N_(devs.length, 'one device', '%d devices').format(devs.length),
|
||||
N_(mounts.length, 'one mount', '%d mounts').format(mounts.length),
|
||||
N_(fstypes.length, 'one filesystem type', '%d filesystem types').format(fstypes.length)
|
||||
);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,49 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Disk Plugin Configuration'),
|
||||
description: _('The disk plugin collects detailed usage statistics for selected partitions or whole disks.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Disks', _('Monitor disks and partitions'),
|
||||
_('When none selected, all disks will be monitored.'));
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return fs.trimmed('/proc/partitions').then(L.bind(function(str) {
|
||||
var lines = (str || '').split(/\n/);
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var m = lines[i].match(/^ +[0-9]+ +[0-9]+ +[0-9]+ (\S+)$/);
|
||||
if (m)
|
||||
this.value(m[1]);
|
||||
}
|
||||
|
||||
return this.super('load', [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var disks = L.toArray(section.Disks),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (disks.length == 0)
|
||||
return _('Monitoring all disks');
|
||||
else if (invert)
|
||||
return N_(disks.length, 'Monitoring all but one disk', 'Monitoring all but %d disks').format(disks.length);
|
||||
else
|
||||
return N_(disks.length, 'Monitoring one disk', 'Monitoring %d disks').format(disks.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,35 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('DNS Plugin Configuration'),
|
||||
description: _('The dns plugin collects detailed statistics about dns related traffic on selected interfaces.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Interfaces', _('Monitor interfaces'),
|
||||
_('When none selected, all interfaces will be monitored.'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.DynamicList, 'IgnoreSources', _('Ignore source addresses'));
|
||||
o.datatype = 'ipaddr("nomask")';
|
||||
o.default = '127.0.0.1';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var ifaces = L.toArray(section.Interfaces);
|
||||
|
||||
if (ifaces.length == 0)
|
||||
return _('Monitoring DNS queries on all interfaces');
|
||||
else
|
||||
return N_(ifaces.length, 'Monitoring DNS queries on one interface', 'Monitoring DNS queries on %d interfaces').format(ifaces.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('E-Mail Plugin Configuration'),
|
||||
description: _('The email plugin creates a unix socket which can be used to transmit email-statistics to a running collectd daemon. This plugin is primarily intended to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can be used in other ways as well.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'SocketFile', _('Socket file'));
|
||||
o.default = '/var/run/collect-email.sock';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.GroupSelect, 'SocketGroup', _('Socket group'));
|
||||
o.default = 'nogroup';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'SocketPerms', _('Socket permissions'));
|
||||
o.default = '0770';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
o.validate = function(section_id, v) {
|
||||
if (v == '')
|
||||
return true;
|
||||
|
||||
if (!v.match(/^[0-7]{1,4}$/))
|
||||
return _('Expecting permssions in octal notation');
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
o = s.option(form.Value, 'MaxConns', _('Maximum allowed connections'));
|
||||
o.datatype = 'range(1,16384)';
|
||||
o.default = '5';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
if (section.SocketFile)
|
||||
return _('Awaiting email input at %s').format(section.SocketFile);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Entropy Plugin Configuration'),
|
||||
description: _('The entropy plugin collects statistics about the available entropy.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Entropy monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,63 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Exec Plugin Configuration'),
|
||||
description: _('The exec plugin starts external commands to read values from or to notify external processes when certain threshold values have been reached.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o, ss;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.SectionValue, '__input', form.TableSection, 'collectd_exec_input');
|
||||
o.title = _('Add command for reading values');
|
||||
o.description = _('Here you can define external commands which will be started by collectd in order to read certain values. The values will be read from stdout.');
|
||||
o.depends('enable', '1');
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
|
||||
o = ss.option(form.Value, 'cmdline', _('Script'));
|
||||
o.default = '/usr/bin/stat-dhcpusers';
|
||||
|
||||
o = ss.option(widgets.UserSelect, 'cmduser', _('User'));
|
||||
o.default = 'nobody';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
|
||||
o = ss.option(widgets.GroupSelect, 'cmdgroup', _('Group'));
|
||||
o.default = 'nogroup';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
|
||||
o = s.option(form.SectionValue, '__notify', form.TableSection, 'collectd_exec_notify');
|
||||
o.title = _('Add notification command');
|
||||
o.description = _('Here you can define external commands which will be started by collectd when certain threshold values have been reached. The values leading to invocation will be fed to the the called programs stdin.');
|
||||
o.depends('enable', '1');
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
|
||||
o = ss.option(form.Value, 'cmdline', _('Script'));
|
||||
o.default = '/usr/bin/stat-dhcpusers';
|
||||
|
||||
o = ss.option(widgets.UserSelect, 'cmduser', _('User'));
|
||||
o.default = 'nobody';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
|
||||
o = ss.option(widgets.GroupSelect, 'cmdgroup', _('Group'));
|
||||
o.default = 'nogroup';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Command monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,36 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Interface Plugin Configuration'),
|
||||
description: _('The interface plugin collects traffic statistics on selected interfaces.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Interfaces', _('Monitor interfaces'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var ifaces = L.toArray(section.Interfaces),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (ifaces.length == 0)
|
||||
return _('Monitoring all interfaces');
|
||||
else if (invert)
|
||||
return N_(ifaces.length, 'Monitoring all but one interface', 'Monitoring all but %d interfaces').format(ifaces.length);
|
||||
else
|
||||
return N_(ifaces.length, 'Monitoring one interface', 'Monitoring %d interfaces').format(ifaces.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,166 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require uci';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Iptables Plugin Configuration'),
|
||||
description: _('The iptables plugin will monitor selected firewall rules and collect information about processed bytes and packets per rule.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o, ss;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
for (var family = 4; family <= 6; family += 2) {
|
||||
var suffix = (family == 4 ? '' : '6');
|
||||
|
||||
o = s.option(form.SectionValue, '__match' + suffix, form.TableSection, 'collectd_iptables_match' + suffix,
|
||||
suffix ? _('Match IPv6 iptables rules') : _('Match IPv4 iptables rules'),
|
||||
_('Here you can define various criteria by which the monitored iptables rules are selected.'));
|
||||
|
||||
o.depends('enable', '1');
|
||||
o.load = L.bind(function(suffix, section_id) {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/ip' + suffix + 'tables-save', []), '').then(L.bind(function(res) {
|
||||
var lines = res.split(/\n/),
|
||||
table, chain, count, iptables = {};
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var m;
|
||||
|
||||
if ((m = lines[i].match(/^\*(\S+)$/)) != null) {
|
||||
table = m[1];
|
||||
count = {};
|
||||
}
|
||||
else if ((m = lines[i].match(/^-A (.+?) (-.+)$/)) != null) {
|
||||
count[m[1]] = (count[m[1]] || 0) + 1;
|
||||
|
||||
iptables[table] = iptables[table] || {};
|
||||
iptables[table][m[1]] = iptables[table][m[1]] || {};
|
||||
iptables[table][m[1]][count[m[1]]] = E('span', {
|
||||
'style': 'overflow:hidden; text-overflow:ellipsis; max-width:200px',
|
||||
'data-tooltip': m[2]
|
||||
}, [
|
||||
'#%d: '.format(count[m[1]]),
|
||||
m[2].replace(/-m comment --comment "(.+?)" /, '')
|
||||
]);
|
||||
|
||||
/*
|
||||
* collectd currently does not support comments with spaces:
|
||||
* https://github.com/collectd/collectd/issues/2766
|
||||
*/
|
||||
var c = m[2].match(/-m comment --comment "(.+)" -/);
|
||||
if (c && c[1] != '!fw3' && !c[1].match(/[ \t\n]/))
|
||||
iptables[table][m[1]][c[1]] = E('span', {}, [ c[1] ]);
|
||||
}
|
||||
}
|
||||
|
||||
this.subsection.iptables = iptables;
|
||||
|
||||
return form.SectionValue.prototype.load.apply(this, [section_id]);
|
||||
}, this));
|
||||
}, o, suffix);
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
ss.addbtntitle = suffix ? _('Add IPv6 rule selector') : _('Add IPv4 rule selector');
|
||||
|
||||
o = ss.option(form.Value, 'name', _('Instance name'));
|
||||
o.datatype = 'maxlength(63)';
|
||||
o.validate = function(section_id, v) {
|
||||
var table_opt = this.section.children.filter(function(o) { return o.option == 'table' })[0],
|
||||
table_elem = table_opt.getUIElement(section_id);
|
||||
|
||||
table_elem.clearChoices();
|
||||
table_elem.addChoices(Object.keys(this.section.iptables).sort());
|
||||
|
||||
if (v != '' && v.match(/[ \t\n]/))
|
||||
return _('The instance name must not contain spaces');
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
o = ss.option(form.Value, 'table', _('Table'));
|
||||
o.default = 'filter';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.transformChoices = function() { return this.super('transformChoices', []) || {} };
|
||||
o.validate = function(section_id, table) {
|
||||
var chain_opt = this.section.children.filter(function(o) { return o.option == 'chain' })[0],
|
||||
chain_elem = chain_opt.getUIElement(section_id);
|
||||
|
||||
chain_elem.clearChoices();
|
||||
chain_elem.addChoices(Object.keys(this.section.iptables[table]).sort());
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
o = ss.option(form.Value, 'chain', _('Chain'));
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.transformChoices = function() { return this.super('transformChoices', []) || {} };
|
||||
o.validate = function(section_id, chain) {
|
||||
var table_opt = this.section.children.filter(function(o) { return o.option == 'table' })[0],
|
||||
rule_opt = this.section.children.filter(function(o) { return o.option == 'rule' })[0],
|
||||
rule_elem = rule_opt.getUIElement(section_id),
|
||||
table = table_opt.formvalue(section_id);
|
||||
|
||||
rule_elem.clearChoices();
|
||||
|
||||
if (this.section.iptables[table][chain]) {
|
||||
var keys = Object.keys(this.section.iptables[table][chain]).sort(function(a, b) {
|
||||
var x = a.match(/^(\d+)/),
|
||||
y = b.match(/^(\d+)/);
|
||||
|
||||
if (x && y)
|
||||
return +x[1] > +y[1];
|
||||
else if (x || y)
|
||||
return +!!x > +!!y;
|
||||
else
|
||||
return a > b;
|
||||
});
|
||||
|
||||
var labels = {};
|
||||
|
||||
for (var i = 0; i < keys.length; i++)
|
||||
labels[keys[i]] = this.section.iptables[table][chain][keys[i]].cloneNode(true);
|
||||
|
||||
rule_elem.addChoices(keys, labels);
|
||||
}
|
||||
|
||||
if (chain != '' && chain.match(/[ \t\n]/))
|
||||
return _('The chain name must not contain spaces');
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
o = ss.option(form.Value, 'rule', _('Comment / Rule Number'));
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.transformChoices = function() { return this.super('transformChoices', []) || {} };
|
||||
o.load = function(section_id) {
|
||||
var table = uci.get('luci_statistics', section_id, 'table'),
|
||||
chain = uci.get('luci_statistics', section_id, 'chain'),
|
||||
rule = uci.get('luci_statistics', section_id, 'rule'),
|
||||
ipt = this.section.iptables;
|
||||
|
||||
if (ipt[table] && ipt[table][chain] && ipt[table][chain][rule])
|
||||
this.value(rule, ipt[table][chain][rule].cloneNode(true));
|
||||
|
||||
return rule;
|
||||
};
|
||||
o.validate = function(section_id, rule) {
|
||||
if (rule != '' && rule.match(/[ \t\n]/))
|
||||
return _('The comment to match must not contain spaces');
|
||||
|
||||
return true;
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Rule monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,60 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('IRQ Plugin Configuration'),
|
||||
description: _('The irq plugin will monitor the rate of issues per second for each selected interrupt. If no interrupt is selected then all interrupts are monitored.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Irqs', _('Monitor interrupts'));
|
||||
o.optional = true;
|
||||
o.multiple = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return fs.trimmed('/proc/interrupts').then(L.bind(function(str) {
|
||||
var lines = str.split(/\n/),
|
||||
cpus = L.toArray(lines[0]);
|
||||
|
||||
for (var i = 1; i < lines.length; i++) {
|
||||
var line = lines[i],
|
||||
m = lines[i].match(/^\s*([^\s:]+):/);
|
||||
|
||||
if (!m)
|
||||
continue;
|
||||
|
||||
line = line.replace(/^[^:]+:\s+/, '');
|
||||
|
||||
for (var j = 0; j < cpus.length; j++)
|
||||
line = line.replace(/^\d+\s*/, '');
|
||||
|
||||
var desc = line.split(/ {2,}/).join(', ');
|
||||
|
||||
this.value(m[1], '%s (%s)'.format(m[1], desc || '-'));
|
||||
}
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.optional = 'true';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var irqs = L.toArray(section.Irqs),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (irqs.length == 0)
|
||||
return _('Monitoring all interrupts');
|
||||
else if (invert)
|
||||
return N_(irqs.length, 'Monitoring all but one interrupt', 'Monitoring all but %d interrupts').format(irqs.length);
|
||||
else
|
||||
return N_(irqs.length, 'Monitoring one interrupt', 'Monitoring %d interrupts').format(irqs.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,41 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Wireless iwinfo Plugin Configuration'),
|
||||
description: _('The iwinfo plugin collects statistics about wireless signal strength, noise and quality.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Interfaces', _('Monitor interfaces'), _('Leave unselected to automatically determine interfaces to monitor.'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.noinactive = true;
|
||||
o.depends('enable', '1');
|
||||
o.filter = function(section_id, name) {
|
||||
var dev = this.devices.filter(function(dev) { return dev.getName() == name })[0];
|
||||
return (dev && dev.getType() == 'wifi');
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var ifaces = L.toArray(section.Interfaces),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (ifaces.length == 0)
|
||||
return _('Monitoring all interfaces');
|
||||
else if (invert)
|
||||
return N_(ifaces.length, 'Monitoring all but one interface', 'Monitoring all but %d interfaces').format(ifaces.length);
|
||||
else
|
||||
return N_(ifaces.length, 'Monitoring one interface', 'Monitoring %d interfaces').format(ifaces.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Load Plugin Configuration'),
|
||||
description: _('The load plugin collects statistics about the general system load.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Load monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,30 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Memory Plugin Configuration'),
|
||||
description: _('The memory plugin collects statistics about the memory usage.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Flag, 'ValuesAbsolute', _('Absolute values'),
|
||||
_('When set to true, we request absolute values'));
|
||||
o.default = '1';
|
||||
o.optional = false;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'ValuesPercentage', _('Percent values'),
|
||||
_('When set to true, we request percentage values'));
|
||||
o.default = '0';
|
||||
o.optional = false;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Memory monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,58 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Netlink Plugin Configuration'),
|
||||
description: _('The netlink plugin collects extended information like qdisc-, class- and filter-statistics for selected interfaces.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Interfaces', _('Basic monitoring'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'VerboseInterfaces', _('Verbose monitoring'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'QDiscs', _('Qdisc monitoring'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Classes', _('Shaping class monitoring'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.DeviceSelect, 'Filters', _('Filter class monitoring'));
|
||||
o.multiple = true;
|
||||
o.noaliases = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var basic = L.toArray(section.Interfaces),
|
||||
verbose = L.toArray(section.VerboseInterfaces),
|
||||
count = basic.length + verbose.length,
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (invert && count == 0)
|
||||
return _('Monitoring all interfaces');
|
||||
else if (invert)
|
||||
return N_(count, 'Monitoring all but one interface', 'Monitoring all but %d interfaces').format(count);
|
||||
else if (count)
|
||||
return N_(count, 'Monitoring one interface', 'Monitoring %d interfaces').format(count);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,72 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Network Plugin Configuration'),
|
||||
description: _('The network plugin provides network based communication between different collectd instances. Collectd can operate both in client and server mode. In client mode locally collected data is transferred to a collectd server instance, in server mode the local instance receives data from other hosts.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o, ss;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'TimeToLive', _('TTL for network packets'));
|
||||
o.default = '128';
|
||||
o.datatype = 'range(0, 255)';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'Forward', _('Forwarding between listen and server addresses'));
|
||||
o.default = '0';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'CacheFlush', _('Cache flush interval'),
|
||||
_('Seconds'));
|
||||
o.default = '86400';
|
||||
o.datatype = 'uinteger';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.SectionValue, '__listeners', form.TableSection, 'collectd_network_listen');
|
||||
o.title = _('Listener interfaces');
|
||||
o.description = _('This section defines on which interfaces collectd will wait for incoming connections.');
|
||||
o.depends('enable', '1');
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
|
||||
o = ss.option(form.Value, 'host', _('Listen host'));
|
||||
o.default = '0.0.0.0';
|
||||
o.datatype = 'ipaddr("nomask")';
|
||||
|
||||
o = ss.option(form.Value, 'port', _('Listen port'));
|
||||
o.default = '25826';
|
||||
o.datatype = 'port';
|
||||
//o.optional = true;
|
||||
|
||||
o = s.option(form.SectionValue, '__servers', form.TableSection, 'collectd_network_server');
|
||||
o.title = _('Server interfaces');
|
||||
o.description = _('This section defines to which servers the locally collected data is sent to.');
|
||||
o.depends('enable', '1');
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
ss.addremove = true;
|
||||
|
||||
o = ss.option(form.Value, 'host', _('Server host'));
|
||||
o.default = '0.0.0.0';
|
||||
o.datatype = 'ipaddr("nomask")';
|
||||
|
||||
o = ss.option(form.Value, 'port', _('Server port'));
|
||||
o.default = '25826';
|
||||
o.datatype = 'port';
|
||||
//o.optional = true;
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Network communication enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,24 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('UPS Plugin Configuration'),
|
||||
description: _('The NUT plugin reads information about Uninterruptible Power Supplies.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'UPS', _('UPS'), _('UPS name in NUT ups@host format'));
|
||||
o.rmempty = true;
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var ups = L.toArray(section.UPS);
|
||||
|
||||
if (ups.length)
|
||||
return N_(ups.length, 'Monitoring one UPS', 'Monitoring %d UPSes').format(ups.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,51 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('OLSRd Plugin Configuration'),
|
||||
description: _('The OLSRd plugin reads information about meshed networks from the txtinfo plugin of OLSRd.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'Host', _('Host'),
|
||||
_('IP or hostname where to get the txtinfo output from'));
|
||||
o.datatype = 'host';
|
||||
o.rmempty = true;
|
||||
|
||||
o = s.option(form.Value, 'Port', _('Port'));
|
||||
o.datatype = 'port';
|
||||
o.rmempty = true;
|
||||
|
||||
o = s.option(form.ListValue, 'CollectLinks', _('CollectLinks'),
|
||||
_('Specifies what information to collect about links.'));
|
||||
o.default = 'Detail';
|
||||
o.value('No');
|
||||
o.value('Summary');
|
||||
o.value('Detail');
|
||||
|
||||
o = s.option(form.ListValue, 'CollectRoutes', _('CollectRoutes'),
|
||||
_('Specifies what information to collect about routes.'));
|
||||
o.default = 'Summary';
|
||||
o.value('No');
|
||||
o.value('Summary');
|
||||
o.value('Detail');
|
||||
|
||||
o = s.option(form.ListValue, 'CollectTopology', _('CollectTopology'),
|
||||
_('Specifies what information to collect about the global topology.'));
|
||||
o.default = 'Summary';
|
||||
o.value('No');
|
||||
o.value('Summary');
|
||||
o.value('Detail');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Monitoring OLSRd status at %s:%d').format(
|
||||
section.Host || 'localhost',
|
||||
section.Port || 2006
|
||||
);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,53 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('OpenVPN Plugin Configuration'),
|
||||
description: _('The OpenVPN plugin gathers information about the current vpn connection status.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Flag, 'CollectIndividualUsers', _('Generate a separate graph for each logged user'));
|
||||
o.default = '0';
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'CollectUserCount', _('Aggregate number of connected users'));
|
||||
o.default = '0';
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'CollectCompression', _('Gather compression statistics'));
|
||||
o.default = '0';
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'ImprovedNamingSchema', _('Use improved naming schema'));
|
||||
o.default = '0';
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.DynamicList, 'StatusFile', _('OpenVPN status files'));
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return L.resolveDefault(fs.list('/var/run'), []).then(L.bind(function(entries) {
|
||||
for (var i = 0; i < entries.length; i++)
|
||||
if (entries[i].type == 'file' && entries[i].name.match(/^openvpn\..+\.status$/))
|
||||
o.value('/var/run/' + entries[i].name);
|
||||
}, this));
|
||||
};
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var stats = L.toArray(section.StatusFile);
|
||||
|
||||
if (stats.length)
|
||||
return N_(stats.length, 'Monitoring one OpenVPN instance', 'Monitoring %d OpenVPN instancees').format(stats.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,43 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Ping Plugin Configuration'),
|
||||
description: _('The ping plugin will send icmp echo replies to selected hosts and measure the roundtrip time for each host.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Hosts', _('Monitor hosts'));
|
||||
o.default = '127.0.0.1';
|
||||
o.datatype = 'ipaddr("nomask")';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.ListValue, 'AddressFamily', _('Address family'));
|
||||
o.default = 'any';
|
||||
o.depends('enable', '1');
|
||||
o.value('any');
|
||||
o.value('ipv4');
|
||||
o.value('ipv6');
|
||||
|
||||
o = s.option(form.Value, 'TTL', _('TTL for ping packets'));
|
||||
o.default = '128';
|
||||
o.datatype = 'range(0, 255)';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'Interval', _('Interval for pings'), _('Seconds'));
|
||||
o.default = '1.0';
|
||||
o.datatype = 'ufloat';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var hosts = L.toArray(section.Hosts);
|
||||
|
||||
if (hosts.length)
|
||||
return N_(hosts.length, 'Monitoring one host', 'Monitoring %d hosts').format(hosts.length);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,27 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Processes Plugin Configuration'),
|
||||
description: _('The processes plugin collects information like cpu time, page faults and memory usage of selected processes.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Processes', _('Monitor processes'));
|
||||
o.default = 'uhttpd dropbear dnsmasq';
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var processes = L.toArray(section.Processes);
|
||||
|
||||
if (processes.length)
|
||||
return N_(processes.length, 'Monitoring one process', 'Monitoring %d processes').format(processes.length);
|
||||
else
|
||||
return _('Basic process monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,92 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('RRDTool Plugin Configuration'),
|
||||
description: _('The rrdtool plugin stores the collected data in rrd database files, the foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong values will result in a very high memory consumption in the temporary directory. This can render the device unusable!</strong>'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'DataDir', _('Storage directory'),
|
||||
_('Note: as pages are rendered by user \'nobody\', the *.rrd files, the storage directory and all its parent directories need to be world readable.'));
|
||||
o.default = '/tmp';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'StepSize', _('RRD step interval'),
|
||||
_('Seconds'));
|
||||
o.default = '30';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'HeartBeat', _('RRD heart beat interval'),
|
||||
_('Seconds'));
|
||||
o.default = '60';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'RRASingle', _('Only create average RRAs'),
|
||||
_('reduces rrd size'));
|
||||
o.default = 'true';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'RRAMax', _('Show max values instead of averages'),
|
||||
_('Max values for a period can be used instead of averages when not using \'only average RRAs\''));
|
||||
o.default = 'false';
|
||||
o.rmempty = true;
|
||||
o.depends('RRASingle', '0');
|
||||
|
||||
o = s.option(form.DynamicList, 'RRATimespans', _('Stored timespans'));
|
||||
o.default = '10min 1day 1week 1month 1year';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
o.validate = function(section_id, value) {
|
||||
if (value == '')
|
||||
return true;
|
||||
|
||||
if (value.match(/^[0-9]+(?:y|m|w|d|h|min|years?|months?|weeks?|days?|hours?)?$/))
|
||||
return true;
|
||||
|
||||
return _('Expecting valid time range');
|
||||
};
|
||||
|
||||
o = s.option(form.Value, 'RRARows', _('Rows per RRA'));
|
||||
o.default = '100';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'XFF', _('RRD XFiles Factor'));
|
||||
o.default = '0.1';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'CacheTimeout', _('Cache collected data for'),
|
||||
_('Seconds'));
|
||||
o.default = '100';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'CacheFlush', _('Flush cache after'),
|
||||
_('Seconds'));
|
||||
o.default = '100';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
if (section.DataDir)
|
||||
return _('Writing *.rrd files to %s').format(section.DataDir);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,64 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
var sensorTypes = [
|
||||
/^[0-9]+(?:\.[0-9]+)?v$/, 'voltage',
|
||||
/^(?:ain|in|vccp|vdd|vid|vin|volt|voltbatt|vrm)[0-9]*$/, 'voltage',
|
||||
/^(?:cpu_temp|remote_temp|temp)[0-9]*$/, 'temperature',
|
||||
/^(?:fan)[0-9]*$/, 'fanspeed',
|
||||
/^(?:power)[0-9]*$/, 'power'
|
||||
];
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Sensors Plugin Configuration'),
|
||||
description: _('The sensors plugin uses the Linux Sensors framework to gather environmental statistics.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Sensor', _('Sensor list'));
|
||||
o.rmempty = true;
|
||||
o.size = 18;
|
||||
o.depends('enable', '1');
|
||||
o.load = function(section_id) {
|
||||
return fs.exec_direct('/usr/sbin/sensors', ['-j'], 'json').then(L.bind(function(output) {
|
||||
for (var bus in output) {
|
||||
for (var sensor in output[bus]) {
|
||||
if (!L.isObject(output[bus][sensor]))
|
||||
continue;
|
||||
|
||||
for (var j = 0; j < sensorTypes.length; j += 2) {
|
||||
if (sensor.match(sensorTypes[j])) {
|
||||
this.value('%s/%s-%s'.format(bus, sensorTypes[j + 1], sensor));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this.super('load', [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var sensors = L.toArray(section.Sensor),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (invert && sensors.length)
|
||||
return N_(sensors.length, 'Monitoring all but one sensor', 'Monitoring all but %d sensors').format(sensors.length);
|
||||
else if (sensors.length)
|
||||
return N_(sensors.length, 'Monitoring one sensor', 'Monitoring %d sensors').format(sensors.length);
|
||||
else
|
||||
return _('Monitoring all sensors');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Splash Leases Plugin Configuration'),
|
||||
description: _('The splash leases plugin uses libuci to collect statistics about splash leases.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Monitoring spash leases');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,39 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('TCPConns Plugin Configuration'),
|
||||
description: _('The tcpconns plugin collects information about open tcp connections on selected ports.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Flag, 'ListeningPorts', _('Monitor all local listen ports'));
|
||||
o.default = '1';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'LocalPorts', _('Monitor local ports'));
|
||||
o.optional = true;
|
||||
o.depends({ enable: '1', ListeningPorts: '0' });
|
||||
|
||||
o = s.option(form.Value, 'RemotePorts', _('Monitor remote ports'));
|
||||
o.optional = true;
|
||||
o.depends({ enable: '1', ListeningPorts: '0' });
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var lports = L.toArray(section.LocalPorts),
|
||||
rports = L.toArray(section.RemotePorts);
|
||||
|
||||
if (section.ListeningPorts == '1')
|
||||
return _('Monitoring local listen ports');
|
||||
else
|
||||
return _('Monitoring %s and %s').format(
|
||||
N_(lports.length, 'one local port', '%d local ports').format(lports.length),
|
||||
N_(rports.length, 'one remote port', '%d remote ports').format(rports.length)
|
||||
);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
'use strict';
|
||||
'require fs';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Thermal Plugin Configuration'),
|
||||
description: _('The thermal plugin will monitor temperature of the system. Data is typically read from /sys/class/thermal/*/temp ( \'*\' denotes the thermal device to be read, e.g. thermal_zone1 )'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.DynamicList, 'Device', _('Monitor device(s) / thermal zone(s)'), _('Empty value = monitor all'));
|
||||
o.load = function(section_id) {
|
||||
return Promise.all([
|
||||
L.resolveDefault(fs.list('/sys/class/thermal'), []),
|
||||
L.resolveDefault(fs.list('/proc/acpi/thermal_zone'), [])
|
||||
]).then(L.bind(function(res) {
|
||||
var entries = res[0].concat(res[1]);
|
||||
|
||||
for (var i = 0; i < entries.length; i++)
|
||||
if (entries[i].type == 'directory' && !entries[i].name.match(/^cooling_device/))
|
||||
o.value(entries[i].name);
|
||||
|
||||
return this.super('load', [ section_id ]);
|
||||
}, this));
|
||||
};
|
||||
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Flag, 'IgnoreSelected', _('Monitor all except specified'));
|
||||
o.default = '0';
|
||||
o.optional = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
var zones = L.toArray(section.Device),
|
||||
invert = section.IgnoreSelected == '1';
|
||||
|
||||
if (zones.length)
|
||||
return (invert
|
||||
? _('Monitoring all thermal zones except %s')
|
||||
: _('Monitoring thermal zones %s')
|
||||
).format(zones.join(', '));
|
||||
else
|
||||
return _('Monitoring all thermal zones');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,36 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Unixsock Plugin Configuration'),
|
||||
description: _('The unixsock plugin creates a unix socket which can be used to read collected data from a running collectd instance.'),
|
||||
|
||||
addFormOptions: function(s) {
|
||||
var o;
|
||||
|
||||
o = s.option(form.Flag, 'enable', _('Enable this plugin'));
|
||||
o.default = '0';
|
||||
|
||||
o = s.option(form.Value, 'SocketFile', _('Socket path'));
|
||||
o.default = '/var/run/collect-query.socket';
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(widgets.GroupSelect, 'SocketGroup', _('Socket group'), _('Change the ownership of the socket file to the specified group.'));
|
||||
o.placeholder = 'nogroup';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
|
||||
o = s.option(form.Value, 'SocketPerms', _('Socket permissions'));
|
||||
o.placeholder = '0770';
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.depends('enable', '1');
|
||||
},
|
||||
|
||||
configSummary: function(section) {
|
||||
if (section.SocketFile)
|
||||
return _('Socket %s active').format(section.SocketFile);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
'require form';
|
||||
|
||||
return L.Class.extend({
|
||||
title: _('Uptime Plugin Configuration'),
|
||||
description: _('The uptime plugin collects statistics about the uptime of the system.'),
|
||||
|
||||
configSummary: function(section) {
|
||||
return _('Uptime monitoring enabled');
|
||||
}
|
||||
});
|
|
@ -9,66 +9,12 @@ function index()
|
|||
require("nixio.fs")
|
||||
require("luci.util")
|
||||
require("luci.statistics.datatree")
|
||||
require("luci.jsonc")
|
||||
|
||||
-- override entry(): check for existence <plugin>.so where <plugin> is derived from the called path
|
||||
function _entry( path, ... )
|
||||
local file = path[5] or path[4]
|
||||
if nixio.fs.access( "/usr/lib/collectd/" .. file .. ".so" ) then
|
||||
entry( path, ... )
|
||||
end
|
||||
end
|
||||
|
||||
local labels = {
|
||||
s_output = _("Output plugins"),
|
||||
s_general = _("General plugins"),
|
||||
s_network = _("Network plugins"),
|
||||
}
|
||||
|
||||
-- our collectd menu
|
||||
local collectd_menu = {
|
||||
output = { },
|
||||
general = { },
|
||||
network = { }
|
||||
}
|
||||
|
||||
local plugin_dir = "/usr/share/luci/statistics/plugins/"
|
||||
for filename in nixio.fs.dir(plugin_dir) do
|
||||
local plugin_def = luci.jsonc.parse(nixio.fs.readfile(plugin_dir .. filename))
|
||||
if type(plugin_def) == "table" then
|
||||
local name = filename:gsub("%.json", "")
|
||||
table.insert(collectd_menu[plugin_def.category], name)
|
||||
labels[name] = plugin_def.title
|
||||
end
|
||||
end
|
||||
|
||||
-- create toplevel menu nodes
|
||||
local st = entry({"admin", "statistics"}, template("admin_statistics/index"), _("Statistics"), 80)
|
||||
st.index = true
|
||||
|
||||
entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Setup"), 20).subindex = true
|
||||
|
||||
|
||||
-- populate collectd plugin menu
|
||||
local index = 1
|
||||
for section, plugins in luci.util.kspairs( collectd_menu ) do
|
||||
local e = entry(
|
||||
{ "admin", "statistics", "collectd", section },
|
||||
firstchild(), labels["s_"..section], index * 10
|
||||
)
|
||||
|
||||
e.index = true
|
||||
|
||||
for j, plugin in luci.util.vspairs( plugins ) do
|
||||
_entry(
|
||||
{ "admin", "statistics", "collectd", section, plugin },
|
||||
cbi("luci_statistics/" .. plugin ),
|
||||
labels[plugin] or plugin, j * 10
|
||||
)
|
||||
end
|
||||
|
||||
index = index + 1
|
||||
end
|
||||
entry({"admin", "statistics", "collectd"}, view("statistics/collectd"), _("Setup"), 20).subindex = true
|
||||
|
||||
-- output views
|
||||
local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 10)
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("APCUPS Plugin Configuration"),
|
||||
translate(
|
||||
"The APCUPS plugin collects statistics about the APC UPS."
|
||||
))
|
||||
|
||||
-- collectd_apcups config section
|
||||
s = m:section( NamedSection, "collectd_apcups", "luci_statistics" )
|
||||
|
||||
-- collectd_apcups.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_apcups.host (Host)
|
||||
host = s:option( Value, "Host", translate("Monitor host"), translate ("Add multiple hosts separated by space."))
|
||||
host.default = "localhost"
|
||||
host:depends( "enable", 1 )
|
||||
|
||||
-- collectd_apcups.port (Port)
|
||||
port = s:option( Value, "Port", translate("Port for apcupsd communication") )
|
||||
port.isinteger = true
|
||||
port.default = 3551
|
||||
port:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,62 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local sys = require("luci.sys")
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Collectd Settings"),
|
||||
translate(
|
||||
"Collectd is a small daemon for collecting data from " ..
|
||||
"various sources through different plugins. On this page " ..
|
||||
"you can change general settings for the collectd daemon."
|
||||
))
|
||||
|
||||
-- general config section
|
||||
s = m:section( NamedSection, "collectd", "luci_statistics" )
|
||||
|
||||
-- general.hostname (Hostname)
|
||||
hostname = s:option( Value, "Hostname", translate("Hostname") )
|
||||
hostname.default = sys.hostname()
|
||||
hostname.optional = true
|
||||
|
||||
-- general.basedir (BaseDir)
|
||||
basedir = s:option( Value, "BaseDir", translate("Base Directory") )
|
||||
basedir.default = "/var/run/collectd"
|
||||
|
||||
-- general.include (Include)
|
||||
include = s:option( Value, "Include", translate("Directory for sub-configurations") )
|
||||
include.default = "/etc/collectd/conf.d/*.conf"
|
||||
|
||||
-- general.plugindir (PluginDir)
|
||||
plugindir = s:option( Value, "PluginDir", translate("Directory for collectd plugins") )
|
||||
plugindir.default = "/usr/lib/collectd/"
|
||||
|
||||
-- general.pidfile (PIDFile)
|
||||
pidfile = s:option( Value, "PIDFile", translate("Used PID file") )
|
||||
pidfile.default = "/var/run/collectd.pid"
|
||||
|
||||
-- general.typesdb (TypesDB)
|
||||
typesdb = s:option( Value, "TypesDB", translate("Datasets definition file") )
|
||||
typesdb.default = "/etc/collectd/types.db"
|
||||
|
||||
-- general.interval (Interval)
|
||||
interval = s:option( Value, "Interval", translate("Data collection interval"), translate("Seconds") )
|
||||
interval.default = 60
|
||||
interval.isnumber = true
|
||||
|
||||
-- general.readthreads (ReadThreads)
|
||||
readthreads = s:option( Value, "ReadThreads", translate("Number of threads for data collection") )
|
||||
readthreads.default = 5
|
||||
readthreads.isnumber = true
|
||||
|
||||
-- general.fqdnlookup (FQDNLookup)
|
||||
fqdnlookup = s:option( Flag, "FQDNLookup", translate("Try to lookup fully qualified hostname") )
|
||||
fqdnlookup.enabled = "true"
|
||||
fqdnlookup.disabled = "false"
|
||||
fqdnlookup.default = "false"
|
||||
fqdnlookup.optional = true
|
||||
fqdnlookup:depends( "Hostname", "" )
|
||||
|
||||
|
||||
return m
|
|
@ -1,13 +0,0 @@
|
|||
-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Conntrack Plugin Configuration"),
|
||||
translate("The conntrack plugin collects statistics about the number of tracked connections."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_conntrack", "luci_statistics" )
|
||||
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
return m
|
|
@ -1,14 +0,0 @@
|
|||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("CPU Context Switches Plugin Configuration"),
|
||||
translate("This plugin collects statistics about the processor context switches."))
|
||||
|
||||
-- collectd_contextswitch config section
|
||||
s = m:section( NamedSection, "collectd_contextswitch", "luci_statistics" )
|
||||
|
||||
-- collectd_contextswitch.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
return m
|
|
@ -1,36 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("CPU Plugin Configuration"),
|
||||
translate("The cpu plugin collects basic statistics about the processor usage."))
|
||||
|
||||
-- collectd_cpu config section
|
||||
s = m:section( NamedSection, "collectd_cpu", "luci_statistics" )
|
||||
|
||||
-- collectd_cpu.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_cpu.reportbycpu (ReportByCpu)
|
||||
reportbycpu = s:option( Flag, "ReportByCpu",
|
||||
translate("Report by CPU"),
|
||||
translate("By setting this, CPU is not aggregate of all processors on the system"))
|
||||
reportbycpu.default = 1
|
||||
reportbycpu:depends( "enable", 1 )
|
||||
|
||||
-- collectd_cpu.reportbystate (ReportByState)
|
||||
reportbystate = s:option( Flag, "ReportByState",
|
||||
translate("Report by state"),
|
||||
translate("When set to true, reports per-state metric (system, user, idle)"))
|
||||
reportbystate.default = 1
|
||||
reportbystate:depends( "enable", 1 )
|
||||
|
||||
-- collectd_cpu.valuespercentage (ValuesPercentage)
|
||||
valuespercentage = s:option( Flag, "ValuesPercentage",
|
||||
translate("Report in percent"),
|
||||
translate("When set to true, we request percentage values"))
|
||||
valuespercentage.default = 0
|
||||
valuespercentage:depends({ enable = 1, ReportByCpu = 1, ReportByState = 1 })
|
||||
|
||||
return m
|
|
@ -1,20 +0,0 @@
|
|||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("CPU Frequency Plugin Configuration"),
|
||||
translate("This plugin collects statistics about the processor frequency scaling."))
|
||||
|
||||
-- collectd_cpufreq config section
|
||||
s = m:section( NamedSection, "collectd_cpufreq", "luci_statistics" )
|
||||
|
||||
-- collectd_cpufreq.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_cpufreq.extraitems
|
||||
extraitems = s:option( Flag, "ExtraItems", translate("Extra items"), translate("More details about frequency usage and transitions"))
|
||||
extraitems.default = "0"
|
||||
extraitems.optional = true
|
||||
extraitems:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,29 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("CSV Plugin Configuration"),
|
||||
translate(
|
||||
"The csv plugin stores collected data in csv file format " ..
|
||||
"for further processing by external programs."
|
||||
))
|
||||
|
||||
-- collectd_csv config section
|
||||
s = m:section( NamedSection, "collectd_csv", "luci_statistics" )
|
||||
|
||||
-- collectd_csv.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_csv.datadir (DataDir)
|
||||
datadir = s:option( Value, "DataDir", translate("Storage directory for the csv files") )
|
||||
datadir.default = "127.0.0.1"
|
||||
datadir:depends( "enable", 1 )
|
||||
|
||||
-- collectd_csv.storerates (StoreRates)
|
||||
storerates = s:option( Flag, "StoreRates", translate("Store data values as rates instead of absolute values") )
|
||||
storerates.default = 0
|
||||
storerates:depends( "enable", 1 )
|
||||
|
||||
return m
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
-- Copyright 2018 Chizhong Jin <pjincz@gmail.com>
|
||||
-- Licensed to the public under the BSD 3-clause license
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("cUrl Plugin Configuration"))
|
||||
|
||||
s = m:section(NamedSection, "collectd_curl")
|
||||
s_enable = s:option(Flag, "enable", translate("Enable this plugin"))
|
||||
s_enable.default = 0
|
||||
|
||||
page = m:section(TypedSection, "collectd_curl_page")
|
||||
page.addremove = true
|
||||
page.anonymous = true
|
||||
page.template = "cbi/tblsection"
|
||||
page.sortable = true
|
||||
|
||||
page_enable = page:option(Flag, "enable", translate("Enable"))
|
||||
page_enable.default = 1
|
||||
|
||||
page_name = page:option(Value, "name", translate("Name"))
|
||||
|
||||
page_addr = page:option(Value, "url", translate("URL"))
|
||||
|
||||
return m
|
|
@ -1,41 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("DF Plugin Configuration"),
|
||||
translate(
|
||||
"The df plugin collects statistics about the disk space " ..
|
||||
"usage on different devices, mount points or filesystem types."
|
||||
))
|
||||
|
||||
-- collectd_df config section
|
||||
s = m:section( NamedSection, "collectd_df", "luci_statistics" )
|
||||
|
||||
-- collectd_df.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_df.devices (Device)
|
||||
devices = s:option( Value, "Devices", translate("Monitor devices") )
|
||||
devices.default = "/dev/mtdblock/4"
|
||||
devices.optional = true
|
||||
devices:depends( "enable", 1 )
|
||||
|
||||
-- collectd_df.mountpoints (MountPoint)
|
||||
mountpoints = s:option( Value, "MountPoints", translate("Monitor mount points") )
|
||||
mountpoints.default = "/overlay"
|
||||
mountpoints.optional = true
|
||||
mountpoints:depends( "enable", 1 )
|
||||
|
||||
-- collectd_df.fstypes (FSType)
|
||||
fstypes = s:option( Value, "FSTypes", translate("Monitor filesystem types") )
|
||||
fstypes.default = "tmpfs"
|
||||
fstypes.optional = true
|
||||
fstypes:depends( "enable", 1 )
|
||||
|
||||
-- collectd_df.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,29 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Disk Plugin Configuration"),
|
||||
translate(
|
||||
"The disk plugin collects detailed usage statistics " ..
|
||||
"for selected partitions or whole disks."
|
||||
))
|
||||
|
||||
-- collectd_disk config section
|
||||
s = m:section( NamedSection, "collectd_disk", "luci_statistics" )
|
||||
|
||||
-- collectd_disk.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_disk.disks (Disk)
|
||||
devices = s:option( Value, "Disks", translate("Monitor disks and partitions") )
|
||||
devices.default = "hda1 hdb"
|
||||
devices.rmempty = true
|
||||
devices:depends( "enable", 1 )
|
||||
|
||||
-- collectd_disk.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,36 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local sys = require("luci.sys")
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("DNS Plugin Configuration"),
|
||||
translate(
|
||||
"The dns plugin collects detailed statistics about dns " ..
|
||||
"related traffic on selected interfaces."
|
||||
))
|
||||
|
||||
-- collectd_dns config section
|
||||
s = m:section( NamedSection, "collectd_dns", "luci_statistics" )
|
||||
|
||||
-- collectd_dns.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_dns.interfaces (Interface)
|
||||
interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") )
|
||||
interfaces.widget = "select"
|
||||
interfaces.size = 5
|
||||
interfaces:depends( "enable", 1 )
|
||||
interfaces:value("any")
|
||||
for k, v in pairs(sys.net.devices()) do
|
||||
interfaces:value(v)
|
||||
end
|
||||
|
||||
-- collectd_dns.ignoresources (IgnoreSource)
|
||||
ignoresources = s:option( Value, "IgnoreSources", translate("Ignore source addresses") )
|
||||
ignoresources.default = "127.0.0.1"
|
||||
ignoresources:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,48 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("E-Mail Plugin Configuration"),
|
||||
translate(
|
||||
"The email plugin creates a unix socket which can be used " ..
|
||||
"to transmit email-statistics to a running collectd daemon. " ..
|
||||
"This plugin is primarily intended to be used in conjunction " ..
|
||||
"with Mail::SpamAssasin::Plugin::Collectd but can be used in " ..
|
||||
"other ways as well."
|
||||
))
|
||||
|
||||
-- collectd_email config section
|
||||
s = m:section( NamedSection, "collectd_email", "luci_statistics" )
|
||||
|
||||
-- collectd_email.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_email.socketfile (SocketFile)
|
||||
socketfile = s:option( Value, "SocketFile", translate("Socket file") )
|
||||
socketfile.default = "/var/run/collect-email.sock"
|
||||
socketfile:depends( "enable", 1 )
|
||||
|
||||
-- collectd_email.socketgroup (SocketGroup)
|
||||
socketgroup = s:option( Value, "SocketGroup", translate("Socket group") )
|
||||
socketgroup.default = "nobody"
|
||||
socketgroup.rmempty = true
|
||||
socketgroup.optional = true
|
||||
socketgroup:depends( "enable", 1 )
|
||||
|
||||
-- collectd_email.socketperms (SocketPerms)
|
||||
socketperms = s:option( Value, "SocketPerms", translate("Socket permissions") )
|
||||
socketperms.default = "0770"
|
||||
socketperms.rmempty = true
|
||||
socketperms.optional = true
|
||||
socketperms:depends( "enable", 1 )
|
||||
|
||||
-- collectd_email.maxconns (MaxConns)
|
||||
maxconns = s:option( Value, "MaxConns", translate("Maximum allowed connections") )
|
||||
maxconns.default = 5
|
||||
maxconns.isinteger = true
|
||||
maxconns.rmempty = true
|
||||
maxconns.optional = true
|
||||
maxconns:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,14 +0,0 @@
|
|||
-- Copyright 2015 Hannu Nyman <hannu.nyman@iki.fi>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Entropy Plugin Configuration"),
|
||||
translate("The entropy plugin collects statistics about the available entropy."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_entropy", "luci_statistics" )
|
||||
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
return m
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Exec Plugin Configuration"),
|
||||
translate(
|
||||
"The exec plugin starts external commands to read values " ..
|
||||
"from or to notify external processes when certain threshold " ..
|
||||
"values have been reached."
|
||||
))
|
||||
|
||||
-- collectd_exec config section
|
||||
s = m:section( NamedSection, "collectd_exec", "luci_statistics" )
|
||||
|
||||
-- collectd_exec.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
|
||||
-- collectd_exec_input config section (Exec directives)
|
||||
exec = m:section( TypedSection, "collectd_exec_input",
|
||||
translate("Add command for reading values"),
|
||||
translate(
|
||||
"Here you can define external commands which will be " ..
|
||||
"started by collectd in order to read certain values. " ..
|
||||
"The values will be read from stdout."
|
||||
))
|
||||
exec.addremove = true
|
||||
exec.anonymous = true
|
||||
|
||||
-- collectd_exec_input.cmdline
|
||||
exec_cmdline = exec:option( Value, "cmdline", translate("Script") )
|
||||
exec_cmdline.default = "/usr/bin/stat-dhcpusers"
|
||||
|
||||
-- collectd_exec_input.cmdline
|
||||
exec_cmduser = exec:option( Value, "cmduser", translate("User") )
|
||||
exec_cmduser.default = "nobody"
|
||||
exec_cmduser.rmempty = true
|
||||
exec_cmduser.optional = true
|
||||
|
||||
-- collectd_exec_input.cmdline
|
||||
exec_cmdgroup = exec:option( Value, "cmdgroup", translate("Group") )
|
||||
exec_cmdgroup.default = "nogroup"
|
||||
exec_cmdgroup.rmempty = true
|
||||
exec_cmdgroup.optional = true
|
||||
|
||||
|
||||
-- collectd_exec_notify config section (NotifyExec directives)
|
||||
notify = m:section( TypedSection, "collectd_exec_notify",
|
||||
translate("Add notification command"),
|
||||
translate(
|
||||
"Here you can define external commands which will be " ..
|
||||
"started by collectd when certain threshold values have " ..
|
||||
"been reached. The values leading to invocation will be " ..
|
||||
"fed to the the called programs stdin."
|
||||
))
|
||||
notify.addremove = true
|
||||
notify.anonymous = true
|
||||
|
||||
-- collectd_notify_input.cmdline
|
||||
notify_cmdline = notify:option( Value, "cmdline", translate("Script") )
|
||||
notify_cmdline.default = "/usr/bin/stat-dhcpusers"
|
||||
|
||||
-- collectd_notify_input.cmdline
|
||||
notify_cmduser = notify:option( Value, "cmduser", translate("User") )
|
||||
notify_cmduser.default = "nobody"
|
||||
notify_cmduser.rmempty = true
|
||||
notify_cmduser.optional = true
|
||||
|
||||
-- collectd_notify_input.cmdline
|
||||
notify_cmdgroup = notify:option( Value, "cmdgroup", translate("Group") )
|
||||
notify_cmdgroup.default = "nogroup"
|
||||
notify_cmdgroup.rmempty = true
|
||||
notify_cmdgroup.optional = true
|
||||
|
||||
|
||||
return m
|
|
@ -1,35 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local sys = require("luci.sys")
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Interface Plugin Configuration"),
|
||||
translate(
|
||||
"The interface plugin collects traffic statistics on " ..
|
||||
"selected interfaces."
|
||||
))
|
||||
|
||||
-- collectd_interface config section
|
||||
s = m:section( NamedSection, "collectd_interface", "luci_statistics" )
|
||||
|
||||
-- collectd_interface.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_interface.interfaces (Interface)
|
||||
interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") )
|
||||
interfaces.widget = "select"
|
||||
interfaces.size = 5
|
||||
interfaces:depends( "enable", 1 )
|
||||
for k, v in pairs(sys.net.devices()) do
|
||||
interfaces:value(v)
|
||||
end
|
||||
|
||||
-- collectd_interface.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,119 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local ip = require("luci.sys.iptparser").IptParser()
|
||||
|
||||
local chains = { }
|
||||
local targets = { }
|
||||
|
||||
for i, rule in ipairs( ip:find() ) do
|
||||
if rule.chain and rule.target then
|
||||
chains[rule.chain] = true
|
||||
targets[rule.target] = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Iptables Plugin Configuration"),
|
||||
translate(
|
||||
"The iptables plugin will monitor selected firewall rules and " ..
|
||||
"collect information about processed bytes and packets per rule."
|
||||
))
|
||||
|
||||
-- collectd_iptables config section
|
||||
s = m:section( NamedSection, "collectd_iptables", "luci_statistics" )
|
||||
|
||||
-- collectd_iptables.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
|
||||
-- collectd_iptables_match config section (Chain directives)
|
||||
rule = m:section( TypedSection, "collectd_iptables_match",
|
||||
translate("Add matching rule"),
|
||||
translate(
|
||||
"Here you can define various criteria by which the monitored " ..
|
||||
"iptables rules are selected."
|
||||
))
|
||||
rule.addremove = true
|
||||
rule.anonymous = true
|
||||
|
||||
|
||||
-- collectd_iptables_match.name
|
||||
rule_table = rule:option( Value, "name",
|
||||
translate("Name of the rule"), translate("max. 16 chars") )
|
||||
|
||||
-- collectd_iptables_match.table
|
||||
rule_table = rule:option( ListValue, "table", translate("Table") )
|
||||
rule_table.default = "filter"
|
||||
rule_table.rmempty = true
|
||||
rule_table.optional = true
|
||||
rule_table:value("")
|
||||
rule_table:value("filter")
|
||||
rule_table:value("nat")
|
||||
rule_table:value("mangle")
|
||||
|
||||
|
||||
-- collectd_iptables_match.chain
|
||||
rule_chain = rule:option( ListValue, "chain", translate("Chain") )
|
||||
rule_chain.rmempty = true
|
||||
rule_chain.optional = true
|
||||
rule_chain:value("")
|
||||
|
||||
for chain, void in pairs( chains ) do
|
||||
rule_chain:value( chain )
|
||||
end
|
||||
|
||||
|
||||
-- collectd_iptables_match.target
|
||||
rule_target = rule:option( ListValue, "target", translate("Action (target)") )
|
||||
rule_target.rmempty = true
|
||||
rule_target.optional = true
|
||||
rule_target:value("")
|
||||
|
||||
for target, void in pairs( targets ) do
|
||||
rule_target:value( target )
|
||||
end
|
||||
|
||||
|
||||
-- collectd_iptables_match.protocol
|
||||
rule_protocol = rule:option( ListValue, "protocol", translate("Network protocol") )
|
||||
rule_protocol.rmempty = true
|
||||
rule_protocol.optional = true
|
||||
rule_protocol:value("")
|
||||
rule_protocol:value("tcp")
|
||||
rule_protocol:value("udp")
|
||||
rule_protocol:value("icmp")
|
||||
|
||||
-- collectd_iptables_match.source
|
||||
rule_source = rule:option( Value, "source", translate("Source ip range") )
|
||||
rule_source.default = "0.0.0.0/0"
|
||||
rule_source.rmempty = true
|
||||
rule_source.optional = true
|
||||
|
||||
-- collectd_iptables_match.destination
|
||||
rule_destination = rule:option( Value, "destination", translate("Destination ip range") )
|
||||
rule_destination.default = "0.0.0.0/0"
|
||||
rule_destination.rmempty = true
|
||||
rule_destination.optional = true
|
||||
|
||||
-- collectd_iptables_match.inputif
|
||||
rule_inputif = rule:option( Value, "inputif",
|
||||
translate("Incoming interface"), translate("e.g. br-lan") )
|
||||
rule_inputif.rmempty = true
|
||||
rule_inputif.optional = true
|
||||
|
||||
-- collectd_iptables_match.outputif
|
||||
rule_outputif = rule:option( Value, "outputif",
|
||||
translate("Outgoing interface"), translate("e.g. br-ff") )
|
||||
rule_outputif.rmempty = true
|
||||
rule_outputif.optional = true
|
||||
|
||||
-- collectd_iptables_match.options
|
||||
rule_options = rule:option( Value, "options",
|
||||
translate("Options"), translate("e.g. reject-with tcp-reset") )
|
||||
rule_options.rmempty = true
|
||||
rule_options.optional = true
|
||||
|
||||
return m
|
|
@ -1,30 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("IRQ Plugin Configuration"),
|
||||
translate(
|
||||
"The irq plugin will monitor the rate of issues per second for " ..
|
||||
"each selected interrupt. If no interrupt is selected then all " ..
|
||||
"interrupts are monitored."
|
||||
))
|
||||
|
||||
-- collectd_irq config section
|
||||
s = m:section( NamedSection, "collectd_irq", "luci_statistics" )
|
||||
|
||||
-- collectd_irq.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_irq.irqs (Irq)
|
||||
irqs = s:option( Value, "Irqs", translate("Monitor interrupts") )
|
||||
irqs.optional = true
|
||||
irqs:depends( "enable", 1 )
|
||||
|
||||
-- collectd_irq.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected.optional = "true"
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,26 +0,0 @@
|
|||
-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local m, s, o
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Wireless iwinfo Plugin Configuration"),
|
||||
translate("The iwinfo plugin collects statistics about wireless signal strength, noise and quality."))
|
||||
|
||||
s = m:section(NamedSection, "collectd_iwinfo", "luci_statistics")
|
||||
|
||||
o = s:option(Flag, "enable", translate("Enable this plugin"))
|
||||
o.default = 0
|
||||
|
||||
o = s:option(DynamicList, "Interfaces", translate("Monitor interfaces"),
|
||||
translate("Leave unselected to automatically determine interfaces to monitor."))
|
||||
o.template = "cbi/network_ifacelist"
|
||||
o.widget = "checkbox"
|
||||
o.nocreate = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
o = s:option(Flag, "IgnoreSelected", translate("Monitor all except specified"))
|
||||
o.default = 0
|
||||
o:depends("enable", 1)
|
||||
|
||||
return m
|
|
@ -1,17 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Load Plugin Configuration"),
|
||||
translate(
|
||||
"The load plugin collects statistics about the general system load."
|
||||
))
|
||||
|
||||
-- collectd_wireless config section
|
||||
s = m:section( NamedSection, "collectd_load", "luci_statistics" )
|
||||
|
||||
-- collectd_wireless.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
return m
|
|
@ -1,29 +0,0 @@
|
|||
-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Memory Plugin Configuration"),
|
||||
translate("The memory plugin collects statistics about the memory usage."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_memory", "luci_statistics" )
|
||||
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_memory.valuesabsolute (ValuesAbsolute)
|
||||
valuesabsolute = s:option( Flag, "ValuesAbsolute",
|
||||
translate("Absolute values"),
|
||||
translate("When set to true, we request absolute values"))
|
||||
valuesabsolute.default = 1
|
||||
valuesabsolute.optional = false
|
||||
valuesabsolute:depends( "enable", 1 )
|
||||
|
||||
-- collectd_memory.valuespercentage (ValuesPercentage)
|
||||
valuespercentage = s:option( Flag, "ValuesPercentage",
|
||||
translate("Percent values"),
|
||||
translate("When set to true, we request percentage values"))
|
||||
valuespercentage.default = 0
|
||||
valuespercentage.optional = false
|
||||
valuespercentage:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,83 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local sys = require("luci.sys")
|
||||
|
||||
local devices = sys.net.devices()
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Netlink Plugin Configuration"),
|
||||
translate(
|
||||
"The netlink plugin collects extended information like " ..
|
||||
"qdisc-, class- and filter-statistics for selected interfaces."
|
||||
))
|
||||
|
||||
-- collectd_netlink config section
|
||||
s = m:section( NamedSection, "collectd_netlink", "luci_statistics" )
|
||||
|
||||
-- collectd_netlink.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_netlink.interfaces (Interface)
|
||||
interfaces = s:option( MultiValue, "Interfaces", translate("Basic monitoring") )
|
||||
interfaces.widget = "select"
|
||||
interfaces.optional = true
|
||||
interfaces.size = #devices + 1
|
||||
interfaces:depends( "enable", 1 )
|
||||
interfaces:value("")
|
||||
for i, v in ipairs(devices) do
|
||||
interfaces:value(v)
|
||||
end
|
||||
|
||||
-- collectd_netlink.verboseinterfaces (VerboseInterface)
|
||||
verboseinterfaces = s:option( MultiValue, "VerboseInterfaces", translate("Verbose monitoring") )
|
||||
verboseinterfaces.widget = "select"
|
||||
verboseinterfaces.optional = true
|
||||
verboseinterfaces.size = #devices + 1
|
||||
verboseinterfaces:depends( "enable", 1 )
|
||||
verboseinterfaces:value("")
|
||||
for i, v in ipairs(devices) do
|
||||
verboseinterfaces:value(v)
|
||||
end
|
||||
|
||||
-- collectd_netlink.qdiscs (QDisc)
|
||||
qdiscs = s:option( MultiValue, "QDiscs", translate("Qdisc monitoring") )
|
||||
qdiscs.widget = "select"
|
||||
qdiscs.optional = true
|
||||
qdiscs.size = #devices + 1
|
||||
qdiscs:depends( "enable", 1 )
|
||||
qdiscs:value("")
|
||||
for i, v in ipairs(devices) do
|
||||
qdiscs:value(v)
|
||||
end
|
||||
|
||||
-- collectd_netlink.classes (Class)
|
||||
classes = s:option( MultiValue, "Classes", translate("Shaping class monitoring") )
|
||||
classes.widget = "select"
|
||||
classes.optional = true
|
||||
classes.size = #devices + 1
|
||||
classes:depends( "enable", 1 )
|
||||
classes:value("")
|
||||
for i, v in ipairs(devices) do
|
||||
classes:value(v)
|
||||
end
|
||||
|
||||
-- collectd_netlink.filters (Filter)
|
||||
filters = s:option( MultiValue, "Filters", translate("Filter class monitoring") )
|
||||
filters.widget = "select"
|
||||
filters.optional = true
|
||||
filters.size = #devices + 1
|
||||
filters:depends( "enable", 1 )
|
||||
filters:value("")
|
||||
for i, v in ipairs(devices) do
|
||||
filters:value(v)
|
||||
end
|
||||
|
||||
-- collectd_netlink.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,85 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Network Plugin Configuration"),
|
||||
translate(
|
||||
"The network plugin provides network based communication between " ..
|
||||
"different collectd instances. Collectd can operate both in client " ..
|
||||
"and server mode. In client mode locally collected data is " ..
|
||||
"transferred to a collectd server instance, in server mode the " ..
|
||||
"local instance receives data from other hosts."
|
||||
))
|
||||
|
||||
-- collectd_network config section
|
||||
s = m:section( NamedSection, "collectd_network", "luci_statistics" )
|
||||
|
||||
-- collectd_network.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
|
||||
-- collectd_network_listen config section (Listen)
|
||||
listen = m:section( TypedSection, "collectd_network_listen",
|
||||
translate("Listener interfaces"),
|
||||
translate(
|
||||
"This section defines on which interfaces collectd will wait " ..
|
||||
"for incoming connections."
|
||||
))
|
||||
listen.addremove = true
|
||||
listen.anonymous = true
|
||||
|
||||
-- collectd_network_listen.host
|
||||
listen_host = listen:option( Value, "host", translate("Listen host") )
|
||||
listen_host.default = "0.0.0.0"
|
||||
|
||||
-- collectd_network_listen.port
|
||||
listen_port = listen:option( Value, "port", translate("Listen port") )
|
||||
listen_port.default = 25826
|
||||
listen_port.isinteger = true
|
||||
listen_port.optional = true
|
||||
|
||||
|
||||
-- collectd_network_server config section (Server)
|
||||
server = m:section( TypedSection, "collectd_network_server",
|
||||
translate("server interfaces"),
|
||||
translate(
|
||||
"This section defines to which servers the locally collected " ..
|
||||
"data is sent to."
|
||||
))
|
||||
server.addremove = true
|
||||
server.anonymous = true
|
||||
|
||||
-- collectd_network_server.host
|
||||
server_host = server:option( Value, "host", translate("Server host") )
|
||||
server_host.default = "0.0.0.0"
|
||||
|
||||
-- collectd_network_server.port
|
||||
server_port = server:option( Value, "port", translate("Server port") )
|
||||
server_port.default = 25826
|
||||
server_port.isinteger = true
|
||||
server_port.optional = true
|
||||
|
||||
-- collectd_network.timetolive (TimeToLive)
|
||||
ttl = s:option( Value, "TimeToLive", translate("TTL for network packets") )
|
||||
ttl.default = 128
|
||||
ttl.isinteger = true
|
||||
ttl.optional = true
|
||||
ttl:depends( "enable", 1 )
|
||||
|
||||
-- collectd_network.forward (Forward)
|
||||
forward = s:option( Flag, "Forward", translate("Forwarding between listen and server addresses") )
|
||||
forward.default = 0
|
||||
forward.optional = true
|
||||
forward:depends( "enable", 1 )
|
||||
|
||||
-- collectd_network.cacheflush (CacheFlush)
|
||||
cacheflush = s:option( Value, "CacheFlush",
|
||||
translate("Cache flush interval"), translate("Seconds") )
|
||||
cacheflush.default = 86400
|
||||
cacheflush.isinteger = true
|
||||
cacheflush.optional = true
|
||||
cacheflush:depends( "enable", 1 )
|
||||
|
||||
|
||||
return m
|
|
@ -1,17 +0,0 @@
|
|||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("UPS Plugin Configuration"),
|
||||
translate("The NUT plugin reads information about Uninterruptible Power Supplies."))
|
||||
|
||||
s = m:section(NamedSection, "collectd_nut", "luci_statistics" )
|
||||
|
||||
enable = s:option(Flag, "enable", translate("Enable this plugin"))
|
||||
enable.default = 0
|
||||
|
||||
host = s:option(Value, "UPS", translate("UPS"), translate("UPS name in NUT ups@host format"))
|
||||
host.placeholder = "myupsname"
|
||||
host.datatype = "string"
|
||||
host.rmempty = true
|
||||
|
||||
return m
|
|
@ -1,45 +0,0 @@
|
|||
-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("OLSRd Plugin Configuration"),
|
||||
translate("The OLSRd plugin reads information about meshed networks from the txtinfo plugin of OLSRd."))
|
||||
|
||||
s = m:section(NamedSection, "collectd_olsrd", "luci_statistics" )
|
||||
|
||||
enable = s:option(Flag, "enable", translate("Enable this plugin"))
|
||||
enable.default = 0
|
||||
|
||||
host = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from"))
|
||||
host.placeholder = "127.0.0.1"
|
||||
host.datatype = "host(1)"
|
||||
host.rmempty = true
|
||||
|
||||
port = s:option(Value, "Port", translate("Port"))
|
||||
port.placeholder = "2006"
|
||||
port.datatype = "range(0,65535)"
|
||||
port.rmempty = true
|
||||
port.cast = "string"
|
||||
|
||||
cl = s:option(ListValue, "CollectLinks", translate("CollectLinks"),
|
||||
translate("Specifies what information to collect about links."))
|
||||
cl:value("No")
|
||||
cl:value("Summary")
|
||||
cl:value("Detail")
|
||||
cl.default = "Detail"
|
||||
|
||||
cr = s:option(ListValue, "CollectRoutes", translate("CollectRoutes"),
|
||||
translate("Specifies what information to collect about routes."))
|
||||
cr:value("No")
|
||||
cr:value("Summary")
|
||||
cr:value("Detail")
|
||||
cr.default = "Summary"
|
||||
|
||||
ct = s:option(ListValue, "CollectTopology", translate("CollectTopology"),
|
||||
translate("Specifies what information to collect about the global topology."))
|
||||
ct:value("No")
|
||||
ct:value("Summary")
|
||||
ct:value("Detail")
|
||||
ct.default = "Summary"
|
||||
|
||||
return m
|
|
@ -1,53 +0,0 @@
|
|||
-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local m, s, o
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("OpenVPN Plugin Configuration"),
|
||||
translate("The OpenVPN plugin gathers information about the current vpn connection status."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_openvpn", "luci_statistics" )
|
||||
|
||||
|
||||
o = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
o.default = "0"
|
||||
|
||||
|
||||
o = s:option(Flag, "CollectIndividualUsers", translate("Generate a separate graph for each logged user"))
|
||||
o.default = "0"
|
||||
o.rmempty = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
|
||||
o = s:option(Flag, "CollectUserCount", translate("Aggregate number of connected users"))
|
||||
o.default = "0"
|
||||
o.rmempty = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
|
||||
o = s:option(Flag, "CollectCompression", translate("Gather compression statistics"))
|
||||
o.default = "0"
|
||||
o.rmempty = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
|
||||
o = s:option(Flag, "ImprovedNamingSchema", translate("Use improved naming schema"))
|
||||
o.default = "0"
|
||||
o.rmempty = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
|
||||
o = s:option(DynamicList, "StatusFile", translate("OpenVPN status files"))
|
||||
o.rmempty = true
|
||||
o:depends("enable", 1)
|
||||
|
||||
local status_files = nixio.fs.glob("/var/run/openvpn.*.status")
|
||||
if status_files then
|
||||
local status_file
|
||||
for status_file in status_files do
|
||||
o:value(status_file)
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,43 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Ping Plugin Configuration"),
|
||||
translate(
|
||||
"The ping plugin will send icmp echo replies to selected " ..
|
||||
"hosts and measure the roundtrip time for each host."
|
||||
))
|
||||
|
||||
-- collectd_ping config section
|
||||
s = m:section( NamedSection, "collectd_ping", "luci_statistics" )
|
||||
|
||||
-- collectd_ping.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_ping.hosts (Host)
|
||||
hosts = s:option( Value, "Hosts", translate("Monitor hosts"), translate ("Add multiple hosts separated by space."))
|
||||
hosts.default = "127.0.0.1"
|
||||
hosts:depends( "enable", 1 )
|
||||
|
||||
-- collectd_ping.adressfamily (AddressFamily)
|
||||
addressfamily = s:option( ListValue, "AddressFamily", translate("Address family") )
|
||||
addressfamily.default = "any"
|
||||
addressfamily:value( "any" )
|
||||
addressfamily:value( "ipv4" )
|
||||
addressfamily:value( "ipv6" )
|
||||
addressfamily:depends( "enable", 1 )
|
||||
|
||||
-- collectd_ping.ttl (TTL)
|
||||
ttl = s:option( Value, "TTL", translate("TTL for ping packets") )
|
||||
ttl.isinteger = true
|
||||
ttl.default = 128
|
||||
ttl:depends( "enable", 1 )
|
||||
|
||||
-- collectd_ping.interval (Interval)
|
||||
interval = s:option( Value, "Interval", translate("Interval for pings"), translate ("Seconds") )
|
||||
interval.isinteger = true
|
||||
interval.default = 30
|
||||
interval:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,24 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Processes Plugin Configuration"),
|
||||
translate(
|
||||
"The processes plugin collects information like cpu time, " ..
|
||||
"page faults and memory usage of selected processes."
|
||||
))
|
||||
|
||||
-- collectd_processes config section
|
||||
s = m:section( NamedSection, "collectd_processes", "luci_statistics" )
|
||||
|
||||
-- collectd_processes.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_processes.processes (Process)
|
||||
processes = s:option( Value, "Processes", translate("Monitor processes"),
|
||||
translate("Processes to monitor separated by space") )
|
||||
processes:depends( "enable", 1 )
|
||||
processes.default = "uhttpd dropbear dnsmasq"
|
||||
|
||||
return m
|
|
@ -1,107 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("RRDTool Plugin Configuration"),
|
||||
translate(
|
||||
"The rrdtool plugin stores the collected data in rrd database " ..
|
||||
"files, the foundation of the diagrams.<br /><br />" ..
|
||||
"<strong>Warning: Setting the wrong values will result in a very " ..
|
||||
"high memory consumption in the temporary directory. " ..
|
||||
"This can render the device unusable!</strong>"
|
||||
))
|
||||
|
||||
-- collectd_rrdtool config section
|
||||
s = m:section( NamedSection, "collectd_rrdtool", "luci_statistics" )
|
||||
|
||||
-- collectd_rrdtool.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 1
|
||||
|
||||
-- collectd_rrdtool.datadir (DataDir)
|
||||
datadir = s:option( Value, "DataDir",
|
||||
translate("Storage directory"),
|
||||
translate("Note: as pages are rendered by user 'nobody', the *.rrd files, " ..
|
||||
"the storage directory and all its parent directories need " ..
|
||||
"to be world readable."
|
||||
))
|
||||
datadir.default = "/tmp"
|
||||
datadir.rmempty = true
|
||||
datadir.optional = true
|
||||
datadir:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.stepsize (StepSize)
|
||||
stepsize = s:option( Value, "StepSize",
|
||||
translate("RRD step interval"), translate("Seconds") )
|
||||
stepsize.default = 30
|
||||
stepsize.isinteger = true
|
||||
stepsize.rmempty = true
|
||||
stepsize.optional = true
|
||||
stepsize:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.heartbeat (HeartBeat)
|
||||
heartbeat = s:option( Value, "HeartBeat",
|
||||
translate("RRD heart beat interval"), translate("Seconds") )
|
||||
heartbeat.default = 60
|
||||
heartbeat.isinteger = true
|
||||
heartbeat.rmempty = true
|
||||
heartbeat.optional = true
|
||||
heartbeat:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.rrasingle (RRASingle)
|
||||
rrasingle = s:option( Flag, "RRASingle",
|
||||
translate("Only create average RRAs"), translate("reduces rrd size") )
|
||||
rrasingle.default = true
|
||||
rrasingle:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.rramax (RRAMax)
|
||||
rramax = s:option( Flag, "RRAMax",
|
||||
translate("Show max values instead of averages"),
|
||||
translate("Max values for a period can be used instead of averages when not using 'only average RRAs'") )
|
||||
rramax.default = false
|
||||
rramax.rmempty = true
|
||||
rramax:depends( "RRASingle", 0 )
|
||||
|
||||
-- collectd_rrdtool.rratimespans (RRATimespan)
|
||||
rratimespans = s:option( Value, "RRATimespans",
|
||||
translate("Stored timespans"), translate("seconds; multiple separated by space") )
|
||||
rratimespans.default = "600 86400 604800 2678400 31622400"
|
||||
rratimespans.rmempty = true
|
||||
rratimespans.optional = true
|
||||
rratimespans:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.rrarows (RRARows)
|
||||
rrarows = s:option( Value, "RRARows", translate("Rows per RRA") )
|
||||
rrarows.isinteger = true
|
||||
rrarows.default = 100
|
||||
rrarows.rmempty = true
|
||||
rrarows.optional = true
|
||||
rrarows:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.xff (XFF)
|
||||
xff = s:option( Value, "XFF", translate("RRD XFiles Factor") )
|
||||
xff.default = 0.1
|
||||
xff.isnumber = true
|
||||
xff.rmempty = true
|
||||
xff.optional = true
|
||||
xff:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.cachetimeout (CacheTimeout)
|
||||
cachetimeout = s:option( Value, "CacheTimeout",
|
||||
translate("Cache collected data for"), translate("Seconds") )
|
||||
cachetimeout.isinteger = true
|
||||
cachetimeout.default = 100
|
||||
cachetimeout.rmempty = true
|
||||
cachetimeout.optional = true
|
||||
cachetimeout:depends( "enable", 1 )
|
||||
|
||||
-- collectd_rrdtool.cacheflush (CacheFlush)
|
||||
cacheflush = s:option( Value, "CacheFlush",
|
||||
translate("Flush cache after"), translate("Seconds") )
|
||||
cacheflush.isinteger = true
|
||||
cacheflush.default = 100
|
||||
cacheflush.rmempty = true
|
||||
cacheflush.optional = true
|
||||
cacheflush:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,123 +0,0 @@
|
|||
-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
local m, s, o
|
||||
local sensor_types = {
|
||||
["12v"] = "voltage",
|
||||
["2.0v"] = "voltage",
|
||||
["2.5v"] = "voltage",
|
||||
["3.3v"] = "voltage",
|
||||
["5.0v"] = "voltage",
|
||||
["5v"] = "voltage",
|
||||
["ain1"] = "voltage",
|
||||
["ain2"] = "voltage",
|
||||
["cpu_temp"] = "temperature",
|
||||
["fan1"] = "fanspeed",
|
||||
["fan2"] = "fanspeed",
|
||||
["fan3"] = "fanspeed",
|
||||
["fan4"] = "fanspeed",
|
||||
["fan5"] = "fanspeed",
|
||||
["fan6"] = "fanspeed",
|
||||
["fan7"] = "fanspeed",
|
||||
["in0"] = "voltage",
|
||||
["in10"] = "voltage",
|
||||
["in2"] = "voltage",
|
||||
["in3"] = "voltage",
|
||||
["in4"] = "voltage",
|
||||
["in5"] = "voltage",
|
||||
["in6"] = "voltage",
|
||||
["in7"] = "voltage",
|
||||
["in8"] = "voltage",
|
||||
["in9"] = "voltage",
|
||||
["power1"] = "power",
|
||||
["remote_temp"] = "temperature",
|
||||
["temp1"] = "temperature",
|
||||
["temp2"] = "temperature",
|
||||
["temp3"] = "temperature",
|
||||
["temp4"] = "temperature",
|
||||
["temp5"] = "temperature",
|
||||
["temp6"] = "temperature",
|
||||
["temp7"] = "temperature",
|
||||
["temp"] = "temperature",
|
||||
["vccp1"] = "voltage",
|
||||
["vccp2"] = "voltage",
|
||||
["vdd"] = "voltage",
|
||||
["vid1"] = "voltage",
|
||||
["vid2"] = "voltage",
|
||||
["vid3"] = "voltage",
|
||||
["vid4"] = "voltage",
|
||||
["vid5"] = "voltage",
|
||||
["vid"] = "voltage",
|
||||
["vin1"] = "voltage",
|
||||
["vin2"] = "voltage",
|
||||
["vin3"] = "voltage",
|
||||
["vin4"] = "voltage",
|
||||
["volt12"] = "voltage",
|
||||
["volt5"] = "voltage",
|
||||
["voltbatt"] = "voltage",
|
||||
["vrm"] = "voltage"
|
||||
|
||||
}
|
||||
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Sensors Plugin Configuration"),
|
||||
translate("The sensors plugin uses the Linux Sensors framework to gather environmental statistics."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_sensors", "luci_statistics" )
|
||||
|
||||
|
||||
o = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
o.default = 0
|
||||
|
||||
|
||||
o = s:option(Flag, "__all", translate("Monitor all sensors"))
|
||||
o:depends("enable", 1)
|
||||
o.default = 1
|
||||
o.write = function() end
|
||||
o.cfgvalue = function(self, sid)
|
||||
local v = self.map:get(sid, "Sensor")
|
||||
if v == nil or (type(v) == "table" and #v == 0) or (type(v) == "string" and #v == 0) then
|
||||
return "1"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
o = s:option(MultiValue, "Sensor", translate("Sensor list"), translate("Hold Ctrl to select multiple items or to deselect entries."))
|
||||
o:depends({enable = 1, __all = "" })
|
||||
o.widget = "select"
|
||||
o.rmempty = true
|
||||
o.size = 0
|
||||
|
||||
local sensorcli = io.popen("/usr/sbin/sensors -u -A")
|
||||
if sensorcli then
|
||||
local bus, sensor
|
||||
|
||||
while true do
|
||||
local ln = sensorcli:read("*ln")
|
||||
if not ln then
|
||||
break
|
||||
elseif ln:match("^[%w-]+$") then
|
||||
bus = ln
|
||||
elseif ln:match("^[%w-]+:$") then
|
||||
sensor = ln:sub(0, -2):lower()
|
||||
if bus and sensor_types[sensor] then
|
||||
o:value("%s/%s-%s" %{ bus, sensor_types[sensor], sensor })
|
||||
o.size = o.size + 1
|
||||
end
|
||||
elseif ln == "" then
|
||||
bus = nil
|
||||
sensor = nil
|
||||
end
|
||||
end
|
||||
|
||||
sensorcli:close()
|
||||
end
|
||||
|
||||
|
||||
o = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
o.default = 0
|
||||
o.rmempty = true
|
||||
o:depends({ enable = 1, __all = "" })
|
||||
|
||||
return m
|
|
@ -1,14 +0,0 @@
|
|||
-- Copyright 2013 Freifunk Augsburg / Michael Wendland <michael@michiwend.com>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Splash Leases Plugin Configuration"),
|
||||
translate("The splash leases plugin uses libuci to collect statistics about splash leases."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_splash_leases", "luci_statistics" )
|
||||
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 1
|
||||
|
||||
return m
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("TCPConns Plugin Configuration"),
|
||||
translate(
|
||||
"The tcpconns plugin collects information about open tcp " ..
|
||||
"connections on selected ports."
|
||||
))
|
||||
|
||||
-- collectd_tcpconns config section
|
||||
s = m:section( NamedSection, "collectd_tcpconns", "luci_statistics" )
|
||||
|
||||
-- collectd_tcpconns.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_tcpconns.listeningports (ListeningPorts)
|
||||
listeningports = s:option( Flag, "ListeningPorts", translate("Monitor all local listen ports") )
|
||||
listeningports.default = 1
|
||||
listeningports:depends( "enable", 1 )
|
||||
|
||||
-- collectd_tcpconns.localports (LocalPort)
|
||||
localports = s:option( Value, "LocalPorts", translate("Monitor local ports") )
|
||||
localports.optional = true
|
||||
localports:depends( "enable", 1 )
|
||||
|
||||
-- collectd_tcpconns.remoteports (RemotePort)
|
||||
remoteports = s:option( Value, "RemotePorts", translate("Monitor remote ports") )
|
||||
remoteports.optional = true
|
||||
remoteports:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,29 +0,0 @@
|
|||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Thermal Plugin Configuration"),
|
||||
translate("The thermal plugin will monitor temperature of the system. " ..
|
||||
"Data is typically read from /sys/class/thermal/*/temp " ..
|
||||
"( '*' denotes the thermal device to be read, e.g. thermal_zone1 )")
|
||||
)
|
||||
|
||||
-- collectd_thermal config section
|
||||
s = m:section( NamedSection, "collectd_thermal", "luci_statistics" )
|
||||
|
||||
-- collectd_thermal.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_thermal.tz (Device)
|
||||
tz = s:option( Value, "Device", translate("Monitor device(s) / thermal zone(s)"),
|
||||
translate("Empty value = monitor all") )
|
||||
tz.optional = true
|
||||
tz:depends( "enable", 1 )
|
||||
|
||||
-- collectd_thermal.ignoreselected (IgnoreSelected)
|
||||
ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
|
||||
ignoreselected.default = 0
|
||||
ignoreselected.optional = true
|
||||
ignoreselected:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,37 +0,0 @@
|
|||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Unixsock Plugin Configuration"),
|
||||
translate(
|
||||
"The unixsock plugin creates a unix socket which can be used " ..
|
||||
"to read collected data from a running collectd instance."
|
||||
))
|
||||
|
||||
-- collectd_unixsock config section
|
||||
s = m:section( NamedSection, "collectd_unixsock", "luci_statistics" )
|
||||
|
||||
-- collectd_unixsock.enable
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
-- collectd_unixsock.socketfile (SocketFile)
|
||||
socketfile = s:option( Value, "SocketFile" )
|
||||
socketfile.default = "/var/run/collect-query.socket"
|
||||
socketfile:depends( "enable", 1 )
|
||||
|
||||
-- collectd_unixsock.socketgroup (SocketGroup)
|
||||
socketgroup = s:option( Value, "SocketGroup" )
|
||||
socketgroup.default = "nobody"
|
||||
socketgroup.rmempty = true
|
||||
socketgroup.optional = true
|
||||
socketgroup:depends( "enable", 1 )
|
||||
|
||||
-- collectd_unixsock.socketperms (SocketPerms)
|
||||
socketperms = s:option( Value, "SocketPerms" )
|
||||
socketperms.default = "0770"
|
||||
socketperms.rmempty = true
|
||||
socketperms.optional = true
|
||||
socketperms:depends( "enable", 1 )
|
||||
|
||||
return m
|
|
@ -1,14 +0,0 @@
|
|||
-- Copyright 2013 Thomas Endt <tmo26@gmx.de>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
m = Map("luci_statistics",
|
||||
translate("Uptime Plugin Configuration"),
|
||||
translate("The uptime plugin collects statistics about the uptime of the system."))
|
||||
|
||||
s = m:section( NamedSection, "collectd_uptime", "luci_statistics" )
|
||||
|
||||
enable = s:option( Flag, "enable", translate("Enable this plugin") )
|
||||
enable.default = 0
|
||||
|
||||
return m
|
||||
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -17,13 +17,11 @@ $Id$
|
|||
|
||||
|
||||
require("luci.model.uci")
|
||||
require("luci.sys.iptparser")
|
||||
require("luci.util")
|
||||
require("luci.i18n")
|
||||
require("luci.jsonc")
|
||||
require("nixio.fs")
|
||||
|
||||
local ipt = luci.sys.iptparser.IptParser()
|
||||
local uci = luci.model.uci.cursor()
|
||||
local sections = uci:get_all( "luci_statistics" )
|
||||
|
||||
|
@ -138,29 +136,25 @@ end
|
|||
function config_iptables( c )
|
||||
local str = ""
|
||||
|
||||
for s in pairs(sections) do
|
||||
if sections[s][".type"] == "collectd_iptables_match" then
|
||||
for id, s in pairs(sections) do
|
||||
if s[".type"] == "collectd_iptables_match" or s[".type"] == "collectd_iptables_match6" then
|
||||
local tname = s.table and tostring(s.table)
|
||||
local chain = s.chain and tostring(s.chain)
|
||||
|
||||
search = { }
|
||||
if tname and tname:match("^%S+$") and chain and chain:match("^%S+$") then
|
||||
local line = { #s[".type"] > 23 and "\tChain6" or "\tChain", tname, chain }
|
||||
local rule = s.rule and tostring(s.rule)
|
||||
|
||||
for i, k in ipairs( {
|
||||
"table", "chain", "target", "protocol", "source", "destination",
|
||||
"inputif", "outputif", "options"
|
||||
} ) do
|
||||
v = sections[s][k]
|
||||
if rule and rule:match("^%S+$") then
|
||||
line[#line+1] = rule
|
||||
|
||||
if type(v) == "string" then
|
||||
if k == "options" then v = luci.util.split( v, "%s+", nil, true ) end
|
||||
search[k] = v
|
||||
local name = s.name and tostring(s.name)
|
||||
if name and name:match("^%S+$") then
|
||||
line[#line+1] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i, rule in ipairs( ipt:find( search ) ) do
|
||||
|
||||
name = sections[s].name:gsub( "%s+", "_" )
|
||||
if i > 1 then name = name .. "_(" .. i .. ")" end
|
||||
|
||||
str = str .. "\tChain " .. rule.table .. " " .. rule.chain .. " " .. rule.index .. ' "' .. name .. "\"\n"
|
||||
str = str .. table.concat(line, " ") .. "\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue