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
				
			
		|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										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