> diff --git a/src/python/openvpn3/SessionManager.py > b/src/python/openvpn3/SessionManager.py > index 3632790..1a567be 100644 > --- a/src/python/openvpn3/SessionManager.py > +++ b/src/python/openvpn3/SessionManager.py > @@ -114,6 +114,7 @@ def __init__(self, dbuscon, objpath): > self.__log_callback = None > self.__status_callback = None > self.__deleted = False > + self.__log_forward_enabled = False > > > def __del__(self): > @@ -291,16 +292,11 @@ def LogCallback(self, cbfnc): > > dbus_interface='net.openvpn.v3.backends', > bus_name='net.openvpn.v3.log', > path=self.__session_path) > - self.__session_intf.LogForward(True) > else: > - try: > - self.__session_intf.LogForward(False) > - except dbus.exceptions.DBusException: > - # If this fails, the session is typically already removed > - pass > self.__dbuscon.remove_signal_receiver(self.__log_callback, 'Log') > self.__log_callback = None
Oops, this code unconditionally removes the callback, even if there isn't currently a callback. The code below in StatusChangeCallback first checks if there is currently a callback registered before removing it. If `self.__dbuscon.remove_signal_receiver` is resilient to getting passed None values for callbacks, then I suppose would could skip the check and just unconditionally remove the callback. Let me know what's best. > > + self.__set_log_forward() > > ## > # Subscribes to the StatusChange signals for this session and register > @@ -318,10 +314,14 @@ def StatusChangeCallback(self, cbfnc): > bus_name='net.openvpn.v3.log', > path=self.__session_path) > else: > - self.__dbuscon.remove_signal_receiver(self.__status_callback, > - 'StatusChange') > - self.__status_callback = None > + # Only remove the callback if there actually *is* a callback > + # currently. > + if self.__status_callback is not None: > + self.__dbuscon.remove_signal_receiver(self.__status_callback, > + 'StatusChange') > + self.__status_callback = None > > + self.__set_log_forward() > > > ## > @@ -417,6 +417,30 @@ def GetDCO(self): > def SetDCO(self, dco): > self.__prop_intf.Set('net.openvpn.v3.sessions', 'dco', dco) > > + ## > + # Internal method to enable/disable LogForward as needed. > + # Must be called whenever a callback that needs LogForward enabled is > + # added or removed. > + # > + def __set_log_forward(self): > + # The LogCallback and the StatusChangeCallback both need LogForward > + # enabled. In other words, LogForward should be enabled iff one or > both > + # of those callbacks are registered. > + should_log_forward_be_enabled = ( > + self.__log_callback is not None or self.__status_callback > is not None > + ) > + > + if should_log_forward_be_enabled and not self.__log_forward_enabled: > + self.__session_intf.LogForward(True) > + self.__log_forward_enabled = True > + elif not should_log_forward_be_enabled and > self.__log_forward_enabled: > + try: > + self.__session_intf.LogForward(False) > + except dbus.exceptions.DBusException: > + # If this fails, the session is typically already removed > + pass > + > + self.__log_forward_enabled = False > > > ## _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel