diff options
Diffstat (limited to 'tools/test-networkmanager-service.py')
| -rwxr-xr-x | tools/test-networkmanager-service.py | 90 |
1 files changed, 74 insertions, 16 deletions
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py index a7788510..9a423123 100755 --- a/tools/test-networkmanager-service.py +++ b/tools/test-networkmanager-service.py @@ -288,8 +288,15 @@ class Util: return (Util.ip_addr_ntop(a, family), family) @staticmethod - def eprint(*args, **kwargs): - print(*args, file=sys.stderr, **kwargs) + def log(message): + if gl.log_file: + try: + gl.log_file.write(message + "\n") + gl.log_file.flush() + except Exception: + pass + else: + print(message, file=sys.stderr) @staticmethod def variant_from_dbus(val): @@ -308,9 +315,9 @@ class Util: if isinstance(val, dbus.Array): try: if val.signature == "s": - return GLib.Variant("as", [Util.variant_from_dbus(x) for x in val]) + return GLib.Variant("as", [str(x) for x in val]) if val.signature == "b": - return GLib.Variant("ab", [Util.variant_from_dbus(x) for x in val]) + return GLib.Variant("ab", [bool(x) for x in val]) if val.signature == "y": return GLib.Variant("ay", [int(x) for x in val]) if val.signature == "u": @@ -342,8 +349,7 @@ class Util: ) except Exception as e: raise Exception( - "Cannot convert array element to type '%s': %s" - % (val.signature, e.message) + "Cannot convert array element to type '%s': %s" % (val.signature, e) ) if isinstance(val, dbus.Dictionary): if val.signature == "ss": @@ -358,7 +364,7 @@ class Util: [(str(k), Util.variant_from_dbus(v)) for k, v in val.items()] ), ) - if val.signature == "sa{sv}": + if val.signature == "sa{sv}" or val.signature == "sa{ss}": c = collections.OrderedDict( [ ( @@ -825,10 +831,12 @@ class Device(ExportedObj): ExportedObj.__init__(self, ExportedObj.create_path(Device), ident) + self.applied_con = {} self.ip4_config = None self.ip6_config = None self.dhcp4_config = None self.dhcp6_config = None + self.activation_state_change_delay_ms = 50 self.prp_state = NM.DeviceState.UNAVAILABLE @@ -1037,6 +1045,20 @@ class Device(ExportedObj): def Disconnect(self): pass + @dbus.service.method( + dbus_interface=IFACE_DEVICE, in_signature="u", out_signature="a{sa{sv}}t" + ) + def GetAppliedConnection(self, flags): + ac = self._dbus_property_get(IFACE_DEVICE, PRP_DEVICE_ACTIVE_CONNECTION) + return (self.applied_con, 0) + + @dbus.service.method( + dbus_interface=IFACE_DEVICE, in_signature="a{sa{sv}}tu", out_signature="" + ) + def Reapply(self, connection, version_id, flags): + self.applied_con = connection + pass + @dbus.service.method(dbus_interface=IFACE_DEVICE, in_signature="", out_signature="") def Delete(self): # We don't currently support any software device types, so... @@ -1067,6 +1089,10 @@ class Device(ExportedObj): def set_active_connection(self, ac): self._dbus_property_set(IFACE_DEVICE, PRP_DEVICE_ACTIVE_CONNECTION, ac) + if ac is None: + self.applied_con = {} + else: + self.applied_con = ac.con_inst.con_hash def connection_is_available(self, con_inst): if con_inst.is_vpn(): @@ -1388,9 +1414,9 @@ class ActiveConnection(ExportedObj): self.con_inst = con_inst self.is_vpn = con_inst.is_vpn() + self.activation_state_change_delay_ms = device.activation_state_change_delay_ms self._activation_id = None self._deactivation_id = None - self.activation_state_change_delay_ms = 50 s_con = con_inst.con_hash[NM.SETTING_CONNECTION_SETTING_NAME] @@ -1486,9 +1512,17 @@ class ActiveConnection(ExportedObj): def start_activation(self): assert self._activation_id is None - self._activation_id = GLib.timeout_add( - self.activation_state_change_delay_ms, self._activation_step1 - ) + if self.activation_state_change_delay_ms == 0: + self.device.set_active_connection(self) + self._set_state( + NM.ActiveConnectionState.ACTIVATED, + NM.ActiveConnectionStateReason.UNKNOWN, + ) + self.device.set_state(NM.DeviceState.ACTIVATED, NM.DeviceStateReason.NONE) + else: + self._activation_id = GLib.timeout_add( + self.activation_state_change_delay_ms, self._activation_step1 + ) def start_deactivation(self): assert self._deactivation_id is None @@ -1553,7 +1587,9 @@ class NetworkManager(ExportedObj): PRP_NM_ACTIVATING_CONNECTION: ExportedObj.to_path(None), PRP_NM_STARTUP: False, PRP_NM_STATE: dbus.UInt32(NM.State.DISCONNECTED), - PRP_NM_VERSION: "0.9.9.0", + PRP_NM_VERSION: os.environ.get( + "NM_TEST_NETWORKMANAGER_SERVICE_VERSION", "0.9.9.0" + ), PRP_NM_CONNECTIVITY: dbus.UInt32(NM.ConnectivityState.NONE), } @@ -1918,9 +1954,9 @@ class NetworkManager(ExportedObj): @dbus.service.method(dbus_interface=IFACE_TEST, in_signature="ou", out_signature="") def SetActiveConnectionStateChangedDelay(self, devpath, delay_ms): - for ac in reversed(self.active_connections): - if ac.device.path == devpath: - ac.activation_state_change_delay_ms = delay_ms + for d in self.devices: + if d.path == devpath: + d.activation_state_change_delay_ms = delay_ms return raise BusErr.UnknownDeviceException( "Device with iface '%s' not found" % devpath @@ -2856,6 +2892,26 @@ class ObjectManager(dbus.service.Object): return managed_objects +def setup_log_file(): + """ + Get environment variable for the log file , if any + We accept a %p placeholder to replace with the pid of the current + process + """ + try: + log_file_name = os.environ["NM_TEST_NETWORKMANAGER_SERVICE_LOGFILE"] + except KeyError: + return None + if "%p" in log_file_name: + log_file_name = log_file_name.replace("%p", str(os.getpid())) + try: + log_file = open(log_file_name, "w") + except Exception: + log_file = None + + return log_file + + ############################################################################### @@ -2867,6 +2923,7 @@ def main(): global gl gl = Global() + gl.log_file = setup_log_file() gl.mainloop = GLib.MainLoop() gl.bus = dbus.SessionBus() gl.force_activation_failure = {} @@ -2899,7 +2956,8 @@ def main(): gl.settings.unexport() gl.manager.unexport() gl.object_manager.remove_from_connection() - + if gl.log_file: + gl.log_file.close() sys.exit(0) |