From 58c091ac9b2fc8c63cc3f6332da7f6507904ab12 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sat, 8 Feb 2020 11:28:14 +0100 Subject: luci-proto-modemmanager: use nmcli to detemrine modem choices Fixes: #3586 Signed-off-by: Jo-Philipp Wich --- .../luci-static/resources/protocol/modemmanager.js | 52 +++++++++++++++------- 1 file changed, 36 insertions(+), 16 deletions(-) (limited to 'protocols/luci-proto-modemmanager/htdocs') diff --git a/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js b/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js index 68dfb688c..804c567fa 100644 --- a/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js +++ b/protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js @@ -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)); }; -- cgit v1.2.3