Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js fix XSS vulnerability Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix minor bugs Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix plugins bugs Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix interfaces bugs Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix interface & snr bugs Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix hostname Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix typo Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix missing files, use rpc for hostnames, remove luci-compat Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js luci-app-olsr: migrate to js fix menu order Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-olsr: migrate to js
292 lines
8.6 KiB
JavaScript
292 lines
8.6 KiB
JavaScript
'use strict';
|
|
'require view';
|
|
'require form';
|
|
'require uci';
|
|
'require ui';
|
|
'require fs';
|
|
'require network';
|
|
'require validation';
|
|
|
|
return view.extend({
|
|
load: function () {
|
|
return Promise.all([
|
|
uci.load('olsrd').then(() => {
|
|
return fs.list('/usr/lib').then((files) => {
|
|
const sections = uci.sections('olsrd', 'LoadPlugin');
|
|
const libsArr = [];
|
|
sections.forEach((section) => {
|
|
const lib = section.library;
|
|
libsArr.push(lib);
|
|
});
|
|
|
|
files.forEach((v) => {
|
|
if (v.name.substr(0, 6) === 'olsrd_') {
|
|
var pluginname = v.name.match(/^(olsrd.*)\.so\..*/)[1];
|
|
|
|
if (!libsArr.includes(pluginname)) {
|
|
var sid = uci.add('olsrd', 'LoadPlugin');
|
|
uci.set('olsrd', sid, 'ignore', '1');
|
|
uci.set('olsrd', sid, 'library', pluginname);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}),
|
|
]);
|
|
},
|
|
render: function () {
|
|
var pathname = window.location.pathname;
|
|
var segments = pathname.split('/');
|
|
var sidIndex = segments.lastIndexOf('plugins') + 1;
|
|
var sid = null;
|
|
if (sidIndex !== -1 && sidIndex < segments.length) {
|
|
sid = segments[sidIndex];
|
|
}
|
|
if (sid) {
|
|
var mp = new form.Map('olsrd', _('OLSR - Plugins'));
|
|
var p = mp.section(form.NamedSection, sid, 'LoadPlugin', _('Plugin configuration'));
|
|
p.anonymous = true;
|
|
var plname = uci.get('olsrd', sid, 'library');
|
|
var ign = p.option(form.Flag, 'ignore', _('Enable'));
|
|
ign.enabled = '0';
|
|
ign.disabled = '1';
|
|
ign.rmempty = false;
|
|
ign.cfgvalue = function (section_id) {
|
|
return uci.get('olsrd', section_id, 'ignore') || '0';
|
|
};
|
|
|
|
var lib = p.option(form.DummyValue, 'library', _('Library'));
|
|
lib.default = plname;
|
|
|
|
function Range(x, y) {
|
|
var t = [];
|
|
for (var i = x; i <= y; i++) {
|
|
t.push(i);
|
|
}
|
|
return t;
|
|
}
|
|
|
|
function Cidr2IpMask(val) {
|
|
function prefixToMask(prefix, isIPv6) {
|
|
return isIPv6 ? network.prefixToMask(prefix, true) : network.prefixToMask(prefix, false);
|
|
}
|
|
|
|
if (val) {
|
|
var newVal = val.map(cidr => {
|
|
var [ip, prefix] = cidr.split('/');
|
|
var networkip, mask;
|
|
|
|
if (validation.parseIPv6(ip)) {
|
|
networkip = ip;
|
|
mask = prefixToMask(parseInt(prefix), true);
|
|
} else if (validation.parseIPv4(ip)) {
|
|
networkip = ip;
|
|
mask = prefixToMask(parseInt(prefix), false);
|
|
}
|
|
|
|
return networkip && mask ? networkip + ' ' + mask : cidr;
|
|
});
|
|
|
|
}
|
|
return newVal;
|
|
}
|
|
|
|
function IpMask2Cidr(val) {
|
|
if (val) {
|
|
for (let i = 0; i < val.length; i++) {
|
|
var [ip, mask] = val[i].match(/([^ ]+)%s+([^ ]+)/) || [];
|
|
var cidr;
|
|
|
|
if (ip && mask) {
|
|
if (validation.parseIPv6(ip)) {
|
|
cidr = ip + '/' + mask;
|
|
} else if (validation.parseIPv4(ip)) {
|
|
var ipParts = ip.split('.');
|
|
var maskParts = mask.split('.');
|
|
var cidrParts = [];
|
|
|
|
for (let j = 0; j < 4; j++) {
|
|
var ipPart = parseInt(ipParts[j]);
|
|
var maskPart = parseInt(maskParts[j]);
|
|
var cidrPart = ipPart & maskPart;
|
|
cidrParts.push(cidrPart);
|
|
}
|
|
|
|
var cidrPrefix = network.maskToPrefix(maskParts.join('.'));
|
|
cidr = cidrParts.join('.') + '/' + cidrPrefix;
|
|
}
|
|
}
|
|
|
|
if (cidr) {
|
|
val[i] = cidr;
|
|
}
|
|
}
|
|
}
|
|
|
|
return val;
|
|
}
|
|
|
|
const knownPlParams = {
|
|
olsrd_bmf: [
|
|
[form.Value, 'BmfInterface', 'bmf0'],
|
|
[form.Value, 'BmfInterfaceIp', '10.10.10.234/24'],
|
|
[form.Flag, 'DoLocalBroadcast', 'no'],
|
|
[form.Flag, 'CapturePacketsOnOlsrInterfaces', 'yes'],
|
|
[form.ListValue, 'BmfMechanism', ['UnicastPromiscuous', 'Broadcast']],
|
|
[form.Value, 'BroadcastRetransmitCount', '2'],
|
|
[form.Value, 'FanOutLimit', '4'],
|
|
[form.DynamicList, 'NonOlsrIf', 'br-lan'],
|
|
],
|
|
olsrd_dyn_gw: [
|
|
[form.Value, 'Interval', '40'],
|
|
[form.DynamicList, 'Ping', '141.1.1.1'],
|
|
[form.DynamicList, 'HNA', '192.168.80.0/24', IpMask2Cidr, Cidr2IpMask],
|
|
],
|
|
olsrd_httpinfo: [
|
|
[form.Value, 'port', '80'],
|
|
[form.DynamicList, 'Host', '163.24.87.3'],
|
|
[form.DynamicList, 'Net', '0.0.0.0/0', Cidr2IpMask],
|
|
],
|
|
olsrd_nameservice: [
|
|
[form.DynamicList, 'name', 'my-name.mesh'],
|
|
[form.DynamicList, 'hosts', '1.2.3.4 name-for-other-interface.mesh'],
|
|
[form.Value, 'suffix', '.olsr'],
|
|
[form.Value, 'hosts_file', '/path/to/hosts_file'],
|
|
[form.Value, 'add_hosts', '/path/to/file'],
|
|
[form.Value, 'dns_server', '141.1.1.1'],
|
|
[form.Value, 'resolv_file', '/path/to/resolv.conf'],
|
|
[form.Value, 'interval', '120'],
|
|
[form.Value, 'timeout', '240'],
|
|
[form.Value, 'lat', '12.123'],
|
|
[form.Value, 'lon', '12.123'],
|
|
[form.Value, 'latlon_file', '/var/run/latlon.js'],
|
|
[form.Value, 'latlon_infile', '/var/run/gps.txt'],
|
|
[form.Value, 'sighup_pid_file', '/var/run/dnsmasq.pid'],
|
|
[form.Value, 'name_change_script', '/usr/local/bin/announce_new_hosts.sh'],
|
|
[form.DynamicList, 'service', 'http://me.olsr:80|tcp|my little homepage'],
|
|
[form.Value, 'services_file', '/var/run/services_olsr'],
|
|
[form.Value, 'services_change_script', '/usr/local/bin/announce_new_services.sh'],
|
|
[form.DynamicList, 'mac', 'xx:xx:xx:xx:xx:xx[,0-255]'],
|
|
[form.Value, 'macs_file', '/path/to/macs_file'],
|
|
[form.Value, 'macs_change_script', '/path/to/script'],
|
|
],
|
|
olsrd_quagga: [
|
|
[form.DynamicList, 'redistribute', ['system', 'kernel', 'connect', 'static', 'rip', 'ripng', 'ospf', 'ospf6', 'isis', 'bgp', 'hsls']],
|
|
[form.ListValue, 'ExportRoutes', ['only', 'both']],
|
|
[form.Flag, 'LocalPref', 'true'],
|
|
[form.Value, 'Distance', Range(0, 255)],
|
|
],
|
|
olsrd_secure: [[form.Value, 'Keyfile', '/etc/private-olsr.key']],
|
|
olsrd_txtinfo: [[form.Value, 'accept', '127.0.0.1']],
|
|
olsrd_jsoninfo: [
|
|
[form.Value, 'accept', '127.0.0.1'],
|
|
[form.Value, 'port', '9090'],
|
|
[form.Value, 'UUIDFile', '/etc/olsrd/olsrd.uuid'],
|
|
],
|
|
olsrd_watchdog: [
|
|
[form.Value, 'file', '/var/run/olsrd.watchdog'],
|
|
[form.Value, 'interval', '30'],
|
|
],
|
|
olsrd_mdns: [[form.DynamicList, 'NonOlsrIf', 'lan']],
|
|
olsrd_p2pd: [
|
|
[form.DynamicList, 'NonOlsrIf', 'lan'],
|
|
[form.Value, 'P2pdTtl', '10'],
|
|
],
|
|
olsrd_arprefresh: [],
|
|
olsrd_dot_draw: [],
|
|
olsrd_dyn_gw_plain: [],
|
|
olsrd_pgraph: [],
|
|
olsrd_tas: [],
|
|
};
|
|
|
|
if (knownPlParams[plname]) {
|
|
for (const option of knownPlParams[plname]) {
|
|
const [otype, name, defaultVal, uci2cbi, cbi2uci] = option;
|
|
let values;
|
|
|
|
if (Array.isArray(defaultVal)) {
|
|
values = defaultVal;
|
|
defaultVal = defaultVal[0];
|
|
}
|
|
|
|
if (otype === form.Flag) {
|
|
const bool = p.option(form.Flag, name, name);
|
|
if (defaultVal === 'yes' || defaultVal === 'no') {
|
|
bool.enabled = 'yes';
|
|
bool.disabled = 'no';
|
|
} else if (defaultVal === 'on' || defaultVal === 'off') {
|
|
bool.enabled = 'on';
|
|
bool.disabled = 'off';
|
|
} else if (defaultVal === '1' || defaultVal === '0') {
|
|
bool.enabled = '1';
|
|
bool.disabled = '0';
|
|
} else {
|
|
bool.enabled = 'true';
|
|
bool.disabled = 'false';
|
|
}
|
|
bool.optional = true;
|
|
bool.placeholder = defaultVal;
|
|
bool.cfgvalue = function (section_id) {
|
|
return uci.get('olsrd', section_id, name);
|
|
};
|
|
} else {
|
|
const field = p.option(otype, name, name);
|
|
if (values) {
|
|
for (const value of values) {
|
|
field.value(value);
|
|
}
|
|
}
|
|
field.cfgvalue = function (section_id) {
|
|
return uci.get('olsrd', section_id, name);
|
|
};
|
|
if (typeof uci2cbi === 'function') {
|
|
field.cfgvalue = function (section_id) {
|
|
return uci2cbi(uci.get('olsrd', section_id, name));
|
|
};
|
|
}
|
|
if (typeof cbi2uci === 'function') {
|
|
field.write = function (section_id, formvalue) {
|
|
var saveval=cbi2uci(formvalue);
|
|
uci.set('olsrd', section_id, name, saveval);
|
|
};
|
|
}
|
|
field.optional = true;
|
|
field.placeholder = defaultVal;
|
|
}
|
|
}
|
|
}
|
|
|
|
return mp.render();
|
|
} else {
|
|
var mpi = new form.Map('olsrd', _('OLSR - Plugins'));
|
|
|
|
var t = mpi.section(form.TableSection, 'LoadPlugin', _('Plugins'));
|
|
t.anonymous = true;
|
|
|
|
t.extedit = function (eve) {
|
|
var editButton = eve.target;
|
|
var sid;
|
|
var row = editButton.closest('.cbi-section-table-row');
|
|
|
|
if (row) {
|
|
sid = row.getAttribute('data-sid');
|
|
console.log(sid);
|
|
}
|
|
window.location.href = `plugins/${sid}`;
|
|
};
|
|
|
|
var ign = t.option(form.Flag, 'ignore', _('Enabled'));
|
|
ign.enabled = '0';
|
|
ign.disabled = '1';
|
|
ign.rmempty = false;
|
|
|
|
function ign_cfgvalue(section_id) {
|
|
return uci.get(section_id, 'ignore') || '0';
|
|
}
|
|
|
|
t.option(form.DummyValue, 'library', _('Library'));
|
|
|
|
return mpi.render();
|
|
}
|
|
},
|
|
});
|