#!/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 mm_get_modem_gps(modem) location = {} mstatus = {} mm_get_modem_location(modem) if (next(location) ~= nil) then mstatus["location"] = location else mstatus["location"] = {} end table.insert(gps["modem"], mstatus["location"]) 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_gps() 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 = {} gps = {} gps["modem"] = {} for k, v in ipairs(modems["modem-list"]) do mm_get_modem_gps(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 = {}, gps = {}, 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)) elseif call == "gps" then aquire_data_gps() print(json.encode(gps)) end end end main(arg[1], arg[2])