From 58c091ac9b2fc8c63cc3f6332da7f6507904ab12 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sat, 8 Feb 2020 11:28:14 +0100 Subject: [PATCH] luci-proto-modemmanager: use nmcli to detemrine modem choices Fixes: #3586 Signed-off-by: Jo-Philipp Wich --- .../resources/protocol/modemmanager.js | 52 +++++++++++++------ .../rpcd/acl.d/luci-proto-modemmanager.json | 12 +++++ 2 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json 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)); }; diff --git a/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json b/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json new file mode 100644 index 000000000..716f4c465 --- /dev/null +++ b/protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json @@ -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" ] + } + } + } +} -- 2.25.1