From: Jo-Philipp Wich <jo@mein.io>
Date: Sat, 8 Feb 2020 10:28:14 +0000 (+0100)
Subject: luci-proto-modemmanager: use nmcli to detemrine modem choices
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=58c091ac9b2fc8c63cc3f6332da7f6507904ab12;p=oweals%2Fluci.git

luci-proto-modemmanager: use nmcli to detemrine modem choices

Fixes: #3586
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
---

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" ]
+			}
+		}
+	}
+}