Register signal instead of silly polling which even doesn't work in some cases (eg change ipv6 congig of a device to manual and switch it off and on -> only ipv6 config is showed) --- pyanaconda/ui/gui/spokes/network.py | 49 ++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 28 deletions(-)
diff --git a/pyanaconda/ui/gui/spokes/network.py b/pyanaconda/ui/gui/spokes/network.py index 04f01ce..7ee3618 100644 --- a/pyanaconda/ui/gui/spokes/network.py +++ b/pyanaconda/ui/gui/spokes/network.py @@ -336,6 +336,8 @@ class NetworkControlBox(object):
def initialize(self): for device in self.client.get_devices(): + device.connect("notify::ip4-config", self.on_device_config_changed) + device.connect("notify::ip6-config", self.on_device_config_changed) self.add_device_to_list(device)
treeview = self.builder.get_object("treeview_devices") @@ -389,9 +391,12 @@ class NetworkControlBox(object): if new_state == NetworkManager.DeviceState.SECONDARIES: return self._refresh_carrier_info() - read_config_values = (new_state == NetworkManager.DeviceState.ACTIVATED) if device == self.selected_device(): - self.refresh_ui(device, read_config_values, new_state) + self.refresh_ui(device, new_state) + + def on_device_config_changed(self, device, *args): + if device == self.selected_device(): + self.refresh_ui(device)
def on_wireless_ap_changed_cb(self, combobox, *args): if self._updating_device: @@ -673,7 +678,7 @@ class NetworkControlBox(object): for row in rows_to_remove: del(row)
- def refresh_ui(self, device, read_config_values=True, state=None): + def refresh_ui(self, device, state=None):
if not device: notebook = self.builder.get_object("notebook_types") @@ -686,27 +691,12 @@ class NetworkControlBox(object): self._refresh_parent_vlanid(device) self._refresh_speed_hwaddr(device, state) self._refresh_ap(device, state) - if read_config_values: - num_of_tries = 3 - else: - num_of_tries = 0 - self._refresh_device_cfg((device, num_of_tries), state) + self._refresh_device_cfg(device, state)
- def _refresh_device_cfg(self, dev_tries, state): - device, num_of_tries = dev_tries - ipv4cfg = None - ipv6cfg = None + def _refresh_device_cfg(self, device, state):
- # We might need to wait for config objects to become available - if num_of_tries > 0: - ipv4cfg = device.get_ip4_config() - ipv6cfg = device.get_ip6_config() - if not ipv4cfg and not ipv6cfg: - GLib.timeout_add(300, - self._refresh_device_cfg, - (device, num_of_tries-1), - state) - return False + if state is None: + state = device.get_state()
dev_type = device.get_device_type() if dev_type == NetworkManager.DeviceType.ETHERNET: @@ -718,10 +708,14 @@ class NetworkControlBox(object): elif dev_type == NetworkManager.DeviceType.VLAN: dt = "wired"
- if state is None: - state = device.get_state() - if (ipv4cfg - and state == NetworkManager.DeviceState.ACTIVATED): + if state == NetworkManager.DeviceState.ACTIVATED: + ipv4cfg = device.get_ip4_config() + ipv6cfg = device.get_ip6_config() + else: + ipv4cfg = None + ipv6cfg = None + + if ipv4cfg: addr = socket.inet_ntoa(struct.pack('=L', ipv4cfg.get_addresses()[0].get_address())) self._set_device_info_value(dt, "ipv4", addr) @@ -747,8 +741,7 @@ class NetworkControlBox(object):
# TODO NM_GI_BUGS - segfaults on get_addres(), get_prefix() ipv6_addr = None - if (ipv6cfg - and state == NetworkManager.DeviceState.ACTIVATED): + if ipv6cfg: config = dbus.SystemBus().get_object(NM_SERVICE, ipv6cfg.get_path()) addr, prefix, gw = getNMObjProperty(config, ".IP6Config", "Addresses")[0]
On Fri, 2013-04-05 at 09:55 +0200, Radek Vykydal wrote:
# TODO NM_GI_BUGS - segfaults on get_addres(), get_prefix() ipv6_addr = None
if (ipv6cfgand state == NetworkManager.DeviceState.ACTIVATED):
if ipv6cfg: config = dbus.SystemBus().get_object(NM_SERVICE, ipv6cfg.get_path()) addr, prefix, gw = getNMObjProperty(config, ".IP6Config", "Addresses")[0]
This looks good to me. Just the 'config = dbus.SystemBus()...' line is a bit confusing to me. Isn't there a function for something like that in nm.py?
On 04/05/2013 10:59 AM, Vratislav Podzimek wrote:
On Fri, 2013-04-05 at 09:55 +0200, Radek Vykydal wrote:
# TODO NM_GI_BUGS - segfaults on get_addres(), get_prefix() ipv6_addr = None
if (ipv6cfgand state == NetworkManager.DeviceState.ACTIVATED):
if ipv6cfg: config = dbus.SystemBus().get_object(NM_SERVICE, ipv6cfg.get_path()) addr, prefix, gw = getNMObjProperty(config, ".IP6Config", "Addresses")[0]This looks good to me. Just the 'config = dbus.SystemBus()...' line is a bit confusing to me. Isn't there a function for something like that in nm.py?
I am using dbus-python in places where we can't use libnm-glib with GI due to some (yet unresolved) bugs/issues at lower level. I may send a separate patch replacing all dbus-python calls in spokes/network.py with GDBUS calls, perhaps adding nm_object_property() to nm.py.
anaconda-patches@lists.fedorahosted.org