mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-29 13:59:24 +01:00
c26b0ad3db
Where the code just needs to find all of the network objects, don't look for the device objects first because this only adds overhead. With the structure now having three levels it can be even more confusing, especially in getCurrentlyConnectedNetworkName where the outer loop didn't check for the Device interface. In getNetworkList don't return after the first device's networks are listed.
127 lines
4.3 KiB
Python
Executable File
127 lines
4.3 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import sys
|
|
import dbus
|
|
import logging
|
|
import traceback
|
|
|
|
IWD_SERVICE = 'net.connman.iwd'
|
|
|
|
IWD_AGENT_MANAGER_INTERFACE = 'net.connman.iwd.AgentManager'
|
|
IWD_DEVICE_INTERFACE = 'net.connman.iwd.Device'
|
|
IWD_NETWORK_INTERFACE = 'net.connman.iwd.Network'
|
|
IWD_AGENT_INTERFACE = 'net.connman.iwd.Agent'
|
|
IWD_WSC_INTERFACE = 'net.connman.iwd.WiFiSimpleConfiguration'
|
|
|
|
IWD_TOP_LEVEL_PATH = "/"
|
|
|
|
# get all the available networks
|
|
def getObjectList(bus):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
manager = dbus.Interface(bus.get_object(IWD_SERVICE, "/"),
|
|
"org.freedesktop.DBus.ObjectManager")
|
|
return manager.GetManagedObjects()
|
|
|
|
# get all the available networks
|
|
def getNetworkList(objects, bus):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
networkList = []
|
|
for path in objects:
|
|
if IWD_NETWORK_INTERFACE not in objects[path]:
|
|
continue
|
|
networkList.append(path)
|
|
return networkList
|
|
|
|
def connect(networkToConnect, self, mainloop, bus):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
logger.debug(" %s", networkToConnect)
|
|
network = dbus.Interface(bus.get_object(IWD_SERVICE, networkToConnect),
|
|
IWD_NETWORK_INTERFACE)
|
|
try:
|
|
network.Connect()
|
|
except:
|
|
errorMsg = "Could not connect to network %s", networkToConnect
|
|
logger.error(traceback.print_exc(file=sys.stdout))
|
|
self.assertTrue(False, errorMsg)
|
|
return False
|
|
|
|
logger.info("Successfully connected to: %s", networkToConnect)
|
|
return True
|
|
|
|
# try to disconnect from the device.
|
|
def disconnect(deviceToDisconnect, mainloop, bus):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
device = dbus.Interface(bus.get_object(IWD_SERVICE, deviceToDisconnect),
|
|
IWD_DEVICE_INTERFACE)
|
|
try:
|
|
device.Disconnect()
|
|
except:
|
|
errorMsg = "Failed to disconnect from device %s", deviceToDisconnect
|
|
logger.error(traceback.print_exc(file=sys.stdout))
|
|
assertTrue(False, errorMsg)
|
|
return False
|
|
|
|
logger.info("Successfully disconnected from: %s", deviceToDisconnect)
|
|
return True
|
|
|
|
# get the 1st network found to connect to
|
|
def getNetworkToConnectTo(objects):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
networkList = []
|
|
for path in objects:
|
|
if IWD_NETWORK_INTERFACE not in objects[path]:
|
|
continue
|
|
return path
|
|
return ""
|
|
|
|
# return the currently connected device by
|
|
# checking the 'ConnectedNetwork' property
|
|
def getCurrentlyConnectedDevice():
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
bus = dbus.SystemBus()
|
|
manager = dbus.Interface(bus.get_object(IWD_SERVICE, "/"),
|
|
"net.connman.iwd.Manager")
|
|
objects = getObjectList(bus)
|
|
for path in objects:
|
|
if IWD_DEVICE_INTERFACE not in objects[path]:
|
|
continue
|
|
device = objects[path][IWD_DEVICE_INTERFACE]
|
|
for key in device.keys():
|
|
if key in ["ConnectedNetwork"]:
|
|
return path
|
|
return ""
|
|
|
|
# get name of the network currently connected to
|
|
def getCurrentlyConnectedNetworkName():
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
bus = dbus.SystemBus()
|
|
deviceList = getObjectList(bus)
|
|
for path in deviceList:
|
|
if IWD_NETWORK_INTERFACE not in deviceList[path]:
|
|
continue
|
|
network = deviceList[path][IWD_NETWORK_INTERFACE]
|
|
# this check is needed in case when we are testing
|
|
# connectivity with multiple networks. The previously
|
|
# connected network will still have the 'Connected' property
|
|
# even though it will be set to 0.
|
|
if not network["Connected"]: # if "Connected is 0"
|
|
continue
|
|
return network["Name"]
|
|
return ""
|
|
|
|
# get name of the network
|
|
def getNetworkName(deviceList):
|
|
logger.debug(sys._getframe().f_code.co_name)
|
|
for path in deviceList:
|
|
if IWD_NETWORK_INTERFACE not in deviceList[path]:
|
|
continue
|
|
network = deviceList[path][IWD_NETWORK_INTERFACE]
|
|
return network["Name"]
|
|
return ""
|
|
|
|
def initLogger():
|
|
global logger
|
|
logger = logging.getLogger(__name__)
|
|
# logging levels include DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
logging.basicConfig(level=logging.DEBUG)
|