luci-app-statistics: convert collectd configuration to client side views

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2020-02-08 22:12:17 +01:00
parent 2df2958fd6
commit e7d22dce50
100 changed files with 21364 additions and 12615 deletions

View file

@ -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();
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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)
);
}
});

View file

@ -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);
}
});

View file

@ -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);
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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
);
}
});

View file

@ -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);
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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');
}
});

View file

@ -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)
);
}
});

View file

@ -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');
}
});

View file

@ -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);
}
});

View file

@ -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');
}
});

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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