luci-proto-modemmanager: use nmcli to detemrine modem choices
Fixes: #3586 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
50720d36a3
commit
58c091ac9b
2 changed files with 48 additions and 16 deletions
|
@ -1,21 +1,40 @@
|
|||
'use strict';
|
||||
'require rpc';
|
||||
'require fs';
|
||||
'require form';
|
||||
'require network';
|
||||
|
||||
var callFileList = rpc.declare({
|
||||
object: 'file',
|
||||
method: 'list',
|
||||
params: [ 'path' ],
|
||||
expect: { entries: [] },
|
||||
filter: function(list, params) {
|
||||
var rv = [];
|
||||
for (var i = 0; i < list.length; i++)
|
||||
if (list[i].name.match(/^cdc-wdm/))
|
||||
rv.push(params.path + list[i].name);
|
||||
return rv.sort();
|
||||
}
|
||||
});
|
||||
function getModemList() {
|
||||
return fs.exec_direct('/usr/bin/mmcli', [ '-L' ]).then(function(res) {
|
||||
var lines = (res || '').split(/\n/),
|
||||
tasks = [];
|
||||
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var m = lines[i].match(/\/Modem\/(\d+)/);
|
||||
if (m)
|
||||
tasks.push(fs.exec_direct('/usr/bin/mmcli', [ '-m', m[1] ]));
|
||||
}
|
||||
|
||||
return Promise.all(tasks).then(function(res) {
|
||||
var modems = [];
|
||||
|
||||
for (var i = 0; i < res.length; i++) {
|
||||
var man = res[i].match(/manufacturer: ([^\n]+)/),
|
||||
mod = res[i].match(/model: ([^\n]+)/),
|
||||
dev = res[i].match(/device: ([^\n]+)/);
|
||||
|
||||
if (dev) {
|
||||
modems.push({
|
||||
device: dev[1].trim(),
|
||||
manufacturer: (man ? man[1].trim() : '') || '?',
|
||||
model: (mod ? mod[1].trim() : '') || dev[1].trim()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return modems;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
network.registerPatternVirtual(/^mobiledata-.+$/);
|
||||
network.registerErrorCode('CALL_FAILED', _('Call failed'));
|
||||
|
@ -57,9 +76,10 @@ return network.registerProtocol('modemmanager', {
|
|||
o = s.taboption('general', form.ListValue, 'device', _('Modem device'));
|
||||
o.rmempty = false;
|
||||
o.load = function(section_id) {
|
||||
return callFileList('/dev/').then(L.bind(function(devices) {
|
||||
return getModemList().then(L.bind(function(devices) {
|
||||
for (var i = 0; i < devices.length; i++)
|
||||
this.value(devices[i]);
|
||||
this.value(devices[i].device,
|
||||
'%s - %s'.format(devices[i].manufacturer, devices[i].model));
|
||||
return form.Value.prototype.load.apply(this, [section_id]);
|
||||
}, this));
|
||||
};
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"luci-proto-modemmanager": {
|
||||
"description": "Grant access to mmcli",
|
||||
"read": {
|
||||
"cgi-io": [ "exec" ],
|
||||
"file": {
|
||||
"/usr/bin/mmcli -L": [ "exec" ],
|
||||
"/usr/bin/mmcli -m [0-9]": [ "exec" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue