mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	Add ModemManager status to ubus using feckert pull request to OpenWRT
This commit is contained in:
		
							parent
							
								
									1dc85e8cff
								
							
						
					
					
						commit
						99067813a3
					
				
					 2 changed files with 221 additions and 0 deletions
				
			
		
							
								
								
									
										216
									
								
								modemmanager/files/usr/libexec/rpcd/modemmanager
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								modemmanager/files/usr/libexec/rpcd/modemmanager
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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])
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue