From 99067813a3b3d7718e44d4f716580fcd12022a02 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 13 Jun 2024 19:59:53 +0200 Subject: [PATCH] Add ModemManager status to ubus using feckert pull request to OpenWRT --- modemmanager/Makefile | 5 + .../files/usr/libexec/rpcd/modemmanager | 216 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 modemmanager/files/usr/libexec/rpcd/modemmanager diff --git a/modemmanager/Makefile b/modemmanager/Makefile index 638a51adf..a99efcbf3 100644 --- a/modemmanager/Makefile +++ b/modemmanager/Makefile @@ -43,6 +43,7 @@ define Package/modemmanager +glib2 \ +dbus \ +ppp \ + +lua-cjson \ +MODEMMANAGER_WITH_MBIM:libmbim \ +MODEMMANAGER_WITH_QMI:libqmi \ +MODEMMANAGER_WITH_QRTR:libqrtr-glib @@ -95,6 +96,10 @@ define Package/modemmanager/install $(INSTALL_BIN) ./files/usr/sbin/ModemManager-wrapper $(1)/usr/sbin $(INSTALL_BIN) ./files/usr/sbin/ModemManager-monitor $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/libexec/rpcd + $(INSTALL_BIN) ./files/usr/libexec/rpcd/modemmanager \ + $(1)/usr/libexec/rpcd/ + $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin diff --git a/modemmanager/files/usr/libexec/rpcd/modemmanager b/modemmanager/files/usr/libexec/rpcd/modemmanager new file mode 100644 index 000000000..0f0d24a48 --- /dev/null +++ b/modemmanager/files/usr/libexec/rpcd/modemmanager @@ -0,0 +1,216 @@ +#!/usr/bin/env lua + +local json = require "cjson" + +local status = {} +local bearers = {} +local sim = {} +local signal = {} +local location = {} + +local info = {} + +function mm_get_modem_bearer(index) + + local command = string.format("/usr/bin/mmcli --bearer=%s --output-json 2>/dev/null", index) + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, status = pcall(function() + return json.decode(string.format(output)) + end) + + if not ok then + return + end + + table.insert(bearers, status["bearer"]) +end + +function mm_get_modem_sim(index) + + local command = string.format("/usr/bin/mmcli --sim=%s --output-json 2>/dev/null", index) + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, status = pcall(function() + return json.decode(string.format(output)) + end) + + if not ok then + return + end + + sim = status["sim"] +end + +function mm_get_modem_signal(modem) + + local command = string.format("/usr/bin/mmcli --modem=%s --signal-get --output-json 2>/dev/null", modem) + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, status = pcall(function() + return json.decode(string.format(output)) + end) + + if ok == false then + return + end + + signal = status["modem"]["signal"] +end + +function mm_get_modem_location(modem) + + local command = string.format("/usr/bin/mmcli --modem=%s --location-get --output-json 2>/dev/null", modem) + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, status = pcall(function() + return json.decode(string.format(output)) + end) + + if ok == false then + return + end + + location = status["modem"]["location"] +end + +function mm_get_modem_status(modem) + + local command = string.format("/usr/bin/mmcli --modem=%s --output-json 2>/dev/null", modem) + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, mstatus = pcall(function() + return json.decode(string.format(output)) + end) + + if ok == false then + return + end + + if mstatus["modem"]["generic"]["bearers"] ~= nil then + bearers = {} + for k, v in ipairs(mstatus["modem"]["generic"]["bearers"]) do + mm_get_modem_bearer(v) + end + if (next(bearers) ~= nil) then + mstatus["modem"]["generic"]["bearers"] = bearers + end + end + + if mstatus["modem"]["generic"]["sim"] ~= "--" then + sim = {} + mm_get_modem_sim(mstatus["modem"]["generic"]["sim"]) + if (next(sim) ~= nil) then + mstatus["modem"]["generic"]["sim"] = sim + end + else + mstatus["modem"]["generic"]["sim"] = {} + end + + signal = {} + mm_get_modem_signal(modem) + if (next(signal) ~= nil) then + mstatus["modem"]["signal"] = signal + else + mstatus["modem"]["signal"] = {} + end + + location = {} + mm_get_modem_location(modem) + if (next(location) ~= nil) then + mstatus["modem"]["location"] = location + else + mstatus["modem"]["location"] = {} + end + + mstatus["modem"]["device"] = mstatus["modem"]["generic"]["device"] + + table.insert(status["modem"], mstatus["modem"]) +end + +function aquire_data_modemmanager() + + local command = string.format("/usr/bin/mmcli --list-modems --output-json 2>/dev/null") + + local handle = io.popen(command) + local output = handle:read("*a") + handle:close() + + local ok, modems = pcall(function() + return json.decode(output) + end) + + if not ok then + return + end + + entry_cache = {} + status = {} + status["modem"] = {} + for k, v in ipairs(modems["modem-list"]) do + mm_get_modem_status(modems["modem-list"][k]) + end +end + +function aquire_data_info() + aquire_data_modemmanager() + + -- check if modemmanger is available and is using a modem + if status['modem'] == nil then + return + end + + info['modem'] = {} + + for k, v in ipairs(status['modem']) do + local element = {} + + element['imei'] = status['modem'][k]['3gpp']['imei'] + element['signal'] = status['modem'][k]['generic']['signal-quality']['value'] + element['technology'] = status['modem'][k]['generic']['access-technologies'][1] + if status['modem'][k]['3gpp']['operator-name'] ~= '--' then + element['operator'] = status['modem'][k]['3gpp']['operator-name'] + end + if status['modem'][k]['generic']['sim']['properties'] ~= nil then + element['iccid'] = status['modem'][k]['generic']['sim']['properties']['iccid'] + element['imsi'] = status['modem'][k]['generic']['sim']['properties']['imsi'] + end + element['device'] = status['modem'][k]['device'] + + table.insert(info['modem'], element) + end +end + +function main(cmd, call) + if cmd == "list" then + print(json.encode({ + dump = {}, + info = {} + })) + elseif cmd == "call" then + if call == "dump" then + aquire_data_modemmanager() + print(json.encode(status)) + elseif call == "info" then + aquire_data_info() + print(json.encode(info)) + end + end +end + +main(arg[1], arg[2])