diff options
Diffstat (limited to 'tools/test-networkmanager-service.py')
| -rwxr-xr-x | tools/test-networkmanager-service.py | 207 |
1 files changed, 150 insertions, 57 deletions
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py index 3a32d91d..68097778 100755 --- a/tools/test-networkmanager-service.py +++ b/tools/test-networkmanager-service.py @@ -92,9 +92,15 @@ class ExportedObj(dbus.service.Object): dbus.service.Object.__init__(self, bus, object_path) self._bus = bus self.path = object_path - self.__dbus_ifaces = {} + self.__ensure_dbus_ifaces() + object_manager.add_object(self) + + def __ensure_dbus_ifaces(self): + if not hasattr(self, '_ExportedObj__dbus_ifaces'): + self.__dbus_ifaces = {} def add_dbus_interface(self, dbus_iface, get_props_func, prop_changed_func): + self.__ensure_dbus_ifaces() self.__dbus_ifaces[dbus_iface] = ExportedObj.DBusInterface(dbus_iface, get_props_func, prop_changed_func) def __dbus_interface_get(self, dbus_iface): @@ -113,6 +119,11 @@ class ExportedObj(dbus.service.Object): def _dbus_property_notify(self, dbus_iface, propname): prop = self._dbus_property_get(dbus_iface, propname) self.__dbus_interface_get(dbus_iface).prop_changed_func(self, { propname: prop }) + ExportedObj.PropertiesChanged(self, dbus_iface, { propname: prop }, []) + + @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') + def PropertiesChanged(self, iface, changed, invalidated): + pass @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') def GetAll(self, dbus_iface): @@ -122,6 +133,16 @@ class ExportedObj(dbus.service.Object): def Get(self, dbus_iface, name): return self._dbus_property_get(dbus_iface, name) + def get_managed_ifaces(self): + my_ifaces = {} + for iface in self.__dbus_ifaces: + my_ifaces[iface] = self.__dbus_ifaces[iface].get_props_func() + return self.path, my_ifaces + + def remove_from_connection(self): + object_manager.remove_object(self) + dbus.service.Object.remove_from_connection(self) + ################################################################### IFACE_DEVICE = 'org.freedesktop.NetworkManager.Device' @@ -148,8 +169,6 @@ class Device(ExportedObj): def __init__(self, bus, iface, devtype): object_path = "/org/freedesktop/NetworkManager/Devices/%d" % Device.counter Device.counter = Device.counter + 1 - ExportedObj.__init__(self, bus, object_path) - self.add_dbus_interface(IFACE_DEVICE, self.__get_props, Device.PropertiesChanged) self.iface = iface self.udi = "/sys/devices/virtual/%s" % iface @@ -162,6 +181,9 @@ class Device(ExportedObj): self.dhcp6_config = None self.available_connections = [] + self.add_dbus_interface(IFACE_DEVICE, self.__get_props, Device.PropertiesChanged) + ExportedObj.__init__(self, bus, object_path) + # Properties interface def __get_props(self): props = {} @@ -221,8 +243,6 @@ PE_S390_SUBCHANNELS = "S390Subchannels" class WiredDevice(Device): def __init__(self, bus, iface, mac, subchannels): - Device.__init__(self, bus, iface, NM_DEVICE_TYPE_ETHERNET) - self.add_dbus_interface(IFACE_WIRED, self.__get_props, WiredDevice.PropertiesChanged) if mac is None: self.mac = random_mac() @@ -231,6 +251,9 @@ class WiredDevice(Device): self.carrier = False self.s390_subchannels = subchannels + self.add_dbus_interface(IFACE_WIRED, self.__get_props, WiredDevice.PropertiesChanged) + Device.__init__(self, bus, iface, NM_DEVICE_TYPE_ETHERNET) + # Properties interface def __get_props(self): props = {} @@ -257,19 +280,19 @@ PV_VLAN_ID = "VlanId" class VlanDevice(Device): def __init__(self, bus, iface): - Device.__init__(self, bus, iface, NM_DEVICE_TYPE_VLAN) - self.add_dbus_interface(IFACE_VLAN, self.__get_props, VlanDevice.PropertiesChanged) - self.mac = random_mac() self.carrier = False self.vlan_id = 1 + self.add_dbus_interface(IFACE_VLAN, self.__get_props, VlanDevice.PropertiesChanged) + Device.__init__(self, bus, iface, NM_DEVICE_TYPE_VLAN) + # Properties interface def __get_props(self): props = {} props[PV_HW_ADDRESS] = self.mac props[PV_CARRIER] = self.carrier - props[PV_VLAN_ID] = self.vlan_id + props[PV_VLAN_ID] = dbus.UInt32(self.vlan_id) return props @dbus.service.signal(IFACE_VLAN, signature='a{sv}') @@ -295,8 +318,6 @@ class WifiAp(ExportedObj): def __init__(self, bus, ssid, mac, flags, wpaf, rsnf, freq): path = "/org/freedesktop/NetworkManager/AccessPoint/%d" % WifiAp.counter WifiAp.counter = WifiAp.counter + 1 - ExportedObj.__init__(self, bus, path) - self.add_dbus_interface(IFACE_WIFI_AP, self.__get_props, WifiAp.PropertiesChanged) self.ssid = ssid if mac: @@ -310,6 +331,9 @@ class WifiAp(ExportedObj): self.strength = random.randint(0, 100) self.strength_id = GLib.timeout_add_seconds(10, self.strength_cb, None) + self.add_dbus_interface(IFACE_WIFI_AP, self.__get_props, WifiAp.PropertiesChanged) + ExportedObj.__init__(self, bus, path) + def __del__(self): if self.strength_id > 0: GLib.source_remove(self.strength_id) @@ -357,13 +381,13 @@ PW_WIRELESS_CAPABILITIES = "WirelessCapabilities" class WifiDevice(Device): def __init__(self, bus, iface): - Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIFI) - self.add_dbus_interface(IFACE_WIFI, self.__get_props, WifiDevice.PropertiesChanged) - self.mac = random_mac() self.aps = [] self.active_ap = None + self.add_dbus_interface(IFACE_WIFI, self.__get_props, WifiDevice.PropertiesChanged) + Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIFI) + # methods @dbus.service.method(dbus_interface=IFACE_WIFI, in_signature='', out_signature='ao') def GetAccessPoints(self): @@ -443,13 +467,14 @@ class WimaxNsp(ExportedObj): def __init__(self, bus, name): path = "/org/freedesktop/NetworkManager/Nsp/%d" % WimaxNsp.counter WimaxNsp.counter = WimaxNsp.counter + 1 - ExportedObj.__init__(self, bus, path) - self.add_dbus_interface(IFACE_WIMAX_NSP, self.__get_props, WimaxNsp.PropertiesChanged) self.name = name self.strength = random.randint(0, 100) self.strength_id = GLib.timeout_add_seconds(10, self.strength_cb, None) + self.add_dbus_interface(IFACE_WIMAX_NSP, self.__get_props, WimaxNsp.PropertiesChanged) + ExportedObj.__init__(self, bus, path) + def __del__(self): if self.strength_id > 0: GLib.source_remove(self.strength_id) @@ -492,14 +517,14 @@ PX_ACTIVE_NSP = "ActiveNsp" class WimaxDevice(Device): def __init__(self, bus, iface): - Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIMAX) - self.add_dbus_interface(IFACE_WIMAX, self.__get_props, WimaxDevice.PropertiesChanged) - self.mac = random_mac() self.bsid = random_mac() self.nsps = [] self.active_nsp = None + self.add_dbus_interface(IFACE_WIMAX, self.__get_props, WimaxDevice.PropertiesChanged) + Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIMAX) + # methods @dbus.service.method(dbus_interface=IFACE_WIMAX, in_signature='', out_signature='ao') def GetNspList(self): @@ -582,8 +607,6 @@ class ActiveConnection(ExportedObj): def __init__(self, bus, device, connection, specific_object): object_path = "/org/freedesktop/NetworkManager/ActiveConnection/%d" % ActiveConnection.counter ActiveConnection.counter = ActiveConnection.counter + 1 - ExportedObj.__init__(self, bus, object_path) - self.add_dbus_interface(IFACE_ACTIVE_CONNECTION, self.__get_props, ActiveConnection.PropertiesChanged) self.device = device self.conn = connection @@ -598,6 +621,9 @@ class ActiveConnection(ExportedObj): self.vpn = False self.master = None + self.add_dbus_interface(IFACE_ACTIVE_CONNECTION, self.__get_props, ActiveConnection.PropertiesChanged) + ExportedObj.__init__(self, bus, object_path) + # Properties interface def __get_props(self): props = {} @@ -659,9 +685,6 @@ def set_device_ac_cb(device, ac): class NetworkManager(ExportedObj): def __init__(self, bus, object_path): - ExportedObj.__init__(self, bus, object_path) - self.add_dbus_interface(IFACE_NM, self.__get_props, NetworkManager.PropertiesChanged) - self._bus = bus; self.devices = [] self.active_connections = [] @@ -670,6 +693,9 @@ class NetworkManager(ExportedObj): self.state = NM_STATE_DISCONNECTED self.connectivity = 1 + self.add_dbus_interface(IFACE_NM, self.__get_props, NetworkManager.PropertiesChanged) + ExportedObj.__init__(self, bus, object_path) + @dbus.service.signal(IFACE_NM, signature='u') def StateChanged(self, new_state): pass @@ -736,6 +762,7 @@ class NetworkManager(ExportedObj): if s_con['id'] == 'object-creation-failed-test': self.active_connections.remove(ac) + self.__notify(PM_ACTIVE_CONNECTIONS) ac.remove_from_connection() else: GLib.timeout_add(50, set_device_ac_cb, device, ac) @@ -930,6 +957,11 @@ class NetworkManager(ExportedObj): def UpdateConnection(self, path, connection, verify_connection): return settings.update_connection(connection, path, verify_connection) + @dbus.service.method(dbus_interface=IFACE_TEST, in_signature='', out_signature='') + def Restart(self): + bus.release_name("org.freedesktop.NetworkManager") + bus.request_name("org.freedesktop.NetworkManager") + ################################################################### IFACE_CONNECTION = 'org.freedesktop.NetworkManager.Settings.Connection' @@ -946,7 +978,7 @@ class InvalidSettingException(dbus.DBusException): class MissingSettingException(dbus.DBusException): _dbus_error_name = IFACE_CONNECTION + '.MissingSetting' -class Connection(dbus.service.Object): +class Connection(ExportedObj): def __init__(self, bus, object_path, settings, remove_func, verify_connection=True): if self.get_uuid(settings) is None: @@ -955,8 +987,6 @@ class Connection(dbus.service.Object): settings['connection']['uuid'] = uuid.uuid4() self.verify(settings, verify_strict=verify_connection) - dbus.service.Object.__init__(self, bus, object_path) - self.path = object_path self.settings = settings self.remove_func = remove_func @@ -964,6 +994,9 @@ class Connection(dbus.service.Object): self.props = {} self.props['Unsaved'] = False + self.add_dbus_interface(IFACE_CONNECTION, self.__get_props, None) + ExportedObj.__init__(self, bus, object_path) + def get_uuid(self, settings=None): if settings is None: settings = self.settings @@ -1003,20 +1036,11 @@ class Connection(dbus.service.Object): self.settings = settings; self.Updated() - # Properties interface - @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') - def GetAll(self, iface): - if iface != IFACE_CONNECTION: - raise UnknownInterfaceException() + def __get_props(self): return self.props - @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') - def Get(self, iface, name): - if iface != IFACE_CONNECTION: - raise UnknownInterfaceException() - if not name in self.props.keys(): - raise UnknownPropertyException() - return self.props[name] + def __notify(self, propname): + self._dbus_property_notify(IFACE_CONNECTION, propname) # Connection methods @dbus.service.method(dbus_interface=IFACE_CONNECTION, in_signature='', out_signature='a{sa{sv}}') @@ -1054,9 +1078,8 @@ IFACE_SETTINGS = 'org.freedesktop.NetworkManager.Settings' class InvalidHostnameException(dbus.DBusException): _dbus_error_name = IFACE_SETTINGS + '.InvalidHostname' -class Settings(dbus.service.Object): +class Settings(ExportedObj): def __init__(self, bus, object_path): - dbus.service.Object.__init__(self, bus, object_path) self.connections = {} self.bus = bus self.counter = 1 @@ -1066,6 +1089,9 @@ class Settings(dbus.service.Object): self.props['CanModify'] = True self.props['Connections'] = dbus.Array([], 'o') + self.add_dbus_interface(IFACE_SETTINGS, self.__get_props, Settings.PropertiesChanged) + ExportedObj.__init__(self, bus, object_path) + def auto_remove_next_connection(self): self.remove_next_connection = True; @@ -1092,7 +1118,7 @@ class Settings(dbus.service.Object): self.connections[path] = con self.props['Connections'] = dbus.Array(self.connections.keys(), 'o') self.NewConnection(path) - self.PropertiesChanged({ 'connections': self.props['Connections'] }) + self.__notify('Connections') if self.remove_next_connection: self.remove_next_connection = False @@ -1111,7 +1137,7 @@ class Settings(dbus.service.Object): def delete_connection(self, connection): del self.connections[connection.path] self.props['Connections'] = dbus.Array(self.connections.keys(), 'o') - self.PropertiesChanged({ 'connections': self.props['Connections'] }) + self.__notify('Connections') @dbus.service.method(dbus_interface=IFACE_SETTINGS, in_signature='s', out_signature='') def SaveHostname(self, hostname): @@ -1119,21 +1145,13 @@ class Settings(dbus.service.Object): if hostname.find('.') == -1: raise InvalidHostnameException() self.props['Hostname'] = hostname - self.PropertiesChanged({ 'hostname': hostname }) + self.__notify('Hostname') - @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') - def GetAll(self, iface): - if iface != IFACE_SETTINGS: - raise UnknownInterfaceException() + def __get_props(self): return self.props - @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') - def Get(self, iface, name): - if iface != IFACE_SETTINGS: - raise UnknownInterfaceException() - if not name in self.props.keys(): - raise UnknownPropertyException() - return self.props[name] + def __notify(self, propname): + self._dbus_property_notify(IFACE_SETTINGS, propname) @dbus.service.signal(IFACE_SETTINGS, signature='o') def NewConnection(self, path): @@ -1207,7 +1225,80 @@ class AgentManager(dbus.service.Object): return secrets ################################################################### +IFACE_OBJECT_MANAGER = 'org.freedesktop.DBus.ObjectManager' + +PATH_OBJECT_MANAGER = '/org/freedesktop' + +class ObjectManager(dbus.service.Object): + def __init__(self, bus, object_path): + dbus.service.Object.__init__(self, bus, object_path) + self.objs = [] + self.bus = bus + @dbus.service.method(dbus_interface=IFACE_OBJECT_MANAGER, + in_signature='', out_signature='a{oa{sa{sv}}}', + sender_keyword='sender') + def GetManagedObjects(self, sender=None): + managed_objects = {} + for obj in self.objs: + name, ifaces = obj.get_managed_ifaces() + managed_objects[name] = ifaces + return managed_objects + + def add_object(self, obj): + self.objs.append(obj) + name, ifaces = obj.get_managed_ifaces() + self.InterfacesAdded(name, ifaces) + + def remove_object(self, obj): + self.objs.remove(obj) + name, ifaces = obj.get_managed_ifaces() + self.InterfacesRemoved(name, ifaces.keys()) + + @dbus.service.signal(IFACE_OBJECT_MANAGER, signature='oa{sa{sv}}') + def InterfacesAdded(self, name, ifaces): + pass + + @dbus.service.signal(IFACE_OBJECT_MANAGER, signature='oas') + def InterfacesRemoved(self, name, ifaces): + pass + +################################################################### +IFACE_DNS_MANAGER = 'org.freedesktop.NetworkManager.DnsManager' + +class DnsManager(ExportedObj): + def __init__(self, bus, object_path): + self.props = {} + self.props['Mode'] = "dnsmasq" + self.props['RcManager'] = "symlink" + self.props['Configuration'] = dbus.Array([ + dbus.Dictionary( + { 'nameservers' : dbus.Array(['1.2.3.4', '5.6.7.8'], 's'), + 'priority' : dbus.Int32(100) }, + 'sv') ], + 'a{sv}') + + self.add_dbus_interface(IFACE_DNS_MANAGER, self.__get_props, None) + ExportedObj.__init__(self, bus, object_path) + + @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') + def GetAll(self, iface): + if iface != IFACE_DNS_MANAGER: + raise UnknownInterfaceException() + return self.props + + @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') + def Get(self, iface, name): + if iface != IFACE_DNS_MANAGER: + raise UnknownInterfaceException() + if not name in self.props.keys(): + raise UnknownPropertyException() + return self.props[name] + + def __get_props(self): + return self.props + +################################################################### def stdin_cb(io, condition): mainloop.quit() @@ -1219,12 +1310,14 @@ def main(): random.seed() - bus = dbus.SessionBus() + global manager, settings, agent_manager, dns_manager, object_manager, bus - global manager, settings, agent_manager + bus = dbus.SessionBus() + object_manager = ObjectManager(bus, "/org/freedesktop") manager = NetworkManager(bus, "/org/freedesktop/NetworkManager") settings = Settings(bus, "/org/freedesktop/NetworkManager/Settings") agent_manager = AgentManager(bus, "/org/freedesktop/NetworkManager/AgentManager") + dns_manager = DnsManager(bus, "/org/freedesktop/NetworkManager/DnsManager") if not bus.request_name("org.freedesktop.NetworkManager"): sys.exit(1) |